SOCKS4 代理的工作原理
应用程序不会直接连接目标端,而是先与代理建立 TCP 连接。
应用程序 → SOCKS4 代理 → 198.51.100.20:443
建立连接时,客户端会发送 SOCKS 版本、命令、目标端口、目标 IPv4 地址和 USERID 字段。对于常用的 CONNECT 命令,代理会连接目标端,并返回连接是否成功。SOCKS4 还定义了 BIND 命令,用于监听传入的 TCP 连接。
连接建立后,代理会双向转发字节,不解析 HTTP 或其他应用层数据。目标端看到的连接来源是代理的 IP 地址。
SOCKS4 与 SOCKS5 的区别
SOCKS5 是较新的协议,支持更多连接类型。
| 功能 | SOCKS4 | SOCKS5 |
|---|---|---|
| 流量 | 仅支持 TCP | 支持 TCP 和 UDP 关联 |
| 目标地址 | IPv4;可通过 SOCKS4a 使用主机名 | IPv4、IPv6 或主机名 |
| 认证 | 无标准化协商;USERID 明文传输 | 可协商认证方式 |
| DNS | 通常由客户端解析 | 代理可以解析主机名 |
原始 SOCKS4 请求包含 IPv4 地址,因此客户端必须先完成 DNS 解析。SOCKS4a 扩展允许客户端发送主机名,交由代理解析,但不支持 SOCKS5 的其他功能。
SOCKS4 适用场景
SOCKS4 主要适合已有软件支持该协议、但不支持较新代理协议的情况。常见场景包括:
- 转发旧版应用程序的出站 TCP 连接。
- 传输 HTTP、HTTPS 或其他基于 TCP 的协议,而不解析其内容。
- 通过已知的 IPv4 代理端点测试流量。
对于新部署,SOCKS5 通常是更好的选择。如果工具只处理 Web 请求,并且需要 HTTP 特有的功能,请使用 HTTP 代理。
限制与安全使用
- **不支持 UDP:**DNS 客户端、游戏和实时应用程序可能需要 UDP。
- **不支持 IPv6 目标地址:**原始请求格式只提供 IPv4 目标地址字段。
- **不提供加密:**SOCKS4 不会保护客户端与代理之间的数据。HTTPS 仍可对 Web 流量进行端到端加密。
- **无标准化认证协商:**SOCKS4 会以明文发送用于标识身份的 USERID 字段。代理实现可以选择验证该值,但这并不是经过协商的用户名和密码认证方式。
代理只会改变连接的源 IP,不会改变请求头、Cookie 或浏览器指纹。请遵守网站条款和限速规则,仅在可信的应用程序中使用 SOCKS4,并仅连接可信的代理服务器。
常见问题
SOCKS4 支持 UDP 吗?
不支持。SOCKS4 只能转发 TCP 连接。如果应用程序需要 UDP 关联,请使用 SOCKS5。
SOCKS4 代理可以转发 HTTPS 流量吗?
可以。HTTPS 基于 TCP 运行,因此 SOCKS4 可以转发其加密字节流。加密由 TLS 连接提供,SOCKS4 本身不提供加密。
SOCKS4 可以防止 DNS 泄漏吗?
通常不可以。原始 SOCKS4 要求客户端在本地解析主机名,这可能导致 DNS 请求绕过代理而暴露。SOCKS4a 可以将主机名发送给代理进行解析。