把树莓派变成家里的透明代理旁路由:Mihomo + TPROXY + DNS-only 排障记

💡 原文中文,约16100字,阅读约需39分钟。
📝

内容提要

文章介绍用树莓派5搭建旁路由:由华为AX3 Pro保留DHCP,树莓派仅负责DNS与Mihomo透明代理(TPROXY)。需手动将客户端网关和DNS设为192.168.3.27,并用两个不同SSID区分普通与代理入口。文中记录了双DHCP互抢、Docker默认丢弃转发、同网段双网卡ARP混乱、IPv6绕过代理等故障及修复方法,强调分层验证并保留回滚路径。

🔎

延伸解读

为什么保留华为 DHCP:故障隔离的取舍

文章明确将 DHCP 留在华为 AX3 Pro,树莓派只做 DNS 和透明代理。这不是对树莓派硬件可靠性的判断,而是故障隔离设计:当树莓派整机、服务、供电或网线出问题时,其他家人设备仍能从华为自动获取地址、网关和 DNS 继续上网。旁路由只影响主动选择它的设备,排查时也不会把全家的地址分配和上网入口一起绑定到 Pi。

两个 SSID 的真实作用与限制

文章用两个名称不同的 SSID 区分普通/备用入口和按需旁路由入口,但强调频段本身不会让 AX3 Pro 自动下发两套不同的网关或 DNS。只有选中的客户端手动把网关和 DNS 改为 192.168.3.27,树莓派才会接住其 DNS 和透明流量。两个 SSID 也不提供自动故障切换,旁路由失效时需手动切回自动 DHCP 的备用 SSID。

TPROXY 的覆盖边界:IPv6 与 wlan0 可能绕过

这套 TPROXY 只处理 IPv4 且仅匹配从 eth0 进入的局域网流量。文章记录了两个绕过场景:客户端拿到全局 IPv6 地址后可能直接走 IPv6 出去,完全不经过树莓派;同网段双网卡时 ARP 可能让客户端把网关解析到 wlan0 的 MAC,而规则只匹配 eth0。因此服务 active 不等于端口已监听,也不等于所有流量都被代理。

分层验证与回滚:避免“改完回不去”

文章反复强调按服务层、TPROXY 层、DNS 层、代理层、透明转发层和客户端层逐层验证,并把 systemd active 与实际端口监听分开看。回滚脚本会恢复安装时的文件备份,停止 dnsmasq/netfilter,并删除自己创建的 nft 表、策略路由和 FORWARD 规则。日常维护还需注意订阅更新可能覆盖 config.yaml,以及脚本权限错误会导致服务 203/EXEC。

❓

Q&A

树莓派旁路由方案中,为什么保留华为路由器的DHCP而不是让树莓派接管?

保留华为AX3 Pro的DHCP是为了故障隔离:即使树莓派整机、服务、供电或网络链路出故障,其他家人的设备仍能从华为自动获取地址、网关和DNS,继续正常上网。旁路由只影响主动选择它的设备,避免树莓派成为全家的单点故障。

如何让客户端使用树莓派的透明代理?需要修改哪些网络设置?

需要代理的客户端手动将网关和DNS都设为树莓派的eth0地址192.168.3.27。如果系统因此切换到静态模式,需保留一个不冲突的192.168.3.0/24地址,不能把客户端自己的IP填成.27。普通设备则继续使用自动DHCP,网关和DNS为192.168.3.1。

树莓派上Docker导致局域网直连流量中断,如何修复?

Docker会将iptables的FORWARD链默认策略设为DROP,导致被TPROXY排除的局域网转发流量被丢弃。修复方法是添加一条窄规则:iptables -I FORWARD 1 -i eth0 -o eth0 -s 192.168.3.0/24 -j ACCEPT,只放行eth0进出的局域网流量,不影响Docker自身隔离。

同网段双网卡导致ARP混乱,树莓派上如何配置sysctl解决?

设置net.ipv4.conf.all.arp_ignore=1和arp_announce=2,并对eth0、wlan0分别设置相同参数。这样树莓派只回答配置在收到请求接口上的ARP,确保.27只在eth0上应答,动态管理地址只在wlan0上应答,避免客户端将网关解析到错误接口。同时关闭send_redirects。

IPv6如何绕过TPROXY透明代理?应该如何排查和解决?

TPROXY只处理IPv4,如果客户端有全局IPv6地址且目标有AAAA记录,流量可能直接走IPv6绕过代理。排查时检查客户端Wi-Fi详情是否有全局IPv6、路由器IPv6/RA是否关闭、是否开启Private DNS或VPN。解决方法是关闭路由器的IPv6/RA,使客户端只剩fe80:链路本地地址。

如何配置Mihomo自动选择最优新加坡节点?

创建一个url-test类型的代理组,包含新加坡节点,设置url为http://www.gstatic.com/generate_204,interval: 300,tolerance: 50,lazy: true,expected-status: 204。然后将该组放入🔰国外流量选择列表并设为默认。验证时在面板连接链中应看到[节点, ♻️新加坡自动, 🔰国外流量]。

树莓派旁路由出现故障时,如何快速回滚?

运行sudo /usr/local/libexec/sumpi-gateway-rollback --confirm,脚本会恢复安装时的文件备份,停止dnsmasq和netfilter,并删除自己创建的nft表、策略路由和FORWARD规则。日常应保留配置备份,修改前先备份,以防订阅更新覆盖config.yaml。

🏷️

标签

➡️

继续阅读