SOCKS是一种网络传输协议,主要用于客户端和外部服务器之间通信的中间传输。袜子是“袜子”的缩写。
当防火墙后的客户端想要访问外部服务器时,它会与SOCKS代理服务器连接。该代理服务器控制客户端对外部网络的访问,如果允许,将客户端的请求发送到外部服务器。
该协议最初由大卫科布拉斯开发,然后由NEC的李英达扩展到第4版。最新的协议是版本5。与以前的版本相比,它支持UDP、身份验证和IPv6。
根据OSI模型,SOCKS是会话层协议,位于表示层和传输层之间。
与HTTP代理的对比
SOCKS工作在比HTTP代理更低的级别:SOCKS使用握手协议通知代理软件其客户端正在尝试建立的连接SOCKS,然后尽可能透明地操作,而常规代理可能会解释和重写报头(例如,使用另一个底层协议,如FTP;但是,HTTP代理只将HTTP请求转发到所需的HTTP服务器)。虽然HTTP代理有不同的使用模式,但是CONNECT方法允许转发TCP连接;但是,SOCKS代理也可以转发UDP流量和反向代理,而HTTP代理则不能。HTTP代理通常更了解HTTP协议并执行更高级别的过滤(尽管它通常只用于GET和POST方法,而不用于CONNECT方法)。
袜子
比尔想通过互联网和简交流,但是他们的网络之间有防火墙,所以比尔不能直接和简交流。因此,比尔在他的网络上连接到SOCKS代理,并告诉它他想与简建立连接。SOCKS代理通过防火墙打开一个连接,并促进比尔和简之间的通信。
有关SOCKS协议技术细节的更多信息,请参考以下部分。
超文本传送协议
比尔想从简的网络服务器上下载一个网页。比尔不能直接连接到简的服务器,因为他的网络上设置了防火墙。为了与服务器通信,比尔连接到他的网络的HTTP代理。他的网络浏览器与代理通信的方式与他直接连接到简的服务器的方式相同。也就是说,网络浏览器将发送一个标准的HTTP请求头。HTTP代理连接到简的服务器,然后将简的服务器返回的任何数据返回给比尔。
版本分支
SOCKS 4
以下是客户端发送到SOCKS 4代理服务器的连接请求数据包的格式(以字节为单位):
VNCDDSTPORTDSTIPUSERIDNULL
1 1 2 4变量1
是SOCK版本,应该是4;是CD SOCK的命令代码,1表示CONNECT请求,2表示BIND请求;DSTPORT表示目的主机的端口;DSTIP指目的主机的IP地址;空值为0;然后,代理服务器发送响应数据包(以字节为单位):
VNCDDSTPORTDSTIP
1 1 2 4
VN是响应代码的版本,应该是0;这是光盘代理服务器的回复。有几种可能:90、请求被允许;91.请求被拒绝或失败;92.请求被拒绝,因为SOCKS服务器无法连接到客户端的identd(身份验证过程);93,因为客户端程序与identd报告的用户身份不同,连接被拒绝。DSTPORT和DSTIP与请求数据包中的相同,但它们被忽略。如果请求被拒绝,SOCKS服务器会立即与客户端断开连接;如果请求被允许,代理服务器充当客户端和目的主机之间的双向传输,对于客户端来说,它就像直接与目的主机连接一样。
SOCKS4a
SOCKS 4A是SOCKS 4协议的简单扩展,允许客户端定义自身无法解析的目的主机。
客户端将DSTIP的前三个字节设置为NULL,最后一个字节为非零;对应的IP地址是0.0.0.x,其中x为非零,当然不能是目的主机的地址,这样即使客户端可以解析域名,也不会有冲突。用户标识以下一个空字节结束,客户端必须发送目标主机的域名,并以另一个空字节结束。CONNECT和BIND请求应该遵循以下格式(以字节为单位):
VN 1
CD 1
DSTPORT 2
DSTIP 0.0.0.x4
USERID变量
空1
HOSTNAME变量
空1
使用4a协议的服务器必须检查请求数据包中的DSTIP字段。如果它指示地址是0.0.0.x,并且x有非零结尾,那么服务器必须读取客户端发送的数据包中的域名字段,然后服务器必须解析这个域名,如果可能的话,连接到目的主机。
SOCKS5
SOCKS5比SOCKS4a有更多的认证、IPv6和UDP支持。与SOCKS5服务器建立TCP连接后,客户端需要先发送协议版本和认证方式的请求,格式为(以字节为单位):
VER方法
1 1 1-255
是SOCKS版本,这里应该是0x05;NMETHODS是METHODS部分的长度;METHODS是客户端支持的身份验证方法列表,每个方法占用1个字节。目前的定义是0x00不需要验证0x01gsapi0x02用户名,密码验证0x03-0x7F由IANA作为私有方分配(保留)0x80-0xFE。
法保留0xFF 无可接受的方法
服务器从客户端提供的方法中选择一个并通过以下消息通知客户端(以字节为单位):
VER METHOD
1 1
VER是SOCKS版本,这里应该是0x05;METHOD是服务端选中的方法。如果返回0xFF表示没有一个认证方法被选中,客户端需要关闭连接。
之后客户端和服务端根据选定的认证方式执行对应的认证。
认证结束后客户端就可以发送请求信息。如果认证方法有特殊封装要求,请求必须按照方法所定义的方式进行封装。
SOCKS5请求格式(以字节为单位):
VERCMD RSV ATYPDST.ADDRDST.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 网络字节序表示的目的端口
服务器按以下格式回应客户端的请求(以字节为单位):
VERREPRSV ATYPBND.ADDR BND.PORT
1 1 0x001 动态 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.is/20130502024508/
http://www.alhem.net/project/socks4
SS5 Socks Server
http://ss5.sourceforge.net
Tcp Toute2
https://github.com/GameXG/TcpRoute2
快三稳赚10大技巧方式进行封装。
SOCKS5请求格式(以字节为单位):
VERCMD RSV ATYPDST.ADDRDST.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 网络字节序表示的目的端口
服务器按以下格式回应客户端的请求(以字节为单位):
VERREPRSV ATYPBND.ADDR BND.PORT
1 1 0x001 动态 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.is/20130502024508/
http://www.alhem.net/project/socks4
SS5 Socks Server
http://ss5.sourceforge.net
Tcp Toute2
https://github.com/GameXG/TcpRoute2