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


mihomo 用 TUN 模式（`stack: system`，`auto-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

```bash
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

```bash
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`：

```yaml
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.stack` 从 `system` 改成 `mixed` 或 `gvisor` 即可，不需要改系统配置。

---

> 作者: Nite  
> URL: https://www.nite07.com/zh-cn/posts/mihomo-tun-no-network/  

