协议 · 1 分钟阅读

SOCKS5 认证方法 (RFC 1929)

在SOCKS5代理转发您的流量之前,它会协商如何验证您。此指南详细介绍了SOCKS5方法协商握手(来自RFC 1928)、用户名/密码方案(来自RFC 1929)以及在实践中的含义——包括明文警告。

方法协商握手

SOCKS5(在RFC 1928中定义)不假设认证方法——它协商一种。只要与代理的TCP连接打开,客户端就会发送一个问候,列出它支持的认证方法,代理则选择其中一种。

客户端的问候是:一个版本字节(0x05),一个方法计数,然后是那么多的方法标识符。常见的方法有0x00 "不需要认证",0x02 "用户名/密码",和0xFF "没有可接受的方法"。服务器回复两个字节:版本和它选择的单一方法。如果返回0x00,你可以直接连接;如果返回0x02,客户端必须先进行用户名/密码的子协商,然后才能发出任何连接请求。如果服务器返回0xFF,则没有任何提供的方法是可接受的,它会关闭连接。这就是为什么一个经过认证的s4m SOCKS5代理在1080端口上期望你的客户端提供方法0x02。

用户名/密码:RFC 1929

用户名/密码方法 (0x02) 在 RFC 1929 中单独指定。这是一个微小的、自包含的交换,发生在方法协商之后和 SOCKS 请求之前:

  • 客户端发送:一个子协商版本字节 (0x01 — 注意这是认证版本,而不是 SOCKS 版本),一个字节的用户名长度,用户名,一个字节的密码长度,以及密码。
  • 服务器回复两个字节:版本 (0x01) 和一个状态字节。0x00 表示成功;其他任何值表示失败,服务器关闭连接。

只有在成功状态之后,客户端才会继续进行实际的 SOCKS5 CONNECT 请求,指定目标。由于用户名和密码都是长度前缀的单字节,每个都限制为 255 字节。请参阅我们的 代理认证指南,了解这在真实客户端和 API 中如何处理凭证。

明文警告及其处理方式

关键的诚实点:RFC 1929以明文传输用户名和密码。这些字节没有加密或哈希处理——任何能够观察您与代理之间TCP连接的人都可以读取您的凭据。RFC本身承认这一点,并警告这种方法仅在这种暴露是可接受的情况下才合适。

这在实践中意味着:SOCKS5用户名/密码认证的安全性依赖于通往代理的路径是可信的,或者将整个SOCKS连接包装在某种加密中。人们使用的缓解措施包括通过TLS或SSH隧道SOCKS5,在可信网络上运行代理,或依赖IP白名单而不是(或除了)凭据——这使得专用IP变得可行。原则上存在其他SOCKS5认证方法(例如RFC 1928中的GSS-API),但用户名/密码仍然是最广泛实现的方法,因此理解其明文特性——并且不将重要密码重复用作代理凭据——是很重要的。

FAQ

问题,已解答

SOCKS5 如何决定使用哪种认证方法?

它进行协商。客户端以列出其支持的方法(例如 0x00 无认证和 0x02 用户名/密码)的问候语开头,服务器则回复它选择的单一方法。如果服务器选择 0x02,客户端将运行 RFC 1929 用户名/密码交换,然后发送连接请求。

SOCKS5用户名/密码认证是加密的吗?

不。RFC 1929 以明文发送用户名和密码,因此任何能够观察到与代理的连接的人都可以读取它们。为了保护凭据,通过 TLS 或 SSH 隧道 SOCKS5 连接,使用受信任的网络路径,或依赖于专用 IP 的 IP 白名单。

RFC 1928和RFC 1929之间有什么区别?

RFC 1928 定义了 SOCKS5 本身,包括客户端和服务器就认证方法达成一致的方式协商握手。RFC 1929 仅定义了其中一种方法——用户名/密码方案——并具有自己的子协商版本字节和消息格式。它们协同工作。

经过认证的 SOCKS5,做得正确

s4m的SOCKS5代理在1080端口使用用户名/密码认证,提供可选的专用IP,以便您可以将稳定地址列入白名单。按需计费,匿名账户,接受加密货币。

人们通过搜索找到此页面

此页面回答的真实搜索短语 — 链接的短语打开详细覆盖它们的页面。