SK5(SOCKS5) 代理检测:三步握手走通才算可用
SK5 就是 SOCKS5,业界口语里常写成 SK5。它的检测比 L2TP 简单,但"端口能连上"和"代理真能用"之间的距离,同样容易踩坑。
一、SOCKS5 的完整握手过程
一次可用的 SOCKS5 代理,客户端要完成三段交互,任何一段失败都等于不可用。
| 阶段 | 客户端发出 | 服务端应返回 |
|---|---|---|
| 1. 方法协商 | 版本号 0x05 + 支持的认证方法列表 | 选定一种方法,常用 0x00(免认证)或 0x02(用户名密码) |
| 2. 认证(RFC1929) | 版本 0x01 + 用户名长度与内容 + 密码长度与内容 | 0x01 表示认证成功,非 0 状态码即失败 |
| 3. 建立连接 | 0x05 + CONNECT 命令 + 目标地址与端口 | 应答码 0x00 表示成功,其余为各类拒绝原因 |
只有第三段返回成功应答,代理才算真正可用。前两段通过、第三段被拒,是最常见的"看着能用实际不能用"。
二、四种典型失败与对应原因
1. 端口能连,但一说话就断
多半是端口不是 SOCKS5 服务。服务商面板里那一列数字有时是 HTTP 代理端口、有时是账号字段、有时只是内部编号。可以观察返回的首字节:SOCKS5 一定会回 0x05 开头的响应,回了 HTTP 的 200 或直接断开就不是 SOCKS5。
2. 卡在方法协商,服务端不选任何方法
常见于需要 IP 白名单的线路:你的出口 IP 不在允许列表里,服务端直接拒绝或不回应。这类线路即使账号密码全对也连不上,必须先加白名单。
3. 认证返回非 0 状态码
账号密码错误、账号到期、并发数超限、账号与 IP 绑定不符,都会在这一步体现。这一层的失败原因和 HTTP 代理的 407 是同一性质,可以直接找服务商核对账号状态。
4. CONNECT 被拒
应答码会给出方向:网络不可达、主机不可达、连接被拒、TTL 过期、命令不支持等。这一层失败通常不是账号问题,而是目标地址或服务端出口的链路问题。用不同目标地址(比如不同网站的 443 端口)复测两次,就能区分是个别目标不可达还是整体出口异常。
三、DNS 在哪里解析,影响很大
SOCKS5 支持把域名交给代理解析(ATYP=0x03),也可以由客户端先解析成 IP 再连接(ATYP=0x01)。两者的区别在于:
- 域名交给代理:解析发生在代理端,出口地区与解析结果一致,适合需要落地地区一致的场景;
- 本地先解析:解析发生在你本机,可能拿到就近 CDN 节点,走代理后反而访问到非预期地区的服务。
遇到"代理能用但打开某站点显示地区不对"的情况,先看客户端是不是把域名在本地解析掉了。
四、UDP 转发:要不要单独验
SOCKS5 规范里定义了 UDP ASSOCIATE,但绝大多数代理只实现了 TCP 转发。所以一个代理"网页能用"并不代表"UDP 也能用"。
- 只做网页访问、HTTP(S) 请求:TCP 通即可;
- 涉及语音、游戏、部分实时通信:必须确认 UDP 转发是否支持,否则表现为能打开网页但语音连不上、游戏无法匹配。
五、自查清单
- 确认端口确实是 SOCKS5,观察首字节是否为 0x05;
- 确认是否需要 IP 白名单,本机出口 IP 是否已加入;
- 确认账号是否到期、并发是否超限;
- 用两个以上不同目标地址做 CONNECT,排除单目标问题;
- 核查出口 IP 与落地地区,确认与购买时约定一致;
- 需要 UDP 的场景,单独验证 UDP 转发能力。
支持批量粘贴、自动识别格式,逐条给出可用性、出口 IP 与地区。