MikuM97
2021-11-29 22:49:26 +08:00
我之前玩过 Redmi ac2100 做主路由,N1 刷 openwrt 做旁路由的架构。旁路由的玩法之所以能成立,是建立在使用旁路由的终端,包括安卓手机、电视盒子等,可以自由修改 IPv4 参数,绕过主路由的 DHCP 分配机制,将网关及 DNS 指向旁路由,从而让本机发出的流量都去旁路由上走一遍,再由旁路由转发到主路由,从而旁路由上可以挟持处理经过自身流量,完成 fq 透明代理、去广告等一系列骚操作。
然而 IPv6 的出现引入了一个难题,那就是当前除 Windows 外,大部分终端对于手动配置 IPv6 参数的支持都不太好,例如小米的 MIUI ,没 root 的情况下只能通过 SLAAC 从主路由自动获取 IPv6 ,获取到的网关和 DNS 当然指向主路由,又没办法手动改,就没法把 IPv6 的流量引导到旁路由了。
当前大部分操作系统的软件和逻辑,在本地有 IPv6 地址,服务器也支持 IPv6 的情况下,IPv6 优先,IPv6 不通,再回退 IPv4 。所以你主路由打开 IPv6 之后,终端获取了主路由的 IPv6 网关地址,DNS 解析也奔着主路由过去了,这种情况相当于流量和 DNS 解析绕开了旁路由,骚操作当然就实现不了。
个人分析,可能的解决方案:
0.完全放弃 IPv6 ,主路由关闭 IPv6 相关功能即可。
1.对于使用旁路由的终端,放弃 IPv6 。曾经使用过的方案。由于目前操作系统默认都会优先使用 ipv6 的 dns 进行解析,如果仅仅只在旁路由上面的 dnsmasq 禁用 ipv6 的 4A 记录,很有可能使用旁路由的终端,dns 请求走还是通过 IPv6 走到主路由上,造成 dns 污染。因为我都主路由 AC2100 是刷过 padavan 的,因此我的方法是打开 WLAN 的访客网络,然后用 ebtables 禁用访客网络所属接口( ra1,rai1 )收发双向的所有 ipv6 报文转发,然行需要使用旁路由的终端连接访客网络的 ssid ,即可做到使用旁路由的终端完全获取不到 IPv6 地址及 DNS 。这个时候再手动把 ipv4 网关及 dns 全部指向旁路由即可。不使用旁路由的其它终端,连接原有主网络的 SSID ,IPv6 走主路由转发,可以正常使用 IPv6 。
2.放弃旁路由架构,使用主路由做透明代理。当前使用的方案。主路由改成 J4125 的软路由+openwrt ,AC2100 直接改成 AP 模式做无线接入,fq 软件是 passwall ,passwall 上面启用 IPv6 透明代理( Tproxy )。这种方案适合自建机场并且熟练使用 Linux 的用户,因为对 fq 软件里面配置的节点服务器要求比较高,节点服务器的网络必须支持 IPv6 ,不支持的话就得通过 tunnel broker 或者 cloud flare 的 warp 去弄一个 6In4 隧道,市面上购买的机场一般不具备此条件,只能代理纯 v4 。
综上,如果当前追求稳定,或者购买机场,建议 0 或者 1 ,如果自建机场,有一定 Linux 能力和网络基础,可以尝试折腾下 2 。