系统代理不生效排查:浏览器走了代理,终端为什么没走

系统代理只对遵守系统设置的应用有效。分浏览器与终端两条线排查:浏览器查扩展与代理覆盖,终端讲清环境变量写法,并说明何时应改用 TUN 模式接管全部流量。

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

打开 Clash Nyanpasu 的「系统代理」后,客户端会把本机代理地址写入操作系统设置。以常见配置为例,代理服务器是 127.0.0.1,混合端口是 7890。浏览器读取这项设置后,会把 HTTP 请求以及通过 CONNECT 建立的 HTTPS 连接交给 Clash;Clash 再按照当前配置中的规则、策略组和节点处理流量。

关键点在于,系统代理是一项供应用读取的设置,不是操作系统对所有网络包的强制转发。Chrome、Edge、Safari 等桌面浏览器通常会遵守系统代理,许多命令行程序、游戏启动器、开发工具和自带网络栈的应用则会自行决定是否读取。因此,“浏览器可以访问,终端仍然直连”并不矛盾,通常说明代理核心与节点已经工作,问题集中在终端程序如何取得代理参数。

接管方式 生效范围 常见配置位置 适合场景
系统代理 读取操作系统代理设置的应用 Clash Nyanpasu「设置」→「系统代理」 浏览器与常规桌面应用
应用内代理 指定应用自身 应用网络设置或启动参数 Git、浏览器扩展、开发工具
环境变量 当前终端或由其启动的进程 HTTP_PROXY、HTTPS_PROXY、ALL_PROXY curl、包管理器、命令行工具
TUN 模式 经过虚拟网络接口的更多流量 Clash Nyanpasu「设置」→「TUN 模式」 不读取代理设置的应用与 UDP 流量

第一步:确认 Clash 核心与本地端口正常

不要一开始就修改系统网络设置。先在 Clash Nyanpasu 中确认配置已经启用、代理核心处于运行状态,并检查当前模式是「规则」「全局」还是「直连」。规则模式下,某些目标按规则直接连接属于预期结果;如果测试域名命中了 DIRECT,即使请求进入 Clash,也看不到代理节点出口。

核对混合端口与监听地址

进入「设置」→「Clash 设置」或当前版本对应的端口设置页面,查看 mixed-port。常见值是 7890,但导入配置、端口冲突或手动调整都可能让实际值变成 78917897 等。后续命令中的端口必须与界面一致。

默认监听地址通常使用回环地址 127.0.0.1。如果命令就在本机运行,不需要开启局域网访问,也不应把代理地址填成本机 Wi-Fi IP。只有容器、虚拟机或同一局域网中的其他设备需要访问时,才需要结合 allow-lan、防火墙和监听地址进一步配置。

用 curl 直接测试本地代理

先绕过系统代理设置,明确指定 Clash 的 HTTP 代理进行一次请求:

curl -I -x http://127.0.0.1:7890 https://www.example.com

如果返回 HTTP/2 200HTTP/1.1 200 OK 或目标站点的正常重定向状态,说明本地端口可连接,HTTPS 隧道也已建立。若提示 Failed to connectConnection refused,优先检查端口、核心运行状态和本地防火墙。若连接建立后超时,则查看 Clash 日志中的规则命中、节点错误和 DNS 结果。

还可以指定 SOCKS5 入口测试。混合端口通常同时接受 HTTP 与 SOCKS5,请以当前配置为准:

curl -I --proxy socks5h://127.0.0.1:7890 https://www.example.com

socks5h 中的字母 h 表示由代理端解析目标域名,适合用来区分本地 DNS 解析问题与代理链路问题。如果 HTTP 代理测试成功、直接请求失败,基本可以把排查范围收敛到系统设置或应用配置。

浏览器能用时,检查扩展与代理覆盖

浏览器访问正常只能证明“浏览器当前使用的某条代理路径可用”,不能直接证明系统代理设置正确。Chrome 和 Edge 一般读取系统代理,但代理扩展、企业策略、启动参数以及浏览器内置的安全 DNS 都可能改变实际行为。Firefox 还拥有独立的连接设置,可以选择系统代理、手动代理或直接连接。

排除浏览器代理扩展的独立配置

  1. 暂时停用负责切换代理的浏览器扩展。
  2. 完全退出浏览器,再重新启动,避免后台进程继续沿用旧连接。
  3. 只开启 Clash Nyanpasu 的系统代理,然后重新访问测试页面。
  4. 在 Clash 的连接记录中确认出现对应域名,并查看规则命中结果。

