关于 Cloudflare DDNS 的配置方式
2025 年 11 月 13 日
从外网访问家里的服务,免不了要设置 DDNS。在 IPv6 网络已经能正常使用的当下,结合 DDNS 可以有很多想象空间。
Cloudflare 的 DDNS 本质上是通过 Cloudflare 的 http API 去修改其域名配置。各种 DDNS 客户端实际只是把配置的参数转换成 http 请求。但我配了两个系统,都遇到点问题。这里把遇到的坑记录一下。
用例描述
这次有两个用例,都是配置 IPv6 的 AAAA 地址,包括:
- 内网的 armbian 系统。
- Openwrt 路由器。
注:实际用例有三个,不过飞牛配置 DDNS 实在太简单了,不值得单独拿出来说。
由于我自己有顶级域名,所以用例都是配置二级域名。下面都以 sub.example.com 举例。
对于三级泛域名,在 Cloudflare DNS 配置界面用 CNAME 设置即可,比如 *.sub 设置 CNAME 为 sub.example.com 意味着 *.sub.example.com 都会被指向 sub.example.com 对应的地址。
准备工作
要配置 IPv6 的 DDNS,要准备下面几项。
申请 Cloudflare API Token
要通过 API 修改 AAAA 地址,必须要准备 Cloudflare API Token。在 Cloudflare 的 Dashboard 找账户 API 令牌,选区域.DNS模板,记得起个自己能看懂的名字。
OpenWRT 防火墙配置 IPv6 放行
IPv6 是可以直通的,因此家用路由器必然会有防火墙,否则内网就没有安全可言了。
OpenWRT 路由器本身的 IPv6 地址不需要考虑防火墙问题。服务对外默认都是拒绝的,所以没有安全问题。另外 IP 地址是从 pppoe-wan 获取,所以也没有可达性问题。
但配置 OpenWRT 的防火墙时,要求内网机器的 IPv6 地址相对固定。这就要考虑内网机器 IPv6 地址的生成方式。
通常来说,内网机器的 IPv6 地址包括前缀和后缀两部分。前缀是由运营商下发,路由器广播。所以需要固定的实际只能有后缀。这就需要确认内网机器的 IPv6 地址生成方式,需要配置为 EUI64(即根据 mac 地址生成 IPv6 地址)。简单说来,如果地址的后缀的中间,包含一个 ff:fe,比如这样的后缀:0215:2BFF:FEE4:9B60,就基本可以确认是 EUI64 地址。如果不是的话,查询不同系统的修改方式。
另外,需要查询一下内网机器网卡的几个配置,包括:
- /proc/sys/net/ipv6/conf/${接口名}/autoconf
- /proc/sys/net/ipv6/conf/${接口名}/accept_ra
这两个值跟 IPv6 的生成方式和时机有关。简单一点来说,在我的系统里,这两个值需要都是 1。
然后,在 OpenWRT 的 网络 - 防火墙 - 通信规则 中,添加一条规则,配置包括:
- 常规设置:
- 源区域:需要设置成 wan/wan6,即允许接受外部数据。
- 目标区域:需要设置成 lan,即允许外部数据进入内网。
- 目标地址:写成规则映射的方式,以上面的后缀为例,写成:::0215:2BFF:FEE4:9B60/::ffff:ffff:ffff:ffff
- 目标端口:从安全角度来说,必须填。多个端口以空格隔开,比如
80 443。 - 操作:选
接受。
- 高级设置:
- 地址族限制:仅 IPv6。
这样就能保证外部访问内网 IPv6 地址时,OpenWRT 路由器对特定机器的特定端口放行。
Armbian/Debian - ddclient
首先要安装 ddclient,sudo apt install ddclient。安装后跟随向导先配置一下,虽然铁定不能用,但可以让它生成一个默认的配置文件参考。
默认会启动定时服务,但目前服务没什么用,还得用调试方式看 log,确定配置是否能正常使用,调试方式如下:
sudo ddclient -daemon=0 -debug -verbose
接下来修改 ddclient 配置文件/etc/ddclient.conf,参考如下:
protocol=cloudflare \
zone=example.com \
usev6=if, if=end0 \
login=token \
password='my-cloudflare-token' \
sub.example.com
注意,login 必须是 token,否则脚本对于 API token 的使用方式不正确。
这时候,可以用调试方式看 log 是否正常了。
调试的本质,是执行 /usr/bin/ddclient 脚本。该脚本会通过 ip 命令获取接口的 IP 地址。默认命令是:ip -6 -o addr show dev $interface scope global,获取该命令得到的第一个地址。
但对于我的用例来说,这条命令会获取到一个错误的地址,这样就要修改这条命令,也就是在 ddclient 脚本中找到这条命令,改成自己所需要的命令。我的用例是改成 ip -6 -o addr show dev $interface scope global mngtmpaddr。即获取 mngtmpaddr 地址。
调试 OK 以后,需要重启服务。这样可以重新加载脚本,否则内存中跑的脚本源码还是旧的。
sudo systemctl daemon-reload
sudo systemctl restart ddclient
OpenWRT
默认 DDNS 脚本是没有 cloudflare 的,因此需要先安装 ddns-script-cloudflare。
在服务 - 动态 DNS 配置界面,添加新服务,选择 cloudflare-v4,这里 v4 不是指的 ipv4,而是 cloudflare v4 api。
配置界面填写这几个参数:
- 基本设置:
- 查询主机名:是目标域名,填写 sub.example.com。
- IP 地址版本:选 IPv6。
- DDNS 服务提供商。
- 域名:写成 [email protected]。
- 用户名:填 Bearer。
- 密码:使用 API token。
- 另外,如果使用 HTTPS,则 CA 证书路径填 /etc/ssl/certs。
- 高级设置:
- IP 地址来源:接口。(注:个人喜好,其他方法也可以)
- 接口:pppoe-wan。
基本就这些了。其他最多也就调一下间隔。
总结
IPv6 意味着可以获得无限的公网地址。这给人的感觉……有点像互联网刚刚开始那时候了。DDNS 配合 IPv6 可以让家里的机器很容易的从外部访问,这意味着可以有很多玩法了。不过需要注意安全。这也就是接下来我要研究怎样配置应用层网关的原因了。