为家里所有设备一次更新 ipv6 动态域名

Posted on April 27, 2020

来了! ipv6 真的来了! 最近回一趟老家,发现老家的 ipv6 也可以用后, 家,公司,老家1,老家2 四个地方的 ipv6 就全部都能互通了。这样,就没有理由留着 ipv4 了。我甚至觉得搞个公网 ipv4 地址是多么可笑的一件事。

全ipv6化以后,为了互连方便,我把所有的支持 ipv6 的设备,都配置了动态域名。编译了 dnspodc 还有交叉编译了 dnspodc 到各种设备上。但是,打印机让我头疼了。打印机支持ipv6, 但是不支持运行自己写的程序。

而且为那么多设备一个一个编译并配置 ddns 更新程序,着实让我有点筋疲力竭。我开始思考,让一个程序自动为所有设备都更新 ddns。

ipv6 地址,使用的是 prefix + host 的方法构成。不同于 ipv4 时代 prefix 按照 /8 /16 /24 分成了 A B C 三类地址,后来又发明了 CIDR 无分类地址,可以使用任意长度的 prefix, ipv6 时代建议 prefix 永远等于 64 。低于 64 的 prefix 只用于地址分配机构分配地址,还有路由聚合简化路由表的时候用。实际过程中进行地址分配,一个局域网下永远让 prefix=64。

这么做有个什么好处呢? 就是 无状态地址自动配置 能发挥作用。而且 64bit 的 prefix 意味着 主机地址可以有 64bit, 也就是说永远不会遇到 主机位不足的情况。 ipv4 时代使用 C 类地址的时候,就容易遇到局域网超过 255 台机器的情况。好不容易划好的网络,增加一台可能导致整个网络重新规划。而 64bit 的 prefix 一劳永逸的解决了这个问题。

无状态地址自动配置的方法是,由网关每隔一段时间广播一个 RA 包。RA 包里包含了 prefix , dns,网关 等等信息。主机收到 RA 后, 把 prefix和自己生成的 host 一拼接,就 获得了 全球可达的 ipv6 地址了。

在 PPPoE 拨号环境下, prefix 是由 dhcp-pd 协议由 ISP 下发给路由器的,所以 prefix 会不断的变化,是动态的,所以需要设置动态域名。但是 host 部分是不会变的。 host 部分是使用 mac 地址经一定规则变换而来。这个规则叫 EUI-64。对于不需要被外部访问的主机来说,可以开启 mac 地址随机化和隐私保护,使用随机的主机地址。当然不想被访问也就不会有动态域名的需求了,所以这里只考虑使用固定的 EUI-64 方法构造的 ipv6 地址。

这样只要把需要更新动态域名的设备的 mac 地址收集起来,就可以一次性构造出所有设备的 ipv6 地址,不需要在每个设备上单独运行 ddns 程序。

所以,在运行 ddns 的设备上 (可以是路由器,可以是 nas ,可以是一个 树梅派)获取本地地址,取前64bit,然后依次拼接 eui-64 就可以获得一系列设备的 全局ipv6 地址,然后再调用 dns 供应商的接口更新上去,就完成了。

于是搞定后,获得了2个优势:

  1. 无法运行自定义程序的设备也能更新dns
  2. 无需在每个设备上设定dns更新程序
Comments