在光猫/软路由上使用 Cloudflare 的动态域名

发布时间: 2023-06-10

相信很多小伙伴对于动态域名已经很熟悉了,大多数光猫/路由器也都内置了 DDNS 功能。但是在使用过程中,好像总是有点掣肘,例如一些早期的光猫/路由器提供的 DDNS 功能只支持更新 IPv4 地址,由于移动宽带只提供公网的 IPv6 公网地址,DDNS 功能会无法使用。因此在两年前,我就写了两段简单的 DDNS 更新脚本,使用 DnsPod.cn 或 dynv6.com 动态域名完成 IPv4&IPv6 地址的更新。

现在看来,使用 DnsPod.cn 或 dynv6.com 动态域名仍然有一些不完美的地方,由于三大运营商都关闭了家庭宽带的 80 & 443 端口,如果想利用家庭宽带搭建一个 Blog ,或者将自己群晖里的内容分享给其他朋友使用时,总要在网址后面带上端口才可以访问。如果使用 Cloudflare.com 的动态域名,另外配合 Cloudflare Origin Rules 功能,即可完美解决上述问题。

一、获取域名的 Zone ID 和 API 令牌

1、登录 Cloudflare.com ,点击域名,我以 ifeng.xyz 这个域名为例。

1-DDNS-ZoneID-1.webp2、Copy 页面右下角的“区域 ID” ( Cloudflare_Zone_ID )备用,然后点击“获取您的 API 令牌” ( Cloudflare_API_Tokens ) 。

2-DDNS-ZoneID-2.webp3、点击“创建令牌”。

3-DDNS-Token-1.webp4、将页面拉到底部,点击“创建自定义令牌”。

4-DDNS-Token-2.webp5、如下图所示填入令牌名称,例如我填入了“dynamic”;权限选择 “区域” -> “DNS” ->“编辑” ;区域资源选择 “包含” -> “特定域名” ->“自己的域名(例如我选择 ifeng.xyz )” ,最后点击页面底部的“继续以显示摘要”。

5-DDNS-Token-3.webp6、点击“创建令牌”。

6-DDNS-Token-4.webp7、Copy “API 令牌” ( Cloudflare_API_Tokens )备用 。

7-DDNS-Token-5.webp二、登录光猫/软路由安装 DDNS 更新脚本

ddns_update.sh 脚本中有关 Cloudflare 域名记录更新的代码为 update_IP 函数中 24 行代码,其他代码主要用于获取光猫/软路由的公网 IPv4/IPv6 地址,同时检测 IP 地址是否发生变化,然后调用 update_IP 函数更新。如果对于特定的光猫/软路由,代码会写的更简单一些,例如使用类似“ip -6 addr list scope global pppoe | grep -v " fd" | sed -n 's/.*inet6 \([0-9a-f:]\+\).*/\1/p' | head -n 1”这样的命令来获取本机的 IPv6 地址,但是不同品牌的光猫/路由器由于固件版本不同,在建立 pppoe 链接后 interface 名称有所区别,为了脚本的通用性,这种方法不能使用,因此代码中的处理逻辑相对来说更复杂一点。当然,你可以根据自己光猫/路由器的情况自行修改代码,让代码更加简单高效。例如可以使用 /etc/ppp/ipv6-up 来启动脚本,来减少循环检测 IP 地址是否发生变化对系统资源的占用。

1、下载并安装 DDNS 更新脚本,以 EdgeMAX EdgeRouter ER-X 路由器为例。

项目地址:https://github.com/hiifeng/Dynamic-DNS-using-Cloudflare

在上述地址下载 ddns_update.sh ,使用 WinSCP 等 ftp 工具将脚本上传到 /usr/local/ 目录中。

2、使用 ssh 登录光猫/软路由

Bash
 
# 切换到 root 用户
sudo -i
# 增加可执行属性
chmod a+x /usr/local/ddns_update.sh
# 修改 ddns_update.sh 文件中的相关参数,其中包含 Cloudflare_Zone_ID 、Cloudflare_API_Tokens 和你需要解析的域名(例如:ddns.ifeng.xyz)
sed -i "s/type in zoneID/此处填入上面获取的Cloudflare_Zone_ID/g" /usr/local/ddns_update.sh
sed -i "s/type in token/此处填入上面获取的Cloudflare_API_Tokens/g" /usr/local/ddns_update.sh
sed -i "s/ddns.example.com/你的域名/g" /usr/local/ddns_update.sh
# 修改操作系统 /etc/rc.local 文件,当光猫/软路由开机或重启时,自动执行 ddns_update.sh
sed -i 's/^exit 0$/bash \/usr\/local\/ddns_update.sh\n\nexit 0/' /etc/rc.local
BASH
 

3、重启光猫/软路由使其生效。

三、注意事项

Cloudflare API 不支持对 .cf, .ga, .gq, .ml, .tk 域名的更新。

请在下方留下您的评论.加入TG吹水群