Mihomo TUN 模式断网:ip_forward、UFW 与 Auto-Redirect

目录

mihomo 用 TUN 模式(stack: systemauto-route: true)时,启动后全局断网,SSH 也掉线。问题不在 mihomo 配置本身,而是系统网络转发设置没配齐。

原因

stack: system 让 mihomo 依赖内核网络栈转发 TUN 流量。auto-route: true 会接管默认路由,把所有流量导入 TUN 网卡。但内核转发需要满足三个条件:

  1. net.ipv4.ip_forward 必须为 1
  2. 防火墙 forward 链不能 DROP
  3. 内核不能因 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.conf

2. UFW forward 改为 ACCEPT

sudo sed -i 's/DEFAULT_FORWARD_POLICY="DROP"/DEFAULT_FORWARD_POLICY="ACCEPT"/' /etc/default/ufw
sudo ufw reload

3. 开启 auto-redirect

在 config.yaml 的 tun 部分加 auto-redirect: true

tun:
  enable: true
  stack: system
  auto-route: true
  auto-redirect: true
  auto-detect-interface: true

auto-redirect 会自动配置 nftables 规则重定向 TCP 连接,绕过 rp_filter 对 TUN 网卡返回包的过滤。改完重启 mihomo。

另一个选择

不想改系统转发配置的话,可以换 TUN 协议栈:

  • mixed:TCP 用 system 栈,UDP 用 gvisor 栈,兼容性比 system 好,性能比纯 gvisor 高
  • gvisor:完全在用户态处理 TCP/IP,不依赖内核转发,兼容性最强但性能略低

把 config.yaml 里 tun.stacksystem 改成 mixedgvisor 即可,不需要改系统配置。

目录