HTTP 与 SOCKS5 如何提出请求
HTTP 代理用 HTTP 消息提出请求,SOCKS5 则先协商,再提交目标地址。这里说的是应用连接代理入口的一段,入口之后还可以使用其他远端协议。
| 项目 | HTTP代理 | SOCKS5代理 |
|---|---|---|
| 应用如何提出请求 | HTTP请求,或用CONNECT请求建立隧道 | SOCKS5协商与目标连接请求 |
| 目标表达方式 | 由具体HTTP请求和隧道目标决定 | 可携带IPv4、IPv6地址或域名 |
| 选用依据 | 应用支持的HTTP代理功能与实际入口 | 应用支持的SOCKS5功能与实际入口 |
SOCKS5的请求结构见RFC 1928。如果一个工具同时提供两种入口,不必先争论哪种“更高级”;先选应用支持的方式,再核对DNS、认证与所需传输能力。
通过 CONNECT 访问 HTTPS
访问 HTTPS 网站时,应用可以向 HTTP 代理发送 CONNECT,请它建立一条到目标的隧道。隧道建立后,应用再和网站完成 TLS 握手。
- 应用先连接代理,并请求连接目标主机与端口,例如一个HTTPS网站的443端口。
- 代理接受CONNECT后,双方进入隧道传输阶段;应用再通过隧道与网站进行TLS握手。
- TLS验证成功后,网页请求和响应在应用与网站之间受到TLS保护;代理仍能知道隧道目标等连接信息。
这是HTTP语义标准中的CONNECT所描述的常见用途。这里说的是普通隧道转发;如果设备安装了用于HTTPS检查的证书,并由中间设备终止TLS,则信任关系和可见内容会改变。
因此,目标网址为https://,代理地址仍然可以是http://。把本机HTTP代理地址随手改成https://,会要求代理入口本身支持TLS,通常不能解决原来的连接问题。
socks5 与 socks5h 的解析位置
curl 的 socks5:// 通常先在本机解析域名,socks5h:// 则把域名交给 SOCKS 入口。h 改变的是解析位置,并不是新的协议版本。
curl官方SOCKS说明把两种行为分别对应到socks5://与socks5h://。当本机无法正确解析目标域名时,改为代理端解析可能改变结果;但前提是该代理能够按域名请求处理连接。
这里的“代理端”首先指应用连接的SOCKS入口。如果入口就是本机客户端,它如何继续解析或把域名交给远端,还取决于客户端的DNS和出站配置。socks5h不自动等于远端加密DNS,也不能单独保证设备没有其他DNS请求。需要了解这部分关系,可继续看DNS 与加密 DNS。
监听端口与 mixed 入口
端口填客户端当前开放的值。独立 HTTP、SOCKS 入口可能使用不同端口;mixed 入口则可以在一个端口识别两种请求。
例如sing-box mixed入站可以接受HTTP和SOCKS协议,但仍要配置监听地址与端口。某客户端把HTTP、SOCKS分别监听在两个端口,另一客户端只开放一个mixed端口,都可能是正常设计。
填写地址时逐项确认:协议是应用与入口之间的协议;127.0.0.1表示当前应用所在设备的本机;端口填客户端当前显示的实际值;认证按入口要求填写。手机中的127.0.0.1不会指向电脑,同理容器中的本机也不能直接等同于宿主机。
到验证命令工具生成请求前,先检查监听情况。没有开启相应入口时,仅换一个“常见端口”不会让服务出现。
SOCKS5 的 UDP 支持条件
SOCKS5 标准定义了 UDP ASSOCIATE,但应用必须使用它,入口与后续链路也要支持。只做一次网页请求,检查到的主要还是 TCP 路径。
浏览器网页测试或curl的一次普通HTTPS请求,主要验证的是相应TCP连接,不能用来证明游戏、语音或其他UDP路径可用。HTTP CONNECT建立的普通TCP隧道,也不能直接视为通用UDP转发。
遇到“网页正常、某应用异常”时,先确认应用使用的流量类型以及是否真正进入代理入口,再检查客户端的能力和出站支持。若要用TUN处理没有代理设置的应用,还需按系统代理与 TUN核对接管范围。支持SOCKS5、支持UDP、已经接管这款应用,是三个不同条件。
认证、加密与监听范围
用户名和密码用于限制入口使用权限,传输加密另有机制。配置本机代理时,先保持回环监听;要共享给其他设备,再安排认证和访问范围。
RFC 1929指出,SOCKS5的用户名密码认证方式会明文携带密码,因此不能把普通用户名密码认证当成加密通道。SOCKS5还可以协商其他认证机制,具体保护取决于实际机制与实现。
TLS保护的是建立该通道的双方。网站HTTPS、应用到HTTPS代理的TLS、客户端到远端的加密协议是不同的连接层次。仅开启一个本机代理监听端口,不能替代对这些层次的确认。
本机用途优先保持入口只对本机可达。确实需要共享到局域网时,再检查认证、监听地址与访问范围,避免无意把一个可转发请求的入口开放给其他设备。
填写代理地址并定位报错
先核对协议、地址和端口,再发一次明确指定代理的请求。得到报错后从对应环节检查,避免同时修改 DNS、证书和出站。
- 核对应用接受的地址格式,区分HTTP、HTTPS与SOCKS5。HTTPS代理需要入口支持TLS;访问HTTPS网站不要求代理入口一定写成HTTPS。
- 检查环境变量和代理例外。curl的官方手册说明了
--proxy、NO_PROXY等选项,例外配置可能让目标绕过预期入口。 - 记录实际请求结果和客户端连接日志。连接被拒绝先查监听与端口;HTTP 407先查代理认证;SOCKS协商失败先查协议和认证方式。
- 如果本机解析失败,比较应用采用的解析方式;如果已建立代理连接但TLS失败,继续检查目标证书、设备时间与链路,不用关闭校验作为常规修复。
同一目标的一次请求成功,只证明该次路径工作。之后仍要用实际应用验证,并分别测试需要的DNS、TCP或UDP能力;详细操作可以参考sing-box指南。
常见问题
socks5h是不是更安全的SOCKS5协议?
它在curl中主要用于选择由代理处理目标域名解析,不是一个新的SOCKS协议版本,也不自动启用加密DNS或连接加密。其他应用是否接受这个写法要看其文档。
为什么电脑上的127.0.0.1代理地址不能直接给手机用?
127.0.0.1指发起连接设备自己的回环地址。手机填写它会访问手机本机,不会访问电脑。跨设备共享需要另外确认电脑的局域网地址、监听范围和访问权限。
有用户名密码的代理可以直接在不可信网络上使用吗?
不能仅凭用户名密码作判断。普通SOCKS5用户名密码认证会明文传递密码;应另行确认传输保护和入口访问范围,区分认证与加密。
参考资料
原理和协议定义可查以下标准与官方文档。文中的流程图由 AFQKit 绘制。