故障排查 预计阅读 12 分钟

Clash 系统代理不生效:浏览器与终端分开排查的完整步骤

浏览器能访问、终端却直连,或反过来?分别检查系统代理开关、浏览器扩展接管、终端环境变量与 TUN 模式,逐项定位代理没被应用的环节。

先区分系统代理、应用代理与 TUN

Clash 客户端里的“系统代理”开关,通常只是把本地代理地址写入操作系统的代理设置。它不等于强制接管所有网络连接。浏览器、命令行工具、后台服务可能各自读取不同设置,因此“网页能打开,终端连接超时”并不矛盾。

排查时先看两件事:请求有没有进入 Clash 内核,进入后命中了什么规则。前者是代理入口问题,后者才涉及订阅节点、策略组和分流配置。不要看到出口地址没变化,就立即判断系统代理开关失效。

入口方式设置位置主要限制
系统代理操作系统网络代理页面应用必须主动读取并采用该设置
应用专用代理浏览器扩展、Firefox 网络设置、工具配置可能覆盖系统代理
终端代理环境变量或命令参数不同程序支持的变量与优先级不同
TUN 模式客户端虚拟网卡与路由设置依赖内核能力、系统权限及正确的路由配置

第一步:确认本地代理入口可用

检查混合端口,而不是外部控制端口

在客户端的设置或配置查看页面中查找 mixed-port。混合端口同时接受 HTTP 和 SOCKS 代理请求;external-controller 是管理 API 的监听地址,不能当作网页代理使用。常见的 9090 只是控制端口示例,不能因为它正在监听就填进浏览器代理栏。

mixed-port: 7890
external-controller: 127.0.0.1:9090

先确认内核正在运行、订阅配置已经选中,再使用明确指定代理的命令测试。Windows 的 PowerShell 中使用 curl.exe,避免旧版 Windows PowerShell 将 curl 解释成另一个命令。

# Windows PowerShell
curl.exe -v --connect-timeout 10 --max-time 20 --noproxy "" --proxy http://127.0.0.1:7890 https://example.com/ -o NUL

# macOS / Linux
curl -v --connect-timeout 10 --max-time 20 --noproxy "" --proxy http://127.0.0.1:7890 https://example.com/ -o /dev/null

--noproxy "" 用于清空本次请求的代理绕过列表,避免已有的 NO_PROXY 设置干扰。这里的 10 秒是连接超时上限,20 秒是整次请求上限,不是节点延迟的参考值。测试地址也可以替换成正在出问题的网站,但不要在公开日志中保留带登录令牌的完整 URL。

  • 对 127.0.0.1:7890 出现连接拒绝:先检查内核是否启动、端口是否填错,以及是否有其他进程占用该端口。
  • 看到 HTTP 代理隧道的 200 Connection established:本地代理已经接受 CONNECT 请求,但还需继续观察后续 TLS 与 HTTP 结果。
  • 本地连接成功,随后超时或报 TLS 错误:转向节点连接、目标站点、DNS 或证书排查,不再只盯着系统代理开关。

同时打开客户端“连接”或“日志”页面,发起一次新的请求。日志级别可临时调到 info;确有必要时再用 debug,结束后恢复。显式代理命令成功而浏览器失败,通常说明问题位于浏览器自己的入口设置。

第二步:检查系统代理实际写入的位置

Windows 11:核对手动代理与脚本配置

打开「设置」→「网络和 Internet」→「代理」,查看「手动设置代理」下的「使用代理服务器」。若使用本文示例,地址应为 127.0.0.1,端口应为 7890。启用客户端系统代理后,返回该页面确认值确实改变,而不是只看客户端按钮颜色。

再检查「使用设置脚本」是否启用,以及代理例外列表是否包含目标域名。自动配置脚本、组织策略或另一款网络工具可能改变实际结果。受管理设备应先联系管理员,不要直接删除组织下发的配置。

netsh winhttp show proxy 查看的是 WinHTTP 代理设置,并不等于这个设置页面的完整状态。部分服务使用 WinHTTP,浏览器则可能采用系统代理解析机制或自己的配置。不要为了让输出一致就直接运行全局导入命令;先确认出问题的程序究竟使用哪套网络接口。

macOS:检查当前联网服务

在 macOS 13 及后续版本,打开「系统设置」→「网络」→当前使用的 Wi-Fi 或以太网→「详细信息」→「代理」。检查网页代理(HTTP)、安全网页代理(HTTPS)以及自动代理配置。网络从 Wi-Fi 切换到有线后,需要检查新连接对应的服务,而不是继续看原来的 Wi-Fi 设置。

HTTPS 网页使用 HTTP 代理时,通常通过 CONNECT 建立隧道。本地代理地址写成 http://127.0.0.1:7890 并不意味着网页失去 HTTPS 加密,也不要求把本地地址改成 https://。代理服务器本身是否支持 TLS,是另一项独立能力。

