先区分系统代理、应用代理与规则分流

系统代理开启,只代表操作系统记录了代理设置,不代表所有进程都会使用它。浏览器可能遵循系统设置,也可能被扩展或独立配置覆盖;命令行程序通常需要环境变量或专用参数。连接进入 Clash 内核以后,还要按当前模式、规则和策略组决定最终出口。

因此,“出口地址没变”不能单独证明系统代理失效。连接可能已经进入内核,但命中了 DIRECT;也可能应用完全绕过了代理。排查时应同时看应用配置与客户端连接记录,不要只看网页是否打开。

在支持这些字段的 Clash 或 mihomo 内核中,下列片段表示仅向本机提供 HTTP 与 SOCKS 代理入口。它需要合并进已有配置,不包含节点与规则,不能替代完整订阅。

mixed-port: 7890
allow-lan: false
mode: rule
log-level: info

第一步:确认内核监听与显式代理请求

先绕开系统代理开关,用命令明确指定入口。如果显式代理也失败,应先查监听端口、内核运行状态和节点连接,而不是继续修改浏览器选项。

检查 7890 是否在监听

Windows PowerShell 可执行以下命令。输出中的 OwningProcess 是进程编号,可在任务管理器的“详细信息”页核对,避免把其他软件占用的端口当成 Clash。

Get-NetTCPConnection -LocalPort 7890 -State Listen |
  Select-Object LocalAddress, LocalPort, OwningProcess

macOS 可用 lsof,Linux 可用 ss。没有输出时,先确认实际端口是否不同,以及配置是否成功载入。

# macOS
lsof -nP -iTCP:7890 -sTCP:LISTEN

# Linux
ss -lntp 'sport = :7890'

用 curl 显式指定 HTTP 代理

Windows 使用 curl.exe,避免部分 PowerShell 环境中的同名别名干扰。macOS 与 Linux 将命令名改为 curl 即可。这里的 --noproxy "" 用于排除已有绕过列表对本次测试的影响。

curl.exe --proxy http://127.0.0.1:7890 --noproxy "" --connect-timeout 10 --max-time 30 -v https://example.com/

先看是否连接到 127.0.0.1:7890,再看 HTTPS 的 CONNECT 隧道是否建立,最后才看目标站响应。示例域名只用于连通性演示;定位实际故障时,应使用同一个出现问题的目标地址。

观察结果优先检查
连接本地 7890 被拒绝内核是否运行、端口是否一致、监听地址是否可达。
本地入口已连接,目标连接超时客户端日志里的目标、规则、策略组和节点出口。
请求成功,浏览器仍失败浏览器代理来源、扩展、绕过列表与已有连接。
显式参数成功,普通终端命令失败环境变量是否设置、程序是否支持、是否被工具配置覆盖。

CONNECT 成功只能证明代理入口接受了隧道请求,不能独立证明走了某个远端节点。最终路径仍要结合客户端连接详情中的规则与链路判断。

第二步:浏览器按代理来源逐项检查

先核对操作系统中的实际地址

Windows 11 可进入“设置”→“网络和 Internet”→“代理”,查看手动代理地址与端口。macOS 可进入“系统设置”→“网络”→当前使用的网络服务→“详细信息”→“代理”。不同系统版本的文字可能略有区别,重点是检查当前正在使用的网络服务,而不是已断开的 Wi-Fi 或网卡。

再排除扩展与浏览器独立配置

Chrome、Edge 在常规桌面环境下通常读取系统代理,但代理切换扩展、启动参数与企业策略都可能覆盖它。先暂停代理相关扩展,完全退出浏览器并重新打开,再对同一网址测试。无痕窗口不能保证排除所有扩展,因为扩展可以获准在无痕模式运行。

Firefox 可在“设置”→“常规”→“网络设置”→“设置”中检查代理来源。需要沿用操作系统设置时,选择“使用系统代理设置”;若选择“手动配置代理”,则必须单独核对地址、端口和“不使用代理”列表。

公司管理设备还应检查浏览器的管理状态。Chrome 的 chrome://policy 与 Edge 的 edge://policy 可查看策略是否生效;受管理策略限制时,应向管理员确认,不要反复覆盖设置。

查看绕过列表与连接复用

浏览器和系统常对本地地址、内网域名或指定网段绕过代理。用 localhost、路由器管理页或公司内网地址测试,往往无法判断公网代理是否有效。修改设置以后,已有长连接也可能继续复用;关闭相关标签页、完全退出浏览器再启动,比连续刷新同一页面更适合复测。

第三步:终端单独设置 http_proxy 与 HTTPS_PROXY

