Git、npm、pip 和 Docker 在终端里报连接超时,不一定是节点本身不可用。常见原因是命令行程序没有读取系统代理设置,而 Clash 的系统代理通常只影响遵循操作系统代理配置的应用。mihomo 内核的 TUN 模式则通过虚拟网络接口接管更多系统流量,使终端程序即使不支持 HTTP 代理,也有机会按 Clash 规则转发。
不过,TUN 不是“打开后所有连接必定走代理”的开关:流量仍会根据规则选择代理、直连或拒绝;容器、虚拟机和后台服务也可能有独立的网络路径。建议先确认客户端和内核正常,再逐层验证 TUN、域名规则与具体开发工具。
终端为什么不一定跟随系统代理
系统代理一般通过操作系统提供的 HTTP、HTTPS 或 SOCKS 代理设置生效,但命令行工具是否使用它,取决于工具自身。浏览器可能已经走代理,Git 却仍尝试直连;npm 能访问注册表,也不代表 Docker 后台服务使用同一条路径。把代理端口填进某个工具的配置,能够解决该工具的问题,但逐个配置容易遗漏子进程、构建脚本和其他尚未设置的工具。
TUN 模式在系统网络层建立虚拟接口,并由内核接收、识别和路由流量。它适用于没有代理选项或没有读取系统代理环境变量的程序。连接被接管后,最终走向仍由 Clash 规则和策略组决定:匹配到 DIRECT 就直连,匹配到代理策略组才会使用所选节点。TUN 不会自动修复节点故障、DNS 上游错误或目标站点限流。
| 方式 | 适合场景 | 主要边界 |
|---|---|---|
| 系统代理 | 浏览器及会遵循系统设置的桌面应用 | 部分 CLI、后台服务和容器不读取系统代理 |
| 工具代理变量或专属设置 | 只需配置 Git、npm 等少数工具 | 需逐个维护,环境变量可能未传给服务进程 |
| TUN 模式 | 需要接管更多系统网络流量的桌面环境 | 依赖权限、路由和 DNS;虚拟机或容器需单独验证 |
通常先用系统代理或单个工具代理做小范围验证,再启用 TUN 处理需要统一接管的流量。TUN 开启后仍可以保留工具级代理,但两层代理可能造成重复转发、环路或难以判断实际出口;排查时先清除不必要的工具代理设置。
启用 TUN:按平台检查权限与接管状态
桌面客户端的菜单名称会随版本变化,常见入口是「设置」→「网络」或「TUN 模式」。启用前确认当前配置使用支持 TUN 的 mihomo 内核,并检查客户端是否提示安装服务、授予网络权限或以管理员权限重启。仅在配置文件里出现 tun: 字段,不代表虚拟接口已经成功创建;应同时查看客户端状态和运行日志。
- Windows:在 Clash Verge Rev 等客户端中打开 TUN 开关,按提示批准 UAC 权限或安装服务。若开关无法保持开启,查看服务状态、安全软件拦截和日志中的权限错误。测试结束后确认关闭 TUN 能恢复原有网络。
- macOS:按客户端提示授权网络扩展或 VPN 配置。首次批准后,系统设置中可能还需要确认相应的网络扩展权限。Apple Silicon 与 Intel 的客户端构建不同,不能仅凭客户端名称推断内核或权限状态。
- Linux:TUN 通常需要访问
/dev/net/tun以及设置路由的权限。使用图形客户端时查看其服务提示;直接运行 mihomo 时,要确认运行用户拥有所需权限,并检查发行版的防火墙、策略路由和 DNS 管理器是否冲突。
不同系统及客户端可能使用各自的服务安装方式,具体按钮位置以当前版本界面为准。启用后先确认状态显示已运行,再测试终端请求;如果客户端显示 TUN 已开但没有连接记录,可能是流量未进入接口、目标使用了其他网络命名空间,或该请求被系统代理以外的机制处理。
对直接维护 mihomo 配置的用户,下面是可参考的局部配置,不是完整配置文件。先核对当前内核版本支持的字段,并与客户端配置合并,避免重复出现顶层 tun:。日志和实际路由比仅复制示例更重要。
tun:
enable: true
stack: mixed
auto-route: true
auto-detect-interface: true
dns-hijack:
- "any:53"
rules:
- DOMAIN-SUFFIX,github.com,开发代理
- DOMAIN-SUFFIX,registry.npmjs.org,开发代理
- DOMAIN-SUFFIX,pypi.org,开发代理
- DOMAIN-SUFFIX,registry-1.docker.io,开发代理
- MATCH,开发代理
示例中的 开发代理 必须替换成配置里真实存在的策略组名称;规则按从上到下顺序匹配,兜底规则放在最后。Docker 镜像拉取可能涉及多个注册表、认证服务和镜像 CDN 域名,仅添加一条注册表域名规则不保证所有部署都覆盖。实际使用时要从内核连接记录中核对被请求的域名,再按需要补充规则。dns-hijack 仅处理符合配置的 DNS 流量,不等于所有应用都已使用代理 DNS,也不应把这段片段当作防泄漏保证。
为 Git、npm、pip 与 Docker 验证分流
先切换到规则模式,确认代理策略组已选中可用节点。按工具逐个发起短请求,并在客户端的连接或日志页面查找对应域名、命中规则和出站策略。若请求没有出现在连接记录里,先检查 TUN 是否真正接管终端流量;若记录显示直连,则检查规则顺序和域名是否匹配;若显示代理但失败,再检查节点、DNS 和远端服务。
- Git:用
git ls-remote测试一个自己有权访问的仓库。Git 的 HTTP、HTTPS 与 SSH 连接路径不同;为 HTTPS 设置的代理不一定影响 SSH。若使用 SSH,需单独检查目标地址、端口和路由,不要看到 Git 超时就立即认定 TUN 失效。 - npm:可执行
npm ping --registry=https://registry.npmjs.org/验证注册表访问。安装依赖时还可能访问包元数据、压缩包 CDN 或自定义 registry;检查日志中的实际主机名,不要假设所有包都只从一个域名下载。 - pip:可执行
python -m pip index versions 包名测试索引访问,也可检查当前索引配置。企业或项目可能使用私有 PyPI 镜像;应按实际索引域名配置分流,并确认镜像的证书和访问权限。 - Docker:先测试
docker pull指定的镜像,再检查 Docker daemon 日志和 Clash 连接记录。Docker CLI 负责向后台服务提交请求,真正联网下载镜像的通常是 daemon;Docker Desktop 还可能经过虚拟机网络,因此不能只看当前终端的环境变量就判断后台流量已接管。
开发站点的域名与服务端点可能随地区、镜像配置和认证流程变化。以连接日志为准逐步补规则,不建议把整个开发域名空间都无差别地放进代理组。需要保留直连的内部 Git、公司镜像或局域网服务,可以为已确认的域名添加更靠前的直连规则;同时检查规则是否被更早的宽泛规则抢先匹配。
TUN 之外的补充方案:临时代理环境变量
如果不需要全局接管,或者当前环境无法创建 TUN,可以临时为终端设置代理变量。以下示例假设客户端在本机监听 HTTP 代理 127.0.0.1:7890;端口应以客户端界面实际显示为准。端口未启动、只监听其他地址,或代理类型不匹配时,变量设置正确也会连接失败。
# macOS / Linux:仅对当前终端会话生效
export HTTP_PROXY=http://127.0.0.1:7890
export HTTPS_PROXY=http://127.0.0.1:7890
export ALL_PROXY=socks5h://127.0.0.1:7891
export NO_PROXY=localhost,127.0.0.1,::1,.internal
# 清除当前会话的代理变量
unset HTTP_PROXY HTTPS_PROXY ALL_PROXY NO_PROXY
7891 只是常见示例,并不保证你的客户端启用了 SOCKS 端口;如果没有对应监听,请删除 ALL_PROXY 或改成实际端口。socks5h 通常表示域名解析也交给 SOCKS 代理处理;使用 HTTP 代理时按工具支持设置变量。部分程序只读取小写变量名,遇到差异时可按该工具文档同时设置对应的小写名称。
Windows PowerShell 可在当前会话中设置变量,例如 $env:HTTPS_PROXY="http://127.0.0.1:7890";关闭该终端后设置通常不再保留。若工具通过服务、IDE 或容器后台运行,当前交互终端的变量未必会传递给它。NO_PROXY 用于声明不走代理的主机或网段,内容应尽量精确;过宽的排除项可能让本来需要代理的请求意外直连。
环境变量与 TUN 可以作为不同接管层使用,但不建议未经验证就同时配置。若打开 TUN 后连接记录显示相同流量又经过本地代理端口,先清除工具代理变量,再重新测试。工具级配置需要长期保留时,记录修改位置和恢复命令,避免在公共机器或共享 shell 配置中留下敏感代理地址。
TUN 与终端连接故障排查
出现超时、解析失败或连接重置时,先保持节点、网络和测试地址不变,每次只修改一个因素。以下顺序能区分“流量未接管”“规则走错”“域名解析异常”和“代理出口不可用”,避免一开始就同时改 DNS、MTU 与规则。
- 确认接管状态:在客户端检查 TUN 是否运行,查看日志是否有权限、创建接口或路由失败。关闭并重新打开 TUN 后,用同一条命令重试。
- 确认请求实际经过哪里:打开连接记录,查看目标域名、命中的规则与策略组。没有记录时,检查虚拟机、容器、SSH 会话或后台服务是否使用了另一套网络环境。
- 检查域名解析:确认域名能解析,并查看当前配置中 DNS 上游、DNS 劫持和规则解析行为。不要仅凭某个 DNS 测试页面判断开发工具的连接一定走了同一条解析路径。
- 分开验证节点和目标服务:使用浏览器或另一个已知可用的网络请求测试节点出口;若只有某一个注册表或仓库失败,核对该服务状态、认证信息、证书和限流提示。
- 检查网络冲突:退出其他 VPN 或代理工具,检查虚拟机网卡、容器网络、局域网路由和系统防火墙。确认问题后再逐一恢复需要的工具。
| 症状 | 优先检查 | 判断依据 |
|---|---|---|
| 浏览器可用,终端超时 | TUN 状态、终端是否被接管、代理变量 | 连接记录中是否出现终端目标域名 |
| 有连接记录但策略为直连 | 规则顺序、目标域名与策略组 | 日志显示的规则和出站结果 |
| 域名解析失败或间歇失败 | DNS 上游、劫持设置、其他 VPN 的 DNS | 同一域名在配置调整前后的解析结果 |
| Docker 失败而宿主机请求正常 | Docker daemon、Desktop 虚拟机与后台代理设置 | daemon 日志及实际镜像请求的连接记录 |
| 所有目标同时失效 | 节点状态、默认路由、权限与端口监听 | 客户端日志和一个简单 HTTPS 请求 |
MTU 通常不是终端代理超时的第一排查项。只有出现特定网络下大响应卡住、TLS 握手异常或分片相关迹象,并且更换接入网络后表现不同,才值得对照测试 MTU;修改前保存原值,并在同一节点、同一目标下复测。不要为了一个仓库偶发失败就全局改路由表、关闭防火墙或开放 DNS 监听。
常见问题
开启 TUN 后,终端流量是不是一定走代理?
不一定。TUN 扩大的是流量接管范围,具体出站仍由规则决定,可能是代理、直连或拒绝。检查连接记录中的规则与策略组;如果目标没有进入记录,继续检查进程所处的容器、虚拟机或后台服务网络。
已经开启 TUN,还需要设置 HTTP_PROXY 吗?
一般先不要重复配置。TUN 的目标之一就是接管不读取代理变量的流量。只有需要限定某个工具使用不同代理,或 TUN 暂时不可用时,才考虑工具级代理;设置后如出现回环或重复转发,应先清除变量再比较。
Git 能用,但 npm、pip 或 Docker 仍然超时,原因是什么?
这些工具可能访问不同注册表、镜像、认证服务或 CDN,Docker 还常由后台 daemon 发起下载。分别检查失败请求对应的主机名、日志中的出站策略、工具索引配置和服务端认证,不要假设一个域名规则覆盖全部依赖下载。
关闭 TUN 后仍然无法联网,应该怎么恢复?
先确认客户端已停止虚拟接口或服务,再检查系统代理是否仍开启、其他 VPN 是否接管路由,以及系统 DNS 和网络连接是否恢复。按客户端提供的停止或重置方式操作,不要直接删除系统路由;若原网络仍异常,重启客户端或系统后再逐项核对。