ProxyChains 是一款 Linux 命令行工具,它强制程序发起的任何 TCP 连接都经过指定的代理服务器列表,形成一条"链",以增强隐私性或绕过网络限制。它通过动态拦截与网络相关的系统调用来工作,在到达目标之前将其重定向到一个或多个已配置的代理服务器。
ProxyChains 概述
ProxyChains 作为其他程序的包装器运行,使这些程序的网络流量通过一系列代理进行路由。这种链式机制可以掩盖网络请求的来源,使真实源 IP 地址更难被追踪。它常用于实现匿名性、绕过地理限制,或访问带有基于 IP 的访问控制的网络。
ProxyChains 的工作原理
ProxyChains 利用 Linux 的 LD_PRELOAD 机制。LD_PRELOAD 是一个环境变量,用于指定在所有其他库(包括 C 标准库 libc)之前加载的共享库列表。ProxyChains 提供了自己的共享库(libproxychains4.so),其中包含标准网络函数(例如 connect()、send()、recv())的修改版本。
当程序通过 ProxyChains 执行时(例如 proxychains4 <command>),libproxychains4.so 会被预加载。该库会拦截程序对网络函数的调用。这些被拦截的调用不会建立直接连接,而是被重定向到已配置的代理链。此过程对被包装的应用程序是透明的,应用程序会继续像直接建立网络连接那样运行。
安装
安装步骤因 Linux 发行版而略有不同。
Debian/Ubuntu
sudo apt update
sudo apt install proxychains4
Fedora/CentOS/RHEL
sudo dnf install proxychains-ng
# 或用于较旧的系统:
sudo yum install proxychains-ng
Arch Linux
sudo pacman -S proxychains-ng
从源码编译
对于其他发行版或特定版本,可以从源码编译 ProxyChains。
git clone https://github.com/rofl0r/proxychains-ng.git
cd proxychains-ng
./configure --prefix=/usr --sysconfdir=/etc
make
sudo make install
sudo make install-config # 将默认配置文件安装到 /etc/proxychains.conf
配置
ProxyChains 的主配置文件通常位于 /etc/proxychains.conf 或 ~/.proxychains/proxychains.conf。如果两者都不存在,可以将 proxychains.conf 从源码目录或 /usr/share/proxychains/proxychains.conf 复制到 /etc/proxychains.conf。
主要指令
配置文件定义了代理的使用方式以及可用的代理。
strict_chain:按照列表中出现的顺序使用全部代理。如果链中任一代理失败,连接即失败。dynamic_chain:使用列表中的全部代理,但如果某个代理失败,则跳过它,链条继续使用下一个代理。这样具有更强的容错能力。random_chain:从列表中随机选取指定数量的代理(chain_len),并以随机顺序使用。chain_len:(与random_chain配合使用)指定随机选取的代理数量。proxy_dns:强制 DNS 请求通过代理链解析,缓解 DNS 泄露。这对匿名性至关重要。remote_dns_subnet:(与proxy_dns配合使用)在启用proxy_dns时,指定用于远程 DNS 查询的 IP 子网。默认值为10.0.0.0/8。
代理列表格式
代理在 proxychains.conf 文件末尾的 [ProxyList] 部分中定义。每条代理记录采用以下格式:
type ip_address port [username] [password]
支持的类型包括 socks4、socks5 和 http。
proxychains.conf 片段示例
# ProxyChains configuration file
# Uncomment one of the proxy chain types:
# strict_chain
# dynamic_chain
random_chain
# Randomize the proxy list - no, this doesn't make sense.
# Keep the default order of proxies in the proxy list and use them in that order.
# If you want to randomize, use 'random_chain' above.
# random_chain_len 2
# Make a host where the chain starts from.
# This can be useful for some applications.
# chain_len 2
# Proxy DNS requests through the chain.
# This is highly recommended for anonymity.
proxy_dns
# Remote DNS subnet
# When proxy_dns is enabled, this subnet is used for remote DNS queries.
# Default is 10.0.0.0/8
# remote_dns_subnet 10.0.0.0/8
# Timeout for proxy connections.
# proxy_timeout 10000
# Proxy list - add your proxies here
# Format: type ip_address port [username] [password]
[ProxyList]
# socks4 127.0.0.1 9050 # Example for Tor (default SOCKS port)
# socks5 192.168.1.1 1080
# http proxy.example.com 8080 user pass
# Example using multiple proxies for a chain
socks5 192.168.1.10 1080
socks5 192.168.1.11 1080
http 192.168.1.12 8080
支持的代理类型
ProxyChains 支持以下代理协议:
- SOCKS4:面向 TCP 应用的简单代理协议。不支持 UDP,也不支持身份验证。
- SOCKS5:支持 TCP、UDP 和身份验证的高级代理协议。推荐用于大多数场景。
- HTTP:支持通过 HTTP 代理隧道传输 TCP 连接。可在有或没有身份验证的情况下使用。
使用示例
要使用 ProxyChains,请在您希望通过代理执行的命令前加上 proxychains4(某些系统上为 proxychains)。
基本用法
通过代理链检查您的外部 IP 地址:
proxychains4 curl ifconfig.me
该命令会将 curl 请求通过已配置的代理链路由,ifconfig.me 将返回链中最后一个代理的 IP 地址;如果启用了 dynamic_chain,则返回第一个可用代理的地址。
测试 DNS 泄露
在 proxychains.conf 中启用 proxy_dns 后:
proxychains4 curl https://ipleak.net/
查看 ipleak.net 上的 DNS 部分,确认 DNS 请求是通过代理链解析的,而不是通过您本地的 DNS 服务器。
与网络扫描器配合使用
通过代理链扫描目标可以隐藏扫描来源。
proxychains4 nmap -sT -Pn target.example.com
注意:nmap 的 -sS(SYN 扫描)及其他原始数据包模式无法与 ProxyChains 配合使用,因为 LD_PRELOAD 只拦截较高层的 socket 调用,而不拦截原始数据包生成。请使用 -sT(TCP connect 扫描)。
与 Secure Shell(SSH)配合使用
通过代理链建立 SSH 连接:
proxychains4 ssh user@remote_host.com
与 Wget 配合使用
通过代理链下载文件:
proxychains4 wget https://example.com/file.zip
与网页浏览器配合使用(例如 Firefox)
ProxyChains 是为命令行应用设计的。对于网页浏览器等图形应用,通常直接配置浏览器自身的代理设置或使用专门的代理管理扩展更为有效。不过也可以强制运行:
proxychains4 firefox
与原生代理设置相比,这种方式在复杂的 GUI 应用上往往不够稳定可靠。
链类型对比
| 特性 | strict_chain |
dynamic_chain |
random_chain |
|---|---|---|---|
| 代理使用方式 | 按顺序使用列表中的全部代理。 | 按顺序使用列表中的全部代理,跳过失败的。 | 随机选取并排序 chain_len 个代理。 |
| 容错能力 | 低(任一代理失败即连接失败)。 | 高(跳过失败的代理)。 | 中等(若选中的随机代理失败则失败)。 |
| 匿名性 | 高(路径固定,使用全部代理)。 | 高(路径固定,使用全部可用代理)。 | 可变(路径随机,每次不同)。 |
| 性能 | 因路径固定且完整,可能较慢。 | 若部分代理较慢或掉线,则更快。 | 可变,取决于所选代理。 |
| 适用场景 | 所有代理都可靠且顺序重要时。 | 需要容错能力时。 | 为提高匿名性而需要变换路径时。 |
安全注意事项与局限性
ProxyChains 是一款流量路由工具,而非完整的匿名解决方案。用户必须了解它的局限性。
DNS 泄露
未启用 proxy_dns 时,DNS 请求可能由本地系统直接解析,从而将用户的真实 IP 地址暴露给 DNS 服务器。启用 proxy_dns 对匿名性至关重要。
流量泄露
ProxyChains 主要拦截 TCP 连接。直接使用 UDP 或其他协议的应用(例如某些 VPN 客户端、VoIP 应用、部分游戏,或 nmap 的原始数据包模式)可能绕过代理链,导致流量泄露。它不适用于需要对整个网络栈进行匿名化的应用。
性能开销
串联多个代理会引入延迟并降低吞吐量。链中每一跳都会增加处理时间和网络延迟。链中的代理越多,连接就越慢。
匿名性并非万无一失
ProxyChains 提供了额外一层混淆,但并不保证绝对匿名。老练的攻击者仍可能关联流量特征或利用其他漏洞(例如浏览器指纹、WebRTC 泄露)来去匿名化用户。它应与其他安全实践配合使用,例如安全的操作系统、严格的防火墙规则以及谨慎的应用选择。
应用兼容性
ProxyChains 依赖 LD_PRELOAD 来拦截库调用。并非所有应用在其网络函数被拦截后都能表现出可预期的行为。使用自定义网络库、静态链接或特定内核接口的应用,可能无法与 ProxyChains 正常配合,甚至完全无法工作。
