Skip to content

SOCKS5 配置器指南:浏览器、SSH、curl、git 和 Python

一份实用的 SOCKS5 配置指南,涵盖 Firefox、macOS、Linux、SSH 动态转发、curl、git 和 Python——包括导致大多数地域和 DNS 泄漏的 socks5 与 socks5h 区别。

搜索 SOCKS5 配置器通常意味着您已经拥有主机、端口,可能还有用户名和密码——并且希望浏览器、shell 或脚本通过它来路由流量。没有单一的通用配置器,但每个配置 SOCKS5 的地方都需要相同的几个值,而且这些怪癖是可预测的。本指南涵盖了人们实际使用的设置。

SOCKS5 是什么,大约 60 秒说明

SOCKS5 (RFC 1928) 是一种传输层代理协议。您的客户端与代理建立连接,请求它到达目的地,然后在两个方向上中继字节。这种设计带来两个后果:

  • 代理不解析或重写应用协议,因此无需特殊配置即可承载 HTTPS、SSH 和任意 TCP 流量。
  • SOCKS5 不加密任何内容。机密性来自目标协议(HTTPS、SSH)或通过加密传输(如 SSH)运行隧道。

SOCKS5 的用户名和密码认证是单独的规范,RFC 1929。客户端对其支持各不相同,这种差异导致了很大一部分配置问题。

开始之前需要的值

  1. 主机 — 代理主机名或 IP 地址。
  2. 端口 — 提供商或隧道提供的监听端口。
  3. 认证 — 用户名和密码、IP 白名单,或无。
  4. 方案 — 您的工具期望 socks5:// 还是 socks5h://。

socks5:// 与 socks5h:// 以及为什么 DNS 决定您的地理位置

方案 谁解析 DNS 加密流量 使用时机
socks5:// 您的机器 否 本地 DNS 解析可接受
socks5h:// 代理 否 您希望查询和地理位置与代理匹配
http:// 前缀 您的机器 否 您使用的是 HTTP 代理,而非 SOCKS
https:// 前缀 您的机器 到代理的 TLS 提供商提供 TLS 封装的代理端点

h 意味着主机名由代理解析。当您想要 socks5h:// 却使用 socks5:// 时,这是代理工作但仍显示错误地区的最常见原因,并且它还可能将您访问的主机名暴露给本地解析器。只有部分工具——curl、通过 libcurl 的 git,以及某些 Python 库——遵循 socks5h 约定;GUI 应用程序通常将其显示为复选框。

在 Firefox 中配置 SOCKS5

Firefox 是最容易指向 SOCKS5 代理的主流浏览器,因为它保留自己的代理设置,而不是继承操作系统的设置。

  1. 打开设置并搜索网络设置,或导航到设置,然后常规,然后网络设置。
  2. 选择 手动代理配置。
  3. 在 SOCKS 主机字段中输入主机和端口,并选择 SOCKS v5。
  4. 如果代理应解析主机名,请勾选 使用 SOCKS v5 时代理 DNS。
  5. 除非您也有 HTTP 代理,否则将 HTTP 代理字段留空。
  6. 单击确定,然后加载一个报告您 IP 地址的页面以确认更改。

Chrome、Edge 和其他 Chromium 浏览器

基于 Chromium 的浏览器读取操作系统代理设置。对于隔离测试,使用标志和一次性配置文件启动一个:

# macOS
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome \
  --proxy-server="socks5://127.0.0.1:1080" \
  --user-data-dir=/tmp/chrome-socks-test
# Linux
google-chrome --proxy-server="socks5://127.0.0.1:1080" --user-data-dir=/tmp/chrome-socks-test

两个注意事项。单独的 --user-data-dir 使测试与您的正常配置文件隔离,而标志不是放置凭据的可靠位置——如果您的代理需要认证,请在操作系统设置中配置它,或通过本地转发器路由,而不是在标志中嵌入用户名和密码。

macOS:从终端配置 SOCKS5

networksetup 实用程序写入与网络偏好设置面板所暴露的完全相同的设置。

# List available network services if you are unsure of the name
networksetup -listallnetworkservices

