Cloudflare DDNS¶
概述¶
Cloudflare DDNS 係一套用嚟將動態公網 IP 自動同步到 Cloudflare DNS A 記錄嘅機制。對於喺屋企或者香港辦公室自托管嘅服務,如果寬頻供應商提供嘅係動態 IP,一旦 IP 轉咗,域名解析就會指錯位置。
呢個部署用 favonia/cloudflare-ddns:latest 鏡像,喺 Docker 入面定期偵測目前公網 IPv4,同 Cloudflare DNS 記錄比對,唔一致就經 API 更新。配合 PROXIED=false,DNS 記錄保持灰色雲朵(grey cloud)直連,做到「域名指向屋企真實 IP,但唔經過 Cloudflare 代理」。
本條目係根據 wiki.benhoweb.com 實際 Docker Compose(節選)整理,適用於一般 Dynamic DNS 場景;如果搵唔到真 IP,或者想隱藏來源伺服器,就應該改用 cloudflare-tunnel。
架構¶
容器運作流程如下:
- 每次更新週期(
@every 10m)開始,容器透過出站 HTTPS 向 IP 偵測服務查詢當前公網 IP。 - 讀取
DOMAINS入面指定嘅 A 記錄現有目標。 - 如果偵測到嘅 IP 同 DNS 記錄唔同,就帶住
CF_API_TOKEN呼叫 Cloudflare API 更新 DNS 記錄。 IP6_PROVIDER=none表示完全唔處理 IPv6,只同步 IPv4 A record。PROXIED=false令 Cloudflare 只做解析、唔代理流量;所以用戶連線係直達 origin server,適合需要保留真實用戶 IP 嘅服務,例如 VoIP、遊戲伺服器或者 litellm API endpoint。
本機實況:鏡像係 favonia/cloudflare-ddns:latest,容器名 cloudflare-ddns。Compose 冇特別指名 network,所以容器用 Docker 預設 bridge。只要容器出站能連到 api.cloudflare.com 同 IP provider 就得。呢個 compose 亦冇 cf_network 配置,即係話呢個容器唔會行 Cloudflare Tunnel 數據面;Cloudflare API 只係控制面,實際內容流量唔會入 Cloudflare edge。
部署¶
部署好簡單,大約四步:
- 去 Cloudflare Dashboard 建立 API Token,權限揀 Zone > DNS > Edit,Zone resources 揀你要更新嘅域名。
- 喺 docker compose 同一個目錄建立
.env:
CF_API_TOKEN=your_token
DOMAINS=dynamic.wiki.benhoweb.com
- 將 compose 片段放入
docker-compose.yml,執行docker compose up -d。 - 檢查日誌:
docker logs -f cloudflare-ddns
呢度特別提一句:.env 入面唔好寫死公網 IP,因為 DDNS 嘅重點就係由容器每次動態偵測。如果 DOMAINS 有多過一個子網域,可以用逗號分隔;但呢個 setup 只同步一個 A record。
配置¶
逐項解說 compose 入面嘅環境變數:
CF_API_TOKEN:必須有 DNS edit 權限,唔好用 Global API Key。Token 要放.env,由${CF_API_TOKEN}參考。DOMAINS:要同步嘅 A 記錄域名,例如dynamic.wiki.benhoweb.com。PROXIED=false:灰色雲朵直連。如果改成true,會變成橙色雲朵(Cloudflare 代理),隱藏 origin IP,但同時要確保伺服器支援經 Cloudflare 回源。UPDATE_CRON=@every 10m:每十分鐘檢查一次。太密會增加 API call,太疏會令 IP 轉咗之後 downtime 拉長。TZ=Asia/Hong_Kong:令容器日誌顯示香港時間,方便排錯。IP6_PROVIDER=none:完全停用 IPv6 偵測。如果日後寬頻派 IPv6,想同步 AAAA 記錄,就要改做ipify等 provider。
要留意:如果伺服器喺 1:1 NAT 後面,容器偵測到嘅可能係 router WAN IP;如果 ISP 派 CGNAT IP(例如 100.64.0.0/10),DDNS 更新咗都冇意義,因為 port forwarding 根本到唔到。
維運與監控¶
日常維運要留意以下幾點:
- 確認同步成功:
docker logs cloudflare-ddns如果出現The record is up to date或者類似嘅訊息就正常;出現 HTTP 4xx 就要檢查 token 同 zone 設定。 - DNS 生效時間:Cloudflare DNS 一般好快,但都要視乎 TTL。如果呢個 A record 用嚟做 production,建議 TTL 校到
Auto或者短啲(例如 300 秒)。 - 容器狀態:
docker compose ps要見到Up,如果 restart loop,就睇docker inspect或者日誌。restart: always確保 server reboot 後自動拉返起個容器。 - Token 安全:
.env記得chmod 600;如果懷疑洩漏,即刻去 Cloudflare Dashboard revoke 再換新。 - 同其他服務配合:如果同一部主機行緊 docker 上嘅 litellm 或 cloudflare-tunnel,要小心唔好撞 port。DDNS 容器本身唔 listen port,只係做更新,但 backend 服務嘅 firewall 要只開放必要 port。
常見問題¶
Q: 點解 logs 話 IP 已經更新,但 dig 出嚟仲係舊 IP?
答:可能 DNS TTL 未過,或者 DOMAINS 入面個域名唔係 Cloudflare 呢個 zone 嘅 record;亦可能係 client 嘅 DNS cache。等幾分鐘再試。
Q: 可以唔用 PROXIED=false 嗎?
答:可以。true 會令 Cloudflare proxy HTTP/HTTPS,隱藏 origin IP,但你嘅服務必須允許 Cloudflare 回源,而且唔係所有 TCP/UDP 協議都支援。呢個 compose 揀 false,就係為咗保持直連同「灰色雲朵」。
Q: 明明有公網 IPv6,點解唔同步?
答:因為 IP6_PROVIDER=none。如果你需要,可以設定 IP6_PROVIDER=ipify,並確保 DOMAINS 有對應 AAAA record;否則唔好亂開,會令容器嘗試 IPv6 而增加複雜度。
Q: 如果 set PROXIED=true,係咪等於 cloudflare-tunnel?
答:唔係。DDNS + PROXIED=true 仍然需要你有公開 port 同真實 IP;Cloudflare Tunnel 係由主機主動向外建立隧道,唔需要 public inbound port。想架構更安全,應該直接用 cloudflare-tunnel。
相關鏈接¶
- docker
- litellm
- cloudflare-tunnel
- 反向代理
- 動態 DNS
來源¶
自動生成(2026-08-19 容器覆蓋率補完第二批)