系統代理是建議,不是命令
按下系統代理開關,用戶端做的只有一件事:把 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