HTTP 与 SOCKS5
两种协议共用同一个端口的原理、CONNECT 隧道行为、SOCKS5 的能力边界,以及请求头会被怎么处理。
HTTP 和 SOCKS5 走同一个端口 58971。网关按 TCP 首字节判断协议,不需要你选端口。
协议识别
网关 peek 连接的第一个字节:
0x05→ 按 SOCKS5 握手- 其他 → 按 HTTP 解析(
CONNECT或普通 forward)
# HTTP
curl -x 'http://USERNAME-country-US:PASSWORD@GATEWAY_HOST:58971' https://example.com
# SOCKS5,同一个端口
curl -x 'socks5h://USERNAME-country-US:PASSWORD@GATEWAY_HOST:58971' https://example.com
HTTPS 网站怎么走
通过 HTTP CONNECT 建立透明 TCP 隧道:
- 客户端发
CONNECT example.com:443 - 网关认证、选路、建立出口连接
- 网关回
HTTP/1.1 200 Connection Established - 之后就是纯 TCP 双向转发,网关不解析也不改写隧道内的任何内容
所以 TLS 是你和目标站端到端的,证书链、SNI、ALPN 都不受影响。
普通 HTTP forward 模式
访问 http:// 站点时,客户端可以不用 CONNECT,直接把完整 URL 放在请求行里。这时网关会解析并重建请求。
它只接受 http:// URL:
# 可以
curl -x 'http://USERNAME:PASSWORD@GATEWAY_HOST:58971' http://example.com
# 不行:https 绝对 URL 不走 CONNECT 会返回 400
请求行里也不允许带 userinfo(http://user:pass@example.com/),会返回 400。
forward 模式下的请求头处理
这个模式下网关会重建请求头。会被删除的:
Proxy-AuthorizationProxy-ConnectionConnection头里列出的所有 hop-by-hop 扩展头Connection、Keep-Alive、Proxy-Authenticate、TE、Trailer、Transfer-Encoding
其他行为:
- 非 Upgrade 请求会被强制设为
Connection: close - 必要时重建
Host和Content-Length - chunked body、Trailer、Upgrade 会做受控重建
CONNECT 隧道和 SOCKS5 建立之后,网关完全不解析隧道内的请求头,上面这些规则都不适用。
SOCKS5 的能力边界
支持
CONNECT(CMD =0x01)- 三种地址类型:IPv4、IPv6、域名
- RFC 1929 用户名密码认证(method
0x02)
不支持
- UDP ASSOCIATE —— 返回
0x07command not supported - BIND —— 同样返回
0x07 - 匿名接入(除了下面说的免密端口)
关于 socks5h 和 DNS
socks5h:// 和 socks5:// 的差别是谁解析域名:
socks5://—— 客户端本地解析,把 IP 发给代理socks5h://—— 客户端把域名发给代理,让代理解析
用 socks5h:// 的好处是你的本地 DNS 不会暴露正在访问哪个域名。
SOCKS5 的错误表达
SOCKS5 没有 HTTP 状态码,用协商响应和 reply 码表达:
| 阶段 | 值 | 含义 |
|---|---|---|
| 方法协商 | 0x02 | 选中用户名密码认证 |
| 方法协商 | 0x00 | 选中无认证(仅免密端口) |
| 方法协商 | 0xff | 没有可接受的认证方式 |
| 认证 | 01 00 | 认证成功 |
| 认证 | 01 01 | 认证失败、参数非法或认证服务异常 |
| CONNECT | 0x00 | 成功 |
| CONNECT | 0x01 | 其他连接或服务错误 |
| CONNECT | 0x02 | 策略、配额或并发限制 |
| CONNECT | 0x05 | connection refused |
| CONNECT | 0x06 | 连接超时 |
| CONNECT | 0x07 | command not supported(UDP / BIND) |
地址类型不支持返回 0x08。认证阶段只能报告成功或失败;可临时使用 HTTP CONNECT 获取更细的状态码和 X-NextProxy-Error。完整映射见 错误码对照。
IPv6
IPv6 目标:支持。HTTP 和 SOCKS5 都能解析 IPv6 目标地址。
curl -x 'http://USERNAME:PASSWORD@GATEWAY_HOST:58971' 'http://[2001:db8::1]/'
IPv6 客户端接入:取决于网关节点和负载均衡器的 IPv6 配置,不是所有节点都保证可用。
免密端口的来源绑定只接受 IPv4 —— 见 IP 白名单与免密端口。
两种协议怎么选
| 需求 | 选 |
|---|---|
| 大部分 HTTP/HTTPS 抓取 | HTTP(生态最好,库支持最全) |
| 需要代理任意 TCP(非 HTTP 协议) | SOCKS5 |
| 需要避免本地 DNS 暴露 | SOCKS5 + socks5h:// |
| 需要 UDP / QUIC / WebRTC | 都不行,见上面的限制 |
| 浏览器自动化 | 两者都可以,SOCKS5 在部分工具里配置更简单 |