TUN 要三样东西,缺一样就起不来
内核得建一块虚拟网卡,得改路由表把默认出口指过去,还得有足够权限干这两件事。缺一样,开关就按不住。别急着重装客户端——先打开日志页,翻到你按下开关的那一刻,TUN 相关那几行会写明是权限不够、设备打不开,还是路由根本没设成。读懂那一行,下面的分诊就快多了。
- 虚拟网卡。Windows 上靠 Wintun 驱动,macOS 和 Linux 用系统自带的 utun / tun 设备。
- 路由表。默认路由要挪到虚拟网卡上,这在主流系统里都属于特权操作。
- 权限。管理员、root,或者客户端事先装好的后台服务。
Windows:驱动、提权,以及服务模式
- 驱动文件不在了。客户端一般把 Wintun 的 dll 放在可执行文件旁边,被安全软件隔离、或者解压时没解全,网卡都建不起来。重新完整解压一次,再把客户端目录加进杀毒软件白名单。
- 没提权。最直接的办法是右键「以管理员身份运行」。嫌每次都点很烦,就去装服务模式。
- 另一个 VPN 客户端还在跑。公司 VPN、游戏加速器、另一套代理工具,谁先抢到默认路由谁说了算。要彻底退出,缩到托盘不算。
- Hyper-V、WSL2、Docker Desktop 都会往系统里加虚拟网卡,路由表比一般机器复杂。TUN 建得起来却抢不到默认出口,症状看着就像「开了却没网」。
服务模式(有的客户端写作 Service Mode 或系统服务)值得单独说。它装一个常驻的系统服务,由服务去动网卡和路由,客户端本体就不必每次提权。Clash Verge Rev 的设置页里有单独的安装按钮,装完之后普通双击启动也能开 TUN。安装当下会弹一次 UAC,这一次躲不掉。
macOS:卡在授权那一步的人最多
- 第一次开 TUN,系统会弹密码框要你授权一个后台助手。点了取消,之后常常就不再问,开关便一直弹回去。把客户端退出重开,或者在客户端里找重装助手的入口,让它重新问一次。
- 系统设置里的登录项与后台扩展列表,对应那一条可能被关掉过。关掉了助手就起不来。
- utun 设备被占着。公司 VPN、Tailscale 这类都会建自己的 utun。先断掉再试。
Linux:权限和 /dev/net/tun
- 先确认 tun 设备到底在不在。精简内核和容器环境里经常没有,得先把 tun 模块加载起来。
- 以普通用户跑二进制没有网络管理权限。要么用客户端提供的服务模式,要么给二进制加上 CAP_NET_ADMIN。
- 内核二进制更新之后 capability 要重新加一次。覆盖安装会把它抹掉,故障看起来像是全新的。
ls -l /dev/net/tun
sudo modprobe tun
sudo setcap cap_net_admin,cap_net_raw+ep /path/to/mihomo
开起来了,却还是没网
route print 0.0.0.0
netstat -rn
ip route show
三条分别对应 Windows、macOS 和 Linux,看默认路由现在指向谁。还指着物理网卡,就是 auto-route 没生效,或者被别的程序改回去了。指向虚拟网卡却仍然不通,那就往 DNS 和防火墙上想:TUN 需要接管 53 端口的查询,被系统或杀毒软件的防火墙挡住虚拟网卡时,流量进得去出不来。还有一种是系统代理和 TUN 同时开着——有的客户端会自己处理回环,有的不会,排障期间只留一个。
TUN 不是必需品。它解决的是「程序不读系统代理」这一类问题;如果你的流量几乎就是浏览器,系统代理够用,而且能省掉这篇里所有驱动和权限的麻烦。为了开 TUN 折腾掉一个下午之前,先想清楚到底需不需要它。