终端窗口不会因为客户端开启系统代理,就自动给所有命令注入环境变量。先在当前会话临时设置,确认有效后再考虑持久化。对于 HTTP 代理入口,即使目标网站是 HTTPS,代理地址也通常仍写 http://127.0.0.1:7890,不能仅因变量名含 HTTPS 就改成 https://。

macOS 与 Linux:当前 shell 临时设置

export http_proxy=http://127.0.0.1:7890
export https_proxy=http://127.0.0.1:7890
export no_proxy=localhost,127.0.0.1,::1

curl --connect-timeout 10 --max-time 30 -v https://example.com/

# 测试结束后移除本次设置
unset http_proxy https_proxy no_proxy

curl 对 HTTP 代理变量只接受小写的 http_proxy;其他程序的大小写支持可能不同。若同时存在大写变量、ALL_PROXY 或工具自带配置,应一并检查,避免删除一组变量后仍被另一组影响。

Windows PowerShell:当前进程环境变量

$env:HTTP_PROXY = "http://127.0.0.1:7890"
$env:HTTPS_PROXY = "http://127.0.0.1:7890"
$env:NO_PROXY = "localhost,127.0.0.1,::1"

curl.exe --connect-timeout 10 --max-time 30 -v https://example.com/

# 测试结束后移除本次设置
Remove-Item Env:HTTP_PROXY, Env:HTTPS_PROXY, Env:NO_PROXY

这些设置仅作用于当前 PowerShell 与随后启动的子进程,不会修改已经运行的 IDE、终端或后台服务。若原先有变量值,应先记录,结束测试后恢复原值,而不是直接删除。通过系统界面持久修改变量后,通常需要重新启动相关应用才能继承新值。

第四步:检查 Git、WSL 与工具自己的代理配置

如果 curl 正常而某个工具失败,不应立刻判定节点不可用。Git、包管理器与运行时可能有专用代理设置,也可能由不同网络库处理环境变量。以 Git 为例,先查看所有已定义的配置及其来源:

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

输出可能来自系统、用户或当前仓库配置。确认是过期配置后,应在对应作用域处理,不要直接清空所有层级。需要只对一次命令指定入口时,可执行:

git -c http.proxy=http://127.0.0.1:7890 ls-remote https://github.com/git/git.git HEAD

第五步:请求进入内核后,再看规则与出口

在客户端的连接列表或运行日志中,用目标域名与测试时间定位本次请求。重点记录目标地址、匹配规则、所选策略组和实际链路。客户端界面名称不统一,但这几项比“已开启”状态更能说明流量去了哪里。

  1. 如果看到 DIRECT,先检查是否命中了直连规则,或策略组当前选中了直连。
  2. 如果进入预期策略组但超时,再排查节点、服务端与本地到节点的连接。
  3. 如果完全没有相关记录,先核对日志级别、筛选条件和请求是否真实发出,再回头检查应用入口。

短时提高到 log-level: debug 可以补充线索,复现完成后恢复 info。日志可能含域名、内网地址与订阅相关信息,提交给他人之前应脱敏。不要用关闭 TLS 证书验证的方法“修复”代理;证书错误需要按证书链、系统时间和网络拦截分别处理。

什么时候考虑 TUN 模式?

应用不支持代理设置,或需要接管更多网络流量时,再考虑 TUN。系统代理主要依赖应用主动使用代理入口;TUN 通过虚拟网卡和路由接管流量,覆盖范围不同。Clash Meta 后续发展的 mihomo 支持相关功能,但能否使用还取决于客户端集成、系统权限和运行环境,不能把所有名为 Clash 的客户端视为同一实现。

在 mihomo 环境中,以下只是字段关系示例,不是适用于所有设备的通用配置。部分客户端会根据界面选项生成这些字段,应优先核对最终生效配置,避免界面开关与手写内容互相覆盖。

tun:
  enable: true
  stack: mixed
  auto-route: true
  auto-detect-interface: true

按结果收敛,不同时改多个开关

最短排查路径是:确认监听端口 → 显式指定代理测试 → 浏览器核对设置来源 → 终端核对环境变量 → 客户端核对规则与链路。只有应用确实无法通过常规代理接入时,才进一步评估 TUN。

每次复测保留四项信息:操作系统与客户端名称、实际监听端口、执行的完整命令、同一时间的连接记录。若显式代理成功而浏览器失败,继续查浏览器;若终端加参数成功而不加参数失败,继续查环境与工具配置。这样可以把“系统代理没效果”拆成可验证的问题,而不是反复重装客户端。

需要核对字段含义,可查看Clash 配置字段;初次导入配置和选择代理模式,可从入门指南按顺序操作。