跳到主要内容
NextProxyNextProxy文档

HTTP 与 SOCKS5

两种协议共用同一个端口的原理、CONNECT 隧道行为、SOCKS5 的能力边界,以及请求头会被怎么处理。

HTTP 和 SOCKS5 走同一个端口 58971。网关按 TCP 首字节判断协议,不需要你选端口。

协议识别

网关 peek 连接的第一个字节:

  • 0x05 → 按 SOCKS5 握手
  • 其他 → 按 HTTP 解析(CONNECT 或普通 forward)
shell
# 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 隧道:

  1. 客户端发 CONNECT example.com:443
  2. 网关认证、选路、建立出口连接
  3. 网关回 HTTP/1.1 200 Connection Established
  4. 之后就是纯 TCP 双向转发,网关不解析也不改写隧道内的任何内容

所以 TLS 是你和目标站端到端的,证书链、SNI、ALPN 都不受影响。

普通 HTTP forward 模式

访问 http:// 站点时,客户端可以不用 CONNECT,直接把完整 URL 放在请求行里。这时网关会解析并重建请求。

它只接受 http:// URL:

shell
# 可以
curl -x 'http://USERNAME:PASSWORD@GATEWAY_HOST:58971' http://example.com

# 不行:https 绝对 URL 不走 CONNECT 会返回 400

请求行里也不允许带 userinfo(http://user:pass@example.com/),会返回 400

forward 模式下的请求头处理

这个模式下网关会重建请求头。会被删除的:

  • Proxy-Authorization
  • Proxy-Connection
  • Connection 头里列出的所有 hop-by-hop 扩展头
  • ConnectionKeep-AliveProxy-AuthenticateTETrailerTransfer-Encoding

其他行为:

  • 非 Upgrade 请求会被强制设为 Connection: close
  • 必要时重建 HostContent-Length
  • chunked body、Trailer、Upgrade 会做受控重建

CONNECT 隧道和 SOCKS5 建立之后,网关完全不解析隧道内的请求头,上面这些规则都不适用。

SOCKS5 的能力边界

支持

  • CONNECT(CMD = 0x01
  • 三种地址类型:IPv4、IPv6、域名
  • RFC 1929 用户名密码认证(method 0x02

不支持

  • UDP ASSOCIATE —— 返回 0x07 command not supported
  • BIND —— 同样返回 0x07
  • 匿名接入(除了下面说的免密端口)

关于 socks5h 和 DNS

socks5h://socks5:// 的差别是谁解析域名

  • socks5:// —— 客户端本地解析,把 IP 发给代理
  • socks5h:// —— 客户端把域名发给代理,让代理解析

socks5h:// 的好处是你的本地 DNS 不会暴露正在访问哪个域名。

SOCKS5 的错误表达

SOCKS5 没有 HTTP 状态码,用协商响应和 reply 码表达:

阶段含义
方法协商0x02选中用户名密码认证
方法协商0x00选中无认证(仅免密端口)
方法协商0xff没有可接受的认证方式
认证01 00认证成功
认证01 01认证失败、参数非法或认证服务异常
CONNECT0x00成功
CONNECT0x01其他连接或服务错误
CONNECT0x02策略、配额或并发限制
CONNECT0x05connection refused
CONNECT0x06连接超时
CONNECT0x07command not supported(UDP / BIND)

地址类型不支持返回 0x08。认证阶段只能报告成功或失败;可临时使用 HTTP CONNECT 获取更细的状态码和 X-NextProxy-Error。完整映射见 错误码对照

IPv6

IPv6 目标:支持。HTTP 和 SOCKS5 都能解析 IPv6 目标地址。

shell
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 在部分工具里配置更简单

这篇解决你的问题了吗?