Linux:桌面设置不代表全部程序

GNOME 桌面可在「设置」→「网络」→「网络代理」查看手动或自动模式;其他桌面环境的入口名称可能不同。桌面代理通常只影响读取该设置的应用,不会自动为所有 shell、容器和 systemd 服务注入环境变量。Linux 上终端失败时,应继续检查下一节的环境与程序配置。

第三步:浏览器单独排查扩展、例外和旧连接

先使用同一浏览器的新窗口访问同一个测试地址,并在 Clash 连接页面观察新请求。已有的 HTTP/2 或 HTTP/3 长连接可能继续复用,切换开关后刷新一次页面,未必能完整反映新的连接路径。必要时完全退出浏览器并重新启动。

  1. Chrome 与 Edge:进入浏览器「设置」,搜索“代理”,打开计算机代理设置。桌面版通常采用系统代理,但代理扩展、启动参数和企业策略都可能覆盖它。
  2. 检查代理扩展:临时停用会管理代理的扩展,或将其切换为“系统代理”。不要同时让扩展固定代理、PAC 脚本和客户端系统代理互相覆盖。
  3. Firefox:打开「设置」→「常规」→「网络设置」→「设置」。明确选择“使用系统代理设置”,或用手动代理单独测试,避免误选“无代理”。
  4. 检查绕过列表:查看浏览器和系统中的“不使用代理”或例外项。目标域名如果被覆盖,就可能直接连接。

Firefox 手动配置时,HTTP 代理可填写 127.0.0.1 与实际混合端口,并按界面选项让 HTTPS 使用同一 HTTP 代理;若改用 SOCKS v5,则需关注“使用 SOCKS v5 时代理 DNS”这一选项。不要把 HTTP 代理与 SOCKS 的 DNS 行为混为一谈。

如果请求已进入 Clash,但命中 DIRECT,应检查规则模式、匹配规则和策略组选择。系统代理已完成转交,并不承诺所有网站都从远端节点出口访问。查看一次出口 IP 只能说明那次检测请求的路径,不能代表浏览器的全部连接。

第四步:终端检查环境变量与工具专用配置

终端通常不会因为系统代理开启就自动采用代理。先运行前面的显式代理命令:如果它成功,而普通的 curl 请求失败,就优先检查当前 shell 的环境变量。变量名大小写的支持存在工具差异,例如 curl 出于安全原因不接受大写 HTTP_PROXY 作为 HTTP 代理变量。

PowerShell:只修改当前会话

# 查看已有代理变量
Get-ChildItem Env: | Where-Object Name -Match '^(HTTP_PROXY|HTTPS_PROXY|ALL_PROXY|NO_PROXY)$'

# 为当前 PowerShell 及其后续子进程设置代理
$env:http_proxy = 'http://127.0.0.1:7890'
$env:https_proxy = 'http://127.0.0.1:7890'

# 用一个新的请求验证
curl.exe -v --connect-timeout 10 --max-time 20 https://example.com/ -o NUL

这些赋值只改变当前 PowerShell 进程及它之后启动的子进程,不会同步修改已经打开的 IDE、其他终端或系统服务。Windows 环境变量名称通常不区分大小写;在 macOS 和 Linux 上则需要留意大小写差异。

macOS / Linux:检查当前 shell

# 查看代理相关变量
env | grep -iE '^(http_proxy|https_proxy|all_proxy|no_proxy)='

# 为当前 shell 设置 HTTP 代理
export http_proxy='http://127.0.0.1:7890'
export https_proxy='http://127.0.0.1:7890'

# 发起新请求
curl -v --connect-timeout 10 --max-time 20 https://example.com/ -o /dev/null

https_proxy 的值使用 http:// 是正常写法,表示通过 HTTP 代理访问 HTTPS 目标。若 NO_PROXY 或 no_proxy 包含目标域名,请求仍可能绕过代理;设为 * 甚至可能让该工具的全部请求直连。保留有实际用途的本地地址例外,只调整与本次故障相关的条目。

环境变量正确,程序仍不走代理

并非所有命令行程序都支持这些变量。以 Git 为例,可检查专用配置及其来源:

git config --show-origin --get-regexp '.*proxy.*'

若输出里有旧端口或另一台机器的代理,先记录配置所在文件与作用域,再修改对应项。项目配置、全局配置、URL 专用配置可能同时存在,不要只改一处就判断无效。IDE 内置终端继承的是 IDE 启动时的环境;修改系统环境后,可能需要完全退出 IDE 再打开。

WSL、Docker 容器、虚拟机以及 SSH 远程会话还存在网络边界:它们内部的 127.0.0.1 通常指向各自环境,不一定是运行 Clash 的宿主机。WSL 的具体行为还取决于网络模式与系统配置。应先确认宿主机可达地址和监听范围;如果确需开放局域网访问,应限制防火墙来源,不能把代理端口直接暴露到公网。

