这个系列预计会有多篇文章,每一篇聚焦一两个问题,在这一篇主要考虑IPv6的问题。
IPv6已经是大势所趋,未来一定会大规模部署使用,实际上现在的骨干网早已支持该协议,真正的痛点出在“最后一公里”,也就是家里的路由器上。绝大部分2018年之前购买的路由器内部完全没有或部分残缺IPv6协议栈,即便现代操作系统普遍支持该协议,在这样的网络环境下,难以真正分配得到可用v6地址。
路由器残缺的协议栈
现在接入宽带普遍采用FTTH模式,在光缆中就是光信号,只有到了光电转换这(也就是俗称的光猫),才能看到以太网帧。由于IP协议是工作在第三层的,因此和路由功能直接相关。目前家中的主要网络设备为一台光猫和一台路由器。光猫改为桥接模式以后,相当于工作在第二层,而路由器通过ppp协议接入互联网,在此之上提供路由功能,属于第三层。
遇到的第一个问题,现有的这台路由器不支持ppp拨号时协商IPv6地址。查证过程如下:首先需要开启路由器的telnet功能,需要进入shell来查看拨号日志。在登入网页管理端以后,访问该网址:http://192.168.0.1/goform/telnet 后,页面提示load telnetd success.表示开启telnet成功,会话在网页管理端退出前有效。
使用shell进入telenet,用户名为root,密码Fireitup,在路径/var/pppoe.log查看到拨号日志。
1 | Connected to **:dc:**:10:**:95 via interface eth1 |
这是一份很标准的链路协商日志,关键问题就出在了Unsupported protocol这一句,拨号程序不认识IPv6的链路控制协议,自然也没法获得IP地址,也就是说协议栈是残缺的。但也不是说这个路由器就没用,在后面会看到,还是一定程度上可以利用的。
SLAAC和DHCPv6
既然路由器从拨号这一关就不认识IPv6协议,那也就没法继续直接利用,自行修改固件也不太可能。于是转战研究光猫。光猫的硬件生产年份为2017年,经过查看管理界面的代码,部分注释标注2021年,因此可以认为该光猫获得了运营商下发的更新。
在网络管理界面,改变模式为“路由”,开启FullConeNAT,以期能够达到NAT1。重点是下方的IPv6配置,一定要勾选获取前缀,获取方式就是PrefixDelegation,这个地方的配置对于后续手机等设备能否正常获取地址非常关键。
之后进入用户侧管理,对于IPv4的配置不用改动,主要是注意IPv6部分。在最开始的测试中,如果开启DHCPv6则所有的安卓手机均无法获得IPv6地址,其余设备正常。在反复查证后了解到,Android系统只支持以SLAAC (Stateless Adress AutoConfigure,无状态自动地址配置)方式获得IPv6地址,因此这里关闭DHCPv6服务器,不勾选“地址信息通过DHCP获取”。刚才讲到的前缀,也就决定了这两种方式分配地址的方式的不同。IPv4在拨号时只会获得一个地址,IPv6获取的是一个前缀,在前缀后面的部分是可以自定义的。使用光猫拨号分配得到的是一个/56地址块,在使用SLAAC的情况下,/56地址块可以进一步划分得到2^8=256个/64地址块。设备单拨地址协商的大致过程如下:
- 设备发送RS报文,请求地址信息
- 网关发送RA报文,包含前缀和前缀长度等信息
- 设备根据前缀长度,生成后半部分地址(接口ID)
- 邻居发现,检测是否重复地址(DAD)
在RA报文中,M,O标记就是图片中的“地址信息通过DHCP获取”和“其他信息通过DHCP获取”。所谓无状态,就是不存在全局的地址服务器,内部维护该自治系统下的全部地址分配状态信息。
| M | O | 含义 | 描述 |
|---|---|---|---|
| 1 | 1 | 地址和DNS等都从DHCPv6服务器取得 | Stateful DHCPv6 |
| 0 | 1 | 地址使用RA广播的prefix+EUI-64计算出来的接口地址,DNS和其他服务器从DHCPv6取得 | Stateless DHCPv6 |
| 0 | 0 | 完全的Stateless配置,仅地址使用RA广播的prefix+ EUI-64计算出来的接口地址 | Stateless AutoConfiguration |
其中,无状态DHCPv6是最常用的配置方式。在使用了上述配置以后,将路由器改为AP模式,或关闭路由器自带的DHCP功能后,将光猫千兆口与路由器LAN口连接,将无线路由器降级为二层交换机使用,也就无视了路由器内部的三层及以上协议栈。至此,所有设备均可分配得到可用的IPv6地址。
本文作者:MyTech::Author