用 cURL 自動更新 Cloudflare IP 地址實現 DDNS

授權

這種涉及賬戶的請求肯定需要授權,首先登錄自己的 Cloudflare 帳號,然後在「My Profile」創建一個「API Token」(不是底下的 API Key 哦),並且加入 Zone.Zone, Zone.DNS 的權限。

然後就有 -H “Authorization: Bearer xxxxxxxx” 這個的用法了,下面只需要使用這個就好了。

獲得 ZoneID 和 Record ID

先拿到自己的所有的 Zones,找到自己對應域名的 Zone ID:

curl -X GET "https://api.cloudflare.com/client/v4/zones" -H "Authorization: Bearer xxxxxxxx"      -H "Content-Type:application/json"

然後找到對應的 Record 的 ID:

curl -X GET "https://api.cloudflare.com/client/v4/zones/<域名的 ZoneID>/dns_records" -H "Authorization: Bearer xxxxxxx"      -H "Content-Type:application/json"

修改 Record 解析

然後就可以通過如下來修改自己的 DNS 解析了,比如我希望修改 home.nova.moe 的解析爲 1.2.3.4,那麼可以這麼寫:

curl -X PUT "https://api.cloudflare.com/client/v4/zones/<域名的 ZoneID>/dns_records/<Record 的 ZoneID>" \
     -H "Authorization: Bearer xxxxxxx" \
     -H "Content-Type: application/json" \
     --data '{"type":"A","name":"home.nova.moe","content":"1.2.3.4","ttl":120,"proxied":false}'

連貫起來自動獲取公網 IP 並設置就是:

home_ip=$(curl ip.sb)
curl -X PUT "https://api.cloudflare.com/client/v4/zones/<域名的 ZoneID>/dns_records/<Record 的 ZoneID>" \
     -H "Authorization: Bearer xxxxxxx" \
     -H "Content-Type: application/json" \
     --data '{"type":"A","name":"home.nova.moe","content":"'$home_ip'","ttl":120,"proxied":false}'

注意上面 cURL 中的 $home_ip 是用 ‘(單引號)包裹的。

Cloudflare 對於 API 請求的限制如下:

The Cloudflare API sets a maximum of 1,200 requests in a five minute period.

https://api.cloudflare.com/#getting-started-requests

好,搞個 crontab 開跑,免費的 DDNS 成了。

References

  1. https://api.cloudflare.com/#dns-records-for-a-zone-update-dns-record