Transparent proxy using side gateway
前言
今天在折腾整个局域网的透明代理,感觉网上现成的 tproxy 方案都要用到防火墙,一堆乱七八糟的转发规则,很不优雅啊。于是想弄点非侵入的代理方案,于是想到使用 tun + 旁路网关的方式,这样只需要在主路由上使用 dhcp 指定旁路网关即可(但是其实也没这么简单,需要处理 ipv6 的情况)
IPv4
ipv4 的旁路网关其实很好配置,只需要在旁路网关上设置好 mihomo,然后设置一下 tun 即可,我这里直接将 mihomo 的 dns 替换掉 op 自带的 dnsmasq,然后将网关指向旁路网关就可以了
IPv6
ipv6 就有点麻烦了,因为 dhcpv6 无法下发指定网关,设备是将收到的 ra 的来源视为 v6 网关的,所以理想中的旁路网关和主路由解耦无法实现了,这里我选择在主路由上设置 dhcpv4,将 v6 前缀中继给旁路网关,并由旁路网关来下发 ra,具体可查看这篇文章
主路由:
首先在全局网络选项中清空 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 服务器所通告的动态网关。