如果停用扩展后立刻失效,说明此前是扩展直接连接 127.0.0.1:7890,而不是系统代理生效。此时应检查操作系统代理地址是否仍指向旧端口,或者系统代理开关是否被其他代理软件覆盖。

检查 Firefox 的连接设置

Firefox 可进入「设置」→「常规」→「网络设置」→「设置」。选择「使用系统代理设置」时,它才会跟随操作系统;选择「手动代理配置」时,需要把 HTTP 代理与 HTTPS 代理填写为 127.0.0.1 和实际混合端口。若使用 SOCKS,应选择 SOCKS v5,并根据需求启用通过 SOCKS 代理 DNS。

识别安全 DNS 带来的差异

浏览器的 DNS over HTTPS 可能让域名解析路径与终端不同。终端通常先调用系统 DNS,浏览器则可能向自己的加密 DNS 服务查询。若表现为浏览器可访问、终端提示“无法解析主机”,先运行 nslookupdig 检查系统解析,再用前面的 socks5h 请求测试代理端解析。此时问题不一定出在代理端口,而可能是系统 DNS、VPN 残留设置或网络接口优先级。

终端为什么不会自动跟随系统代理

命令行工具跨平台运行时,往往不依赖桌面系统的代理接口。curl、Git、Python、Node.js 及各类包管理器对代理变量的支持也不完全相同。最稳定的做法是先给当前终端会话设置环境变量,再启动目标命令;测试完成后清除变量,避免以后切换端口时仍连接旧地址。

Windows PowerShell 临时设置

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

curl.exe -I https://www.example.com

HTTPS_PROXY 的值写成 http:// 是常见且正确的配置:它表示客户端先通过 HTTP 代理建立 CONNECT 隧道,隧道内再传输 HTTPS。不要因为变量名包含 HTTPS 就擅自把协议改成 https://,除非本地代理端口明确提供 TLS 代理服务。

这些 PowerShell 变量只影响当前窗口以及从该窗口启动的子进程。关闭窗口后设置失效。清除方式如下:

Remove-Item Env:HTTP_PROXY
Remove-Item Env:HTTPS_PROXY
Remove-Item Env:ALL_PROXY
Remove-Item Env:NO_PROXY

Windows CMD 临时设置

set HTTP_PROXY=http://127.0.0.1:7890
set HTTPS_PROXY=http://127.0.0.1:7890
set ALL_PROXY=socks5://127.0.0.1:7890
set NO_PROXY=localhost,127.0.0.1,::1

curl.exe -I https://www.example.com

Windows 中还存在 WinINET 与 WinHTTP 两套代理机制。浏览器和不少桌面程序读取系统界面的代理设置,某些系统服务则使用 WinHTTP。可以用 netsh winhttp show proxy 查看 WinHTTP 状态,但不要为了修复普通终端请求就直接导入全局设置;先确认目标程序究竟读取哪一套配置。

macOS 与 Linux 的当前会话设置

export HTTP_PROXY="http://127.0.0.1:7890"
export HTTPS_PROXY="http://127.0.0.1:7890"
export ALL_PROXY="socks5://127.0.0.1:7890"
export NO_PROXY="localhost,127.0.0.1,::1"

curl -I https://www.example.com

同时设置小写变量可以兼容只读取小写名称的工具:

export http_proxy="$HTTP_PROXY"
export https_proxy="$HTTPS_PROXY"
export all_proxy="$ALL_PROXY"
export no_proxy="$NO_PROXY"

清除当前会话变量可执行:

unset HTTP_PROXY HTTPS_PROXY ALL_PROXY NO_PROXY
unset http_proxy https_proxy all_proxy no_proxy

如果要写入 ~/.zshrc~/.bashrc 或其他 shell 配置,建议定义开启和关闭代理的函数,而不是长期固定一个端口。这样在 Clash 未启动时,终端不会反复等待一个不存在的本地代理。修改配置文件后,需要重新打开终端或执行相应的 source 命令。

Git、包管理器与开发工具要单独核对

环境变量设置正确后,部分工具仍可能被自己的配置覆盖。排查时应同时检查“系统设置、环境变量、应用配置”三个层级,并留意配置的优先级。最常见的情况是 Git 中保存了旧端口,或者 npm 配置中仍指向已停用的代理地址。

Git 的代理配置

查看 Git 当前读取到的代理来源:

git config --show-origin --get-regexp "http\..*proxy|https\..*proxy"

需要为当前用户设置代理时,可执行:

git config --global http.proxy http://127.0.0.1:7890
git config --global https.proxy http://127.0.0.1:7890

以后改用环境变量或 TUN 模式时,应移除这两项,避免固定配置继续覆盖新路径:

