第六章代理安全Socks杨礼珍作业思考题2、4补充题:如果通信双方都具备IPv4和IPv6协议栈的网络,假设发起方连接IPv6网络,回应方连接IPv4,中间是Socks网关,请写出回应方向发起方发送的报文的发送过程。6.1代理代理服务器是用户接入互联网的重要手段之一,使用代理服务器接入方式,通信双方的数据流都由代理服务器转发。代理服务器分为以下三类应用层代理:工作于TCP/IP协议栈的应用层,如:HTTP代理和FTP代理。互联网连接共享ICS:工作于IP层,可以实现多个私用IP地址共享同一公共地址。Socks(防火墙安全会话转换协议)代理Socks使用端口1080,工作于应用层。可转发所有高层应用,对操作系统无限制。专门设计用于防火墙在应用层和传输层之间垫了一层Socks库和sockd守护程序不支持ICMP转发socks应用传输层网络层链路层clientSocksserverpolicyserver6.1代理Socks的优点:任何主机都可作为Socks代理服务器。Socks本身未定义机密性、完整性保护方法,但由于所有通信量都要经过代理服务器转发,为统一制定安全策略并部署安全防护措施提供了便利。Socks5支持多种客户端身份认证方案,如果某些认证方案能够支持机密性和完整性保护,这些功能在应用Socks后仍然能够得到保留。6.2Socks框架Socks使用C/S模型。Socks软件包组成:Socks库:安装于客户端。为Socket库的替代品,所有使用Socks的程序都必须将Socket库函数调用更改为Socks库函数调用。Socks库和Socket库的对应关系参考下页的表格。Sockd守护程序:安装于服务器,接收并处理来自客户端的CONNECT和BIND请求。Socks函数功能Socket函数Rconnect与服务器建立连接ConnectRbind将套接字与IP地址和端口绑定BindRlisten在套接字上监听连接ListenRgetsockname获取套接字详细信息GetsocknameRaccept接受连接请求AcceptSocks库函数和Socket库函数对应表6.2Socks框架Socks客户端命令:CONNECT:通告代理服务器与远程主机建立连接,调用函数:RconnectBIND:通告服务器接收来自某个远程主机的连接请求,调用函数:Rbind,Rlisten和Raccept.6.2.1CONNECT命令处理过程不使用Socks时客户端和远程主机的连接建立过程:1.客户端调用Socket的Connect函数2.后台与远程主机完成TCP的三次握手过程:–如果连接成功,Connect函数返回TRUE–如果连接失败,Connect函数返回FALSE3.如连接成功,则客户端调用Write和Read函数发送和接受数据6.2.1CONNECT命令处理过程使用Socks时客户端和远程主机建立连接过程1.客户端调用Rconnet函数,指明了远程主机的IP地址和端口。1.与Socks服务器的1080号端口建立连接。2.发送CONNECT请求消息2.服务器的Sockd验证客户端的身份,如验证通过后使用Connect与远程主机建立连接。3.服务器Sockd向客户端返回连接状态4.若连接成功,服务器作为数据的中转站。CONNECT命令处理过程Rconnect请求验证客户端身份Connect请求建立连接连接建立状态Write(发送数据)Write(发送数据)Read(接收数据)Write(发送数据)Read(接收数据)Write(发送数据)Read(接收数据)Read(接收数据)Socks客户端远程主机Sockd...1080端口6.2.2BIND命令处理过程不使用Socks代理时,客户端接收来自远程主机的连接请求的过程:1.创建套接字2.调用Bind函数,将套接字与本地端口号绑定3.调用Listen函数,监听连接请求4.调用Accept函数,接受连接请求,并启动新进程(或线程)处理连接请求5.调用Write和Read函数发送和接收数据6.2.2BIND命令处理过程使用Socks代理时,客户端通告代理服务器接收远程主机的连接请求过程:1.利用CONNECT命令建立了到远程主机的“主连接”2.Socks客户端调用Rbind函数向代理服务器发送请求:1.通过三次握手与代理服务器建立连接2.向代理服务器发送BIND请求消息,其中包含了远程主机IP地址3.代理服务器验证客户端身份,若验证通过1.代理服务器在本地创建套接字,绑定一个IP地址和端口,用以接收远程主机的连接请求,把IP地址和端口的绑定信息返回给客户端,并在该套接字上监听远程主机的连接请求。2.客户端通过主连接向远程主机通告代理服务器绑定的IP地址和端口,然后调用RListen在本地监听连接请求。3.远程主机向客户端通告的IP地址和端口号发出连接请求。4.代理服务器将远程主机发来的信息中的源地址与客户端BIND请求中包含的地址进行比较,如果一致,则接受请求并通告客户端;否则拒绝连接,并向客户端返回错误应答。5.客户端收到代理服务器转发的连接请求后,调用Raccept接受连接,开始数据投递过程。Rbind请求验证客户端身份绑定用于监听远程主机连接请求的本地端口本地端口绑定信息通过主连接向远程主机通告服务器绑定的IP地址和端口调用Listen在本地端口监听Connect建立到代理服务器的连接验证远程主机身份使用Raccept接受连接使用Raccept接受连接Socks客户端远程主机Sockd调用RListen在本地监听连接请求远程主机地址和端口BIND命令处理过程6.4Socks5Socks5沿袭了Socks4的体系结构以及命令,并作了以下扩展扩展了客户端身份认证功能,支持多种身份验证方法:用户名/口令认证方法、GSSAPI认证。扩展了寻址方法:除了IPv4地址外,还支持域名及IPv6地址增加了对UDP的支持6.4.1.1身份认证方法协商过程1)Client-Server:版本、认证方法数、认证方法列表,消息格式如下+-----+---------------+---------------+|VER|NMETHODS|METHODS|+-----+---------------+---------------+|1|1|1to255|所占字节数+-----+---------------+---------------+2)Server-Client:版本,选定的认证方法,消息格式如下+-----+------------+|VER|METHOD|+-----+------------+|1|1|+-----+------------+Method取值:X’00:不需要认证X’01:GSSAPI认证X’02:用户名/口令认证方法X’FF:没有可接受的认证方法6.4.1.2用户名/口令认证方法如果客户端和服务器协定使用用户名/口令认证方法后,1.客户端向服务器发送认证请求报文,报文中包括了用户名和口令。2.服务器验证用户名和口令,并根据验证结果返回应答消息。6.4.2请求/应答过程及寻址方法扩展客户发出的请求消息格式,或见p.187图6.4+-----+-------+----------+-------+---------------+--------------------------+|VER|CMD|RSV|ATYP|DST.ADDR|DST.PORT|+-----+-------+----------+--------+--------------+--------------------------+|1|1|X‘00’|1|Variable|2|所占字节+-----+-------+----------+--------+---------------+-------------------------+CMD:请求消息类型,取值如下X’01:connectionX’02:bindX’03:UDPassociateATYP:地址类型,取值如下X’01:IPv4X’03:DomainnameX’04:IPv6服务器的应答+-----+-------+-------+--------+-----------------+--------------------------+|VER|REP|RSV|ATYP|BND.ADDR|BND.PORT|+-----+-------+-------+--------+-----------------+--------------------------+|1|1|X‘00’|1|Variable|2|所占字节+-----+-------+-------+--------+-----------------+--------------------------+REP:应答状态码,也可见p.187表6.300:succeed01:generalSOCKSserverfailure02:connectionnotallowedbyruleset03:networkunreachable04:hostunreachable05:connectionrefused06:TTLexpired07:Commandnotsupported08:addresstypenotsupported09-FF:notassignedBND.ADDR&BND.PORT:Specifytheaddrandportofthesocksserverwhichwillacceptaninboundconnection6.4.3UDP支持使用Socks5转发UDP会话方法:1.请求命令为“UDPassociate”(设置为字段3),“目标地址”和“目标端口”设置为客户端发送及接收UDP报文所使用的地址和端口号。2.服务器返回的应答消息中将“绑定地址”和“绑定端口”设置为用于转发UDP会话的地址和端口号。6.4.3UDP支持3.在UDP数据报报头及应用数据之间增加一个UDP请求首部,格式如下:UDPpacket+-----+--------+-------+--------------+-------------+-----------+|RSV|FRAG|ATYP|DST.ADDR|DST.PORT|DATA|+-----+--------+-------+--------------+-------------+-----------+|2|1|1|Variable|2|Variable|字节数+-----+--------+-------+--------------+-------------+-----------+FRAG:currentfragmentnumber6.6Socks应用Socks客户端应用软件:QQ:内置Socks代理功能NEC开发的SocksCap:Socks客户端免费软件,支持Socks4和Socks5。Hummingbird工作组开发的Hummingbirdsocks.TSOCKS:开源的Socks代理库。…6.6.2基于Socks的IPV4/IPv6网关基于Socks的IPv4和IPv6网络互通:如果通信双方都具备IPv4和IPv6协议栈的网络,假设发起方连接IPv4网络,回应方连接IPv6,中间是Socks网关:1.发起方构造IPv6报文,并在报文前添加IPv4首部,该报文首部的目标地址设置为Socks网关地址。2.Socks网关剥掉IPv4首部,把IPv6报文发送给回应方。IPv6报文IPv4首部目标地址是Socks网关地址目标地址是远程主机地址发起方网关回应方IPv6报文目标地址是远程主机地址IPv4网络IPv6网络6.6.2基于Socks的IPV4/IPv6网关如果通信双方只有一个协议栈,且分别是IPv4和IPv6,可使用基于Socks5的IPv