SOCK/HTTP代理协议解析

来源:互联网 发布:mac怎么看bilibili 编辑:程序博客网 时间:2024/06/02 03:59

在互联网环境越来越复杂的今天,很多组织选择使用HTTP Proxy或者SOCKS代理来限制未授权的访问和请求。在使用代理(proxy)的网络的网络环境中,如何使用socket编程建立与internet server的联系不是一件轻而易举的事情,本文将会详细的分析SOCKS和HTTP Proxy代理的通讯规范。

 

SOCKS Proxy:

SOCK Proxy当前最高版本是SOCK5而且扩展支持UTP的数据发送,一个典型的SCOK Proxy代理运行在TCP 1080端口。SOCK Proxy协议最初是来自于一名Unix的系统管理员开发的,在1992年Koblas提交一篇关于SOCK Proxy的论文,从而SOCK Proxy变得公开和流行起来。一个典型的SOCK4的连接请求应该是这样:

             C (Client)--------------->S(Server)

           +----+----+----+----+----+----+----+----+----+----+....+----+

           | VN | CD | DSTPORT |     DSTIP        | USERID       |NULL|

           +----+----+----+----+----+----+----+----+----+----+....+----+

# ofbytes:   1    1     2              4           variable       1

VN表示的是协议版本号,值是0X04

CD表示的是执行的请求动作,值0X01表示连接请求(connection request)

DSTPORT andDSTIP 两个域分别是目标主机的端口和IP地址

USERID表示用户的ID String

NULL表示必须以0x00结束

 

Server端处理客户端请求然后,应答客户端的数据包必须是以下格式回复:

           C (Client) <---------------- S(Server)

         +----+----+----+----+----+----+----+----+

          | VN | CD | DSTPORT |      DSTIP        |

         +----+----+----+----+----+----+----+----+

 # of bytes:1   1      2              4

VN的值是版本返回码必须是0

CD域的值请求的结果码 90表示授权成功;9X表示授权失败

剩下的两个域的值将被忽略

 

默认情况下请求连接的TCP在两分钟之内还没有建立连接,一个timeout错误将被抛出同时TCP连接被关闭。一旦请求获得成功,TCP连接将会建立,客户端可以向SOCK Proxy代理开始发送数据。

 

当前SOCK5 Proxy代理协议对客户端请求分成了两步来做,第一步客户端发送方法信息,格式如下:

          +----+---------+---------+

          | VN | NMETHOD | METHODS |

          +----+---------+---------+

# of bytes:1  |  1     | 1 to 255

 

服务器端回复的信息格式如下:

                          +----+--------+

                          |VER | METHOD |

                          +----+--------+

# of bytes: |1  |  1    |

如果method域的值是0XFF则意味着没有客户端选择的方法可以支持, 0x00则表示不需要授权访问,更多的详细信息参见RFC1928。

 

一旦客户端收到服务器端的选择方法回复。客户端紧接着发送一个链接请求到SOCK5 Proxy Server,格式与SOCK4的请求报文类似,只是目标主机支持域名,同时多了一个保留的字节域。

具体请求报文格式如下:

+----+-----+-------+------+----------+----------+

|VER | CMD|  RSV  | ATYP | DST.ADDR | DST.PORT|

+----+-----+-------+------+----------+----------+

| 1   | 1  | X’00’ |  1    | Variable |     2  |

+----+-----+-------+------+----------+----------+

 

VER是版本号,它的值必须是0X05

CMD链接方法,0X01表示链接请求,0X02表示绑定请求常被用于FTP通讯,0X03表示UDP关联

RSV表示保留字节,值必须为0X00

ATYP表示地址类型,0X01表示IPv4,0X03表示域名,0X04表示IPv6

DST.ADDR表示目标主机IP或者域名

DST.PORT表示目标主机端口号

 

需要注意的是如果使用域名则必须转换为ASCII码字节,所有的数据表示必须是0XFF的格式。

SOCK代理协议是一个运行在OSI第五层会话层的协议,在第四层TCP层之上。

 

HTTP代理(HTTP PROXY)

HTTP代理会自动提取用户数据包的HTTP Request数据并且把Response的数据转发给发送请求的客户端,HTTP Proxy使用的端口通常是8080.如果在组织内部发起一个socket链接到外部的internet,需要做的事情很简单,首先创建scoket链接到HTTP代理服务器

         Socket s = new Socket(proxy-host,host-port)

向http proxy发送一个http get请求如下:

GEThttp://edinkysoft.appspot.com/Article.do HTTP/1.1\r\n + 结束标志 \r\n

具体可以参见RFC2616

 

工具(SmartSniff)refer to http://www.nirsoft.net/utils/smsniff.html一个免费的数据包截获工具,可以用来研究各种代理与客户端之间是如何建立TCP链接,smartsniff捕获以太网数据包和第三层(IP)数据包,要求用户安装WinPcap Capture驱动。

 

原创粉丝点击