1. 程式人生 > >給 iTerm 終端設定代理

給 iTerm 終端設定代理

本文介紹如何為自己的終端設定代理,從而實現在命令列中訪問Google。

1. 背景

當你使用SS FQ時,大部分瀏覽器都可以成功訪問Google,但是在命令列下執行curl https://www.google.com時,會超時失敗。對於類似的這種情況,本文將解釋出現這種現象的原因,並給出有效的解決方案。

2. 原因

  1. 啟動SS時,會建立兩個代理,一個是ss-local,一個是privoxy;ss-local用於代理socks5請求,privoxy用於代理所有的HTTP請求
  2. 啟動SS時,不管用PAC模式還是全域性模式,都會修改網路系統代理設定
    1. 網路系統代理設定從哪裡看?Mac:系統偏好設定-->網路-->高階-->代理
    2. 在代理頁中可以看到
    3. 從上圖可以看到,網頁代理伺服器是一個部署在本地的代理伺服器
    4. 這個本地代理伺服器實際上是SS啟動時建立的,我們可以從SS的HTTP代理設定中看到
  3. 大部分瀏覽器的預設代理設定是系統代理
    1. 因此瀏覽器訪問https://www.google.com時,實際上是把請求傳送給了SS建立的本地代理伺服器127.0.0.1:1087
    2. 上圖的privoxy就是SS建立的本地HTTP代理伺服器127.0.0.1:1087
    3. privoxy會把接收到的http/https請求轉發給本地的ss-local服務,ss-local服務通過socks5協議傳送加密過的請求資料到遠端的SS server,SS server解密請求資料後,將真實的請求https://www.google.com
      傳送到Google的伺服器
    4. 上圖是privoxy的配置檔案,privoxy的監聽地址是:127.0.0.1:1087,轉發地址是:127.0.0.1:1080
  4. 終端軟體iterm/iterm2等預設是沒有設定請求代理,因此無法訪問https://www.google.com

3. 解決方案

  1. 通過下面的環境變數就可以設定HTTP代理:

    export http_proxy=http://127.0.0.1:8087
    export https_proxy=$http_proxy
  2. 為了能夠快速切換代理,可以在 ~/.zshrc 或者 ~/.bash_profile 中新增這樣的alias:

    alias goproxy='export http_proxy=http://127.0.0.1:8087 https_proxy=http://127.0.0.1:8087'
    alias disproxy='unset http_proxy https_proxy'

4. 參考資料

  1. 給 iTerm 終端設定代理
  2. 利用 Privoxy 讓命令列下的 wget 和 curl 等命令實現自動代理