第六章 代理安全Socks
代理的定义
代理服务器是用户接入互联网的重要手段之一,使用代理服务器接入
方式,通信双方的数据流都由代理服务器转发。
代理服务器:
应用层代理:位于TCP/IP协议栈的应用层,例如HTTP代理和FTP代理。
- 通常具备缓存功能,当它发现客户端所请求的资源已经被缓存时,将直接返回这些资源,由此提高通信效率并减轻应用服务器的负担;
- 经过代理服务器转发的报文首部将服务器本身的IP地址作为请求的源地址,可以用于突破基于IP地址的访问限制;
- 应用层网关使用的是应用层待机技术,它是目前常用的一种防火墙技术,能够检查进出的数据包,通过网关复制传递数据,防止在受信器户与不受信的服务器与主机间直接建立联系。
互联网连接共享(Internet Connection Sharing,ICS):位于IP层,实现多个私用IP地址共享同一公共地址。
- 对家庭网络或小型网络所提供的一种连接共享服务。
- 这种代理依托网络地址转换(Network Address Translation,NAT)技术,可以实现多个私有地址共享同一公共地址。
Socks代理(防火墙安全会话转换协议)
- 使用端口1080,工作于应用层。
- 可转发所有高层应用,对操作系统无限制。
- 专门设计用于防火墙,在应用层和传输层之间垫了一层,为在 TCP和UDP域中的客户机/服务器应用程序能更方便安全地使用网络防火墙所提供的服务。
Socks框架
Socks使用C/S模型
Socks软件包组成:
- Socks库:安装于客户端。
- Sockd守护程序:安装于服务器,接收并处理来自客户端的CONNECT和BIND请求。
Socks4和Socks5
Socks4定义CONNECT请求消息、BIND请求消息以及状态应答消息
CONNECT
- 在收到这个请求后,Socks4服务器会根据源IP地址、源端口、目标IP地址、目标端口号及USERID信息确定是否与远程主机建立连接。
- 若同意建立该连接,则向目标发出连接请求。
- 无论结果如何,Socks服务器都会返回状态应答消息,其中VN应取值“0”;CD字段则包含了结果状态码;“目标端口"和“目标IP”这两个字段被忽略。
- Socks4支持基于身份协议(RFC1413)的客户端认证方法,即Ident。该协议使用113号TCP端口,守护程序实现通常命名
identd。- 服务器收到这个回应后,会将其与CONNECT请求中包含的用户ID进行比较。若比较相同,则身份验证通过;否则验证失败。
BIND
- 服务器收到请求后会返回状态应答消息。
- 当目标IP取0时,表示的就是socks服务器自身的地址。
- 客户端在收到这个应答后,应将这两个信息通过主连接通告给远程主机。
- 当服务器收到远程主机的连接请求时,会匹配请求报文的源IP地址与BIND请求中包含的目标IP字段。
- 若二者不同,服务器向客户端返回状态码为91的应答,并断开与远程主机的连接;
- 否则返回状态码为90的应答,并准备进行随后的数据转发过程。
Socks 5沿袭了Socks 4的体系结构以及命令,并作了以下扩展
- 扩展了客户端身份认证功能,支持多种身份验证方法:用户名/口令认证方法、GSSAPI认证。
- 扩展了寻址方法:除了IPv4地址外,还支持域名及IPv6地址
- 增加了对UDP的支持
通用安全服务应用程序接口GSSAPI
- 安全应用开发者经常使用的编程接口
- GSSAPI本身不提供任何安全保护,它的目的是为有安全需求的应用开发者屏蔽不同底层安全机制的差异,由此提供一套统一的编程接口
GSSAPI涉及三个关键概念
- 信任状:客户端和服务器之间建立安全上下文的先决条件;
- 安全上下文:客户端和服务器通过协商所建立的安全通道,建立了安全上下文就意味着双方已经认证了对方的身份,并且生成了用户保护通信所需的安全参数;
- 令牌:包含安全参数
- 安全上下文令牌:用于安全上下文的建立和维护
- 单条消息令牌:用于保护每条应用消息
Socks应用
基于Socks的IPv4/IPv6网关
- 如果通信双方都具备IPv4和IPv6协议栈的网络,假设发起方连接IPv4网络,回应方连接IPv6,中间是Socks网关:
- 发起方构造IPv6报文,并在报文前添加IPv4首部,该报文首部的目标地址设置为Socks网关地址。
- Socks网关剥掉IPv4首部,把IPv6报文发送给回应方。
- 如果通信双方只有一个协议栈,且分别是IPv4和IPv6,可使用基于Socks 5的IPv4/IPv6网关实现互通。因为Sock5支持基于域名的寻址方式,可以屏蔽两类地址的差异。
小结
Socks是目前较为常用的一种代理技术,使用C/S模型
- 客户端的Socks库代替了Socket库
- 服务器的Sockd实现代理转发功能
Socks4仅能转发TCP连接,包括CONNECT和BIND两个命令
- CONNECT用于客户端发起到远程主机的连接;
- BIND是在已经利用CONNECT建立主连接的基础上,客户端接收来自远程主机的连接请求。
Socks5对Socks4进行了三种扩展,包括:
- 用户身份认证
- 基于IPv6及域名的寻址机制
- 转发UDP会话
Socks5支持用户名/口令及GSSAPI认证方法
GSSAPI是一套安全编程接口,它提供双向身份认证功能以及数据机密性和完整性保护
- Socks5GSSAPI包括建立安全上下文、子协商以及数据保护等步骤
- 子协商是对GSSAPI的扩充,用于进一步协商对单条消息的保护方式