二、準備工作:Cloudflare 配置與 API 權限管理

2.1 注冊 Cloudflare 并添加域名

  1. 注冊 Cloudflare 賬號
  2. 添加已有域名(例如 yourdomain.com
  3. 設置 NS 記錄至 Cloudflare 提供的解析服務器
  4. 等待 DNS 生效后,即可使用 API 管理 DNS 記錄

2.2 獲取 API Token(推薦方式)

前往 API Tokens 頁面:

> ?? 避免使用全局 API Key,限制權限更安全


三、Cloudflare DNS API 核心概念

使用 DDNS 前,我們需要了解 3 個基本參數:

參數名 說明
Zone ID Cloudflare 分配給域名的唯一標識
Record ID 子域名(A 記錄)在 Cloudflare 中的 ID
API Token 授權調用 DNS 接口的密鑰

你可以通過如下 API 獲取這些信息:

獲取 Zone ID

curl -X GET "https://api.cloudflare.com/client/v4/zones?name=yourdomain.com" \
  -H "Authorization: Bearer $CF_API_TOKEN" \
  -H "Content-Type: application/json"

獲取 DNS Record ID

curl -X GET "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records?type=A&name=sub.yourdomain.com" \
  -H "Authorization: Bearer $CF_API_TOKEN" \
  -H "Content-Type: application/json"

四、實現動態更新邏輯(Bash 腳本)

以下腳本實現:

#!/bin/bash

CF_API_TOKEN="你的API密鑰"
ZONE_ID="你的Zone ID"
RECORD_ID="你的DNS記錄ID"
RECORD_NAME="sub.yourdomain.com"

# 獲取當前公網 IP
CURRENT_IP=$(curl -s https://api.ipify.org)

# 獲取現有 A 記錄 IP
DNS_IP=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$RECORD_ID" \
  -H "Authorization: Bearer $CF_API_TOKEN" \
  -H "Content-Type: application/json" | jq -r '.result.content')

# 若 IP 變化,更新記錄
if [ "$CURRENT_IP" != "$DNS_IP" ]; then
  echo "IP changed: $DNS_IP → $CURRENT_IP. Updating..."
  curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$RECORD_ID" \
    -H "Authorization: Bearer $CF_API_TOKEN" \
    -H "Content-Type: application/json" \
    --data "{\"type\":\"A\",\"name\":\"$RECORD_NAME\",\"content\":\"$CURRENT_IP\",\"ttl\":120}"
else
  echo "IP unchanged: $CURRENT_IP"
fi

> ? 支持設置為 cron 定時任務,每 5 分鐘運行一次,持續保持域名可達


五、Python 實現 DDNS 更新

Python 實現更加靈活,適合日志處理、異常重試、Webhook 推送等場景:

import requests
import os

API_TOKEN = os.getenv("CF_API_TOKEN")
ZONE_ID = os.getenv("CF_ZONE_ID")
RECORD_ID = os.getenv("CF_RECORD_ID")
RECORD_NAME = "sub.yourdomain.com"

def get_public_ip():
    return requests.get("https://api.ipify.org").text.strip()

def get_dns_ip():
    url = f"https://api.cloudflare.com/client/v4/zones/{ZONE_ID}/dns_records/{RECORD_ID}"
    headers = {"Authorization": f"Bearer {API_TOKEN}"}
    res = requests.get(url, headers=headers).json()
    return res["result"]["content"]

def update_dns(ip):
    url = f"https://api.cloudflare.com/client/v4/zones/{ZONE_ID}/dns_records/{RECORD_ID}"
    headers = {"Authorization": f"Bearer {API_TOKEN}", "Content-Type": "application/json"}
    data = {
        "type": "A",
        "name": RECORD_NAME,
        "content": ip,
        "ttl": 120
    }
    res = requests.put(url, headers=headers, json=data)
    return res.json()

if __name__ == "__main__":
    current_ip = get_public_ip()
    dns_ip = get_dns_ip()
    if current_ip != dns_ip:
        print(f"IP changed: {dns_ip} → {current_ip}")
        update_dns(current_ip)
    else:
        print("IP unchanged.")

六、部署自動化更新任務

6.1 使用 cron 定時執行腳本(Linux/Mac)

crontab -e

添加如下條目:

*/5 * * * * /home/user/ddns_update.sh > > /var/log/ddns.log 2 > &1

6.2 Docker 容器化部署(推薦)

可將 DDNS 腳本打包為 Docker 鏡像,部署在樹莓派、NAS、路由器、云主機等環境中:

FROM python:3.10
COPY ddns.py /app/
WORKDIR /app
RUN pip install requests
CMD ["python", "ddns.py"]

在 Uptime Kuma、OpenWRT、Home Assistant 中均有集成方式


七、常見問題與排查指南

問題 排查建議
A 記錄未更新 確保 API Token 權限為 Zone.DNS Edit
Record ID 獲取失敗 檢查 type=Aname=sub.domain.com 參數是否正確
IP 檢測始終為空或錯誤 更換 IP 獲取接口,如 https://ifconfig.me
更新太頻繁被限流(429) 設置合適的運行間隔(建議 ≥ 300 秒)
DNS 更新但訪問失敗 檢查 ISP 是否封鎖 80/443 端口,或設置端口轉發

八、拓展與增強方案


九、總結與建議

通過 Cloudflare DNS API,我們可以輕松構建一個 高可用、零費用、可定制的 DDNS 動態域名解析服務。適用于家庭寬帶、辦公服務器、自建站點、IoT 設備遠程管理等場景。

上一篇:

如何通過 SerpAPI 獲取結構化搜索數據

下一篇:

如何通過 Cloudflare DNS API 實現自動化域名管理
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費