Skip to content
文章 / 2 分钟阅读

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 和泄漏。