Linux 上的 SOCKS5 配置器:proxychains、redsocks 与按应用路由
Linux 没有单一的 SOCKS5 开关,但你可以使用 proxychains 按应用路由、使用 redsocks 透明代理,或通过环境变量进行路由。以下是如何配置每种方式、验证 DNS 并避免泄漏。
在 Linux 上搜索“SOCKS5 配置器”常常会让人困惑:GNOME 或 KDE 中并没有像 HTTP 代理那样的系统级 SOCKS5 开关。相反,Linux 为你提供了灵活的构建模块。本指南介绍在 Linux 上通过 SOCKS5 代理路由流量的实用方法——按应用、透明代理以及针对特定 CLI 工具——并附上你可以改编的代码。
SOCKS5 在 Linux 上如何工作(以及为什么 DNS 很重要)
SOCKS5 是一种通用代理协议,可以处理 TCP 连接(某些扩展也支持 UDP,但大多数实现仅使用 TCP)。在 Linux 上,关键区别在于 socks5 与 socks5h:
socks5://在本地机器上解析 DNS,然后将 IP 发送给代理。socks5h://将主机名发送给代理,由代理远程解析。
对于受地理限制的内容或避免 DNS 泄漏,socks5h 通常是正确选择。如果你的代理提供商为你提供 SOCKS5 端点,你通常可以通过使用 h 变体或 Firefox 中的“使用 SOCKS v5 时代理 DNS”设置来强制远程 DNS。
使用 proxychains 按应用路由
proxychains-ng 是经典 proxychains 工具的维护分支。它使用 LD_PRELOAD 拦截动态链接程序的网络调用,并将它们路由到你的代理。它是 Linux 上最接近 Windows 或 macOS 上 Proxifier 的等价工具,尽管底层工作原理不同。
在 Debian/Ubuntu 上安装:
sudo apt install proxychains4
在 Arch 上:
sudo pacman -S proxychains-ng
编辑配置文件(通常是 /etc/proxychains4.conf 或 ~/.proxychains/proxychains.conf)。在文件末尾定义你的代理:
[ProxyList]
socks5 127.0.0.1 1080
如果你的代理需要认证:
socks5 203.0.113.10 1080 username password
要通过代理路由 DNS,请在配置中保持 proxy_dns 行未被注释。这会让 proxychains 使用远程 DNS,类似于 socks5h。
通过代理运行任意命令:
proxychains4 curl https://ifconfig.me
proxychains4 firefox
注意:proxychains 不适用于静态链接的二进制文件、setuid 二进制文件或进行原始套接字调用的应用程序。默认情况下它也不代理 UDP 流量。对于这些情况,请考虑下面的透明代理方法。
使用 redsocks 的透明代理
如果你希望在不进行按应用配置的情况下,将所有 TCP 流量(或特定端口)通过 SOCKS5 代理路由,redsocks 可以在内核级别重定向连接。这更复杂,如果配置错误可能会破坏你的网络,因此请谨慎操作。
安装 redsocks:
sudo apt install redsocks
创建配置文件,例如 /etc/redsocks.conf:
redsocks {
local_ip = 127.0.0.1;
local_port = 12345;
ip = 203.0.113.10;
port = 1080;
type = socks5;
login = "username";
password = "password";
}
然后使用 iptables 将传出的 TCP 流量重定向到本地 redsocks 端口。例如,重定向除本地网络之外的所有 TCP 流量:
sudo iptables -t nat -N REDSOCKS
sudo iptables -t nat -A REDSOCKS -d 0.0.0.0/8 -j RETURN
sudo iptables -t nat -A REDSOCKS -d 10.0.0.0/8 -j RETURN
sudo iptables -t nat -A REDSOCKS -d 127.0.0.0/8 -j RETURN
sudo iptables -t nat -A REDSOCKS -d 169.254.0.0/16 -j RETURN
sudo iptables -t nat -A REDSOCKS -d 172.16.0.0/12 -j RETURN
sudo iptables -t nat -A REDSOCKS -d 192.168.0.0/16 -j RETURN
sudo iptables -t nat -A REDSOCKS -p tcp -j REDIRECT --to-ports 12345
sudo iptables -t nat -A OUTPUT -p tcp -j REDSOCKS
此设置会重定向来自本地机器的出站 TCP。请根据你的需求调整规则(例如,排除某些用户或目标)。请记住 DNS 通常是 UDP;redsocks 可以处理 TCP DNS,但你可能需要针对 UDP 进行额外配置。许多用户将 redsocks 与本地 DNS 解析器(如 dnscrypt-proxy 或 unbound)结合使用以避免泄漏。
环境变量与 CLI 工具
许多命令行工具会遵循诸如 http_proxy、https_proxy 和 all_proxy 等环境变量。对于 SOCKS5,最可靠的是使用 socks5h 方案的 all_proxy:
export all_proxy=socks5h://127.0.0.1:1080
curl https://ifconfig.me
有些工具也会接受带有 socks5:// URL 的 http_proxy 和 https_proxy,但支持情况各不相同。对于特定工具,请直接配置它们:
- curl:使用
--socks5-hostname 127.0.0.1:1080(等同于socks5h)。 - git:
git config --global http.proxy socks5h://127.0.0.1:1080 - SSH:使用动态转发创建本地 SOCKS 代理:
ssh -D 1080 -N user@remote-host。然后将其他工具指向127.0.0.1:1080。
Linux 上的浏览器配置
Firefox 对 SOCKS5 有很好的支持。转到设置 → 网络设置 → 手动代理配置,将 SOCKS 主机设置为 127.0.0.1,端口设置为 1080,选择 SOCKS v5,并勾选“使用 SOCKS v5 时代理 DNS”。这会让 Firefox 使用远程 DNS。
在 Linux 上,可以使用代理标志启动 Chrome 和 Chromium:
google-chrome --proxy-server="socks5://127.0.0.1:1080"
然而,默认情况下这不会代理 DNS。Chrome 会在本地解析主机名,这可能会泄漏 DNS。要强制远程 DNS,你可以使用 --host-resolver-rules 或一个处理带远程 DNS 的 SOCKS5 的代理扩展。或者,使用像 redsocks 这样的系统级透明代理来避免为每个浏览器设置标志。
验证你的设置并检查泄漏
配置后,务必验证流量是否通过代理,以及 DNS 是否泄漏。快速检查:
- 显示 IP:
curl https://ifconfig.me或curl https://ipinfo.io/ip。(如果使用 proxychains,请在前面加上proxychains4。) - DNS 泄漏测试:在浏览器中访问类似
dnsleaktest.com的网站,并检查 DNS 服务器属于你的 ISP 还是你的代理提供商。 - WebRTC 泄漏:在浏览器中,WebRTC 可能会暴露你的真实 IP。如有需要,请禁用 WebRTC 或使用扩展程序阻止它。
- 终端 DNS 检查:
dig +short example.com将使用你的系统解析器,除非你已配置 proxychains 或本地 DNS 转发器。要查看 DNS 是否被代理,请比较使用和不使用代理时的结果。
常见陷阱及如何避免
- 在需要
socks5h://时使用了socks5://:这是 DNS 泄漏最常见的原因。如果你的工具支持,请始终使用h变体。 - 假设所有应用都遵循 proxychains:静态链接的二进制文件和一些沙盒应用会绕过
LD_PRELOAD。请测试你需要的每个应用。 - 忘记 UDP 和 QUIC:SOCKS5 代理通常只处理 TCP。QUIC(用于 HTTP/3)运行在 UDP 上,可能会绕过你的代理。如果你需要绝对一致,请在浏览器中禁用 QUIC。
- IPv6 泄漏:如果你的代理仅支持 IPv4,IPv6 流量可能会直接出去。请禁用 IPv6,或在支持的情况下通过代理路由它。
- 透明代理环路:使用 redsocks 时,注意不要重定向代理本身所需的流量(例如,到代理服务器 IP 的流量)。请使用排除规则。
结语
Linux 没有提供一键式 SOCKS5 配置器,但这是特性,不是缺陷。你可以选择使用 proxychains 进行按应用路由、使用 redsocks 进行透明重定向,或为 CLI 工具使用简单的环境变量。选择适合你工作流程的方法,然后在用它处理敏感流量之前验证 DNS 和泄漏。