Mihomo TUN 模式断网:ip_forward、UFW 与 Auto-Redirect
目录
mihomo 用 TUN 模式(stack: system,auto-route: true)时,启动后全局断网,SSH 也掉线。问题不在 mihomo 配置本身,而是系统网络转发设置没配齐。
原因
stack: system 让 mihomo 依赖内核网络栈转发 TUN 流量。auto-route: true 会接管默认路由,把所有流量导入 TUN 网卡。但内核转发需要满足三个条件:
net.ipv4.ip_forward必须为1- 防火墙 forward 链不能 DROP
- 内核不能因 rp_filter 丢弃 TUN 网卡返回的 TCP 包
Arch Linux 默认 ip_forward=0,UFW 默认 DEFAULT_FORWARD_POLICY="DROP",这两个挡住转发。就算前两步都改了,在内核 6.x 上 ping 能通但 curl 超时——TCP 握手包从 TUN 网卡回来时被 rp_filter=1 丢掉。表现就是 mihomo 日志能看到 [TCP] ... using DIRECT,但连接一直 timeout。
修复
1. 开启 ip_forward
echo 'net.ipv4.ip_forward = 1' | sudo tee /etc/sysctl.d/99-mihomo.conf
sudo sysctl -p /etc/sysctl.d/99-mihomo.conf2. UFW forward 改为 ACCEPT
sudo sed -i 's/DEFAULT_FORWARD_POLICY="DROP"/DEFAULT_FORWARD_POLICY="ACCEPT"/' /etc/default/ufw
sudo ufw reload3. 开启 auto-redirect
在 config.yaml 的 tun 部分加 auto-redirect: true:
tun:
enable: true
stack: system
auto-route: true
auto-redirect: true
auto-detect-interface: trueauto-redirect 会自动配置 nftables 规则重定向 TCP 连接,绕过 rp_filter 对 TUN 网卡返回包的过滤。改完重启 mihomo。
另一个选择
不想改系统转发配置的话,可以换 TUN 协议栈:
mixed:TCP 用 system 栈,UDP 用 gvisor 栈,兼容性比 system 好,性能比纯 gvisor 高gvisor:完全在用户态处理 TCP/IP,不依赖内核转发,兼容性最强但性能略低
把 config.yaml 里 tun.stack 从 system 改成 mixed 或 gvisor 即可,不需要改系统配置。