第五步:用 SOCKS 与日志区分 DNS、规则和节点问题

如果本地 HTTP 代理可连接,但特定域名失败,可以在同一个混合端口上再做一次 SOCKS 测试。以下命令使用 socks5h,让 curl 把域名交给 SOCKS 代理侧解析,而不是先由 curl 在本地解析目标域名。

# Windows PowerShell
curl.exe -v --connect-timeout 10 --max-time 20 --noproxy "" --proxy socks5h://127.0.0.1:7890 https://example.com/ -o NUL

# macOS / Linux
curl -v --connect-timeout 10 --max-time 20 --noproxy "" --proxy socks5h://127.0.0.1:7890 https://example.com/ -o /dev/null

socks5:// 与 socks5h:// 对 curl 的域名解析位置不同。代理侧收到域名后,还会按内核的 DNS 与规则配置继续处理,因此 SOCKS 测试成功并不能直接证明整台电脑的 DNS 都正常。应把结果和客户端日志中的目标域名、匹配规则、策略链放在一起判断。

观察结果优先检查
显式代理成功,浏览器没有对应连接浏览器扩展、系统代理、PAC 和例外列表
显式代理成功,终端普通请求直连环境变量、NO_PROXY 和工具专用配置
连接进入内核,规则结果为 DIRECT规则顺序、策略组及当前运行模式
连接进入内核,节点拨号超时节点可用性、订阅状态及本地网络
仅部分域名解析失败DNS 日志、域名规则及浏览器安全 DNS 设置

浏览器的安全 DNS 可能改变域名解析路径,但不等于绕过了 HTTP 代理。不要把“启用了安全 DNS”直接当作系统代理失效的证据。只有对同一域名做前后对照,并结合实际连接记录,才能判断是否需要调整解析方式。

第六步:需要接管非代理应用时再检查 TUN

TUN 模式通过虚拟网络接口和路由接收流量,适合处理不读取系统代理的应用,但它不是修复错误端口的替代品。建议先让显式代理命令正常工作,再单独测试 TUN。这样可以区分代理出口故障与虚拟网卡接管故障。

  1. 确认当前客户端和内核支持 TUN。使用 mihomo 的客户端与旧版 Clash 客户端可能提供不同选项,不能把任意网上的配置段直接粘贴到所有版本中。
  2. 按客户端说明安装服务或授予所需权限,再开启 TUN。Windows 客户端可能依赖服务模式或管理员权限,macOS 可能提示授权,Linux 通常涉及网络管理权限。
  3. 检查日志是否报告虚拟网卡创建失败、权限不足或路由添加失败。界面开关处于开启状态,不代表相关操作全部成功。
  4. 排查时暂时只保留一种接管方式:记录原设置后,关闭系统代理,用新的请求观察 TUN 是否接管;完成测试后恢复原来的组合。
  5. 若同时运行其他 VPN、虚拟网卡或网络过滤工具,逐个暂停并对照。不要直接删除路由或网卡,也不要在依赖远程连接的机器上贸然改变默认路由。

在 mihomo 中,tun.enable、auto-route、auto-detect-interface 和 DNS 接管相关设置各有作用。客户端可能在启动时生成或合并配置,修改订阅原文件不一定会成为最终生效值。应查看运行配置或客户端提供的覆盖设置,并在重启内核后核对日志。

TUN 同样受路由排除、进程规则、DNS 配置以及其他网络组件影响,不能简单理解成“打开后所有流量必定代理”。如果请求进入内核后被规则判定为直连,仍然可能使用本地出口。

恢复设置与复核顺序

完成排查后,保留实际需要的入口即可。临时修改的环境变量应恢复成原值;下面命令仅适用于测试前这些变量未设置的情况。如果原先已有企业代理或开发环境代理,应恢复记录下来的值,而不是直接删除。

# PowerShell:清除本次临时添加的变量
Remove-Item Env:http_proxy, Env:https_proxy -ErrorAction SilentlyContinue

# macOS / Linux:清除本次临时添加的变量
unset http_proxy https_proxy
  • 先验本地入口:显式指定实际混合端口,请求能够进入内核。
  • 再验浏览器:核对系统代理、扩展、Firefox 独立配置与例外列表。
  • 单独验终端:检查当前会话的环境变量、程序配置与宿主机网络边界。
  • 最后验分流:查看规则和策略链,再决定是否调整 DNS 或启用 TUN。

需要求助时,提供操作系统版本、客户端与内核版本、实际端口、显式代理命令的结果,以及同一时间段的相关日志。分享前删除订阅地址、节点凭据、API 密钥和个人访问记录。比起只写“Clash 系统代理不生效”,这些信息更能缩小故障范围。

初次设置可继续查看系统代理教程;已经确认请求进入内核但仍然超时,可参考连接超时排查。修改配置前保留副本,每次只改变一个环节,才能明确是哪项设置影响了结果。

Clash 安装包下载