桌面端教程

电脑可以打开网页但客户端无法连接怎么办

分析浏览器正常而其它程序无法访问的原因,包括系统代理的作用范围、不遵守代理的程序类型、环境变量差异与规则模式配置,并给出对应的处理方法。

本文解决的问题:浏览器能上网但某个软件死活连不上,想知道差别在哪。

「浏览器能用,但某个程序连不上」——这个现象几乎总是同一个原因:不是所有程序都遵守系统代理设置

理解这一点,问题就从「客户端坏了」变成了「这个程序从哪里读取网络配置」,排查方向完全不同。

系统代理不是强制的

客户端接管流量的常见方式是设置系统代理。但「系统代理」这个名字有误导性——它不是一个强制生效的网络层拦截,而更像是一个公告板:系统把代理地址写在上面,程序可以选择读取并遵守,也可以完全忽略。

按行为分成三类:

第一类:遵守系统代理。 主流浏览器(Chrome、Edge、Safari)、大部分图形界面应用、系统自带组件。这一类最省心,客户端一连上就自动生效。

第二类:读环境变量。 终端里的命令行工具,包括 curlgitnpmpipbrewapt 等。它们不看系统设置,只看 http_proxyhttps_proxyall_proxy 这几个环境变量。

第三类:完全忽略。 部分游戏客户端、下载工具、以及自己实现了完整网络栈的软件。它们直接建立连接,不理会任何代理配置。

第一步:判断程序属于哪一类

一个快速的判断方法:把客户端切换到全局模式(或 TUN / 虚拟网卡模式),再试一次。

  • 切换后能用了 → 说明程序属于第三类(忽略系统代理),需要更底层的接管方式;
  • 切换后仍然不行 → 问题可能在规则、DNS 或程序自身配置上,继续往下看。

全局模式或 TUN 模式的原理是在网络层接管流量,不依赖程序是否「愿意」使用代理。代价是所有流量都走客户端,包括本地和局域网访问,所以适合排查时临时使用,不建议长期开启。

第二步:命令行工具的处理

如果不通的是终端里的工具,需要单独设置环境变量。

临时设置(只对当前终端窗口有效):

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:7891

Windows PowerShell:

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

端口号必须换成你的客户端实际使用的端口,在客户端设置界面里可以查到。填错端口的表现和没设置一样。

验证是否生效:

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

能返回 HTTP 响应头就说明代理生效了。

部分工具有自己的配置:

  • gitgit config --global http.proxy http://127.0.0.1:7890
  • npmnpm config set proxy http://127.0.0.1:7890
  • 包管理器通常在自己的配置文件里另有设置

这些工具即使设置了环境变量,也可能优先使用自己的配置。如果环境变量不生效,检查一下工具本身的配置。

注意:不要把代理配置写进会被提交到代码仓库的文件里。团队协作时,别人的环境不一定有同样的代理。

第三步:检查规则配置

如果客户端运行在规则模式下,只有匹配规则的流量才会走客户端。

典型症状:切换到全局模式能用,切回规则模式就不行。

这说明目标地址没有被任何一条「走客户端」的规则匹配到,落到了默认的直连规则上。

处理方式:

  • 在客户端的规则设置里,为该域名或 IP 添加一条走客户端的规则;
  • 或者使用客户端提供的「分应用代理」功能,直接指定该程序走客户端。

规则模式本身是合理的默认选择——它让本地和国内访问保持直连,速度更快也更稳定。只是偶尔需要为特定目标补一条规则。

第四步:检查程序内部的代理设置

有些程序有自己独立的网络设置,会覆盖系统配置。常见的有:

  • 浏览器扩展:某些代理管理类扩展会接管浏览器的网络配置,优先级高于系统代理;
  • 开发工具与 IDE:通常在设置里有独立的代理配置项;
  • 下载工具:往往自带代理设置;
  • 虚拟机与容器:虚拟机内部是独立的网络环境,宿主机的代理设置不会自动传递进去。

如果一个程序有自己的代理设置界面,优先检查那里

第五步:DNS 层面的问题

还有一种情况:连接本身没问题,但域名解析走了不同的路径,解析出来的 IP 不可达。

判断方法:

  1. 用 IP 地址直接访问,看能否连通;
  2. 如果 IP 可以但域名不行,问题在 DNS。

部分客户端提供「DNS 走客户端」或「远程解析」一类的选项,开启后域名解析会通过客户端进行。相关背景见DNS 解析异常会导致哪些访问问题

排查决策树

某程序连不上,浏览器正常

切到全局 / TUN 模式试试
  ├── 能用了 → 该程序忽略系统代理
  │            → 长期用 TUN 模式,或用分应用代理
  └── 仍不行 ↓
      是命令行工具吗?
        ├── 是 → 设置环境变量,检查工具自身配置
        └── 否 ↓
            程序有自己的代理设置吗?
              ├── 有 → 在程序内配置
              └── 没有 ↓
                  用 IP 直接访问能通吗?
                    ├── 能 → DNS 问题
                    └── 不能 → 回到客户端连接本身排查

一个反向的情况

有时问题是反的:某个程序本不该走客户端,却走了,导致访问本地服务或国内网站变慢。

常见于全局模式下访问局域网设备(比如路由器管理页面、NAS、打印机)。处理方式是改回规则模式,或者为局域网地址段添加直连规则。

如果你在 Windows 上遇到全部连接都失败,先看Windows 节点超时的常见原因与排查步骤;macOS 上则看macOS 无法连接时如何检查系统代理

安全提示

  • 为单个程序配置代理时,不要把配置写进会被提交到代码仓库的文件里。
  • 排查时临时切换到全局模式是可以的,但确认原因后建议改回规则模式。

本文相关常见问题

为什么浏览器能用而终端不行?

浏览器默认遵守系统代理设置,而终端里的命令行工具读的是环境变量。两者是不同的配置来源,需要分别设置。

切到全局模式就好了,说明什么?

说明连接本身正常,问题出在规则配置上——目标地址没有被规则匹配到走客户端的那一条。

所有程序都能走客户端吗?

不能。有些程序自己实现网络栈、忽略系统代理设置。这类程序需要客户端提供的更底层的接管方式才能覆盖。

需要给每个程序单独设置吗?

大多数不需要。只有命令行工具和少数忽略系统代理的程序需要单独处理。

INVITE CODE

准备注册 FlyingBird 飞鸟?

AMM
复制并前往注册

打开注册页面后,如系统要求填写优惠码,请粘贴 AMM。价格、套餐与可用状态请以用户中心实时页面为准。