前言
用途:註冊和管理網域名稱,整合 Cloudflare 提供的安全性和加速服務,提升網站效能及保護網站免受攻擊。
實做:使用 Cloudflare API 實現 Cloudflare DDNS (動態域名系統),通過 API 來自動更新 DNS 記錄,使域名始終指向正確的動態 IP。
隨著雲端服務和網路應用的普及,選擇合適的網域管理平台變得越來越重要,Cloudflare 作為業界領先的網路基礎設施服務商,提供了全方位的網域管理解決方案,包括成本透明的網域註冊服務、強大的內容分發網路(CDN)和完整的安全防護機制。
透過 Cloudflare 一站式管理平台,使用者不僅能以合理的價格購買和管理網域,更可享有免費的 SSL/TLS 加密、DDoS 防護等進階功能。本教學將介紹 Cloudflare 付費網域的購買流程、託管設定,以及如何透過 API 實現 DDNS 功能,協助您建立一個安全且高效能的網路服務環境。
Cloudflare 網域優點
- 強大的效能與速度優化
- 全球 CDN 支援:Cloudflare 提供強大的內容分發網路(CDN),可以加快全球連線速度。
- 快速 DNS:Cloudflare 的 DNS 是業界最快之一,解析速度極快,有助於提高網站的回應速度。
- 高水平的安全性
- 內建 DDoS 防護:自動攔截大規模攻擊,保護網站免受惡意流量影響。
- 免費 SSL/TLS 加密:輕鬆啟用 HTTPS,提升網站安全性和 SEO 排名。
- 防火牆規則:提供靈活的防火牆設定,保護網站免受常見攻擊。
- 簡單的網域管理
- 一站式管理:Cloudflare 提供網域註冊、DNS 設定、SSL/TLS、效能優化等功能集中管理,簡化運營。
- 價格透明:註冊網域時無隱藏費用,續費價格也相對穩定。
- 免費的 WHOIS 隱私保護:隱藏個人資訊,防止垃圾郵件和隱私洩露。
- 適合開發者的功能
- API 支援:開發者可以通過 API 自動化管理網域和其他服務。
- Workers:提供無伺服器運算功能,可在邊緣網路上執行應用程式邏輯。
- 穩定的技術支援
- 免費計劃提供基礎支援,高級付費方案可獲得更快速、專業的客戶服務。
Cloudflare 網域缺點
- 網域選擇範圍有限
- TLD 限制:Cloudflare 提供的頂級網域(TLD)選擇有限,可能無法找到某些特定後綴。
- 進階功能需要付費
- 雖然基礎功能免費,但高級安全規則、防火牆功能、高階效能優化(如圖片優化、負載均衡)需要額外收費。
- 較適合具技術背景的用戶
- Cloudflare 的平台與功能介面偏向技術型用戶,初學者可能需要時間學習使用。
- 沒有提供郵件服務
- Cloudflare 不包含內建的電子郵件主機功能,需要自行設定第三方郵件服務(如 Google Workspace 或 Zoho Mail)。
- 依賴 Cloudflare 的基礎架構
- 如果所有服務都依賴於 Cloudflare,當機(雖然罕見)時可能會影響所有網站功能。
適合使用 Cloudflare 的情境
- 網站需要全球連線且需要高效能(如 CDN 和 DNS 快速回應)。
- 對網站安全性有高要求(DDoS 防護、SSL 加密)。
- 希望集中管理網域並簡化操作流程。
- 適合對技術有一定了解,或需要可擴展性的開發者。
Cloudflare 網域購買
- 進入 Cloudflare 官網,點選右上角「登入」
- 建議啟用「雙因素驗證」,點選左側「管理帳號」,在右邊設定雙因素驗證,點選「您的帳戶」連結
- 點選左側「網域註冊」,再點選下方「註冊網域」,在右邊「搜尋網域名稱」輸入您想要註冊的網域名稱,可以輸入 example.com 或是 example,然後點選右方的「搜尋」
example.com 會檢查此網域是否被註冊過
example 會提供此名稱可以註冊的相關網域後綴
- 搜尋後會列出可以購買和建議的網域名稱價格(美金/年)、續訂價格(美金/年),若確認無誤就可以點選右方的「購買」
- Cloudflare 的優點是購買網域的價格每年固定,所以可以先選擇一年,之後再自動續約
- 填寫註冊者和付款資訊 (必須使用英文),姓名、電話、地址、郵遞區號、信用卡或PayPal,可視情況「勾選」啟用自動續約,帳單地址同上,帳戶類型選擇「個人」(Personal),輸入完成後點選下方的「驗證地址」
- 出現「全部完成」的訊息,若您有「勾選」啟用自動續約,Cloudflare 將在註冊到期前 60 天自動續訂您的註冊
Cloudflare 結帳時會有 5% 的稅,若結帳價格總計是 10.44 美元/年,實際價格需乘上1.05,也就是 10.962 美元/年,約 357 新台幣/年
- 點選左側的「網域註冊」→「管理網域」,在右邊可以「開啟」或「關閉」自動續訂的功能
託管到 Cloudflare
點選左側的「網站」,再點選右側的域名,就可以開始使用 Cloudflare 的免費服務
Cloudflare 設定檢查
- 點選左側的「網站」,再點選右側的域名
- 上方域名的狀態顯示「使用中」,表示已經成功將域名託管到 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。
建置步驟
- 獲取 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)
Cloudflare API 呼叫測試
• Bearer 後方的字串 → 您的 API Token
如果呼叫成功會收到 JSON Success response
API Token:L01u13czcFZ8Wd2_3cWmxxex0qZXTKPEymW_6w8Tcurl -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') DNS_RecordIP=$(host "$DDNS_NAME" | grep "has address" | awk '{print $NF}') # 如果兩個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.shl
- 自動更新 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') DNS_RecordIP=$(host "$DDNS_NAME" | grep "has address" | awk '{print $NF}') # 如果兩個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
修改前後對照
結語
透過本文的完整教學,可以從 Cloudflare 網域購買、DNS 託管到 DDNS 功能實作,建立一個專業的網域管理環境。Cloudflare 提供的服務不僅在價格上具有優勢,其強大的 CDN 網路、DNS 解析速度和多層次的安全防護,為網站提供了穩定且安全的基礎架構。
特別是透過 API 實現的 DDNS 功能,讓使用動態 IP 的用戶也能建立可靠的網路服務。雖然在某些進階功能上需要付費升級,但以基礎建設和安全防護而言,Cloudflare 已經提供了相當完整的免費功能,是個人用戶和小型企業架設網路服務的理想選擇。