# Replace "Wi-Fi" with your active service name
sudo networksetup -setsocksfirewallproxy "Wi-Fi" 127.0.0.1 1080
sudo networksetup -setsocksfirewallproxystate "Wi-Fi" on

# Turn it back off
sudo networksetup -setsocksfirewallproxystate "Wi-Fi" off

许多命令行工具完全忽略 macOS 系统代理设置,并且需要自己的配置,因此不要假设一旦此命令成功,终端就已被覆盖。

Linux 和 CLI 工具:环境变量

export ALL_PROXY="socks5h://user:[email protected]:1080"
export all_proxy="$ALL_PROXY"

大量命令行工具读取 ALL_PROXY 或其小写变体。使用 env | grep -i proxy 检查当前设置。Linux 上的图形应用程序通常遵循桌面环境的代理设置,而不是这些变量,因此配置两条路径,或对顽固的二进制文件使用 proxychains 等包装器。

SSH:将您控制的服务器变为 SOCKS5 代理

# -D enables dynamic (SOCKS) forwarding, -N runs no remote command, -C compresses
ssh -N -C -D 1080 [email protected]

# Add -f to push it into the background
ssh -f -N -C -D 1080 [email protected]

这通常是获得可用 SOCKS5 端点的最快方法。远程服务器上无需安装任何内容,不需要提升权限,并且您的机器与服务器之间的跳跃由 SSH 加密——这解决了 SOCKS5 的一个弱点。隧道建立后,将浏览器或 CLI 指向 127.0.0.1:1080。

curl、git 和 Python

# Resolve DNS locally
curl --socks5 127.0.0.1:1080 https://api.ipify.org

# Resolve DNS at the proxy
curl --socks5-hostname 127.0.0.1:1080 https://api.ipify.org

# With username and password authentication
curl --socks5-hostname 127.0.0.1:1080 \
  --proxy-user "USER:PASS" \
  https://api.ipify.org
# Route git through a SOCKS5 proxy; git uses libcurl underneath
git config --global http.proxy  socks5h://127.0.0.1:1080
git config --global https.proxy socks5h://127.0.0.1:1080

# Undo when you are finished
git config --global --unset http.proxy
git config --global --unset https.proxy
# Requires: pip install "requests[socks]"
import requests

proxies = {
    "http": "socks5h://user:[email protected]:1080",
    "https": "socks5h://user:[email protected]:1080",
}

response = requests.get("https://api.ipify.org", proxies=proxies, timeout=15)
print(response.status_code, response.text)

requests 库需要 PySocks 依赖项才能理解 SOCKS 代理。没有它,您会在尝试任何连接之前收到缺失依赖项错误,这很容易被误读为代理失败。

排查您实际会遇到的故障

症状 可能原因 修复
连接被拒绝 该端口上没有监听 确认端口以及代理或 SSH 隧道正在运行
SOCKS5 认证失败 凭据错误,或代理期望白名单 IP 重新检查凭据;如果您在白名单中,请删除它们
网站仍显示错误地区 因为您使用了 socks5://,DNS 在本地解析 切换到 socks5h:// 或启用远程 DNS
407 需要代理认证 您指向的是 HTTP 代理端口,而非 SOCKS 检查提供商的端口列表
在 curl 中有效,在浏览器中失败 浏览器使用系统设置,或扩展覆盖了它们 禁用代理扩展并验证系统设置
UDP 应用程序失败 SOCKS5 UDP 关联在客户端很少实现 改用 VPN 处理 UDP 流量

信任之前先验证

# Compare the reported IP with and without the proxy
curl -sS https://api.ipify.org; echo
curl -sS --socks5-hostname 127.0.0.1:1080 https://api.ipify.org; echo

如果两个地址相同,则流量没有通过代理。当地理位置准确性很重要时,还要在浏览器中运行 DNS 泄漏测试,以确认查询是通过代理而不是本地解析器离开的。

要点

SOCKS5 配置器实际上只是在正确的位置应用四个值:主机、端口、凭据以及关于 DNS 解析位置的决策。配置您实际使用的浏览器或 CLI 工具,使用上面的 curl 比较确认出口 IP,并在地理位置准确性或 DNS 隐私重要时默认使用 socks5h://。