先区分流量接管与出站规则
系统代理和 TUN 解决的是同一个前置问题:应用发出的连接,怎样进入 Clash 内核。进入内核以后,再由运行模式、分流规则和策略组决定直连、代理或拒绝。开启 TUN 不等于开启全局代理;开启系统代理也不等于所有进程都会遵从它。
本文以使用 mihomo 内核的 Clash 客户端为例。不同客户端、内核和操作系统的 TUN 实现并不完全相同,不能把某个客户端的开关名称直接套到所有软件上。操作前先在客户端的内核信息中确认实际运行的是 mihomo,再对照它支持的配置字段。
系统代理:由应用主动连接本地端口
浏览器怎样把连接交给 Clash
客户端打开“系统代理”后,通常会把操作系统的 HTTP、HTTPS 代理地址改成本地监听地址。例如,配置中的 mixed-port: 7890 表示在同一个端口接受 HTTP 代理和 SOCKS 请求。这里的 7890 是示例值,检查时应以当前生效配置为准。
支持系统代理的浏览器读取设置后,先连接 127.0.0.1:7890。访问 HTTPS 网站时,通常通过 HTTP CONNECT 建立隧道,再在隧道中进行 TLS 通信。普通代理转发不需要给浏览器安装用于解密网站流量的根证书。
支持系统代理的应用
→ 127.0.0.1:7890
→ mihomo 规则匹配
→ DIRECT 或所选代理节点
系统设置不等于所有程序的设置
- Windows 11 可在「设置」→「网络和 Internet」→「代理」检查代理地址与端口。系统代理关闭后,这里的相关设置也应恢复。
- macOS 可在「系统设置」→「网络」→当前网络服务→「详细信息」→「代理」检查 HTTP、HTTPS 与 SOCKS 项。具体入口文字可能随系统版本略有变化。
- 命令行工具、独立网络栈的应用和游戏可能不读取这些设置,需要显式指定代理、设置环境变量,或者改用 TUN。
因此,“浏览器能访问、终端不能访问”不一定是节点失效。两者可能根本没有经过同一条接管路径。类似地,Windows 的 WinHTTP 代理与用户界面的代理设置并非同一套状态,不能只凭 netsh winhttp show proxy 的输出判断浏览器是否使用代理。
TUN:通过虚拟网卡与路由接管
TUN 是三层虚拟网络接口。启用后,客户端或辅助服务创建虚拟网卡,并按配置调整路由。目标地址命中这些路由的 IP 数据包被送入内核处理,不要求应用先理解 HTTP 代理或 SOCKS 协议。
应用发出 IP 数据包
→ 操作系统路由选择
→ TUN 虚拟网卡
→ mihomo 网络栈与规则匹配
→ DIRECT 或所选代理节点
这条路径使不遵从系统代理的应用也有机会进入分流规则。它不保证所有协议都能通过任意代理节点转发:例如游戏语音需要 UDP,仍然要求节点协议、服务端和相关设置支持 UDP;ICMP 能否获得符合预期的响应,也不能用来直接推断 HTTPS 代理是否正常。
三个常见字段分别负责什么
| 字段 | 作用 | 检查重点 |
|---|---|---|
auto-route | 自动配置通向 TUN 的路由 | 是否与公司 VPN、其他虚拟网卡冲突 |
auto-detect-interface | 自动识别用于出站的网络接口 | 切换 Wi-Fi、有线网络后是否选对出口 |
stack | 选择 TUN 使用的网络栈 | 根据内核支持情况与系统兼容性选择 |
创建网卡和修改路由通常需要管理员权限、系统服务或平台授权。客户端的“服务模式”常用于让辅助服务承担这些操作,不等于代理服务器,也不意味着服务安装成功后节点就一定可用。若 TUN 开关立即回弹,应先查看权限、服务和网卡创建日志,再排查节点。
DNS 与 fake-ip:域名如何参与分流
系统代理场景下,应用可能把域名直接交给本地代理,也可能先在本地解析;具体行为取决于应用与代理协议。TUN 收到的则是 IP 数据包,若内核没有相应域名映射,仅凭目标 IP 无法始终准确还原应用原先访问的域名。
fake-ip 模式通过给域名返回一个合成地址,保存域名与地址的对应关系。例如 mihomo 常用的 198.18.0.0/16 范围用于这类映射,并不代表网站真实出口地址。应用随后连接合成地址时,内核可取回域名,再让 DOMAIN-SUFFIX 等规则参与匹配。
配置片段要合并进已有 Profile
下面是用于说明字段关系的 mihomo YAML 片段,不含节点与策略组,不能作为完整订阅使用。它采用 IPv4 DNS 示例;不要直接覆盖已有 Profile,也不要在文件中重复添加第二个顶层 dns 或 tun。若客户端使用覆写或合并机制,应检查最终生效配置。
mixed-port: 7890
mode: rule
tun:
enable: true
stack: system
auto-route: true
auto-detect-interface: true
dns-hijack:
- any:53
dns:
enable: true
listen: 127.0.0.1:1053
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
nameserver:
- 223.5.5.5
dns-hijack 中的 any:53 表示对被 TUN 捕获的相应传统 DNS 请求进行劫持,默认匹配 UDP;需要处理 TCP DNS 时,可按内核文档增加 tcp://any:53。它不是把所有 DNS 协议强制转换成本地解析:浏览器内置 DoH 通常使用 HTTPS,不能只靠端口 53 的规则接管。
怎么选:先按应用需求判断
| 使用场景 | 优先尝试 | 验证方法 |
|---|---|---|
| 浏览器、读取系统代理的桌面应用 | 系统代理 | 打开网页,确认客户端连接记录中出现对应域名 |
| 单个命令行工具 | 工具自己的代理参数 | 显式指定本地端口,对比不指定代理时的结果 |
| 忽略系统代理的应用 | TUN | 关闭系统代理后,检查应用新连接是否仍进入内核 |
| 游戏、语音等 UDP 应用 | TUN 与支持 UDP 的节点 | 检查 UDP 连接、策略组选择与实际会话是否正常 |
| 同时使用公司 VPN | 先保留已有网络方案 | 检查内网路由、域名解析和地址排除项,再逐项启用 |
两种方式可以同时开启,但第一次排查时不建议这样做。支持系统代理的应用可能继续连接本地代理端口,其他应用则走 TUN,连接记录看起来都正常,却难以确定究竟是哪种接管方式生效。先把单一路径验证清楚,再按实际需求组合。
也不要用“开启 TUN 后延迟更低”作为通用判断。TUN 改变的是本机接管路径,远端出口地区、线路负载和服务端状态仍由节点决定。比较时至少固定目标网站、节点、规则模式和测试工具,避免把换节点带来的变化归因于虚拟网卡。
切换步骤:每次只改变一个变量
- 保存当前配置。记录 Profile 名称、本地端口、运行模式和策略组选择。复制自定义覆写,避免订阅更新后无法恢复。
- 先验证本地代理入口。暂时关闭 TUN,保持内核运行,用显式代理命令访问测试地址。失败时先处理端口、节点或规则问题。
- 验证系统代理。打开系统代理,用浏览器访问相同地址,在客户端连接页查看域名、命中规则和实际出站。测试后关闭系统代理。
- 单独启用 TUN。按客户端要求授权或启动服务,确认没有网卡创建失败、路由写入失败等日志,再测试不设置代理的应用。
- 检查业务之外的连接。测试局域网设备、公司内网、语音和休眠唤醒后的网络。确认需要保留的直连没有被错误送往远端节点。
用命令区分端口问题与路由问题
下面的地址仅作测试示例。Windows 可使用 curl.exe,macOS、Linux 可使用 curl。将示例端口替换成当前配置中的实际值;第二条命令清除本次请求的显式代理影响,但在 TUN 已开启时,数据包仍可能被虚拟网卡接管。
# 测试本地 HTTP 代理入口
curl --proxy http://127.0.0.1:7890 --connect-timeout 10 -I https://example.com/
# 不使用 curl 的代理入口,观察系统路由路径
curl --proxy "" --noproxy "*" --connect-timeout 10 -I https://example.com/
返回 HTTP 状态只能说明该次请求获得了响应,不能独立证明是否走代理。还要在客户端连接页核对该请求是否出现、命中哪条规则,以及最后选择的是 DIRECT 还是代理节点。浏览器可能复用旧连接,切换后应关闭旧连接或重启测试应用再观察。
常见故障按入口、DNS、路由排查
系统代理可用,TUN 不通
- 先看 TUN 服务、权限与虚拟网卡状态,而不是立即更换订阅。显式代理已经可用,说明至少这条代理入口与所测节点能工作。
- Windows 使用
route print,macOS 使用netstat -rn,Linux 使用ip route检查路由;Linux 如启用了策略路由,还需结合ip rule与相关路由表查看。 - 检查 DNS 是否返回地址、fake-ip 映射是否交给同一个内核处理,以及其他 VPN 是否抢占路由。IPv4 成功不能替代 IPv6 验证。
网页正常,游戏或语音不通
先确认应用连接是否进入 TUN,再确认相应策略组实际选中的节点支持 UDP。网页主要测试的是 TCP 或浏览器自身的连接路径,不能证明游戏的 UDP 通道可用。也不要只看节点延迟测试结果;测试 URL 成功和业务协议成功是两件事。
退出客户端后仍无法联网
先检查系统代理是否仍指向已停止监听的 127.0.0.1 端口,再通过客户端正常关闭 TUN,确认路由与 DNS 设置恢复。若客户端异常退出,可重新启动后执行正常关闭;仍有问题时,保存日志并按操作系统网络设置逐项恢复,不要直接批量删除全部网卡或路由。