优化OpenWRT旁路由IPV6环境
近期总是发现在家庭网络环境有一些需要通过代理的站点无法访问,尤其是在访问境外CDN站点时,经由CDN的图片是无法被正确加载的,考虑到我自建了DNS服务器,首先想到的是DNS环境所导致的链接失效,但经过多种方法逐步排除后,发现问题源头并非DNS,而是由于旁路由开启IPV6所导致的问题。如果你的网络也存在相同情况,可以先按照以下内容尝试处理。
网络环境概况

运行流程大概如上图内容,入户网络经过光猫,桥接到锐捷BE72 Pro路由,再由一条网线接入到运行着PVE的笔记本,PVE下包OpenWRT服务。
其中OpenWRT运行了DDNS\PassWall\SmartDNS\AdGuard Home,其中ADG接替了DNSMASQ的53端口,承担着DNS服务器的作用;SmartDNS在其中充当着分流的作用,区分国内外域名并使用对应其地域的DNS进行解析;PassWall已经配置了IPV6透明代理,且其节点支持IPV6,PassWall的两个DNS均指向本地127.0.0.1,并且PassWall不开启过滤IPV6地址,不开启DNS重定向。
客户端方面,其常用的设备均将路由器地址和DNS地址指向OpenWRT地址。
问题描述
在访问例如Reddit这类支持IPV6的网站时,其站点内的图片绝大多数都无法正常显示,多刷新几次后浏览器会因为无法正常加载从而切换到IPV4进行访问,此后一段时间浏览恢复正常。
但当系统重启或者清理DNS后,问题则会复现。此前一直以为是DNS解析在其中的某个环节出现错误,因此一直在用nslookup去监察解析,偶然间发现原本解析到IPV6的地址在我访问后变成了IPV4地址,才意识到可能是IPV6所导致的站点无法正常被加载,突发奇想使用tracert ipv6.google.com,问题浮现。
由于我并没有在我的设备上单独配置IPV6路由和DNS,因此发现tracert返回的内容是由我的设备直接到主路由的,霎时恍然大悟,原来我的机器在访问IPV6的站点时是走的直连,并没有通过旁路由代理。
解决方案
解决方法也颇为简单,仅需要在Openwrt开启IPV6的前提下,进入LAN接口配置——DHCP服务器——IPV6设置,将其中的“RA服务”选择“服务器模式”,并且勾选“本地IPV6 DNS服务器”,“DHCPv6服务"保持默认的”中继模式,确保仍由主路由下发。

此后重启Lan接口,并且在客户端设备上重新接入网络,可以在网络连接详细信息中看到存在两个IPV6默认网关了,接下来就是需要去修改主路由和OpenWRT的默认路由优先级了,从而使客户端设备能优先走Openwrt路由。

OpenWRT的RA优先级设置在/etc/config/dhcp文件中,需要在config dhcp lan下添加option ra_preference 'high',从而提高OpenWRT的RA优先级,使得客户端设备优先走OpenWRT。

至此,重启OpenWRT,重启主路由,使设备重新接入,再次使用tracert ipv6.google.com,可以看到第一跳已经由原来的主路由变为了OpenWRT地址。该问题解决。
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。