代理服务器
根据 维基百科
- 在计算机网络中,代理服务器是一种服务器(计算机系统或应用程序),充当来自客户端的请求的中间人,这些客户端从其他服务器寻求资源。
代理可以应用于常见的互联网协议,如 HTTP 或 SOCKS。
HTTPS MITM 代理
当调试 HTTPS 连接时,有时在浏览器外部拦截它们很有用。为了使 TLS MITM 工作,您需要在浏览器或系统范围内信任代理的证书颁发机构。
- Charles — 用 Java 编写的图形化试用软件。
- Fiddler — 专有且图形化,运行在 Mono 上。
- microsocks — 简单的 SOCKS5 代理服务器,用 C 编写。
- mitmproxy — 命令行和 Web 界面,用 Python 编写,也有 API。
- sslsplit — 适用于任何 TLS 连接,但不能充当浏览器中的 HTTP 代理,用 C 编写。
环境变量
一些程序,例如 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
。然后必须使该脚本可执行。当使用像 Xfce 这样的桌面环境时,此方法很有帮助,Xfce 不提供代理配置的选项。例如,Chromium 浏览器在使用 XFCE 运行时将使用通过此方法设置的变量。
或者,有一个名为 proxyman-gitAUR 的工具,它声称可以轻松配置系统范围的代理设置。它还处理其他软件(如 git、npm、Dropbox 等)的代理配置。
或者,您可以通过将函数添加到 .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 保留代理
如果仅为用户设置了代理环境变量,则当使用 sudo 运行命令时(或当程序在内部使用 sudo 时),它们将丢失。
防止这种情况的一种方法是将以下行添加到 sudo 配置文件
/etc/sudoers.d/05_proxy
Defaults env_keep += "*_proxy *_PROXY"
使用网络管理器自动化
- NetworkManager 无法更改环境变量。
- netctl 可以设置这些环境变量,但它们不会被其他应用程序看到,因为它们不是 netctl 的子进程。
关于 libproxy
libproxy 是一个抽象库,所有想要访问网络资源的应用程序都应该使用它。它仍在开发中,但如果得到广泛采用,可能会在 GNU/Linux 中实现代理的统一和自动化处理。
libproxy 的作用是从不同的来源读取代理设置,并使使用该库的应用程序可以使用它们。libproxy 的有趣之处在于,它提供了 Web 代理自动发现协议 和与之相关的 代理自动配置 的实现。
/usr/bin/proxy
二进制文件将 URL 作为参数,并返回可用于获取此/这些网络资源的代理。
http_proxy='wpad:'
,因为 { pkg-config 'mozjs185 >= 1.8.5'; }
失败。Web 代理选项
- Squid 是一个非常流行的缓存/优化代理。
- Privoxy 是一个匿名化和广告拦截代理。
- tinyproxy 是一个小型、高效的 HTTP/SSL 代理守护程序。
- 对于简单代理,可以使用带有端口转发的 ssh。
使用 SSH 的简单代理
连接到您拥有帐户 (USER) 的服务器 (HOST),如下所示
$ ssh -D PORT USER@HOST
对于 PORT,选择一些不是 IANA 注册端口的数字。这指定本地 PORT 上的流量将转发到远程 HOST。 ssh 将充当 SOCKS 服务器。支持 SOCKS 代理服务器的软件可以简单地配置为连接到 localhost 上的 PORT。请参阅 OpenSSH#端口转发。
使用 SOCKS 代理
有两种情况
- 您要使用的应用程序处理 SOCKS5 代理(例如 Firefox),那么您只需将其配置为使用代理。
- 您要使用的应用程序不处理 SOCKS 代理,那么您可以尝试使用 proxychains-ng、proxy-nsAUR 或 torsocks。
在 Firefox 中,您可以在菜单首选项 > 网络 > 设置中使用 SOCKS 代理。选择手动代理配置,并设置 SOCKS 主机(且仅设置此项,确保其他字段,如 HTTP 代理或 SSL 代理留空)。例如,如果 SOCKS5 代理在 localhost 端口 8080 上运行,请在 SOCKS 主机字段中输入 127.0.0.1
,在端口字段中输入 8080
,然后验证。
如果使用 proxychains-ng,则配置在 /etc/proxychains.conf
中进行。您可能需要取消注释最后一行(默认设置为使用 Tor),并将其替换为 SOCKS 代理的参数。例如,如果您使用与上述相同的 SOCKS5 代理,您将需要将最后一行替换为
socks5 127.0.0.1 8080
然后,可以使用以下命令启动 proxychains-ng
$ proxychains program
其中 program
可以是已安装在您系统上的任何程序(例如 xterm、gnome-terminal 等)。
如果使用 proxy-ns,则配置在 /etc/proxy-ns/config.json
中进行。您可能需要更改 socks5_address。使用与上述相同的 SOCKS5 代理的配置示例如下所示
/etc/proxy-ns/config.json
{ "tun_name": "tun0", "tun_ip": "10.0.0.1/24", "socks5_address": "127.0.0.1:8080", "fake_dns": true, "fake_network": "240.0.0.0/4", "dns_server": "9.9.9.9" }
然后,可以使用以下命令启动 proxy-ns
$ proxy-ns program
用法与 proxychains 相同。
如果使用 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"
GNOME 上的代理设置
某些程序(如 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' ]"
由于 GNOME 经常与 NetworkManager 一起使用,另请参阅 NetworkManager#代理设置。似乎 NetworkManager 不支持在没有 GNOME 桌面的情况下从上述 GNOME 设置中获取配置。
Microsoft NTLM 代理
在 Windows 网络中,NT LAN Manager (NTLM) 是一套 Microsoft 安全协议,为用户提供身份验证、完整性和机密性。
本地代理位于您的应用程序和 NTLM 代理之间,动态添加 NTLM 身份验证。
(NTLM PROXY IP:PORT + CREDENTIALS + OTHER INFO) -----> (127.0.0.1:PORT)
从 AUR 可以获得两个选项
- alpaca-proxyAUR
- cntlmAUR
Alpaca
来自 AUR 的 alpaca-proxyAUR 是一个用于命令行工具的本地 HTTP 代理。它支持代理自动配置 (PAC) 文件和 NTLM 身份验证。
用法
可以交互式启动 Alpaca,这需要输入密码
$ alpaca -d MYDOMAIN -u me Password (for MYDOMAIN\me):
要以非交互方式启动 alpaca,需要生成 NTLM 哈希并将其导出为变量
$ ./alpaca -d MYDOMAIN -u me -H Password (for MYDOMAIN\me): NTLM_CREDENTIALS="me@DOMAIN:00000000000000000000000000000000"; export NTLM_CREDENTIALS
默认情况下,Alpaca 将在 localhost:3128
上监听,可以使用 -l
和 -p
选项覆盖此设置。
此外,应提供代理 PAC url 作为 -C
选项的参数。
作为服务运行
alpaca-proxyAUR 包括 alpaca.service
systemd 用户服务,可用于以非交互方式自动启动 alpaca。
它需要在 ~/.config/alpaca.environment
中设置以下环境变量
LISTEN_ADDRESS=localhost LISTEN_PORT=3128 NTLM_CREDENTIALS="me@DOMAIN:00000000000000000000000000000000" PAC_URL="http://some.url/to/some-file.pac"
Cntlm
来自 AUR 的 cntlmAUR 可以配置多个“父”代理,Cntlm 将依次尝试,直到有一个工作为止。所有经过身份验证的连接都会被缓存和重用,以实现高效率。
配置
根据需要更改 /etc/cntlm.conf
中的设置,密码除外。然后运行
$ cntlm -H
这将根据您的代理主机名、用户名和密码生成加密的密码哈希。
再次编辑 /etc/cntlm.conf
并包含所有三个生成的哈希,然后启用 cntlm.service
。
要测试设置,请运行
$ cntlm -v
用法
使用 127.0.0.1:port
或 localhost:port
作为代理地址。port
匹配 /etc/cntlm.conf
中的 Listen
参数,默认值为 3128
。