假设 ISP 通过 DHCPv6-PD 给用户分配的 IPv6 前缀是2001:db8:1111::/48
,用户 LAN 口侧有三个设备,分别为网关、NAS 和监控摄像头。这三台设备拥有固定的 IPv6 后缀 ::1
、 ::dead
和::beef
(通过 Modified EUI-64 基于 MAC 地址生成或者 DHCPv6 等方式下发),因此分别会分到2001:db8:1111::1
、 2001:db8:1111::dead
和2001:db8:1111::beef
。
当用户与 ISP 的连接断开重新连接后,ISP 重新给用户下发新的前缀,比如是2001:db8:2222::/48
。这时候用户侧设备的地址会发生变更,分别变为2001:db8:2222::1
、 2001:db8:2222::dead
和2001:db8:2222::beef
。
针对这种后缀不变的情况,我们只要把新的前缀地址拼接上每台设备的固定后缀就可以得到每台设备的 IPv6 地址,因此只需要在一台设备上运行 DDNS 服务,就可以为所有设备批量更新 DDNS 解析。
我现在已经完成了一个可运行的原型,名称暂定为 DDNS6,代码放在 GitHub 上: https://github.com/vfreex/ddns6。 目前这个原型功能还很原始,只支持托管在 dns.he.net 上的域名以及有限的几种 IP 地址检测方式,更新策略为每 5 分钟固定向 DDNS 服务商发送更新请求,但已经可以比较稳定地运作。
程序使用 Rust 开发,async-await 异步编程,为了简便目前只在 GitHub 上放了一个Linux x86_64 编译版本,全静态链接,因此体积比较大(约 3.35MB )。我简单做过实验,如果针对 MIPS OpenWRT 编译,动态链接 musl libc 和 openssl,再加上一些标准库魔改,最终可执行文件可以缩到 1M 以下。
配置文件使用 TOML 格式,目前使用固定路径config/ddns6.toml
。
[[entries]]
hostname="router.example.com"
username="router.example.com"
password="your-password"
provider="he.net"
ipv4={web="_"}
ipv6=[{addr={dev="br0"}, len=64}, "::1"]
[[entries]]
hostname="nas.example.com"
username="nas.example.com"
password="your-password"
provider="he.net"
ipv4={web="_"}
ipv6=[{addr={dev="br0"}, len=64}, "::2"]
上面这个示例配置了两个域名,其中域名router.example.com
的 A 记录设置为外网 IPv4 地址(通过访问 Web 地址 http://ip.sb 获得),IPv6 地址为网桥br0
的前 64 位,拼接后缀::1
。域名nas.example.com
的 IPv4 地址相同,IPv6 地址为网桥br0
的前 64 位,拼接后缀::2
。
指定 IP 地址的方式还有很多,比如:
"198.51.100.1"
, "2001:db8:1234:5678:90ab:cdef:1234"
。{web="_"}
。{dev="eth0"}
。{addr=ADDRESS,mask="255.255.255.0"}
,{addr=地址,mask="ffff:ffff:ffff:ffff::"}
。其中ADDRESS
可嵌套,比如为{dev="eth0"}
。N
位),如 {addr=ADDRESS,len=24}
,{addr=地址,len=64}
。其中ADDRESS
可嵌套,前面已经演示过了。[ADDRESS1, ADDRESS2]
,前面已经演示过了。目前开源的 DDNS 软件很多,但对 IPv6 有良好支持的还不多,不能解决我个人使用的需求。但我的需求或许是小众的,不确定有没有完善、让更多人一起参与的必要,现在发出来让大伙参谋一下。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.