之前的那篇 使用CloudFlare做DDNS解析(Global API)操作起来很方便,但是使用 Global API KEY 始终让我感觉很危险,所以这里我们使用 API Token(API 令牌)来实现,更加安全。
通过10几个小时的研究,参考了几篇文章,我发现原来的脚本只要稍作修改就能以 API Token 的方式实现 DDNS。
所以整体流程为:
- 设置DNS解析到Cloudflare;
- 申请 API Token;
- 下载我修改好的脚本,填入对应的参数;
- 设置定时运行脚本。
DNS解析到Cloudflare这个就不再说了,可见前一篇DDNS文章。
申请API Token
Cloudflare 页面点击右上角 我的个人资料——API 令牌(或直接访问 https://dash.cloudflare.com/profile/api-tokens),开始申请:
下载修改的DDNS 脚本
wget -N --no-check-certificate http://pikachu.im/script/cf-v4-ddns-API-Token.sh && chmod +x cf-v4-ddns-API-Token.sh
这里我们把脚本下载到 root 目录
编辑 DDNS 脚本,填写相关参数
vi cf-v4-ddns-API-Token.sh
# 这里填写刚才获取的API Token
CFKEY=
# 填写登陆CF的邮箱
CFUSER=
#这里填写解析用来DDNS解析的根域名 eg: example.com,比如我的域名是123.com,那么此处填写123.com
CFZONE_NAME=
#这里填写解析用来DDNS解析的子域名 eg: a.example.com
CFRECORD_NAME=
如图填写:
保存退出后执行:
./cf-v4-ddns-API-Token.sh
如果有 success 等字样就是成功了。
这个脚本会记录每次的数据,如果执行后发现 IP 没有变化,不会更新。
脚本我进行了小小的修改,取消了对 Global API KEY 的依赖。因个人水平,可能脚本存在问题,请谨慎使用。
原作者的地址为:https://raw.githubusercontent.com/yulewang/cloudflare-api-v4-ddns/master/cf-v4-ddns.sh
设置定时任务
上一篇里面已经有了这个内容,这里还是再展示一下:
输入 crontab -e
,在文件里面添加一行:
*/2 * * * * /root/cf-v4-ddns-API-Token.sh >/dev/null 2>&1
如果需要日志文件,上述代码请替换成下面代码
*/2 * * * * /root/cf-v4-ddns-API-Token.sh >> /var/log/cf-ddns.log 2>&1
另一个精简脚本
后来还发现了简单型的脚本:
#!/bin/sh NEW_IP=`curl -s http://ipv4.icanhazip.com` CURRENT_IP=`cat ~/tmp/current_ip.txt` CURRENT_TIME=$(date +"%F %T") DDNS="ddns.huanyichuang.com" ZONE_ID="" API_TOKEN="" RECORD_ID="" if [ "$NEW_IP" = "$CURRENT_IP" ] then echo "[$CURRENT_TIME] No Change in IP Adddress" >> ~/tmp/crontab_log.txt else curl -X PUT "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$RECORD_ID" \ -H "Authorization: Bearer $API_TOKEN" \ -H "Content-Type: application/json" \ --data '{"type":"A","name":"'$DDNS'","content":"'$NEW_IP'","ttl":1,"proxied":false}' > /dev/null echo $NEW_IP > ~/tmp/current_ip.txt echo "[$CURRENT_TIME] IP changed to $NEW_IP" >> ~/tmp/crontab_log.txt fi
作者:https://huanyichuang.com/blog/create-ddns-with-cloudflare-api-v4/
这个脚本特别简单(代码少),也是会进行简单的本地数据记录,执行时会进行对比,有更改就会执行更新,没有更改就提示后退出。这个脚本可作为参考。
只是其中的几个参数需要自己获取。可见后面的附录。
附录
cloudflare另外2个关键的KEY:Zone ID、Record ID 的获取方法。
Zone ID
点击我们用来做DDNS解析的域名,进入域名的概述页面,右下角就能查看到 Zone ID(区域 ID)。
Record ID
Record ID 代表一个记录,利用子域名生成可与子域名绑定。(之前我以为 Record ID是全局的、类似 Zone ID的参数,可以反复在各个子域名使用,结果导致各个子域名的解析互相覆盖。。。困惑了我很久。现在明白了,利用下面的方式可生成与你子域名绑定的 Record ID)
用 Zone ID + 子域名 + API Token 可以获取 Record ID
在终端输入下面的命令即可获取 Record ID:
curl -X GET "https://api.cloudflare.com/client/v4/zones/$CFZONE_ID/dns_records?name=$CFRECORD_NAME" \ -H "Authorization: Bearer $CFKEY" \ -H "content-type: application/json"
如下图:
感谢 原来是放在header字段里使用自定义令牌