@
sasalemma 你这里对一些概念的理解有些问题。
是这样的,首先各个 /64 的意义是不一样的,通过 SLAAC 获得的只是一个地址,里面的“前缀长度”字段(值为“/64”)只是相当于 ipv4 的子网掩码的含义,只是提示了同一网段( WAN 侧)的地址范围,同前缀的其它地址是不属于你的。所以说当路由器仅获取 WAN 地址时(无论是通过 SLAAC 还是 DHCPv6 IA_NA,前者只支持 /64,后者支持任意的前缀长度,注意这两种方式获取到的都是“地址”而不是“前缀”),LAN 端设备是无法直接获得 IPv6 全球单播地址(就是 2 开头的公网地址)的。
然后还有另外一种操作是 DHCPv6 IA_PD,这种操作可以向上级网络请求一个 IPv6 的前缀,一般家宽运营商给出的前缀长度都是 /56 或者 /60 的,也有极少情况是 /64 的。通过这种方式获取到的是“前缀”而不是“地址”,也就是说同前缀的 2^(128-PREFIX_LEN)个地址都是属于你的。这就是 DHCPv6 IA_PD 和其它地址获取方式( SLAAC 和 DHCPv6 IA_NA )的本质不同之处。
家宽单层路由器(包括光猫自带路由,以及光猫桥接路由拨号两种情况)的一般工作方式:首先路由器(路由模式光猫)建立 PPPoE 链路,然后通过 SLAAC 获取 WAN 侧地址(一般情况下前缀长度为 /64 ),然后通过 DHCPv6 IA_PD 向 ISP 请求一个地址段,比如楼主拿到的是一个 /56 的地址段,这些地址都是临时属于你的( ISP 端在获取地址的那一刻就已经建立好了正确的路由)。然后重要的来了:路由器(路由模式光猫)从这 /56 的地址端中只取了一个 /64 的地址段作为前缀配置到了 LAN 接口上(包括本地路由器的路由表,自身 LAN 口地址,和负责分配地址的 RA 服务,有时候可能还有本地的 DHCPv6 服务),这样 LAN 侧的设备就可以通过相应的协议获取临时属于自己的公网地址了。至于为什么只取一个 /64 而不是整个 /56,是为了兼容 SLAAC 。
而且可以注意到,路由器 LAN 侧和 WAN 侧不是同一个网段,这也是 IP 协议的最基本要求(想想 v4 时代是怎么配置地址的)
这种情况下,还有 255 个 /64 全球可路由的地址段(或者也可以理解成 15 个 /64 地址段和 15 个 /60 地址段)是处于闲置状态的,理论上来说,一级路由器也可以响应 LAN 侧接入的下级路由器的 DHCPv6 IA_PD 请求,给下级路由器分配前缀(下级路由 WAN 侧通过 SLAAC 拿一级路由 LAN 侧的**一个**地址,LAN 侧拿一级路由从 ISP 得到且闲置的**一段**前缀,在这个过程中会自动配置好本地的路由表等参数),然后下级路由 LAN 侧连接的设备就也可以获得公网地址了。此时如果把 /56 改成 /60,也只是少一些可用地址段而已(只有 15 个 /64 地址段闲置),影响不大。如果一级路由器是 OpenWRT,是可以实现这种下发操作的。
所以说实际存在的问题并不是所谓的“/60 下发只有 /64 不能再下发”(实际上不存在这种说法),而是光猫自带路由根本不会正确响应下级路由器的 IA_PD 请求。
(我也见到过一些光猫,能够响应 IA_PD 请求,但是可能固件里有 bug 不能正确配置本地的路由表,导致二级路由后的设备能获取 ipv6 地址但不能上网)