proxychains4 精细配置指南

1. 简介

proxychains4(proxychains-ng)通过 LD_PRELOAD 机制劫持程序的网络相关 libc 调用(connect()getaddrinfo() 等),将流量重定向到代理服务器。它不修改原程序、不依赖 iptables,使用极其灵活。

2. 安装


sudo apt install proxychains4

安装后默认配置文件位于 /etc/proxychains4.conf。推荐复制到用户目录后自定义:


mkdir -p /home/user/.config/proxychains/
cp /etc/proxychains4.conf /home/user/.config/proxychains/proxychains.conf


3. 三种代理模式

3.1 dynamic_chain — 动态链(推荐)

按列表顺序依次尝试,跳过不可用的代理,直到找到一个可用的。最灵活、最常见


# proxychains.conf
dynamic_chain

# 保持 chain_len = 1 表示一次只用一个代理(非级联)
chain_len = 1

行为:127.0.0.1:7891 不可用 → 尝试 127.0.0.1:7892 → 成功则使用

3.2 strict_chain — 严格链

严格按照列表顺序串联所有代理:


你的程序 → Proxy1 → Proxy2 → Proxy3 → 目标服务器

所有代理必须全部在线,任一个失败则连接中断。使用场景极少,主要用于需要多层匿名的场景。


# proxychains.conf
strict_chain

3.3 random_chain — 随机链

从代理列表中随机选取一个使用,配合 chain_len 可实现随机级联。


# proxychains.conf
random_chain
chain_len = 2

行为:从列表中随机选 2 个代理串起来使用。

3.4 模式对比

模式 容错性 延迟 使用场景
dynamic_chain 高(跳过不可用) 最低 日常翻墙,单层代理
strict_chain 零(全需在线) 高(多层) 重匿名需求
random_chain 分散流量,混淆

3.5 实际选择

99% 的场景使用 dynamic_chain


# 推荐配置
dynamic_chain
chain_len = 1


4. 代理列表配置

4.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

4.2 配合 Clash 代理链路


[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(备用,同源)
# 第三个代理可以是任何外部服务器

4.3 验证代理连通性


# 测试 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


5. DNS 代理 (proxy_dns)

5.1 为什么需要代理 DNS

没有 proxy_dns

程序 → 系统 DNS(直连 → 可能被污染/劫持) → 得到错误 IP → 通过代理连接错误 IP

启用 proxy_dns

程序 → proxychains 劫持 DNS → 通过 SOCKS5 代理转发 DNS 请求 → 得到真实 IP → 通过代理连接真实 IP

5.2 配置


# 启用 DNS 代理(推荐)
proxy_dns

# 不启用(DNS 泄露风险,但速度可能更快)
# proxy_dns — 注释掉即可

5.3 注意事项


6. 白名单 / 黑名单策略

6.1 问题

某些程序绝对不能通过代理(见 cloudflared 代理冲突),否则会导致连接中断或功能异常。但 proxychains.conf 原生不支持按应用程序或按端口的排除规则。

6.2 方案 A:多配置文件(推荐)

为不同场景创建不同的 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

6.3 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 段(会变化),维护成本高。

6.4 方案 B:不通过 proxychains 启动敏感应用

最稳妥的做法:


# 需要代理的程序才用 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 启动

6.5 方案 C:bash alias 自动切换


# 在 ~/.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
}


7. 日常使用

7.1 基本用法


# 格式
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]

7.2 指定配置文件


# 使用自定义配置
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'

7.3 调试模式


# 去掉 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

7.4 常见使用场景


# === 软件包管理 ===
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/


8. 完整配置示例


# ====================================================
# /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


9. 故障排除

9.1 常见错误

错误 原因 解决
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

9.2 快速诊断


# 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

9.3 环境变量冲突

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


10. 参考