SOCKS
互联网协议套组 |
---|
应用层 |
传输层 |
网络层 |
链接层 |
SOCKS是一种网络传输协议,名字取自SOCKetS[注 1],主要用于客户端与外网服务器之间通讯的中间传递。
当防火墙后的客户端要访问外部的服务器时,就跟SOCKS代理服务器连接。这个代理服务器控制客户端访问外网的资格,允许的话,就将客户端的请求发往外部的服务器。
这个协议最初由David Koblas开发,而后由NEC的Ying-Da Lee将其扩展到SOCKS4。最新协议是SOCKS5,与前一版本相比,增加支持UDP、验证,以及IPv6。
根据OSI模型,SOCKS是会话层的协议,位于表示层与传输层之间。
SOCKS协议不提供加密。
与HTTP代理的对比
[编辑]SOCKS工作在比HTTP代理更低的层次:SOCKS使用握手协议来通知代理软件其客户端试图进行的SOCKS连接,然后尽可能透明地进行操作,而常规代理可能会解释和重写报头(例如,使用另一种底层协议,例如FTP;然而,HTTP代理只是将HTTP请求转发到所需的HTTP服务器)。虽然HTTP代理有不同的使用模式,HTTP CONNECT方法允许转发TCP连接;然而,SOCKS代理还可以转发UDP流量(仅SOCKS5),而HTTP代理不能。HTTP代理通常更了解HTTP协议,执行更高层次的过滤(虽然通常只用于GET和POST方法,而不用于CONNECT方法)。
版本分支
[编辑]SOCKS 4
[编辑]下面是客户端向SOCKS 4代理服务器,发送的连接请求包的格式(以字节为单位):
VN | CD | DSTPORT | DSTIP | USERID |
---|---|---|---|---|
1 | 1 | 2 | 4 | 可变长度 |
- VN是SOCK版本,应该是4;
- CD是SOCK的命令码,1表示CONNECT请求,2表示BIND请求;
- DSTPORT表示目的主机的端口;
- DSTIP指目的主机的IP地址;
- USERID表示用户标识ID,结尾值为0(NULL);
代理服务器而后发送回应包(以字节为单位):
VN | CD | DSTPORT | DSTIP |
---|---|---|---|
1 | 1 | 2 | 4 |
- VN是回应码的版本,应该是0;
- CD是代理服务器答复,有几种可能:
- 90,请求得到允许;
- 91,请求被拒绝或失败;
- 92,由于SOCKS服务器无法连接到客户端的identd(一个验证身份的进程),请求被拒绝;
- 93,由于客户端程序与identd报告的用户身份不同,连接被拒绝。
- DSTPORT与DSTIP与请求包中的内容相同,但被忽略。
如果请求被拒绝,SOCKS服务器马上与客户端断开连接;如果请求被允许,代理服务器就充当客户端与目的主机之间进行双向传递,对客户端而言,就如同直接在与目的主机相连。
SOCKS4a
[编辑]SOCKS 4A是SOCKS 4协议的简单扩展,允许客户端对无法解析域名的目的主机进行访问。
客户端对DSTIP的头三个字节设定为NULL,最后一个字节为非零;对应的IP地址就是0.0.0.x,其中x是非零,这当然不可能是目的主机的地址,这样即使客户端可以解析域名,对此也不会发生冲突。USERID以紧跟的1字节的0(NULL)作结尾,客户端必须发送目的主机的域名,并以另一个1字节的0(NULL)作结尾。CONNECT和BIND请求的时候,都要按照这种格式(以字节为单位):
VN | CD | DSTPORT | DSTIP 0.0.0.x | USERID | NULL | HOSTNAME | NULL |
---|---|---|---|---|---|---|---|
1 | 1 | 2 | 4 | 可变长度 | 1 | 可变长度 | 1 |
使用4a协议的服务器必须检查请求包里的DSTIP字段,如果表示地址0.0.0.x,x是非零结尾,那么服务器就得读取客户端所发包中的域名字段,然后服务器就得解析这个域名,可以的话,对目的主机进行连接。
SOCKS5
[编辑]SOCKS5比SOCKS4a多了验证、IPv6、UDP支持。建立与SOCKS5服务器的TCP连接后客户端需要先发送请求来确认协议版本及认证方式,格式为(以字节为单位):
VER | NMETHODS | METHODS |
---|---|---|
1 | 1 | 1-255 |
- VER是SOCKS版本,这里应该是0x05;
- NMETHODS是METHODS部分的长度;
- METHODS是客户端支持的认证方式列表,每个方法占1字节。当前的定义是:
服务器从客户端提供的方法中选择一个并通过以下消息通知客户端(以字节为单位):
VER | METHOD |
---|---|
1 | 1 |
- VER是SOCKS版本,这里应该是0x05;
- METHOD是服务端选中的方法。如果返回0xFF表示没有一个认证方法被选中,客户端需要关闭连接。
之后客户端和服务端根据选定的认证方式执行对应的认证。
认证结束后客户端就可以发送请求信息。如果认证方法有特殊封装要求,请求必须按照方法所定义的方式进行封装。
SOCKS5请求格式(以字节为单位):
VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT |
---|---|---|---|---|---|
1 | 1 | 0x00 | 1 | 动态 | 2 |
- VER是SOCKS版本,这里应该是0x05;
- CMD是SOCK的命令码:
- 0x01表示CONNECT请求
- 0x02表示BIND请求
- 0x03表示UDP转发
- RSV为保留字段,值为0x00;
- ATYP为DST.ADDR类型:
- 0x01 IPv4地址,DST.ADDR部分4字节长度
- 0x03 域名,DST.ADDR部分的第一个字节为域名长度,DST.ADDR剩余的内容为域名,没有\0结尾。
- 0x04 IPv6地址,16个字节长度。
- DST.ADDR为目的地址;
- DST.PORT为网络字节序表示的目的端口。
服务器按以下格式回应客户端的请求(以字节为单位):
VER | REP | RSV | ATYP | BND.ADDR | BND.PORT |
---|---|---|---|---|---|
1 | 1 | 0x00 | 1 | 动态 | 2 |
- VER是SOCKS版本,这里应该是0x05;
- REP为应答字段:
- 0x00表示成功;
- 0x01为普通的SOCKS服务器连接失败
- 0x02为现有规则不允许连接
- 0x03为网络不可达
- 0x04为主机不可达
- 0x05为连接被拒
- 0x06为TTL超时
- 0x07为不支持的命令
- 0x08为不支持的地址类型
- 0x09 - 0xFF未定义
- RSV为保留字段,值为0x00;
- ATYP为BND.ADDR类型:
- 0x01 IPv4地址,DST.ADDR部分4字节长度
- 0x03域名,DST.ADDR部分第一个字节为域名长度,DST.ADDR剩余的内容为域名,没有\0结尾。
- 0x04 IPv6地址,16个字节长度。
- BND.ADDR为服务器绑定的地址
- BND.PORT为网络字节序表示的服务器绑定的端口
SOCKS5 用户名密码认证方式
[编辑]在客户端、服务端协商使用用户名密码认证后,客户端发出用户名密码,格式为(以字节为单位):
鉴定协议版本 | 用户名长度 | 用户名 | 密码长度 | 密码 |
---|---|---|---|---|
1 | 1 | 动态 | 1 | 动态 |
鉴定协议版本目前为 0x01 。
服务器鉴定后发出如下回应:
鉴定协议版本 | 鉴定状态 |
---|---|
1 | 1 |
其中鉴定状态 0x00 表示成功,0x01 表示失败。
SOCKS服务器
[编辑]部分SOCKS服务器软件:
- Dante Socks Server,http://www.inet.no/dante (页面存档备份,存于互联网档案馆)
- Java Socks Server,http://jsocks.sourceforge.net (页面存档备份,存于互联网档案馆)
- Socks4 Server,https://archive.today/20130502024508/ http://www.alhem.net/project/socks4 Archive.is的存档,存档日期2013-05-02
- SS5 Socks Server,http://ss5.sourceforge.net (页面存档备份,存于互联网档案馆)
- TcpToute2,https://github.com/GameXG/TcpRoute2 (页面存档备份,存于互联网档案馆)
- CCProxy,https://www.youngzsoft.net/ccproxy/ (页面存档备份,存于互联网档案馆)
SOCKS客户端
[编辑]一般情况下应用程序会内嵌对SOCKS协议的支持。但socksify,proxifier软件可强制使不支持SOCKS的应用通过代理联网。
客户端 | 许可证 | 版本 | 发布日期 | 平台 | 支持协议 |
Dante client(页面存档备份,存于互联网档案馆) | BSD/CMU | 1.1.18 | 09/2005 | Linux | v4, v5 |
FreeCap(页面存档备份,存于互联网档案馆) | GPL | 3.18 | 02/2005 | Windows | - |
Hummingbird socks(页面存档备份,存于互联网档案馆) | - | - | - | Windows | - |
ProxyCap(页面存档备份,存于互联网档案馆) | - | 2.03 | - | Windows | - |
SocksCap | Non-Comercial home use | - | - | - | v5 |
Super Socks5Cap(页面存档备份,存于互联网档案馆) | - | 1.5.3 | - | Windows | - |
tsocks(页面存档备份,存于互联网档案馆) | GPL | 1.8 | 10/2002 | - | - |
nylon | - | - | 06/2003 | OpenBSD | - |
Win2Socks(页面存档备份,存于互联网档案馆) | - | 2.7.0 | 06/2022 | Windows | v5 |
proxifier(页面存档备份,存于互联网档案馆) | - | 3.4.2 | 08/2019 | Windows,Mac | v4,v5 |
SocksCap | - | - | - | Windows | v4,v5 |
tun2socks(页面存档备份,存于互联网档案馆) | BSD-Clause | 1.0.0.2 | 09/2021 | Windows | v5 |
注释
[编辑]参考文献
[编辑]参见
[编辑]外部链接
[编辑]- RFC 3089 - A SOCKS-based IPv6/IPv4 Gateway Mechanism
- RFC 1961 - GSS-API Authentication Method for SOCKS Version 5
- RFC 1929 - Username/Password Authentication for SOCKS V5
- RFC 1928 - SOCKS Protocol Version 5
- Ying-Da Lee,SOCKS 4A: A Simple Extension to SOCKS 4 Protocol(SOCKS 4A:SOCKS 4协议的一个简单扩展)
- Michel Arboi,Vulnerability - Too long hostname kills the SOCKS4A server(页面存档备份,存于互联网档案馆)(易受攻击性:域名过长导致SOCKS4A服务器死机)
- SOCKS: A protocol for TCP proxy across firewalls, SOCKS Protocol Version 4 (NEC)(页面存档备份,存于互联网档案馆) SOCKS:一个用于穿越防火墙的TCP代理协议,SOCKS协议版本4(NEC)