代理服务器
根据 Wikipedia
- 在计算机网络中,代理服务器是充当中介的服务器(计算机系统或应用程序),代表客户端向其他服务器请求资源。
代理可以应用于常见的互联网协议,如 HTTP 或 SOCKS。
环境变量
一些程序,例如 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"
一些程序会查找环境变量的大写版本。
如果希望将代理环境变量提供给所有用户和所有应用程序,可以将上述 export 命令添加到脚本中,例如 /etc/profile.d/ 目录下的 proxy.sh。然后必须将该脚本设为可执行。当使用没有代理配置选项的桌面环境(如 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 代理服务器的软件可以直接配置为连接到本地主机的 PORT。请参阅 OpenSSH#Forwarding other ports。
HTTPS MITM 代理
在调试 HTTPS 连接时,有时在浏览器外部拦截它们会很有用。为了使 TLS MITM 生效,您需要在浏览器或系统范围内信任代理的证书颁发机构。
- Charles — 使用 Java 编写的图形化试用版软件。
- Fiddler — 专有图形化软件,运行在 Mono 上。
- microsocks — 简单的 SOCKS5 代理服务器,用 C 编写。
- mitmproxy — 命令行和 Web 界面,用 Python 编写,还提供 API。
- sslsplit — 可用于任何 TLS 连接,但不能作为浏览器中的 HTTP 代理,用 C 编写。
使用 SOCKS 代理
有两种情况
- 您想使用的应用程序支持 SOCKS5 代理(例如 Firefox),那么您只需将其配置为使用代理即可。
- 您想使用的应用程序不支持 SOCKS 代理,那么您可以尝试使用 proxychains-ng、proxy-nsAUR 或 torsocks。
在 Firefox 中,您可以在菜单 Preferences > Network > Settings 中使用 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 等)。
如果使用 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#Proxy settings。看起来 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
alpaca-proxyAUR 是来自 AUR 的一个本地 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
cntlmAUR 来自 AUR,可以配置多个“父”代理,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。