家宽获得「静态」IPv6 地址
现在运营商基本会下发公网 IPv6 地址。只要设备支持,差不多都能原生接入 IPv6 网络。但获得的地址是动态,设备如果重启就会变。本文分享在 OpenWRT 下通过 DHCPv6 Prefix-Length Hint 技术来固化公网 IPv6 网段的实践经验。
IPv6 网络跟 IPv4 差异非常大。设备拨号成功之后,会通过 DHCPv6 申请地址。ISP 分配一个 /64 地址,同时还会使用 Prefix Delegation (PD) 分配独立的 IPv6 网段给用户。业界推荐分配 /56,但中国不同运营商在不同地区的配置都不尽相同。我用过的上海电信给了 /56 段,但山东联通给的 /60 段。网上很多资料说中国移动一般给 /60,还有一些给的是 /64,这应该是配错了。
在开始之前,我们先看当前分配的 IPv6-PD。登录 OpenWRT 后台,切换到「网络」→「接口」,找到 wan_6 接口,里面会显示你的 IPv6-PD 网段,并记下来。
然后再找到 wan6 接口,打开编辑配置,把「Request IPv6-address」改为「try」同时把「Request IPv6-prefix」改为你上一步记下来的 IPv6 网段。还要勾选最下面的「Do not send a Release when restarting」让设备在重启的时候不要主动释放分配给自己的网段。
如果你能通过 ssh 登录 OpenWRT 设备,就可能打开 /etc/config/network 验证配置:
config interface 'wan6'
option device 'wan'
option proto 'dhcpv6'
option reqprefix '2001:db8:12:34::1/60'
option norelease '1'最核心的配置就是reqprefix,它会最终转换成 odhcp6c 的 -P 参数来发送 DHCPv6 Prefix-Lengsh Hit 信息。
这是生成的 odhcp6c 启动参数:
odhcp6c -s /lib/netifd/dhcpv6.script -P2001:db8:12:34::1/60:bc6680c1 -c00040497d1fab3104725905f60815c保存配置之后重启网络服务,命令行下可以直接执行/etc/init.d/network restart。设备会重新拨号联网,并请求刚才设置的 PD 网段。如果你的运营商支持的话,就会看到重启后的 PD 网段跟刚才指定的一样了🎉
那这是「静态」公网地址吗?在大多数情况下是的。运营商首次分配 PD 之后,设备重启并提供了 Prefix-Length Hint,那么运营商会优先分配你指定的网段,但前提是这个网段没有分配给其他设备。所以说设备主动重启不会有问题。但如果你所在的地域长时间停电的话,对应的 PD 网段就可能被回收进而分配给别的设备,这样你就要不回这个网段了😂
这以这里的「静态」是打了引号的。但总得来说,这个地址不太会变。也就降低了因地址更新导致 DDNS 失效的概率。所以如果条件允许,我还是建议大家都开起来。如果开得多了,就形成了事实部署,运营商也就不会轻量取消该功能,算是利国利民的事。