基础概念 · HTTP与SOCKS5

HTTP 代理与 SOCKS5:端口、DNS 和 CONNECT

给浏览器或终端填写代理地址时,先看客户端开放了哪种入口。HTTP 与 SOCKS5 都能转发连接,但地址写法、域名解析和 UDP 支持需要分别核对。

全部概念工具使用教程引用资料

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 握手。

  1. 应用先连接代理,并请求连接目标主机与端口,例如一个HTTPS网站的443端口。
  2. 代理接受CONNECT后,双方进入隧道传输阶段;应用再通过隧道与网站进行TLS握手。
  3. 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。

curl 的 socks5 在本机解析后提交 IP;socks5h 将目标域名交给 SOCKS 入口处理,后续解析由客户端配置决定。
这里比较的是 curl 的解析选择。“交给入口”不必然意味着由远端服务器解析。

监听端口与 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、证书和出站。

  1. 核对应用接受的地址格式,区分HTTP、HTTPS与SOCKS5。HTTPS代理需要入口支持TLS;访问HTTPS网站不要求代理入口一定写成HTTPS。
  2. 检查环境变量和代理例外。curl的官方手册说明了--proxy、NO_PROXY等选项,例外配置可能让目标绕过预期入口。
  3. 记录实际请求结果和客户端连接日志。连接被拒绝先查监听与端口;HTTP 407先查代理认证;SOCKS协商失败先查协议和认证方式。
  4. 如果本机解析失败,比较应用采用的解析方式;如果已建立代理连接但TLS失败,继续检查目标证书、设备时间与链路,不用关闭校验作为常规修复。

同一目标的一次请求成功,只证明该次路径工作。之后仍要用实际应用验证,并分别测试需要的DNS、TCP或UDP能力;详细操作可以参考sing-box指南。

常见问题

socks5h是不是更安全的SOCKS5协议?

它在curl中主要用于选择由代理处理目标域名解析,不是一个新的SOCKS协议版本,也不自动启用加密DNS或连接加密。其他应用是否接受这个写法要看其文档。

为什么电脑上的127.0.0.1代理地址不能直接给手机用?

127.0.0.1指发起连接设备自己的回环地址。手机填写它会访问手机本机,不会访问电脑。跨设备共享需要另外确认电脑的局域网地址、监听范围和访问权限。

有用户名密码的代理可以直接在不可信网络上使用吗?

不能仅凭用户名密码作判断。普通SOCKS5用户名密码认证会明文传递密码;应另行确认传输保护和入口访问范围,区分认证与加密。

参考资料

原理和协议定义可查以下标准与官方文档。文中的流程图由 AFQKit 绘制。

系统代理与TUN →系统代理与 TUN 的区别:选择、验证与恢复客户端、内核与订阅 →客户端、内核与订阅:从安装到连接DNS 与加密 DNS →DNS 与加密 DNS:解析、缓存和排查

返回基础概念 · 按症状排查问题