Proxy server (简体中文)

From ArchWiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
翻译状态:本文是 Proxy server翻译。上次翻译日期:2020-12-28。如果英文版本有所更改,则您可以帮助同步翻译。

根据维基百科 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]

环境变量

Tango-view-fullscreen.pngThis article or section needs expansion.Tango-view-fullscreen.png

Reason: 为了导出环境变量,可以设置在 /etc/environment/etc/environment.d/*.conf~/.pam_environment 以及 ~/.config/environment.d/*.conf 中。 (Discuss in Talk:Proxy server (简体中文))

一些程序,例如 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环境变量。

防止这种情况发生的方法是在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