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。客户端对其支持各不相同,这种差异导致了很大一部分配置问题。
开始之前需要的值
- 主机 — 代理主机名或 IP 地址。
- 端口 — 提供商或隧道提供的监听端口。
- 认证 — 用户名和密码、IP 白名单,或无。
- 方案 — 您的工具期望
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 代理的主流浏览器,因为它保留自己的代理设置,而不是继承操作系统的设置。
- 打开设置并搜索网络设置,或导航到设置,然后常规,然后网络设置。
- 选择 手动代理配置。
- 在 SOCKS 主机字段中输入主机和端口,并选择 SOCKS v5。
- 如果代理应解析主机名,请勾选 使用 SOCKS v5 时代理 DNS。
- 除非您也有 HTTP 代理,否则将 HTTP 代理字段留空。
- 单击确定,然后加载一个报告您 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://。