Cloudflare DDNS 脚本 包含 Merlin 梅林支持
如果家里有可以一直开机的主机设备(比如树莓派),通过拨号网络为自己或者外网提供一些有限的服务,还是蛮有意思的。
Cloudflare 提供免费且功能强大的 DNS 及 CDN 服务,甚至提供非常方便的共享 SSL 证书。通过它,可以一定程度上保护家里提供服务的主机。在网络通畅、服务接口正常的前提下,还可以起到加速及分流的效果。但 Cloudflare 没有直接支持 DDNS 功能,虽然理论上梅林内置的 DDNS 功能中可以通过 DNS-O-Matic 的第三方服务支持 Cloudflare,但貌似不好用。所以找了一些相关的文章,通过脚本的方式实现动态 DNS 更新。
在开始以前需要注意的是:
在 Cloudflare 中选择主域名,并在 DNS 功能中添加需要设定 DDNS 的子域名 A 记录,初始记录可以写 127.0.0.1 或者其它任何 IP。
在本地 Shell 里面执行以下命令:
如果参数输入都正确的话,会返回一段 JSON 格式的代码,选择 需要动态更新 DNS 记录的子域名,并记录对应的 rec_id 和 name 。(找一个 JSON 格式化工具看会更方便点。)
登录需要运行 DDNS 的主机(梅林路由器或Linux服务器),新建脚本 ddns_cloudflare.sh 。如果是梅林,可以新建在 /jffs/scripts/ 目录中。
内容如下:
CloudFlare_API_Key 为 API Key;
CloudFlare_Email_Address 为注册邮箱;
CloudFlare_Zone 为主域名;
CloudFlare_Record_ID 为 JSON 中对应记录的 rec_id;
CloudFlare_Record_Type 为 A,也可以是 CNAME、AAAA、MX、SRV 等;
CloudFlare_Record_Name 需要 DDNS 的子域名,如 www 。
为 ddns_cloudflare.sh 获得执行权限:
新建以上脚本中的文本文件:
对于其它 Linux主机,用 crontab -e 添加以下定时任务即可(60分钟执行一次):
对于梅林路由器,由于 Merlin 系统会重置 crontab 中的定时任务,所以我通过另外一个脚本,让梅林路由器在每次连接网络的时候都能重新写入 crontab,以保证定时任务有效。
先在 /jffs/configs/ 目录中建立一个标准的 crontab 文件,比如起名叫 ddns_cloudflare,内容如下:
然后在 /jffs/scripts/ 目录中建立一个脚本,比如叫 copy_cloudflare,内容如下:
为 copy_cloudflare.sh 获得执行权限:
最后,在梅林路由器管理界面:Tools > Script 中添加 WAN-START 类型的脚本,填写脚本绝对路径:
/jffs/scripts/copy_cloudflare
这样,每次路由器连接 WAN 的时候,都会重新添加定时任务。重启后可以用 cru l 检查定时任务是否有效。
参考链接:
為 Cloudflare 設定動態 DNS (DDNS)
HowTo: Persistent Crontabs with AsusWRT Merlin
get-my-ip.sh
Cloudflare API
Which ports will Cloudflare work with?
Cloudflare 提供免费且功能强大的 DNS 及 CDN 服务,甚至提供非常方便的共享 SSL 证书。通过它,可以一定程度上保护家里提供服务的主机。在网络通畅、服务接口正常的前提下,还可以起到加速及分流的效果。但 Cloudflare 没有直接支持 DDNS 功能,虽然理论上梅林内置的 DDNS 功能中可以通过 DNS-O-Matic 的第三方服务支持 Cloudflare,但貌似不好用。所以找了一些相关的文章,通过脚本的方式实现动态 DNS 更新。
在开始以前需要注意的是:
- 用来更新 DDNS 的主机或者路由器需要能够获取到公网 IP;
- Cloudflare 的 CDN 功能仅支持 http/https 请求,且只能支持部分端口;
- Cloudflare 虽然有不少国内 CDN 节点,但国内节点只支持 80/443 端口;
- 大部分省份的 ISP 都封锁了 80/443 端口,所以以上两条是死循环。
第一步:Cloudflare后台设置
在 Cloudflare 中选择主域名,并在 DNS 功能中添加需要设定 DDNS 的子域名 A 记录,初始记录可以写 127.0.0.1 或者其它任何 IP。
第二步:获得 Cloudflare API 中的相关信息
在本地 Shell 里面执行以下命令:
curl https://www.cloudflare.com/api_json.html \
-d 'a=rec_load_all' \
-d 'tkn=Cloudflare_API_Key' \
-d 'email=Cloudflare_Email' \
-d 'z=Cloudflare_Domain'
如果参数输入都正确的话,会返回一段 JSON 格式的代码,选择 需要动态更新 DNS 记录的子域名,并记录对应的 rec_id 和 name 。(找一个 JSON 格式化工具看会更方便点。)
第三步:建立从主机更新 Cloudflare DNS 记录的脚本
登录需要运行 DDNS 的主机(梅林路由器或Linux服务器),新建脚本 ddns_cloudflare.sh 。如果是梅林,可以新建在 /jffs/scripts/ 目录中。
vi /jffs/scripts/ddns_cloudflare.sh
内容如下:
#!/bin/sh
NEW_IP=`curl -s http://ifconfig.me/ip`
CURRENT_IP=`cat /jffs/configs/current_ip.txt`
if [ "$NEW_IP" = "$CURRENT_IP" ]
then
echo "No Change in IP Adddress"
else
curl https://www.cloudflare.com/api_json.html \
-d 'a=rec_edit' \
-d 'tkn=Cloudflare_API_Key' \
-d 'email=Cloudflare_Email_Address' \
-d 'z=CloudFlare_Zone' \
-d 'id=CloudFlare_Record_ID' \
-d 'type=CloudFlare_Record_Type' \
-d 'name=CloudFlare_Record_Name' \
-d 'ttl=1' \
-d "content=$NEW_IP"
echo $NEW_IP > /jffs/configs/current_ip.txt
fi
CloudFlare_API_Key 为 API Key;
CloudFlare_Email_Address 为注册邮箱;
CloudFlare_Zone 为主域名;
CloudFlare_Record_ID 为 JSON 中对应记录的 rec_id;
CloudFlare_Record_Type 为 A,也可以是 CNAME、AAAA、MX、SRV 等;
CloudFlare_Record_Name 需要 DDNS 的子域名,如 www 。
为 ddns_cloudflare.sh 获得执行权限:
chmod +x ddns_cloudflare.sh
新建以上脚本中的文本文件:
touch /jffs/configs/current_ip.txt
第四步:建立定时任务执行脚本
对于其它 Linux主机,用 crontab -e 添加以下定时任务即可(60分钟执行一次):
*/60 * * * * /jffs/scripts/ddns_cloudflare.sh
对于梅林路由器,由于 Merlin 系统会重置 crontab 中的定时任务,所以我通过另外一个脚本,让梅林路由器在每次连接网络的时候都能重新写入 crontab,以保证定时任务有效。
先在 /jffs/configs/ 目录中建立一个标准的 crontab 文件,比如起名叫 ddns_cloudflare,内容如下:
*/60 * * * * /jffs/scripts/ddns_cloudflare.sh
然后在 /jffs/scripts/ 目录中建立一个脚本,比如叫 copy_cloudflare,内容如下:
cp /jffs/configs/ddns_cloudflare /var/spool/cron/crontabs/admin
为 copy_cloudflare.sh 获得执行权限:
chmod +x copy_cloudflare
最后,在梅林路由器管理界面:Tools > Script 中添加 WAN-START 类型的脚本,填写脚本绝对路径:
/jffs/scripts/copy_cloudflare
这样,每次路由器连接 WAN 的时候,都会重新添加定时任务。重启后可以用 cru l 检查定时任务是否有效。
参考链接:
為 Cloudflare 設定動態 DNS (DDNS)
HowTo: Persistent Crontabs with AsusWRT Merlin
get-my-ip.sh
Cloudflare API
Which ports will Cloudflare work with?