目前越来越多的地方开始支持IPv6,可以启用openwrt路由器的IPv6功能,从运营商获取IPv6地址,并由openwrt向电脑分配IPv6地址。
我启用IPv6的原因是获取公网IP,以便在公网访问家里的设备。我这里无法获取IPv4的公网地址,但可以获取IPv6公网地址,虽然是动态IP,但可以通过DDNS技术来动态更新域名与IP的绑定。因为是动态IP,可能在几天后获取的IP就会被刷新,即使没有重启路由器也可能会被刷新。
我的环境:光猫的宽带连接设置为桥接模式,宽带连接启用IPv4&IPv6。使用openwrt路由器进行PPPoE拨号。
openwrt在进行PPPoE后,WAN口会获取一个IPv6地址,并从运营商获取一个DHCPv6-PD地址段,然后可以从DHCPv6-PD地址段向openwrt下面的电脑分配IPv6地址,也可以继续向openwrt下面的其他路由器下发DHCPv6-PD地址段,这样下面的路由器也可以给连接在它上面的电脑分配IPv6地址了。也就是进行了多次DHCPv6-PD的下发。
拓扑
openwrt的设置
部分openwrt固件已经启用了IPv6,这样在openwrt首次启动的时候就会创建一个WAN接口和一个WAN6接口,它们都是关联同一个物理接口的。在实际使用过程中,可以只配置WAN口,而不用配置WAN6接口。
在“网络—接口”页面中,“全局网络选项”默认会写有一个IPv6前缀,这是一个ULA地址(唯一本地地址),这个地址段类似IPv4中的私有地址。
如果保留这里的地址,openwrt的LAN接口会从这个网段中获取IP,连接到LAN接口的电脑也会获得相同网段的IP。如果删除这个地址段,LAN接口只能从DHCPv6-PD地址段中获取IPv6地址。是否保留ULA前缀都没有影响,因为电脑要上网,最终使用的是公网IPv6地址。
IPv6 ULA前缀和DHCPv6-PD都是openwrt的地址池。
WAN接口
WAN接口主要是设置PPPoE,只有部分选项与IPv6有关,必须进行设置的是“高级设置”中的“获取IPv6地址”。里面有三个选项:“自动”、“已禁用”、“手动”,显然只能选择“自动”。
WAN—基本设置
WAN—高级设置
使用内置的IPv6管理:
获取IPv6地址:自动
使用对端通告的DNS服务器:如果选择,就是从运营商获取DNS
使用自定义的DNS服务器:如果不选择运营商的DNS,可以手动设置
获取IPv6地址要选择“自动”,以便自动从运营商获取IPv6地址。
在WAN接口和LAN接口都有“使用内置的IPv6管理”这个选项,我不确定选与不选有什么影响。
WAN—物理设置
WAN—防火墙设置
LAN接口
LAN接口中关于IPv6的设置,主要是设置分配给LAN接口的IPv6前缀长度。
LAN—基本设置
IPv6分配长度:分配给LAN接口的IPv6的前缀长度,可以填64位。
为了openwrt路由器LAN接口下的电脑可以自动配置IPv6地址,openwrt路由器LAN接口的IPv6前缀长度至少是64位,不能大于64位。设备接口进行IPv6自动配置时,一般是指自动配置IPv6地址的接口ID,即IPv6地址第65到128位;而IPv6地址的前缀一般是从路由器获取。
LAN接口中可以手动配置IPv4地址,但没有直接填写IPv6地址的地方。 LAN接口的IPv6地址来源于“IPv6 ULA前缀“,但这是私有地址;以及来源于运营商分配的DHCPv6-PD前缀,这是公网地址。 openwrt路由器从DHCPv6-PD中选择地址,配合LAN接口中“IPv6分配长度”设置的前缀长度,将一个IPv6网段分配给LAN接口。
如果openwrt路由器还要继续为下面的其他路由器分配DHCPv6-PD,则LAN接口“IPv6分配长度“可能要设置为比64更小,如60、56,前提是运营商分配的DHCPv6-PD前缀长度小于64位。
LAN—高级设置
LAN—物理设置
LAN—防火墙设置
DHCP/DNS
由于是使用openwrt作用DHCP服务器,需要在LAN接口启用IPv6的DHCP功能,并检查DHCP/DNS中IPv6相关的设置。
网络—接口—LAN—DHCP服务器—IPv6设置
因为这里是使用openwrt路由器本身来作为DHCP服务器,所以“路由通告服务”和“DHCPv6服务”选择服务器模式即可,NDP代理则可以禁用。
DHCPv6模式可以选择“无状态的+有状态的”。
i> 无状态地址自动配置:即SLAAC,电脑根据路由器的RA消息来配置自己的前缀和网关
无状态DHCPv6:DHCP服务器为客户端提供除了前缀和网关之外的信息,如DNS
有状态DHCPv6:DHCP服务器为客户端提供IPv6地址和DNS,但不提供网关信息
总是通告默认路由,表示即使LAN接口没有获得IPv6公网前缀,也仍通告自己为默认路由。电脑总是将LAN接口的链路本地地址设置为默认网关。选不选都没有太大影响。
通告的DNS服务器,可以自定义IPv6的DNS服务器,如果留空就使用LAN接口的公网IPv6地址作为电脑的DNS。
网络—DHCP/DNS—高级设置
这里主要查看“禁止解析IPv6 DNS记录”这个选项,有部分openwrt固件可能默认把这个选项给选上了,这会导致电脑的IPv6 DNS查询报文被openwrt过滤掉,无法完成DNS查询,最终无法连接IPv6域名。把这个选项取消选择即可。
防火墙设置
在IPv6中,ICMPv6是比较重要的报文,接口IPv6地址的自动获取会用到ICMPv6 RS、ICMPv6 RA等报文。DHCPv6-PD地址的获取又需要用到DHCPv6报文。所以需要设置openwrt的防火墙,允许这些报文在openwrt和运营商服务器之间传输。
我这个openwrt固件已经支持IPv6,防火墙默认已经放行了相关报文。
网络—防火墙—通信规则
!> 因为获取的IPv6地址是公网地址,可以直接从互联网连接到openwrt路由器。防火墙主要是阻止从公网方向进来的流量,也就是从互联网发起的、到达openwrt路由器的流量。放行了必要的报文类型或端口后,不要再打开其他端口,更不能直接关闭防火墙。
查看状态
openwrt路由器进行PPPoE拨号成功后,可以在路由器概览中查看WAN接口是否获取了IP地址和DHCPv6-PD地址段。
状态—概览
IPv6 WAN状态:WAN接口获取的IPv6地址
类型:dhcpv6-pd,表明openwrt从运营商获取了DHCPv6-PD地址段
分发前缀:获得的DHCPv6-PD前缀和前缀长度,/之前的地址表示DHCPv6-PD前缀,/56表示DHCPv6-PD前缀长度为56位
地址:WAN接口获取的IPv6地址
网关:openwrt WAN接口的IPv6网关是运营商设备的链路本地地址,以fe80开头
WAN接口获得的IPv6地址和DHCPv6-PD不是同一个网段,DHCPv6-PD用于给openwrt的LAN接口分配IPv6地址。
DHCPv6-PD的前缀长度如果是64,则只能分配给一个LAN接口,而且不能再继续给openwrt下面的其他路由器分配DHCPv6-PD。我这里获取的是56位的前缀长度。
或者在“网络—接口”页面查看
这里只能看到WAN接口的链路本地地址,看不到公网地址。
LAN接口获取了IPv6地址,IPv6地址前缀是240e:351:556:4000::,这个前缀来源于运营商分配的DHCPv6-PD地址段;IPv6地址接口ID是1,在LAN接口“IPv6后缀“中设置,如果不设置,默认是1;IPv6掩码是/60,在LAN接口“IPv6分配长度”中设置。
电脑的设置
电脑网卡启用IPv6的DHCP。
测试
可以在电脑ping一个IPv6地址,比如ping你设置的DNS。
d:\work>ping 2400:3200::1
正在 Ping 2400:3200::1 具有 32 字节的数据:
来自 2400:3200::1 的回复: 时间=18ms
来自 2400:3200::1 的回复: 时间=18ms
来自 2400:3200::1 的回复: 时间=18ms
来自 2400:3200::1 的回复: 时间=18ms
2400:3200::1 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 18ms,最长 = 18ms,平均 = 18ms
或者使用ping -6去测试一个IPv6域名,测试IPv6连通性和IPv6的DNS是否正常。
d:\work>ping -6 b1.planetnp.com
正在 Ping ty.hellonp.com [2603:c024:c002:3100::4001] 具有 32 字节的数据:
来自 2603:c024:c002:3100::4001 的回复: 时间=195ms
来自 2603:c024:c002:3100::4001 的回复: 时间=195ms
来自 2603:c024:c002:3100::4001 的回复: 时间=196ms
来自 2603:c024:c002:3100::4001 的回复: 时间=193ms
2603:c024:c002:3100::4001 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 193ms,最长 = 196ms,平均 = 194ms
可以搜索IPv6测试网站进行测试。