系统代理是一条建议,不是命令

按下系统代理开关,客户端做的只有一件事:把 127.0.0.1 和端口号写进操作系统的代理设置。至于哪个程序会去读这项设置,操作系统管不着,也强迫不了。读的走代理,不读的照样直连——浏览器好端端的而某个软件死活连不上,答案基本就在这儿。

  • Chrome、Edge 跟随系统设置,不需要额外配置。
  • Firefox 默认也跟随,但它有自己独立的一页代理设置。被谁改成过手动配置或者不使用代理,它就不跟了。
  • 命令行工具完全不看系统代理。curlgitnpmpipapt 这一类只认环境变量。
  • 一部分 Electron 应用和多数游戏客户端从设计上就直连,或者有自己的代理设置项,跟系统那份互不相干。
  • Windows 的商店应用(UWP)跑在容器里,网络访问受隔离策略约束,情况又是另一套。
合作推荐订阅链接从哪来?本站合作机场注册即送 1GB 香港高速体验流量,可直接一键导入。获取高速节点

先分清是没走,还是走了不通

  1. 打开客户端的连接页,多数版本写作 Connections。
  2. 把已有连接清空,然后去操作那个应用,让它发一次请求。
  3. 一条新记录都没冒出来:它压根没走代理,接下来两节是给你看的。
  4. 有记录但一直失败,或者停在几百字节就不动了:它走了代理,问题在节点或规则上。那是完全不同的方向,别在代理配置上耗时间。

应用自己有代理设置的,直接填

这是最省事的一层,也最常被跳过。翻一下那个软件的设置,代理那一栏藏在网络或连接分组里的概率比你想的高。填 127.0.0.1 加上你的混合端口就行。注意它问的是 HTTP 代理还是 SOCKS5:mixed-port 两种都收,填哪个都通;老配置把 portsocks-port 分开写的话,就得填对应的那一个。

命令行只认环境变量

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,192.168.0.0/16

小写和大写两种写法都有程序在用,讲究一点就两种各设一遍。no_proxy 负责把本机和内网地址排除在外,漏了它,连本机服务都会绕一圈。这几行只对当前这个 shell 会话有效,关掉终端就没了;要长期生效得写进 .bashrc.zshrc 这类启动文件。Windows 这边 PowerShell 用 $env:HTTP_PROXY 的写法,CMD 用 setsetx 才写得进去长期生效。另外 gitnpmpip 各自还有自己的代理配置项,环境变量看起来没作用时,去翻它们的配置文件。

前两条都没戏,就只剩 TUN

有些程序既没有代理设置项,也不理环境变量,开了 socket 就往外送。跟它讲道理没用。TUN 从下面一层接手:建一块虚拟网卡,改路由把出站流量全抓进来,程序怎么想代理这件事已经无关紧要。这是唯一的通用兜底,代价是要权限,还附赠一整组它自己的毛病。UDP 也是同一回事——游戏和语音通话走 UDP,系统代理从来碰不到。反过来的需求也存在:内网工具、下载软件、公司的办公程序,你反而不希望它们走代理。按进程名写一条规则就解决了。

rules:
  - PROCESS-NAME,aria2c.exe,DIRECT
  - PROCESS-NAME,ssh,DIRECT
  - MATCH,PROXY
环境变量不会回溯生效。终端要重开,图形界面的程序要完整退出再启动——从任务栏点叉往往只是把窗口藏起来,进程还活着,手上握的还是旧环境。很多人改完立刻测,看不出差别就以为方法错了。