开了 TUN 模式还是直连?90% 的人都踩过这个坑

网络问题是做技术绕不开的三座大山之一,而且往往排第一。所以遇到tun模式失效,我们该怎么火速解决呢?


先说结论

根本原因只有一个:代理客户端没有系统级权限,TUN 虚拟网卡压根没创建成功。

解决方法也只有一个:安装服务模式(Service Mode)

设置 → 服务模式 → 安装 → 重启客户端 → 重新开启 TUN

就这一步。下面的内容是帮你搞清楚为什么,以及怎么确认问题真的修好了。


你以为开了 TUN,其实没有

很多人的状态是这样的:

  • 全局模式 ✅ 打开了
  • TUN 模式 ✅ 打开了
  • 终端跑一下 curl ipinfo.io,IP 还是国内的

直觉反应是配置有问题,或者客户端 bug。

其实不是。UI 上的开关只是个开关,背后的 TUN 网卡根本没建起来。


怎么确认 TUN 没生效

第一招:看路由表

bash 复制代码
netstat -rn | grep default

有问题的输出长这样:

复制代码
default   192.168.3.1   UGScg   en0
default   fe80::%utun0  UGcIg   utun0
default   fe80::%utun1  UGcIg   utun1

看到没有------IPv4 的 default 路由指向的是 en0,也就是你的物理网卡。utun 接口全部是 fe80:: 开头的 IPv6 地址,跟代理一点关系没有。

正常接管后应该是这样:

复制代码
default   198.18.0.1   UGScg   utunX   ← IPv4 走 TUN 虚拟网卡
default   192.168.3.1  UGScg   en0

第二招:看有没有 198.18 地址

bash 复制代码
ifconfig | grep -B1 "198.18"

没有任何输出 = TUN 网卡不存在。

代理客户端正常创建 TUN 网卡后,会有一个 utun 接口持有 198.18.0.1 这个地址。如果找不到,说明客户端根本没有成功创建这张虚拟网卡。

那些 utun0utun1utun2......全是 macOS 系统自己的,跟你的代理客户端无关。


为什么会这样

macOS 管得很严。

向系统路由表写条目、创建虚拟网卡,都需要管理员级别的系统权限。

普通应用进程没有这个权限。客户端 UI 可以显示"TUN 已开启",但实际的系统操作全部失败了------静默失败,没有任何报错提示。


解决方法:装服务模式

服务模式会把客户端的核心组件注册为系统服务,以足够高的权限运行,才能真正操作路由表和网卡。

步骤:

  1. 打开 *** Verge
  2. 进「设置」
  3. 找「服务模式(Service Mode)」,点安装
  4. 系统会弹出授权窗口,输入管理员密码
  5. 安装完成后,完全退出客户端(Cmd+Q,不是关窗口)
  6. 重新启动,开启 TUN

装完之后验证一下:

bash 复制代码
# 看 TUN 网卡有没有建起来
ifconfig | grep -B1 "198.18"

# 看 IPv4 默认路由是不是走 utun 了
netstat -rn | grep "^default.*utun"

# 最终验证
curl ipinfo.io

如果 ifconfig 里出现了 inet 198.18.0.1 的 utun 接口,路由表里 IPv4 default 指向 utun,就说明完全修好了。


还有几个附带问题

TUN 配置不对

服务模式装好了,也别忘了检查 TUN 的配置文件,有两个字段最容易漏:

yaml 复制代码
tun:
  enable: true
  stack: system
  auto-route: true              # 漏了这个,路由表不会写入
  auto-detect-interface: true   # 漏了这个,网卡出口识别不了
  inet4-address: 198.18.0.1/16
  dns-hijack:
    - any:53

auto-route: true 是最常见的漏填项。没有它,即使 TUN 网卡创建成功,IPv4 流量也不会走进去。

DNS 泄漏

流量走了 TUN,但 DNS 查询没被接管,一样会暴露真实位置:

bash 复制代码
scutil --dns | grep nameserver

正常情况下应该能看到 198.18.0.2(*** 的虚拟 DNS 地址),如果还是运营商的 DNS 就说明 DNS 没被劫持,需要检查 dns-hijack 配置。

终端环境变量干扰

有时候终端里设了代理相关的环境变量,会干扰测试结果:

bash 复制代码
env | grep -i proxy

如果有输出,先清掉再测:

bash 复制代码
unset ALL_PROXY HTTP_PROXY HTTPS_PROXY
curl ipinfo.io

一句话总结

TUN 模式不生效,99% 是没装服务模式。装好、重启、重开 TUN,三步搞定。配置文件记得加 auto-route: true

相关推荐
liulilittle3 个月前
LIBTCPIP 技术探秘(tun2sys-socket)
开发语言·网络·c++·信息与通信·通信·tun
Just_Paranoid4 个月前
【Settings】Android 设备信息相关参数的获取
android·5g·wifi·ip·sn·network
虚伪的空想家5 个月前
ip网段扫描机器shell脚本
android·linux·网络协议·tcp/ip·shell·脚本·network
IT成长日记7 个月前
【LVS入门宝典】LVS-TUN模式原理与配置:跨越网络界限的负载均衡解决方案
linux·网络·负载均衡·lvs·tun
IT成长日记7 个月前
【LVS入门宝典】LVS-TUN模式配置实战以及配置关键点:Real Server的路由表调整、ipip模块加载
linux·运维·服务器·lvs·tun
IT成长日记7 个月前
【LVS入门宝典】LVS核心原理与实战:Director(负载均衡器)配置指南
linux·运维·负载均衡·lvs·nat·dr·tun
quqi999 个月前
strongswan (by quqi99)
network
qwfys20010 个月前
一次网络问题排查
linux·kylin·network·v10
为什么要做囚徒1 年前
CentOS网络之network和NetworkManager深度解析
linux·网络·centos·network·networkmanager