代理伺服器 - Arch Linux 中文维基

跳至內容

# 代理伺服器

出自 Arch Linux 中文维基
翻譯狀態：

- 本文（或部分內容）譯自 Proxy server，最近一次同步於 2020-12-28，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

相關文章

- HTTP tunneling

根據維基百科 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的工具，這個工具聲稱可以輕鬆配置全系統的代理設置。它還可以處理其他軟體的代理配置，比如git、npm、Dropbox等。這個項目的靈感來源於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."
    }

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

作為一個替代方案，你可能想使用以下腳本。 修改字符串`YourUserName`、`ProxyServerAddress:Port`、`LocalAddress`和`LocalDomain`來匹配你自己的數據，然後編輯你的`~/.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 Protocol 和 Proxy 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 代理，那麼可以嘗試使用 tsocks包 或 proxychains-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設置代理

一些程序，如Chromium和Firefox可以使用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)是一套微軟安全協議，它為用戶提供認證、完整性和保密性。

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

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

### 配置

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

    $ cntlm -H

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

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

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

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

    $ cntlm -v

### 使用方法

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

分類：​

- 代理伺服器
- 網絡配置

代理伺服器
新增話題