客户端与配置问题

系统代理没有开启为什么部分软件不能用?

快速结论

系统代理是操作系统级别的网络转发机制,未开启时浏览器和常用软件依然走本地直连网络,导致虽然客户端运行着但依然无法访问外网。

系统代理的运行本质

在Windows和macOS等桌面操作系统中,“系统代理”是一项全局系统环境约定。当我们在Clash或Verge中勾选“系统代理”时,客户端实际上是在操作系统的网络设置中写入了本地回环地址(如 HTTP 127.0.0.1:7890)。

遵循系统代理约定的软件(如Chrome、Edge、Safari)在发起网络请求时,会自动向这个回环地址发送数据包,再由客户端内核完成加密转发。

为什么部分软件能用而网页不行

如果系统代理处于关闭状态:

  • 浏览器完全无法翻越:因为浏览器不知道代理端口的存在,所有的GET/POST请求直接走本地电信/联通宽带直连;
  • 但支持自定义代理的软件正常:像Telegram、Git、Docker等软件如果在其内部单独指定了 127.0.0.1:7890,它们不需要系统代理也能正常连通。

这就造成了“明明代理核心工作正常,但所有浏览器网页全部打不开”的经典割裂现象。

系统代理的正确开启姿势

确保在客户端每次开机启动后,主面板上的“System Proxy”都处于亮起状态。如果经常被杀毒软件强制关闭,可直接开启TUN模式(虚拟网卡接管),绕过系统代理机制。

常见疑问解答

关机时忘记关系统代理导致开机无法上网怎么办? +

进入Windows设置 - 网络和Internet - 代理,将“手动设置代理”下的“使用代理服务器”开关手动切换为“关”,即可立刻恢复国内直连上网。

操作系统级网络转发完整数据流

为了从原理上透彻理解系统代理,我们需要观察一个HTTP请求的底层流转过程:

当你在Chrome浏览器输入 https://example.com 并回车时:

  1. 浏览器首先查询操作系统注册表中的 ProxyEnable 键值;
  2. 若该值为 1,浏览器不会去查询DNS,而是直接与注册表中指定的 127.0.0.1:7890 建立本地TCP套接字连接;
  3. 浏览器向该本地端口发送标准 CONNECT example.com:443 HTTP/1.1 请求报文;
  4. 客户端核心接收到此报文,根据内部的分流规则决定是直连还是转发至海外节点。

由此可见,如果系统代理未开启,步骤1获取到的值为0,浏览器就会直接跳过代理,强行将数据包发向本地运营商网关,自然无法访问任何国际网站。

命令行与专业开发环境的不适配性

许多开发者经常遇到“浏览器能上网,但终端 git clone 或 npm install 报错”的问题。这是因为Windows PowerShell和Linux终端在默认设计上故意忽略系统代理设置,以保证生产环境脚本的网络纯净性。

在终端中使用代理,必须手动配置环境变量:

$env:HTTP_PROXY="http://127.0.0.1:7890"
$env:HTTPS_PROXY="http://127.0.0.1:7890"

或者直接在客户端开启全局TUN模式,强制在网络驱动层无差别接管全部终端流量。

自动化排障命令与网络工程诊断流程

在客户端故障排查中,熟练运用命令行工具能够大幅提升定位效率,避免盲目猜测。以下为排查客户端异常时最核心的四组诊断指令:

诊断环节 PowerShell / CMD 测试命令 预期正常返回值 异常时应对操作
本地端口监听 Get-NetTCPConnection -LocalPort 7890 State 为 Listen,PID指向客户端进程 若PID非客户端,结束占用进程或修改混合端口
客户端代理出站 curl -I -x 127.0.0.1:7890 https://www.google.com 返回 HTTP/1.1 200 OK 或 301 Moved 若报 Connection Refused,重启客户端内核
系统注册表代理 Get-ItemProperty 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings' | Select ProxyEnable ProxyEnable 属性值为 1 若为0,在客户端重新勾选系统代理或修复注册表
网络协议栈健康 Test-NetConnection -ComputerName 127.0.0.1 -Port 7890 TcpTestSucceeded : True 若为False,排查杀毒软件防火墙入站屏蔽策略

通过上述四步诊断,可以严格将故障定位在操作系统环境、内核服务或远程链路上,使网络排查具备工程级别的确定性。