在互联网环境越来越复杂的今天,很多组织选择使用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驱动。