代理伺服器

出自 Arch Linux 中文维基

根據維基百科 Wikipedia:

在計算機網絡中,代理伺服器是一個作為客戶從其他伺服器請求資源的中介的伺服器。

HTTPS MITM代理[編輯 | 編輯原始碼]

當調試HTTPS連接時,在瀏覽器之外進行攔截是很有用的。為了讓TLS MITM工作,你需要信任瀏覽器或系統範圍內的代理certificate authority

  • Charles — 用Java編寫的圖形化試用軟件。
https://www.charlesproxy.com/ || charlesAUR
  • Fiddler — 在Mono上運行的專有圖形化軟件。
https://www.telerik.com/fiddler || fiddlerAUR
  • mitmproxy — 命令行和網頁界面的軟件,用Python編寫,也提供API。
https://mitmproxy.org/ || mitmproxy
  • sslsplit — 適用於任何TLS連接,但不能作為瀏覽器中的HTTP代理,用C語言編寫。
https://www.roe.ch/SSLsplit || sslsplit
警告: mitmproxy 創建可被所有用戶讀取的私鑰。[1]

環境變量[編輯 | 編輯原始碼]

一些程序,例如 wget 還有 (pacman基於此) curl, 使用 protocol_proxy 形式的環境變量來確定一個給定網絡協議 (例如 HTTP, FTP, 等等)。

下面是一個在shell中設置這些變量的例子:

export http_proxy=http://10.203.0.1:5187/
export https_proxy=$http_proxy
export ftp_proxy=$http_proxy
export rsync_proxy=$http_proxy
export no_proxy="localhost,127.0.0.1,localaddress,.localdomain.com"

有些程序會尋找環境變量為大寫字母版本。

如果代理環境變量要提供給所有的用戶和所有的應用程式,上述的導出命令可以添加到一個腳本中,比如說在 /etc/profile.d/中的proxy.sh . 腳本必須被設置成可執行的executable. 當使用像Xfce這樣不提供代理配置選項的桌面環境時,這種方法很有幫助。例如,Chromium瀏覽器將在運行XFCE時使用此方法設置的變量。

另外,還有一個名為proxyman-gitAUR的工具,這個工具聲稱可以輕鬆配置全系統的代理設置。它還可以處理其他軟件的代理配置,比如gitnpmDropbox等。這個項目的靈感來源於Alan Pope製作腳本。

另外,您也可以通過在.bashrc中添加一個函數來自動切換變量。

