type
status
date
slug
summary
tags
category
icon
password
搬家之后,原来的网络拓扑结构放在新家里总会出现奇奇怪怪的问题,尤其是在IPv6这方面。一方面我非常希望家里可以用上体验良好的IPv6(远程串流、BT、内网穿透等等都不用受制于没有公网IP),同时又不想因为IPv6而在IPv4的外网方面有所妥协,比如无法使用Netflix一类,或者无法使用到IPv6这种无NAT的,可以端到端的特性。目前整体的网络算是调整完毕,也将整体的调整过程写一篇博客进行记录,希望可以帮到面临相同问题的朋友。
为什么要使用IPv6? 我只能说,这是一个趋势:《关于开展“网络去NAT”专项工作 进一步深化IPv6部署应用的通知》。目前国内IPv6基本已经处于可用状态,线路优化相比之前也有了很大提升。不过需要注意的是,目前国内的IPv6是禁止国外IPv6请求入站,至少是禁Ping,部分运营商因为PCDN的缘故,也会直接禁止IPv6入站。
📝 付费内容
配置前提
- 运营商下发的IPv6 PD前缀应小于64,一般来说都是60-62左右。如果你的运营商没有下发类似的前缀,或者下发的前缀为/64,那么这篇文章的内容可能并不适用于你的网络环境。具体可以在这里查看:调查下各地运营商光纤宽带分配的 IPv6 PD 前缀的长度 - V2EX
- 机场代理支持IPv6(例如我的TAG Internet)。
- 主路由和旁路由均为OpenWRT系统(基于ImmortalWRT),其他系统需要根据需要自行摸索。
- 尽量从纯净系统方案下进行配置,避免软件或规则冲突。同时做好备份。
- Windows下可以通过
getmac /v
命令查看本机网卡的mac地址。
网络拓扑
网络目标
整体的网络设计是需要有一个清晰的目标所谓导向,所有的解决方案都是为了实现这个目标。那么我在新家的网络目标如下:
- 旁路网关(旁路由)架构,可以实现对不同客户端的IPv4网关及DNS配置。同时旁路网关不负责任何NAT转换操作。
- 国内IPv4流量可通过
旁路网关 - 主路由网关
的路径,特定设备可直接通过主路由网关
,避免因为BT、PCDN等对旁路网关上的代理机场产生影响。
- 国外IPv4流量通过
旁路网关 - OpenClash的Mihomo内核
进行分流及代理。
- 所有IPv6流量默认通过
旁路网关 - OpenClash的Mihomo内核
进行分流及代理,国外IPv6流量可通过机场的IPv6节点进行代理使用相关服务。
- 国内IPv6流量使用运营商分发前缀分配的IPv6地址,且可通过客户端配置绕过旁路IPv6网关,实现使用原生IPv6地址使用BT功能。
通过旁路静态路由配置实现特定设备直接使用主路由IPv6网关(未实现)
针对网络目标的1、2、3点,已经有很多的教程指导如何实现。包括但不限于通过主路由的dnsmasq实现自定义给客户端下发的网关地址、DNS等等。我在之前也写过一篇文章,可以参考:Dnsmasq进阶技巧:为不同设备定制DNS服务器。
针对文中的4、5点,可以进行拆分,将主路由和旁路网关(旁路由)在网络中的职责进行细化:
主路由
- 从运营商获取可分配的IPv6前缀,也就是需要小于64位的前缀。
- 不作为局域网内的RA服务器,原因在于在IPv6的网络环境下,客户端会自动将RA服务器作为其默认的网关,而在我们的网络目标中,整体网络中距离客户端最近的网关应该是旁路网关。
- 以中继方式将DHCPv6-PD过渡给旁路网关(旁路由),将局域网内的IPv6地址分配任务交给旁路网关实现。
旁路网关(旁路由)
- 从主路由(上级网关)获得DHCPv6-PD的分配权限
- 作为RA(IPv6 Router Advertisement)服务器,但不作为DHCPv6的服务器,通过RA向局域网内的客户端提供IPv6地址分配功能,从而使客户端的默认网关及DNS为旁路网关。这样仅需要对特定设备进行特殊化配置,同时在一个局域网中只存在一个DHCPv6服务器,避免多服务器优先级造成分配紊乱,例如存在两个DHCPv6服务器时,客户端IPv6 DNS无法获取这种问题。同时因为主路由通过RA服务器启用SLACC,所以也支持Android设备的地址分配。如果主路由未启用RA服务器和SLACC,只有旁路由开启,我测试下来是Android设备还是获取不到公网的IPv6地址。
- 其实还有一种方法是通过radvd方式强制提高旁路由的RA服务优先级,从而使局域网内设备使用旁路由所提供的RA信息,但由于一方面radvd较老,OpenWRT并没有提供编译好的安装包,自行编译的依赖关系又很乱;另一方面局域网内存在两个RA Server终究是一个潜在的隐患,所以不采用此方案。
解决方案
主路由:
- 首先在全局网络选项中清空
IPv6 ULA 前缀
。
- 配置WAN_6口:获取运营商IPv6前缀及PD权限。这里有两种方法,都可以:
- 修改原WAN口设置:高级设置中,获取IPv6地址为自动。这种方法可在WAN口PPPoE拨号成功之后,自动生成一个WAN_6的虚拟动态接口,同时获得IPv6地址及PD前缀。
- 新增一个WAN_6接口:协议选择
DHCPv6
,设备选择接口别名:"@wan"
。防火墙配置选择wan
,DHCP选项中的IPv6设置全部选择中继。高级设置中委托IPv6前缀开启,IPv6分配长度64
,IPv6后缀填写EUI64
,便于生成的IPv6地址记忆,在配置防火墙规则时更好用。
- 配置原WAN口:修改DHCP服务器中的IPv6设置全部为中继模式;高级设置中的IPv6源路由勾选,委托IPv6前缀不勾选,分配长度禁用。
- 配置LAN口:不需要新增LAN_6口,使用原LAN口即可完成中继;
- 高级设置:委托IPv6前缀勾选,委托长度60(具体看运营商可以给多少长度的PD),其他默认。
- DHCP服务器 - IPv6设置:指定主接口不勾选;RA服务启用服务器模式,默认路由自动,RA标记其他配置(Stateless无配置);DHCPv6服务选择服务器模式(中继模式无法将PD下发到旁路),通告的IPv6DNS服务器填写旁路由的本地IPv6 DNS服务器地址,本地IPv6 DNS服务器不勾选,通告域名空,NDP代理中继,前缀有效期和遵守IPv4有效期默认。
- 修改
/etc/config/dhcp
,在config dhcp lan
下增加配置:option ra_preference ‘medium’
,配置主路由RA优先级,从而使客户端设备优先选择旁路由RA服务器所通告的动态网关。
旁路网关(旁路由):
我的旁路网关只有一个LAN口,没有配置WAN口。
- 首先在全局网络选项中清空
IPv6 ULA 前缀
。
- 配置LAN_6口:
- 新增一个LAN_6口,协议选择DHCPv6,设备选择
接口别名:"@lan"
。目的是通过@lan口与主路由的lan口对接,从而获得IPv6地址。 - 请求IPv6地址:选择
force
,选择try
也可以 - 请求指定长度的IPv6前缀:填写你在主路由获取的PD的地址后面的数字+1或2,例如我在主路由的PD地址是
240e:3a4:****:****::/60
,那么我在这里填写的就是62,理论上61也可以获取,但只影响可分配地址的范围,家用环境下区别不大,没有那么多的设备。 - 高级设置:使用默认网关勾选;自动获取dns服务器勾选;IPv6源路由勾选;委托IPv6前缀勾选;IPv6分配长度64;前缀过滤器不选择;IPv6后缀填写
EUI64
;IPv6优先级默认0 - 防火墙设置:防火墙选与不选区别不大,或者我还没发现有什么区别。
- DHCP服务器:常规设置,忽略此接口;IPv6设置,指定主接口勾选,其他全部禁用(包括RA服务、DHCPv6服务、NDP代理,这些都是需要在LAN口实现,LAN_6口不进行提供)
- 配置LAN口:
- 高级设置:委托IPv6前缀不选;IPv6分配长度禁用;剩下默认
- DHCP服务器:IPv6设置下,指定主接口不勾选,RA服务器为服务器模式,DHCPv6服务为设置为中继模式,因为我们主路由已经配置了DHCPv6服务器,通告的IPv6DNS服务器填写旁路由的本地IPv6 DNS服务器地址,例如我的为
fe80::****:****:****:f02d
,这个地址可以通过ssh到旁路由,ifconfig查看到;通告的DNS域名为空;NDP代理中继。 - IPv6RA设置:默认路由器,选择在可用的前缀上;启用SLACC勾选;RA标记,其他配置;其他默认。
- 受管配置:开启后,客户端会请求 DHCPv6 服务器提供完整的网络信息(如 IP 地址、DNS 信息等)。这种模式下,客户端不再自行生成 IPv6 地址(即不通过 SLAAC 自动配置 IP 地址),即IPv6的有模式(Stateful),完全依赖DHCPv6进行地址分配,但在Android下无法使用。
- 移动home配置:移动 Home 标志(H Flag)用于标识一个节点是否可以在移动环境下与 Home Agent 通信。这对家庭用户或一般路由配置通常没有实际意义,除非涉及到特殊的移动 IPv6 配置。
- 其他配置:在启用了 SLAAC(无状态自动配置)时,客户端可以自动生成 IPv6 地址,但需要通过 DHCPv6 获取额外的配置信息(如 DNS)。这个标志位通常用于混合环境,即 IP 地址通过 SLAAC 自动生成,而其他信息通过 DHCPv6 获取。在关闭受管配置,并开启其他配置时,即IPv6的无模式(Stateless),不通过DHCPv6进行地址分配。
- 如果LAN_6和LAN口都开启委托IPv6前缀,那么一个设备大概会生成4个IPv6地址,但我们并不需要那么多,所以可以将LAN口的委托关闭。
- 修改
/etc/config/dhcp
,在config dhcp lan
下增加配置:option ra_preference ‘high’
,提高旁路由RA优先级,从而使客户端设备优先选择旁路由RA服务器所通告的动态网关。
通过以上配置之后,主路由大概是这样:
旁路由大概是这样:
同时,现在旁路由作为整个局域网中唯一的RA服务器,也就成为了唯一的通告网关。
Dnsmasq设置:
如果你还在使用Dnsmasq作为DNS转发器,那么需要关闭
过滤器 - 过滤IPv6 AAAA记录
,从而使Dnsmasq可以解析IPv6域名。OpenClash设置:
OpenClash这里没什么好说的,我选择的是mihomo内核(clash_meta内核)。废话不多说,直接上图,就是把IPv6配置项这页配置一下。代理模式可以根据需要进行选择,由于我是Fake-IP的混合模式很久了,且需要代理一些UDP流量,所以这里选择的TUN模式,同时在ipv6我也使用的是tun模式。tproxy可能性能会更好一些,但不清楚是否会有其他NAT问题出现。
值得一提的是,这里的
实验性:绕过中国大陆IPv6
并不依赖于Dnsmasq,所以如果使用其他DNS转发服务的话(例如MoDNS或者AdGuard Home),也可以放心勾选。同时,如果已经使用mosdns进行分流,并且dnsmasq监听端口为53之外的端口,也可以开启实验性:绕过中国大陆IP
,开启后会通过nft set或者ipset将大陆IP端添加到防火墙中,不经过clash核心,提高性能,丧失的只是将dnsmasq通过特定dns解析返回的大陆IP地址添加到ipset这一项。 具体可以参考《实验性:不使用Dnsmasq绕过中国大陆IP》这篇文章。路由设置:
在以上配置完成之后,可能存在客户端ping外网出现
Destination host unreachable
的情况,通过查看路由表发现是旁路网关没有将主路由网关配置到路由表中,需要自己自行添加,lan口和lan6口都需要添加。路由类型:
unicast
目标:
::/0
网关:主路由的本地IPv6网关地址,fe80::开头,可以通过SSH登录主路由之后ifconfig查看,LAN口的就是。
高级设置:
表main(254)
🤗 总结归纳
通过以上设置的话, 现在局域网内设备应该是可以获取到/64位的IPv6地址,且所获得的IPv6地址的默认网关及DNS服务器为旁路网关,达到了整个局域网内的IPv6使用代理。在Test your IPv6. (test-ipv6.com)上也可以检测出IPv6地址为代理的IPv6地址,同时针对不需要代理的服务,我们的IPv6地址还是运营商分发的前缀。
其他针对BT客户端这种,我是通过单独虚拟一张网卡给qBitorrent使用,并单独配置这张网卡的网关为主路由网关,避免BT流量经过旁路由,可以正常使用。
其他待解决问题:
目前网心云可以获取到运营商分发的前缀的IPv6地址,但状态显示IPv6待联通,通过Hyper-V虚拟机内部可以ping通外部IPv6地址,需要再进行观察一下,看看是否需要单独进行配置。目前在尝试通过静态路由或者防火墙的方式进行解决。
如果你从主路由无法ping通局域网下设备的
link-local ipv6 address
,也就是本地fe80
开头的IPv6地址,出现address unreachable
错误,可以尝试为地址增加接口参数,例如:其中
%br-lan
即指定接口为br-lan
,也就是本地网络接口。2024/09/30更新:
网心云X86虚拟机默认只会接收一个RA服务器发送的SLACC,所以如果网络中存在多个RA服务器,那么网心云X86即便可以获取到正确的公网IPv6地址,也无法配置正确的网关和DNS,所以在网心云App中会显示IPv6待连通的情况。解决办法只能修改局域网的网络拓扑,变更为局域网只有一个RA服务器,且停用DHCPv6服务器。在OpenWRT下的具体方法我还在研究,目前仅能提供RouterOS作为主路由情况下的解决办法:RouterOS自动分流方案(支持IPv4 & IPv6)。
📎 参考文章
有关OpenWRT IPv6安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~