系统代理是一条建议,不是命令
按下系统代理开关,客户端做的只有一件事:把 127.0.0.1 和端口号写进操作系统的代理设置。至于哪个程序会去读这项设置,操作系统管不着,也强迫不了。读的走代理,不读的照样直连——浏览器好端端的而某个软件死活连不上,答案基本就在这儿。
- Chrome、Edge 跟随系统设置,不需要额外配置。
- Firefox 默认也跟随,但它有自己独立的一页代理设置。被谁改成过手动配置或者不使用代理,它就不跟了。
- 命令行工具完全不看系统代理。
curl、git、npm、pip、apt这一类只认环境变量。 - 一部分 Electron 应用和多数游戏客户端从设计上就直连,或者有自己的代理设置项,跟系统那份互不相干。
- Windows 的商店应用(UWP)跑在容器里,网络访问受隔离策略约束,情况又是另一套。
先分清是没走,还是走了不通
- 打开客户端的连接页,多数版本写作 Connections。
- 把已有连接清空,然后去操作那个应用,让它发一次请求。
- 一条新记录都没冒出来:它压根没走代理,接下来两节是给你看的。
- 有记录但一直失败,或者停在几百字节就不动了:它走了代理,问题在节点或规则上。那是完全不同的方向,别在代理配置上耗时间。
应用自己有代理设置的,直接填
这是最省事的一层,也最常被跳过。翻一下那个软件的设置,代理那一栏藏在网络或连接分组里的概率比你想的高。填 127.0.0.1 加上你的混合端口就行。注意它问的是 HTTP 代理还是 SOCKS5:mixed-port 两种都收,填哪个都通;老配置把 port 和 socks-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 用 set,setx 才写得进去长期生效。另外 git、npm、pip 各自还有自己的代理配置项,环境变量看起来没作用时,去翻它们的配置文件。
前两条都没戏,就只剩 TUN
有些程序既没有代理设置项,也不理环境变量,开了 socket 就往外送。跟它讲道理没用。TUN 从下面一层接手:建一块虚拟网卡,改路由把出站流量全抓进来,程序怎么想代理这件事已经无关紧要。这是唯一的通用兜底,代价是要权限,还附赠一整组它自己的毛病。UDP 也是同一回事——游戏和语音通话走 UDP,系统代理从来碰不到。反过来的需求也存在:内网工具、下载软件、公司的办公程序,你反而不希望它们走代理。按进程名写一条规则就解决了。
rules:
- PROCESS-NAME,aria2c.exe,DIRECT
- PROCESS-NAME,ssh,DIRECT
- MATCH,PROXY