前言
實做:使用 Cloudflare API 實現 Cloudflare DDNS (動態域名系統),通過 API 來自動更新 DNS 記錄,使域名始終指向正確的動態 IP。
隨著自建網站和遠端服務的需求增加,穩定可靠的網域名稱系統變得越來越重要,US.KG 提供的免費域名服務不僅讓使用者能夠以零成本獲得專業的網域名稱,更可透過 Cloudflare 的 DDNS 功能,實現動態IP的即時更新。
本教學將帶領您完成從 US.KG 免費域名申請、Cloudflare 託管設定到自動化 DDNS 腳本的建置過程,透過整合這些服務,即使是使用動態IP的家用網路環境,也能建立起穩定的網路服務存取點,特別適合想要架設個人網站、遠端服務或測試環境的使用者,讓您在節省成本的同時,也能享有專業級的網域名稱服務。
申請免費域名
- 開啟下列網址,進行免費域名註冊
💡 範例:
用戶名:andyliu
法定全名(名在前、姓在後):John Fitzpatrick
郵件位址:[email protected]
電話號碼:+1-7046275347
住家地址(街道地址、城市、州、郵编、國家):4406 Snyder Avenue, Charlotte, NC 28202, United States
密碼:123456789@
確認密碼:123456789@
驗證你是人類:勾選
輸入完成後點選「註冊」 - 出現「Successful」(成功)!訊息:驗證電子郵件已傳送,請檢查您的郵箱,如果找不到,請檢查您的垃圾郵件資料夾或重試。
- 到信箱的驗證郵件內點選「verification email」(信箱驗證網頁連結)
- 出現「Registration successful」(註冊成功)!
- 開啟下列網址,進行登入驗證,輸入「E-Mail」(郵件位址)後,點選「Next」(下一步)
- 接著輸入「Password」(登入密碼),「勾選」驗證您是人類,再點選「Login」(登入)
- 驗證方法選擇「GitHub KYC Verification」(GitHub KYC 驗證),接著用滑鼠右鍵打開中間的網頁連結
- 點選右上角的「Sign in」(登入),輸入GitHub的帳號和密碼後,點選下方的「Sign in」(登入)
- 輸入信箱驗證郵件中的「Device Verification Code」(設備驗證碼),再點選下方的「Verify」(驗證)
- 點選右上角的Star小星星(☆)
- 點選左下角的「Proceed to GitHub」(前往GitHub)
- 標題預設會帶入 US.KG 的用戶名,步驟:
- 填寫「Username」(用戶名,和標題一致),例如:myname
- 填寫「Reason for Register」(註冊用途),例如:I want to create a blog
- 點選下方的「Submit new issue」(提交新問題)
- 「勾選」全部項目,完成後在此頁面等待驗證結果
- 經過一會,在同頁面下方收到回覆訊息,已批准通過
註冊免費域名
- 登入 US.KG 後即可註冊域名
- 輸入想要的域名後,點選「Check」(檢查),例如:bugtest
- 出現「Congratulations! This domain name is now available」,顯示該域名可以註冊使用
新域名:bugtest.us.kg,Name Server 需要填寫名稱伺服器,這裡將會託管到 Cloudflare,所以先不用填寫,此頁面不要關閉
託管到 Cloudflare
- 進入 Cloudflare 官網,點選右上角「登入」
- 點選左側的「網站」,輸入 US.KG 免費域名:bugtest.us.kg,點選「快速掃描 DNS 記錄」,再點選「繼續」
- 點選「免費」方案,再點選「繼續」
- 點選「繼續以啟用」
- 點選「確認」
- 複製下方的 Cloudflare 名稱伺服器(兩個),再點選下方的「繼續」
junade.ns.cloudflare.com
norah.ns.cloudflare.com
- 貼到 US.KG 域名註冊頁面中的兩個「Name Server」(名稱伺服器),再點選「Register」(註冊)
- 出現「Successful purchase」,表示註冊成功,完成新域名註冊,點選左下方的「Back to panel」(返回控制台)
- 控制台顯示已經註冊 1 個域名,點選左側「My Domains」(我的域名)
- 點選「域名」(bugtest.us.kg)
- 查看域名詳細資訊,域名免費使用,每年需要續約,在域名到期前 180 天可續訂一年
點選左側的「NS Records」(NS記錄),右方可以更新修改「Name Server」(名稱伺服器)
- 點選左側的「Renew」(續約),右方可以續訂一年(若小於到期日 180 天)
- 點選左側的「WHOIS Privacy Protection」(WHOIS 隱私保護),右方可以「Enable」(啟用) 或「Disable」(停用)
建議啟用 WHOIS 隱私保護,以避免隱私洩漏的風險。
- 點選左側的「Cancel This Domain」(刪除域名),右方可以「Cancel thisdomain」(刪除此域名)
- 若您真的要刪除此域名,請「Enter domain name」(輸入域名) 後點選下方的「Cancel Domain」(取消域名)
Cloudflare 設定檢查
- 進入 Cloudflare 官網
- 點選左側的「網站」,再點選右側的域名
- 上方域名的狀態顯示「使用中」,表示已經成功將 US.KG 免費域名託管到 Cloudflare
- 將右邊的功能下拉到底下,點選「從 Cloudflare 中移除」可以刪除已託管的域名
- 點選「移除」會刪除已託管的域名
Cloudflare DNS 是否要開啟 Proxy 呢?
「Cloudflare DNS 設定」是否需要開啟 Proxy(雲端代理)取決於您的需求:
開啟 Proxy:
- 如果您希望 Cloudflare 給您提供 CDN、網站加速、SSL 和 DDoS 防護,則需要開啟 Proxy。
- 此時,Cloudflare 會代理您的網站,並管理 SSL 和安全性。
- Nginx 和 Cloudflare 之間的 HTTP/HTTPS 通訊會經過 Cloudflare 的 CDN 中轉。
- 如果您的網站使用了 Cloudflare 的憑證和 SSL 設定,開啟 Proxy 是必要的。
關閉 Proxy:
- 如果不開啟 Proxy,您將無法使用 Cloudflare 的 SSL、CDN 加速、DDoS 防護等服務。
- DNS 設定仍然會指向 Cloudflare,但 HTTP/HTTPS 將不會被 Cloudflare 管理,會直接對接 Nginx。
建議:
- 如果您使用了 Cloudflare 的「原點憑證」(Origin Certificate),並希望透過 Cloudflare 提供的 SSL 和安全服務,那麼 Proxy 應該開啟。
- 如果您希望簡單的 DNS 設定(不需要 Cloudflare CDN、SSL 加速等),可以關閉 Proxy。
Cloudflare DNS 設定
- 點選左側的「網站」,再點選右側的域名
- 點選左側的「DNS」
- 點選右側的「新增記錄」
- 使用瀏覽器開啟下列網址,查詢自己的「外部IP位址」
- 類型:A﹑名稱:@﹑IPv4 位址:外部IP﹑Proxy 狀態:向右啟用,接著點選「儲存」
- 出現一筆自己域名的 A記錄:bugtest.us.kg
- 再次點選右側的「新增記錄」
- 類型:A﹑名稱:www﹑IPv4 位址:外部IP﹑Proxy 狀態:向右啟用,接著點選「儲存」
- 出現一筆 A記錄:www
- 測試網頁 index.htm
<html><body><h1>It works!</h1>
<p>This is the default web page for this server.</p>
<p>The web server software is running but no content has been added, yet.</p>
</body></html>
- 測試您的伺服器,在瀏覽器輸入 http://www.bugtest.us.kg
- 測試您的伺服器,在瀏覽器輸入 https://www.bugtest.us.kg
Cloudflare 預設已經啟用 SSL 憑證,可以透過 https 連線伺服器
- 點選左側的「SSL/TLS」,可以看到預設的加密模式「彈性」
- 點選右方的「編輯」可以編輯 DNS 記錄
- 修改 DNS 內容後,再點選右下角的「儲存」
- 「勾選」一筆或多筆記錄後點選「刪除記錄」可以將 DNS 記錄刪除
- 輸入「刪除」後點選下方的「刪除」即可將 DNS 記錄刪除
Cloudflare DDNS
Cloudflare DDNS – 動態 IP 自動對應網址
Cloudflare DDNS 是一種技術,讓使用者能夠將變動的動態 IP 地址與域名保持一致,無需手動更改 DNS 記錄,從而確保服務的持續可用性,特別適合那些無法獲得固定 IP 的場景,如家庭網路、監控設備或一些小型企業。
使用 Cloudflare API 實現 Cloudflare DDNS
在許多情境下,動態 IP 地址可能會影響設備或網站的連線穩定性。為了解決這個問題,我們可以利用 Cloudflare DDNS (動態域名系統),通過 Cloudflare API 來自動更新 DNS 記錄,使域名始終指向正確的動態 IP。
建置步驟
- 註冊 Cloudflare 帳戶並登錄網域
- 獲取 API Token
點選右上角的人員圖示,再點選「我的設定檔」(My Profile)
點選左邊「API 權杖」(API Token),再點選右邊的「建立 Token」(Create Token)
點選「編輯區域 DNS」(Edit zone DNS) 右方的「使用範本」(Use template)
設定 Token 最小權限範圍
權限(Permissions):區域(Zone) / DNS / 編輯(Edit)
區域資源(Zone Resources):包含(Include) / 特定區域(Specific zone) / 您的域名(Domain)
設定完成後點選「繼續至摘要」(Continue to summary)
獲取 API Token
點選「Copy」複製 Token,下方是 curl 命令,可以進行 API 測試
Cloudflare API 呼叫測試
Bearer 後方的字串 → 您的 API Token
如果呼叫成功會收到 JSON Success response
API Token:L01u13czcFZ8Wd2_3cWmxxex0qZXTKPEymW_6w8TTcurl -X GET "https://api.cloudflare.com/client/v4/user/tokens/verify" \ -H "Authorization: Bearer L01u13czcFZ8Wd2_3cWmxxex0qZXTKPEymW_6w8T" \ -H "Content-Type:application/json" | python -m json.tool
- 獲取 ZoneID
- Bearer 後方的字串 → 您的 API Token
如果呼叫成功會收到 ZoneID,找到 name 是您域名 bugtest.us.kg 的 id
ZoneID:d95801613008c8b6d131a3ff72d7e4becurl -X GET "https://api.cloudflare.com/client/v4/zones" \ -H "Authorization: Bearer L01u13czcFZ8Wd2_3cWmxxex0qZXTKPEymW_6w8T" \ -H "Content-Type:application/json" | python -m json.tool
- 獲取 RecordID
- zones/ 後方的字串 → 您的 ZoneID
- Bearer 後方的字串 → 您的 API Token
如果呼叫成功會收到 RecordID,找到 name 是您域名 bugtest.us.kg 的 id
RecordID:e3ff3df73968e2c423577e0a21f2eb97
若您要更新 A記錄是 www 的 DNS,找到 name 是 www.bugtest.us.kg 的 id
RecordID:9398c983e25cdaa1c47973e851b12307
curl -X GET "https://api.cloudflare.com/client/v4/zones/d95801613008c8b6d131a3ff72d7e4be/dns_records" \ -H "Authorization: Bearer L01u13czcFZ8Wd2_3cWmxxex0qZXTKPEymW_6w8T" \ -H "Content-Type:application/json" | python -m json.tool
- 使用 Cloudflare API 更新 DNS IP 位址
- zones/ 後方的字串 → 您的 ZoneID:d95801613008c8b6d131a3ff72d7e4be
- dns_records/ 後方的字串 → 您的 RecordID:e3ff3df73968e2c423577e0a21f2eb97
- Bearer 後方的字串 → 您的 API Token:L01u13czcFZ8Wd2_3cWmxxex0qZXTKPEymW_6w8T
- name 後方的字串 → 您的域名:bugtest.us.kg
- content 後方的字串 → 您的外部 IP 位址:114.25.133.1
透過下面的命令更新 IP 資訊
curl -X PUT "https://api.cloudflare.com/client/v4/zones/d95801613008c8b6d131a3ff72d7e4be/dns_records/e3ff3df73968e2c423577e0a21f2eb97" \ -H "Authorization: Bearer L01u13czcFZ8Wd2_3cWmxxex0qZXTKPEymW_6w8T" \ -H "Content-Type: application/json" \ --data '{"type":"A","name":"bugtest.us.kg","content":"114.25.133.1","ttl":120,"proxied":false}' \ | python -m json.tool
- zones/ 後方的字串 → 您的 ZoneID:d95801613008c8b6d131a3ff72d7e4be
- dns_records/ 後方的字串 → 您的 RecordID:9398c983e25cdaa1c47973e851b12307
- Bearer 後方的字串 → 您的 API Token:L01u13czcFZ8Wd2_3cWmxxex0qZXTKPEymW_6w8T
- name 後方的字串 → 您的域名:www.bugtest.us.kg
- content 後方的字串 → 您的外部 IP 位址:114.25.139.242
透過下面的命令更新 IP 資訊
curl -X PUT "https://api.cloudflare.com/client/v4/zones/d95801613008c8b6d131a3ff72d7e4be/dns_records/9398c983e25cdaa1c47973e851b12307" \ -H "Authorization: Bearer L01u13czcFZ8Wd2_3cWmxxex0qZXTKPEymW_6w8T" \ -H "Content-Type: application/json" \ --data '{"type":"A","name":"www.bugtest.us.kg","content":"114.25.139.242","ttl":120,"proxied":false}' \ | python -m json.tool
自動更新 IP 腳本
使用 Cloudflare API 自動更新 DNS IP 的腳本
透過 Shell Script 利用 Crontab 排程執行,就可以自動更新主機的動態 IP,實現自動化的 Cloudflare DDNS 功能。
- 自動更新 IP 腳本 (bugtest.us.kg)
cf-ddns-root.sh#!/bin/bash # 設定變數 CF_TOKEN="L01u13czcFZ8Wd2_3cWmxxex0qZXTKPEymW_6w8T" # Cloudflare API Token CF_ZONE_ID="d95801613008c8b6d131a3ff72d7e4be" # Cloudflare ZoneID CF_RECORD_ID="e3ff3df73968e2c423577e0a21f2eb97" # Cloudflare RecordID DDNS_NAME="bugtest.us.kg" # 要更新的域名 # 獲取目前「外部IP」和「DNS記錄IP」 InternetIP=$(curl -s http://ipv4.icanhazip.com | tr -d '\n') # Cloudflare Proxy 取消時使用 # DNS_RecordIP=$(host "$DDNS_NAME" | grep "has address" | awk '{print $NF}') # Cloudflare Proxy 取消或啟用時都可使用 DNS_RecordIP=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$CF_ZONE_ID/dns_records/$CF_RECORD_ID" \ -H "Authorization: Bearer $CF_TOKEN" \ -H "Content-Type: application/json" | jq -r '.result.content') # 如果兩個IP不同,就更新「DNS記錄」,"ttl":1 表示自動(Auto) if [ "$InternetIP" != "$DNS_RecordIP" ]; then echo "Updating IP from $DNS_RecordIP to $InternetIP" curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$CF_ZONE_ID/dns_records/$CF_RECORD_ID" \ -H "Authorization: Bearer $CF_TOKEN" \ -H "Content-Type: application/json" \ --data '{"type":"A","name":"'$DDNS_NAME'","content":"'$InternetIP'","ttl":1,"proxied":true}' \ | grep -q '"success":true' && echo "Update successful" || echo "Update failed" else echo "No update needed. Current IP: $InternetIP" fi
變更檔案權限成可執行 (cf-ddns-root.sh)
chmod +x cf-ddns-root.sh
- 自動更新 IP 腳本 (www.bugtest.us.kg)
cf-ddns-www.sh#!/bin/bash # 設定變數 CF_TOKEN="L01u13czcFZ8Wd2_3cWmxxex0qZXTKPEymW_6w8T" # Cloudflare API Token CF_ZONE_ID="d95801613008c8b6d131a3ff72d7e4be" # Cloudflare ZoneID CF_RECORD_ID="9398c983e25cdaa1c47973e851b12307" # Cloudflare RecordID DDNS_NAME="www.bugtest.us.kg" # 要更新的域名 # 獲取目前「外部IP」和「DNS記錄IP」 InternetIP=$(curl -s http://ipv4.icanhazip.com | tr -d '\n') # Cloudflare Proxy 取消時使用 # DNS_RecordIP=$(host "$DDNS_NAME" | grep "has address" | awk '{print $NF}') # Cloudflare Proxy 取消或啟用時都可使用 DNS_RecordIP=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$CF_ZONE_ID/dns_records/$CF_RECORD_ID" \ -H "Authorization: Bearer $CF_TOKEN" \ -H "Content-Type: application/json" | jq -r '.result.content') # 如果兩個IP不同,就更新「DNS記錄」,"ttl":1 表示自動(Auto) if [ "$InternetIP" != "$DNS_RecordIP" ]; then echo "Updating IP from $DNS_RecordIP to $InternetIP" curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$CF_ZONE_ID/dns_records/$CF_RECORD_ID" \ -H "Authorization: Bearer $CF_TOKEN" \ -H "Content-Type: application/json" \ --data '{"type":"A","name":"'$DDNS_NAME'","content":"'$InternetIP'","ttl":1,"proxied":true}' \ | grep -q '"success":true' && echo "Update successful" || echo "Update failed" else echo "No update needed. Current IP: $InternetIP" fi
變更檔案權限成可執行 (cf-ddns-www.sh)
chmod +x cf-ddns-www.sh
- 排程 每30分鐘 執行腳本
sudo vim /etc/crontab*/30 * * * * root /root/ddns/cf-ddns-root.sh >/dev/null 2>&1 & */30 * * * * root /root/ddns/cf-ddns-www.sh >/dev/null 2>&1 &
網站主機 DNS 設定
- 在自己的網站主機上修改設定檔
將 DNS 指向 Cloudflare 的 DNS 伺服器sudo vim /etc/netplan/50-cloud-init.yaml
- 增加 DNS 設定
找到 nameservers,將 addresses 設定成 Cloudflare 的 DNS 伺服器- 1.1.1.1 是 Cloudflare 的 DNS 主要伺服器
- 1.0.0.1 是 Cloudflare 的 DNS 備用伺服器
network: ethernets: eth0: dhcp4: true dhcp6: false nameservers: addresses: - 1.1.1.1 - 1.0.0.1 version: 2
- 套用網路設定
sudo netplan apply
- DNS 伺服器修改設定
# 備份舊設定檔 sudo cp /etc/resolv.conf /etc/resolv.conf.bak # 使用軟連結替換,將 /etc/resolv.conf 指向 Systemd-resolved 完整的DNS設定檔 sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf # 驗證設定 cat /etc/resolv.conf # 重啟網路服務 sudo systemctl restart systemd-resolved
DNS 伺服器設定-修改前後對照
結語
透過本教學的步驟說明,可以將 US.KG 免費域名與 Cloudflare 的進階功能結合,建立起一個完整的動態域名解決方案,從域名申請到 DNS 託管,再到自動化IP更新的機制,每個環節都經過精心設定,確保系統能夠穩定運作。
特別是透過 Cloudflare API 實現的 DDNS 功能,讓使用者能夠輕鬆克服動態IP帶來的存取困擾,這套解決方案不僅完全免費,更提供了包含 SSL 加密、CDN 加速等進階的功能,為個人使用者和小型專案提供了專業級的網域名稱服務,透過定期的自動更新機制,您的服務可以持續穩定運作,為後續的應用開發和部署奠定堅實的基礎。