本篇文章更新時間:2022/11/25
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知。
一介資男的 LINE 社群開站囉!歡迎入群聊聊~
如果本站內容對你有幫助,歡迎使用 BFX Pay 加密貨幣新台幣 贊助支持。


這類型工具的需求其實不小。從要知道客戶 IP 資訊來反查請求狀況到自己遠端連線進去雲端主機裡,看不到這台主機 IP,需要查詢,使用情境意外的多~

繼上篇實作 WAF 應用程式防火牆的筆記過程中,有發現一個 Cloudflare 工程師放出來的工具:canhazip.com 直接瀏覽會看到 IP,如果路徑補上 /more 或是 /headers 可以看到更多請求資訊。類似的工具還有前一篇介紹過的 cidr.me,不過這個是需要主機架設,成本資源高了一些。

後來查了一下, canhazip.com 是使用 Cloudflare Workers 工具來實作,連一台主機都不需要!

如果有短網址可以套上就更方便好玩了~ 操作記錄如下,有興趣的人可以自己架設:

前置準備

  1. 一個網域名稱,能越短越好,方便記憶與少打幾個字。
  2. 一個免費的 Cloudflare 帳號,上面的網域也給此帳號 DNS 代管。

進入設定正題

下面使用英文介面來介紹,避免本地化介面調整找不到對應的功能。

  1. 先登入 Cloudflare 後台,然後找到 Workers > Overview,點選 Create a Service 按鈕建立。(如果還沒用過這個服務,會先提示「Set up your free custom Cloudflare Workers® subdomain」建立一個子網域、選方案來開始,基本上就是前置設定完後會看到。
  2. 設定一個服務名稱,選擇 HTTP handler 的做法到下一步。Workers
  3. 點選 Quick edit 編輯程式。Workers
  4. 左側輸入匡填入如下程式碼。
    async function handleRequest(request) {
    const {
        pathname
    } = new URL(request.url);
    const clientUA = request.headers.get('User-Agent');
    const clientIP = request.headers.get('CF-Connecting-IP');
    const clientASN = request.cf.asn;
    const clientISP = request.cf.asOrganization;
    const clientCO = request.cf.country;
    const clientCI = request.cf.city;
    const clientRE = request.cf.region;
    const clientLAT = request.cf.latitude;
    const clientLON = request.cf.longitude;
    const clientPC = request.cf.postalCode;
    const clientTZ = request.cf.timezone;
    const resp_json = {
        IP: clientIP,
        UA: clientUA,
        CF: request.cf
    };
    if (pathname === '/') {
        return new Response(clientIP);
    } else if (pathname === '/json') {
        return new Response(JSON.stringify(resp_json));
    } else if (pathname === '/text') {
        return new Response("Public IP: " + clientIP + "\n" + "ASN: " + clientASN + "\n" + "ISP: " + clientISP + "\n" + "Country: " + clientCO + "\n" + "City: " + clientCI + "\n" + "Region: " + clientRE + "\n" + "Latitude, Longitude: " + clientLAT + "," + clientLON + "\n" + "Postal Code: " + clientPC + "\n" + "Timezone: " + clientTZ + "\n" + "User Agent: " + clientUA + "\n");
    } else {
        return new Response('Oops!');
    }
    }
    addEventListener('fetch', event => {
    event.respondWith(handleRequest(event.request));
    });
  5. 點選 Save and deploy 存檔以及部署後,回到上一頁,點選畫面中 Preview 下方提供的預設網址觀看結果。(程式碼編輯畫面中的預覽不支援查看 cf 的參數結果所以會不正確。)

到這步驟已經算是完成這工具的基礎設定,剩下就是短網域指向的作業。

短網域指向

這步驟就是看喜好了。有人喜歡 mxp.tw/ip 也有人覺得 ip.mxp.tw 好,我個人是直接拿一個沒在用的短網域的主網域 mxp.tw (舉例)來套用。

設計方向是: mxp.tw 會直接看到單一IP、mxp.tw/text 會看到文字描述的 IP 細節、mxp.tw/json 會輸出可以給程式接上的 JSON 格式輸出。

設定方法:

  1. 進入剛剛建立的 Workers 工具畫面,找到 Triggers 的功能分頁。
  2. 點選下方 Add route 填入 mxp.tw/* 並下拉選擇這個短網域當初建立的 Zone 資料,送出完成設定。

注意,這個操作必須要 mxp.tw 本身有開啟 Cloudflare Proxy 橘色的雲。指向哪裡都不重要,這個操作會覆寫原本的設定所以如果原本有網站在這網域下面運作的話,就會出事R~

測試功能

如果打開瀏覽器瀏覽上面設計的連結都能正常輸出就代表沒問題拉!

主機上面想取得 IPv4 的話可以下 curl -4 mxp.tw 指令,如果要 IPv6 的話就是 curl -6 mxp.tw

參考資料

  1. Workers 文件
  2. Creating a Simple IP-Check Tool with Cloudflare Workers

後記

Cloudflare 推出的這功能真的很好玩。目前看到最神的是中國開發者使用 Workers + KV 兩個免費的服務,組合出一個完全免費不用主機架設的 Blog 系統。開源在 Github gdtool/cloudflare-workers-blog 運作了兩年很穩沒問題呀~


Share:

作者: Chun

資訊愛好人士。主張「人人都該為了偷懶而進步」。期許自己成為斜槓到變進度條 100% 的年輕人。[///////////____34%_________]

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

文章