git config --global --unset http.proxy
git config --global --unset https.proxy

npm 与 pnpm 的代理记录

npm config get proxy
npm config get https-proxy
pnpm config get proxy
pnpm config get https-proxy

输出若是旧地址,应更新为当前端口或删除对应配置。包管理器还会受到镜像源、证书链、DNS 和仓库服务状态影响,因此“下载失败”不能只看代理开关。建议先用 curl 请求同一仓库域名,再查看命令的详细日志,区分 TCP 连接失败、域名解析失败、TLS 错误与服务端限流。

容器与虚拟机中的 127.0.0.1

Docker 容器、WSL 和虚拟机里的 127.0.0.1 通常指向它们自己的网络环境,不一定是宿主机。把宿主机 Clash 地址原样复制进去,常见结果就是连接被拒绝。此时需要使用宿主机在该虚拟网络中的地址,并在 Clash 中按需开启局域网访问,同时配置操作系统防火墙。开放范围应限制在可信网络,不要直接暴露给公共网络。

什么时候应改用 TUN 模式

如果目标应用不支持 HTTP 或 SOCKS 代理,也不读取环境变量,系统代理就难以覆盖。典型场景包括部分游戏启动器、使用 UDP 的程序、固定直连的桌面应用,以及需要同时接管多个开发工具的工作环境。这时可以考虑 TUN 模式,让流量先经过虚拟网络接口,再交给 mihomo 核心按规则处理。

TUN 模式解决的是接管范围

TUN 并不会自动提升节点质量,也不会修复订阅中错误的服务器参数。它主要改变流量进入 Clash 的方式。启用后,原本绕过系统代理的 TCP 或 UDP 流量有机会被统一接管,规则模式、策略组和节点选择仍按当前配置执行。

在 Clash Nyanpasu 中,可从「设置」→「TUN 模式」启用相关功能。Windows 首次启用可能需要管理员权限来创建虚拟网络接口;macOS 可能弹出网络扩展或系统权限确认;Linux 通常需要相应的网络管理权限。不同客户端版本的菜单名称会略有差异,但应以 TUN 开关、网络接口状态和核心日志为判断依据。

启用前后的检查顺序

  1. 关闭其他 VPN、加速器或同类 TUN 程序,避免路由表被多方同时修改。
  2. 记录当前系统代理状态、混合端口和 DNS 设置,便于恢复。
  3. 启用 TUN 后确认虚拟接口创建成功,并观察核心日志是否出现权限错误。
  4. 先测试浏览器和 curl,再测试原本无法接管的应用。
  5. 检查局域网地址、打印机、开发服务器是否仍可访问,必要时配置直连规则。

TUN 与系统代理可以在部分客户端中同时开启,但排障阶段最好一次只验证一种接管方式。否则同一请求可能经过不同入口,难以判断问题来自系统代理、环境变量还是虚拟接口。确认 TUN 工作后,再按使用习惯决定是否保留系统代理。

DNS、规则与回环地址的常见误判

终端报域名解析失败

如果错误发生在连接代理之前,例如提示 Could not resolve host,先判断使用的是 HTTP 代理还是 SOCKS。HTTP CONNECT 请求通常会把目标主机名交给代理处理;socks5:// 可能先在本地解析,而 socks5h:// 明确要求代理端解析。用两种写法对照测试,可以快速判断故障位于系统 DNS 还是代理链路。

请求进入 Clash 却显示 DIRECT

规则模式会按域名、IP、进程或规则集选择策略。如果日志显示 DIRECT,说明请求已经被接管,只是规则决定直连。可以检查当前配置的规则顺序、目标域名所属规则集以及最终兜底规则。临时切换到全局模式可用于对照,但测试结束后应恢复原模式,避免把本应直连的局域网和国内服务全部交给代理节点。

localhost 被代理后访问异常

开发服务器常使用 localhost:3000127.0.0.1:5173 或其他本地端口。设置环境变量时应通过 NO_PROXY 排除 localhost127.0.0.1::1,否则某些工具会尝试把本地请求发送到代理。需要访问内网服务时,也可按工具支持的格式加入公司域名或网段,但不同程序对通配符和 CIDR 的支持并不一致。

按现象收敛问题的完整清单

最有效的排查顺序是:先确认本地端口,再明确指定代理测试,然后检查系统代理或环境变量,最后才考虑 TUN。浏览器已经可以访问时,通常无需反复更换节点或订阅;应把注意力放在终端是否读取代理、端口是否一致、DNS 在哪里解析,以及请求是否真正进入 Clash 核心。

下载 Clash 客户端 按系统选择安装包