function proxy_on() {
    export no_proxy="localhost,127.0.0.1,localaddress,.localdomain.com"

    if (( $# > 0 )); then
        valid=$(echo $@ | sed -n 's/\([0-9]\{1,3\}.\?\)\{4\}:\([0-9]\+\)/&/p')
        if [[ $valid != $@ ]]; then
            >&2 echo "Invalid address"
            return 1
        fi
        local proxy=$1
        export http_proxy="$proxy" \
               https_proxy=$proxy \
               ftp_proxy=$proxy \
               rsync_proxy=$proxy
        echo "Proxy environment variable set."
        return 0
    fi

    echo -n "username: "; read username
    if [[ $username != "" ]]; then
        echo -n "password: "
        read -es password
        local pre="$username:$password@"
    fi

    echo -n "server: "; read server
    echo -n "port: "; read port
    local proxy=$pre$server:$port
    export http_proxy="$proxy" \
           https_proxy=$proxy \
           ftp_proxy=$proxy \
           rsync_proxy=$proxy \
           HTTP_PROXY=$proxy \
           HTTPS_PROXY=$proxy \
           FTP_PROXY=$proxy \
           RSYNC_PROXY=$proxy
}

function proxy_off(){
    unset http_proxy https_proxy ftp_proxy rsync_proxy \
          HTTP_PROXY HTTPS_PROXY FTP_PROXY RSYNC_PROXY
    echo -e "Proxy environment variable removed."
}

如果不需要用戶名和密碼可以設置為缺省值。

作為一個替代方案,你可能想使用以下腳本。 修改字符串YourUserNameProxyServerAddress:PortLocalAddressLocalDomain來匹配你自己的數據,然後編輯你的~/.bashrc來包含編輯過的函數。任何新的bash窗口都會有新的函數。在現有的bash窗口中,輸入source ~/.bashrc。 你也可以把函數定義放在一個單獨的文件中,比如functions,然後把source functions添加到.bashrc中,而不是把所有內容都放在.bashrc中。 "myProxy "這個名字改成一個簡短易寫的名字也是可以的。

#!/bin/bash

assignProxy(){
   PROXY_ENV="http_proxy ftp_proxy https_proxy all_proxy HTTP_PROXY HTTPS_PROXY FTP_PROXY ALL_PROXY"
   for envar in $PROXY_ENV
   do
      export $envar=$1
   done
   for envar in "no_proxy NO_PROXY"
   do
      export $envar=$2
   done
}

clrProxy(){
    PROXY_ENV="http_proxy ftp_proxy https_proxy all_proxy HTTP_PROXY HTTPS_PROXY FTP_PROXY ALL_PROXY"
    for envar in $PROXY_ENV
    do
       unset $envar
    done
}

myProxy(){
   user=YourUserName
   read -p "Password: " -s pass &&  echo -e " "
   proxy_value="http://$user:$pass@ProxyServerAddress:Port"
   no_proxy_value="localhost,127.0.0.1,LocalAddress,LocalDomain.com"
   assignProxy $proxy_value $no_proxy_value
}

通過sudo保持代理[編輯 | 編輯原始碼]

如果代理環境變量environment variables只為一般用戶設置,那麼當使用sudo運行命令時(或者當程序在內部使用sudo時)無法獲取代理。

防止這種情況發生的方法是在sudo配置文件中添加以下一行。

/etc/sudoers.d/05_proxy
Defaults env_keep += "*_proxy *_PROXY"

network managers的自動化[編輯 | 編輯原始碼]

  • NetworkManager 不會改變環境變量.
  • netctl 可以設置環境變量,但它們不會被其他應用程式應用,因為它們不是netctl的子程序。

關於libproxy[編輯 | 編輯原始碼]

libproxy (在額外的倉庫中可以找到)是一個抽象庫,所有想要訪問網絡資源的應用程式都應該使用它。這個項目仍在開發中,但如果被廣泛採用的話,可能會在GNU/Linux中實現對代理的統一和自動化處理。

libproxy的作用是從不同的源頭讀取代理設置,並將它們提供給使用該庫的應用程式。libproxy的有趣之處在於,它提供了一個實現了 Web Proxy Autodiscovery ProtocolProxy Auto-Config 的實現。

/usr/bin/proxy 以URL作為參數,並返回可用於獲取這些網絡資源的代理。

注意: 0.4.11 版本 不支持 http_proxy='wpad:' 因為 { pkg-config 'mozjs185 >= 1.8.5'; } 會產生錯誤。

從2009年4月6日開始,libproxy被libsoup依賴,也被midori瀏覽器間接使用。

網絡代理選項[編輯 | 編輯原始碼]

  • Squid 是一個非常流行的緩存/優化代理。
  • Privoxy 是一個匿名和廣告屏蔽的代理。
  • tinyproxy 是一個小型、高效的HTTP/SSL代理守護進程。
  • 對於一個簡單的代理,可以使用帶端口轉發的ssh。

簡單的ssh代理[編輯 | 編輯原始碼]

ssh連接到伺服器,如下所示。

$ ssh -D PORT USER@HOST

對於 PORT,選擇一些非 IANA 註冊端口的數字。ssh將作為SOCKS的伺服器,支持SOCKS代理伺服器的軟件可以簡單地配置連接到localhost上的PORT。支持SOCKS代理伺服器的軟件可以簡單地配置為連接到localhost的PORT

通過socks代理[編輯 | 編輯原始碼]

有如下兩種情形:

  • 想使用的應用程式處理SOCKS5代理(例如Firefox),那麼你只需要配置它來使用代理。
  • 要使用的應用程式不處理 SOCKS 代理,那麼可以嘗試使用 tsocksproxychains-ng

在Firefox中,你可以在菜單偏好 > 網絡 > 設置中使用SOCKS代理。選擇Manual Proxy Configuration,然後設置SOCKS Host(只有這個,確保其他字段,如HTTP Proxy或SSL Proxy為空)。例如,如果SOCKS5代理運行在localhost 8080端口上,則在SOCKS Host字段輸入127.0.0.1,在Port字段輸入8080,然後驗證。

如果使用proxychains-ng,配置將在/etc/proxychains.conf中進行。只需要取消最後一行的註釋(默認設置為使用Tor),並將其替換為SOCKS代理的參數。例如,如果你使用的是和上面一樣的SOCKS5代理,你就必須用以下方式替換最後一行:

socks5 127.0.0.1 8080

然後可以通過proxychains-ng 啟動程序

$ proxychains program

其中program可以是您系統中已經安裝的任何程序(例如xterm、gnome-terminal等)。

如果使用tsocks,配置將在/etc/tsocks.conf中進行。參見tsocks.conf(5)中的選項。一個最少參數配置的例子是這樣的。

/etc/tsocks.conf
server = 127.0.0.1
server_port = 8080
server_type = 5
default_user = ""
default_pass = ""

curl 和 pacman[編輯 | 編輯原始碼]

你可以設置 all_proxy 環境變量,讓 curl 和 pacman (使用 curl) 使用你的 socks5 代理。

$ export all_proxy="socks5://your.proxy:1080"

GNOME3設置代理[編輯 | 編輯原始碼]

一些程序,如ChromiumFirefox可以使用GNOME存儲的設置。這些設置可以通過 gnome-control-center 前端和gsettings來修改。

gsettings set org.gnome.system.proxy mode 'manual' 
gsettings set org.gnome.system.proxy.http host 'proxy.localdomain.com'
gsettings set org.gnome.system.proxy.http port 8080
gsettings set org.gnome.system.proxy.ftp host 'proxy.localdomain.com'
gsettings set org.gnome.system.proxy.ftp port 8080
gsettings set org.gnome.system.proxy.https host 'proxy.localdomain.com'
gsettings set org.gnome.system.proxy.https port 8080
gsettings set org.gnome.system.proxy.socks host 'proxy.localdomain.com'
gsettings set org.gnome.system.proxy.socks port 8080
gsettings set org.gnome.system.proxy ignore-hosts "['localhost', '127.0.0.0/8', '10.0.0.0/8', '192.168.0.0/16', '172.16.0.0/12' , '*.localdomain.com' ]"

這個配置也可以通過proxydriverAUR包設置成在NetworkManager連接到特定網絡時自動執行。

Microsoft NTLM 代理[編輯 | 編輯原始碼]

在Windows網絡中,NT LAN Manager (NTLM)是一套微軟安全協議,它為用戶提供認證、完整性和保密性。

來自AURcntlmAUR站在您的應用程式和NTLM代理之間,即時添加NTLM認證。你可以指定幾個 "父"代理,Cntlm會一個接一個地嘗試,直到有一個成功為止。所有經過認證的連接都會被緩存和重用,以實現高效率。

(NTLM PROXY IP:PORT + CREDENTIALS + OTHER INFO) -----> (127.0.0.1:PORT)

配置[編輯 | 編輯原始碼]

根據需要更改/etc/cntlm.conf中的設置,除了密碼。然後運行。

$ cntlm -H

這將根據您的代理主機名、用戶名和密碼生成加密的密碼哈希。

警告: ettercap 當使用純文本密碼而不是加密哈希時,可以很容易地通過局域網嗅探你的密碼。

再次編輯/etc/cntlm.conf並包含所有三個生成的哈希值,然後啟用enabledcntlm.service

測試配置可使用一下指令:

$ cntlm -v

使用方法[編輯 | 編輯原始碼]

使用 127.0.0.1:portlocalhost:port 作為代理地址。port匹配/etc/cntlm.conf中的Listen參數,默認為3128