读懂 SOCKS5 连接失败码
先确定是 SOCKS 协商、认证还是目标访问失败,不要把所有 SOCKS 错误都当成代理失效。
SOCKS5 服务器可以接受 TCP 连接,却仍拒绝访问目标的请求。判断哪个端点失败前,应先按正确阶段读取回复。
首先是方法选择。若选中用户名密码认证,它有自己的结果。之后服务器才返回 CONNECT 或其他 SOCKS 命令的回复。不能用另一个阶段的表格解释某阶段的字节值。
请求回复对应不同故障
| 回复值 | 在 SOCKS5 请求回复中的含义 |
|---|---|
| 0x01 | 一般服务器故障。 |
| 0x02 | 规则集不允许连接。 |
| 0x03 | 网络不可达。 |
| 0x04 | 主机不可达。 |
| 0x05 | 连接被拒绝。 |
| 0x06 | TTL 已过期。 |
| 0x07 | 不支持该命令。 |
| 0x08 | 不支持该地址类型。 |
例如,请求级拒绝是在已连接 SOCKS 服务后报告的,它不同于操作系统拒绝到该服务的初始 TCP 连接。
地址类型错误可能涉及 IPv4、IPv6 或主机名的表示方式,并不自动意味着整个端点不支持 SOCKS5。同样,UDP 命令不受支持也不能对另一次 TCP CONNECT 请求作出确定判断。
收集能让错误码发挥作用的上下文
编写错误报告时,应将代理地址、命令、目标主机和端口、地址族及 DNS 模式与结果一同记录。如果你管理该端点,服务器端的策略日志也很有用。规则集拒绝意味着应检查适用权限,而不是增大连接超时。
回复是服务器的报告,并非对目标网络完整、独立的诊断。不同客户端的措辞也会不同。可获取时应记录阶段和底层回复,不要只依赖简短的翻译错误信息。