最近家里宽带有了动态公网IP,为了保证随时能连上家里的网,于是使用CF的API接口实现通过curl给域名定时更换IP。
首先把域名托管到Cloudflare,然后打开CF的“我的个人资料”,点击API令牌,创建一个令牌,直达链接。令牌模板选择“编辑区域DNS”。
为保证安全,对于令牌的权限尽可能满足最低要求,这里选择特定域名及设置令牌有效期,如果需要长期使用可以不选择有效期。
然后创建令牌,然后可以看到令牌已成功创建,要注意此令牌Token只显示一次,然后复制。
有了令牌后,首先第一步获取域名ID,这里我是用curl请求CF公开的JSON接口来找到ID。
# jq是一个json解析器,方便找到ID
# 可以 apt-get install jq 进行安装
# 可以不使用jq,ID在首行“id”里面
curl -s -X GET "https://api.cloudflare.com/client/v4/zones" -H "Authorization: Bearer 令牌Token" -H "Content-Type:application/json" | jq -r '.result[].id'
找到域名ID后,接下来找某个子域名ID,先在CF中创建一个子域名,如“ddns”,为了安全最好使用其他名称。类型如果是IPv4则选择A类型,IPv6则选择AAAA类型,IP地址内容随意,不进行CDN代理。然后再curl请求寻找需要DDNS的子域名ID。
# jq可以使用管道符筛选数据
curl -s -X GET "https://api.cloudflare.com/client/v4/zones/域名ID/dns_records" -H "Authorization: Bearer 令牌Token" -H "Content-Type:application/json" | jq -r '.result[] | {id:.id,name:.name}'
知道令牌Token、域名ID、子域名ID后,就可以写脚本更新当前动态IP到托管在CF中的域名了,然后配合crontab进行定时执行脚本更新信息。
#ttl值为1为自动TTL
#返回内容为True即更新成功
#获取IP的方式可自行修改,如通过网卡
#此脚本名字假设为 ddns-cloudflare.sh
#执行脚本更新IPv4:bash ddns-cloudflare.sh ipv4
update(){
if [[ "$1" == "ipv4" ]]; then
ipv4="$(curl -4 ip.sb)"
curl -X PUT "https://api.cloudflare.com/client/v4/zones/域名ID/dns_records/子域名ID" -H "Authorization: Bearer 令牌Token" -H "Content-Type:application/json" --data "{\"type\":\"A\",\"name\":\"子域名\",\"content\":\"$ipv4\",\"ttl\":1,\"proxied\":false}" | jq -r '.result.success'
elif [[ "$1" == "ipv6" ]]; then
ipv6="$(curl -6 ip.sb)"
curl -X PUT "https://api.cloudflare.com/client/v4/zones/域名ID/dns_records/子域名ID" -H "Authorization: Bearer 令牌Token" -H "Content-Type:application/json" --data "{\"type\":\"AAAA\",\"name\":\"子域名\",\"content\":\"$ipv6\",\"ttl\":1,\"proxied\":false}" | jq -r '.result.success'
fi
}
update $1
因为只使用curl来实现DDNS,所以找到PUT请求所需要的内容后,也可以在Windows/Openwrt/MacOS平台下实现定时更新。
不过现在也有比较成熟的DDNS项目了,只要配置好参数,保持后台运行就行了,比如ddns-go,支持多平台多域名服务商。
这个实在是玩不转
还好呀,主要是获取到几个认证值后面就不用动了