proxychains4(proxychains-ng)通过 LD_PRELOAD 机制劫持程序的网络相关 libc 调用(connect()、getaddrinfo() 等),将流量重定向到代理服务器。它不修改原程序、不依赖 iptables,使用极其灵活。
sudo apt install proxychains4
安装后默认配置文件位于 /etc/proxychains4.conf。推荐复制到用户目录后自定义:
mkdir -p /home/user/.config/proxychains/
cp /etc/proxychains4.conf /home/user/.config/proxychains/proxychains.conf
dynamic_chain — 动态链(推荐)按列表顺序依次尝试,跳过不可用的代理,直到找到一个可用的。最灵活、最常见。
# proxychains.conf
dynamic_chain
# 保持 chain_len = 1 表示一次只用一个代理(非级联)
chain_len = 1
行为:127.0.0.1:7891 不可用 → 尝试 127.0.0.1:7892 → 成功则使用
strict_chain — 严格链严格按照列表顺序串联所有代理:
你的程序 → Proxy1 → Proxy2 → Proxy3 → 目标服务器
所有代理必须全部在线,任一个失败则连接中断。使用场景极少,主要用于需要多层匿名的场景。
# proxychains.conf
strict_chain
random_chain — 随机链从代理列表中随机选取一个使用,配合 chain_len 可实现随机级联。
# proxychains.conf
random_chain
chain_len = 2
行为:从列表中随机选 2 个代理串起来使用。
| 模式 | 容错性 | 延迟 | 使用场景 |
|---|---|---|---|
dynamic_chain |
高(跳过不可用) | 最低 | 日常翻墙,单层代理 |
strict_chain |
零(全需在线) | 高(多层) | 重匿名需求 |
random_chain |
中 | 中 | 分散流量,混淆 |
99% 的场景使用 dynamic_chain:
# 推荐配置
dynamic_chain
chain_len = 1
[ProxyList]
# SOCKS5 — 最常用,配合 Clash
socks5 127.0.0.1 7891
# SOCKS5 带认证
socks5 127.0.0.1 7891 username password
# HTTP 代理
http 127.0.0.1 7890
http 127.0.0.1 7890 username password
# SOCKS4(无认证支持)
socks4 192.168.1.100 9050
[ProxyList]
# 方案 A: 用 Clash SOCKS5 端口(推荐,协议兼容性最好)
socks5 127.0.0.1 7891
# 方案 B: 用 Clash HTTP 端口
http 127.0.0.1 7890
# 方案 C: 多代理冗余(Clash + 备用)
socks5 127.0.0.1 7891 # Clash SOCKS5(主)
http 127.0.0.1 7890 # Clash HTTP(备用,同源)
# 第三个代理可以是任何外部服务器
# 测试 SOCKS5 代理
curl -x socks5h://127.0.0.1:7891 -I https://www.google.com
# 测试 HTTP 代理
curl -x http://127.0.0.1:7890 -I https://www.google.com
# 测试 proxychains 本身
proxychains4 curl -I https://www.google.com
proxy_dns)proxy_dns:
程序 → 系统 DNS(直连 → 可能被污染/劫持) → 得到错误 IP → 通过代理连接错误 IP
启用 proxy_dns:
程序 → proxychains 劫持 DNS → 通过 SOCKS5 代理转发 DNS 请求 → 得到真实 IP → 通过代理连接真实 IP
# 启用 DNS 代理(推荐)
proxy_dns
# 不启用(DNS 泄露风险,但速度可能更快)
# proxy_dns — 注释掉即可
proxy_dns 一般没问题fake-ip 或缓存实际影响不大某些程序绝对不能通过代理(见 cloudflared 代理冲突),否则会导致连接中断或功能异常。但 proxychains.conf 原生不支持按应用程序或按端口的排除规则。
为不同场景创建不同的 proxychains 配置:
mkdir -p /home/user/.config/proxychains/
# 默认配置(全代理)
cp /etc/proxychains4.conf /home/user/.config/proxychains/proxychains.conf
# 排除 cloudflared 的配置
cat > /home/user/.config/proxychains/proxychains-no-tunnel.conf << 'EOF'
dynamic_chain
chain_len = 1
quiet_mode
# ★ localnet 配置 — 本地地址不走代理
localnet 127.0.0.0 255.0.0.0
localnet 192.168.0.0 255.255.0.0
localnet 172.16.0.0 255.240.0.0
localnet 10.0.0.0 255.0.0.0
[ProxyList]
socks5 127.0.0.1 7891
EOF
localnet 解释localnet 指定的 IP 段不经过代理,直接连接。默认配置已包含:
# 默认的 localnet(无需修改)
localnet 127.0.0.0 255.0.0.0 # loopback
localnet 192.168.0.0 255.255.255.0 # 常见局域网
可以添加更多:
# 排除整个 Cloudflare IP 段
localnet 104.16.0.0 255.240.0.0
localnet 104.128.0.0 255.128.0.0
localnet 198.41.128.0 255.255.128.0
> 局限:localnet 基于目标 IP 白名单。对于 cloudflared 需要知道 Cloudflare Edge 的具体 IP 段(会变化),维护成本高。
最稳妥的做法:
# 需要代理的程序才用 proxychains
proxychains4 curl -I https://google.com
proxychains4 git clone https://github.com/xxx/yyy.git
proxychains4 pip install torch
# 不需要代理的程序直接运行
cloudflared tunnel run my-tunnel
sudo systemctl start cloudflared
# ★ 核心原则:cloudflared 永远不通过 proxychains 启动
# 在 ~/.bashrc 中添加
alias pc='proxychains4'
alias pcurl='proxychains4 curl'
alias pcgit='proxychains4 git'
# 或者定义一个函数,通过环境变量控制
proxy_exec() {
if [ "$1" = "no" ]; then
shift
unset http_proxy https_proxy all_proxy
"$@"
else
proxychains4 "$@"
fi
}
# 格式
proxychains4 [选项] <命令> [参数...]
# 示例
proxychains4 curl -I https://www.google.com
proxychains4 wget https://github.com/user/repo/releases/download/v1.0/file.tar.gz
proxychains4 git clone https://github.com/user/repo.git
proxychains4 npm install
proxychains4 pip install requests
proxychains4 ssh [email protected]
# 使用自定义配置
proxychains4 -f /home/user/.config/proxychains/proxychains-no-tunnel.conf curl -I https://google.com
# 设为别名
alias pctunnel='proxychains4 -f /home/user/.config/proxychains/proxychains-no-tunnel.conf'
# 去掉 quiet_mode 可看到每次连接用了哪个代理
proxychains4 curl -I https://google.com 2>&1 | grep -i chain
# 示例输出:
# |S-chain|-<>-127.0.0.1:7891-<><>-4.2.2.2:53-<><>-OK
# |S-chain|-<>-127.0.0.1:7891-<><>-142.250.80.4:443-<><>-OK
# === 软件包管理 ===
proxychains4 apt update
proxychains4 apt install package-name
# === Git 操作 ===
proxychains4 git clone https://github.com/user/repo.git
proxychains4 git pull
proxychains4 git push
# === pip / npm / cargo ===
proxychains4 pip install -r requirements.txt
proxychains4 npm install
proxychains4 cargo build
# === Docker(如果 Docker daemon 需要翻墙拉镜像)===
# 注意:Docker daemon 本身不走应用层代理,需配置 Docker 自身的 proxy
mkdir -p /etc/systemd/system/docker.service.d
cat > /etc/systemd/system/docker.service.d/http-proxy.conf << EOF
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:7890"
Environment="HTTPS_PROXY=http://127.0.0.1:7890"
Environment="NO_PROXY=localhost,127.0.0.1"
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
# === SSH ===
proxychains4 ssh [email protected]
# 或在 ~/.ssh/config 中:
# Host example
# HostName example.com
# ProxyCommand proxychains4 nc %h %p
# === 临时 FTP ===
proxychains4 ftp ftp.example.com
# === rsync 远程同步 ===
proxychains4 rsync -avz /local/path/ user@remote:/remote/path/
# ====================================================
# /home/user/.config/proxychains/proxychains.conf
# proxychains-ng 4.x 完整配置
# ====================================================
# ── 模式选择 ──
dynamic_chain
# strict_chain
# random_chain
# chain_len 对 dynamic_chain 无效(始终取 1 即第一个)
chain_len = 1
# ── 通用选项 ──
quiet_mode # 减少日志输出(日常用)
# proxy_dns # 启用 DNS 代理(取消注释开启)
tcp_read_time_out 15000 # TCP 读超时(毫秒)
tcp_connect_time_out 8000 # TCP 连接超时(毫秒)
# ── 本地网段(直连,不走代理)──
localnet 127.0.0.0 255.0.0.0
localnet 192.168.0.0 255.255.0.0
localnet 172.16.0.0 255.240.0.0
localnet 10.0.0.0 255.0.0.0
# ── 代理列表 ──
[ProxyList]
# Clash SOCKS5(主代理)
socks5 127.0.0.1 7891
| 错误 | 原因 | 解决 |
|---|---|---|
ERROR: ld.so: ... LD_PRELOAD cannot be preloaded |
32/64 位不匹配 | 32 位程序用 proxychains4(64 位),确认 dpkg -l proxychains4 |
connect: Connection refused |
代理端口未监听 | ss -tlnp | grep 7891 确认 Clash 在运行 |
connect: Connection timed out |
代理服务器不可达 | curl -x socks5h://127.0.0.1:7891 google.com 测试 |
| DNS 解析失败 | proxy_dns 开启但代理不支持 UDP |
关闭 proxy_dns 或更换代理 |
代理拒绝连接 (denied) |
代理拒绝了连接 | 检查 clash 日志 journalctl --user -u clash-verge -f |
# 1. 确认 clash 代理端口在监听
ss -tlnp | grep -E '7890|7891'
# 2. 测试代理端口
curl -x socks5h://127.0.0.1:7891 -s -o /dev/null -w "%{http_code}" https://www.google.com
# 期望输出: 200
# 3. 对比 proxychains 与直连
proxychains4 curl -s -o /dev/null -w "proxychains: %{http_code}\n" https://www.baidu.com
curl -s -o /dev/null -w "direct: %{http_code}\n" https://www.baidu.com
# 4. 检查 proxychains 版本(4.x)
proxychains4 -v 2>&1 || proxychains4 --version
proxychains 通过 LD_PRELOAD 工作,与直接设置环境变量 http_proxy 的方式互不干扰。但如果程序内部硬编码检查环境变量,可能会冲突:
# 为了安全,使用 proxychains 时临时清除代理环境变量
unset http_proxy https_proxy all_proxy HTTP_PROXY HTTPS_PROXY ALL_PROXY
proxychains4 <command>
# 或创建一个 wrapper 脚本
cat > /home/user/bin/pc << 'EOF'
#!/bin/bash
unset http_proxy https_proxy all_proxy HTTP_PROXY HTTPS_PROXY ALL_PROXY
exec proxychains4 "$@"
EOF
chmod +x /home/user/bin/pc