基于SOCKS的IPv4向IPv6过渡技术

网络技术是从1990年代中期发展起来的新技术 , 它把互联网上分散的资源融为有机整体 , 实现资源的全面共享和有机协作 , 使人们能够透明地使用资源的整体能力并按需获取信息 。资源包括高性能计算机、存储资源、数据资源、信息资源、知识资源、专家资源、大型数据库、网络、传感器等 。当前的互联网只限于信息共享 , 网络则被认为是互联网发展的第三阶段 。一、概述
【基于SOCKS的IPv4向IPv6过渡技术】由于IPv6与IPv4相比具有诸多的优越性 , IPv6代替IPv4已经成为网络发展的必然趋势 。然而现有IPv4网络是如此的庞大 , 以至于短时间之内不可能将它全部废除 。因此 , 需要寻找一种合适的过渡技术来解决这一难题 。由于无状态 IP/互联网控制消息协议翻译算法(SIIT)、网络地址翻译-协议转换器(NAT-PT)和栈内凸块(BIS)等过渡技术都存在着这样那样的缺点 , 隧道技术又不能解决IPv6节点与IPv4节点之间相互通信的问题 , 而在网络中应用代理服务既可以充分利用IP地址资源 , 又能够保证网络安全 , 尤其是全能代理协议SOCKS , 它可以完成网页浏览、文件传输和远程登陆等所有工作的代理 , 是可用的功能最强大、应用最灵活、安全性较高的代理 , 因而基于具有强大功能的 SOCKS代理的IPv4向IPv6过渡技术已经成为一种不错的选择 。基于SOCKS的过渡技术分为两种 。一种是API内凸块(BIA)技术 , 这种技术直接在双栈主机上实现IPv4和IPv6的地址转换;另一种是SOCKS64技术 , 这种技术是通过一个双栈网关来进行IPv4和IPv6的地址转换 。
二、BIA技术
BIA技术在双栈主机的SocketAPI模块与TCP/IP模块之间加入一个 API翻译器(如图1所示) 。API翻译器包含三个模块:域名解析器 , 地址映射器和函数映射器 。其中 , 域名解析器负责对IPv4应用程序的请求域名返回一个正确的应答 , 地址映射器在主机内部维护一张IPv4与IPv6地址对的表格(分配的IPv4地址来自IPv4地址池中 , 采用未使用的IPv4地址 , 如 0.0.0.1~ 0.0.0.255) , 函数映射器负责在IPv4的Socket API函数与IPv6的Socket API函数间相互翻译 。

基于SOCKS的IPv4向IPv6过渡技术

文章插图

图1 采用BIA机制的双栈主机的结构模型
RFC3338中描述了采用BIA机制的双栈主机与IPv6主机之间相互通信的过程 。其中双栈主机DualStack向IPv6主机Host6发起通信的过程如下:·当双栈主机DualStack上的IPv4应用向它的域名服务器(DNS)发送查询目的主机的地址请求时 , 域名解析器拦截了这个请求 , 并产生一个新的查询请求转发给DNS来解析A和AAAA两种记录 。·DNS解析出Host6的AAAA记录后 , 将它返回给域名解析器 。·域名解析器要求地址映射器为IPv6地址分配一个IPv4地址 。·地址映射器在IPv4地址池中选择一个未用的保留地址 , 在映射表中注册后返回给域名解析器 。·域名解析器为分配的IPv4地址产生一条A记录 , 返回给IPv4应用程序 。·IPv4应用程序调用IPv4的SocketAPI函数 , 函数映射器对调用命令进行拦截 , 判断其是否来自于IPv6的应用 。若不是 , 跳过翻译程序;否则 , 函数映射器向地址映射器请求该IPv4地址对应的IPv6地址 , 地址映射器从映射表中查找后将结果返回 。函数映射器使用收到的这个AAAA型地址调用Host6上相应的IPv6socketAPI函数 。·当函数映射器接收到Host6上IPv6socketAPI函数的应答后 , 向地址映射器请求与Host6对应的IPv4地址 。然后 , 函数映射器利用此IPv4地址继续完成socketAPI函数的调用 。由IPv6主机Host6发起到双栈主机DualStack的通信过程相对简单一些 。Host6通过它的DNS解析DualStack的AAAA记录 , 然后向DualStack发送一个IPv6的数据包 。为了通过调用IPv4的API函数和IPv4应用通信 , 函数映射器检测到IPv6数据包到达Dual Stack后 , 向地址映射器发送一个IPv4地址请求 , 并用返回的IPv4地址发起一个IPv4的Socket API调用 。然后 , 函数映射器再向地址映射器请求与该IPv4地址对应的原来的IPv6地址 , 按照这个地址对Host6答复 。 三、SOCKS64技术SOCKS64技术是原有SOCKS协议(IETFRFC1928)的扩展 , 相当于IP层的代理 , 其原理如图2所示 。它增加了两个新的功能部件*SocksLib*和*Gateway* 。*SocksLib*是在客户机一端引入的 , 它位于应用层和Socket层之间 , 可以替代应用程序的Socket API和DNS域名解析API 。在*Socks Lib*中有一个DNS域名解析代表 , 它在源节点(客户机C)全权代表到中继服务器(网关G)的域名解析行为 。*Gateway*是安装在IPv6和 IPv4双栈网关上的一个增强型的SOCKS服务器 , 可以完成客户机C(IPvX)和目的端D之间的任何协议组合类型的中继 。当*Socks Lib*调用中继时 , 由父*Gateway*来产生出一个*Gateway*进程(线程)来负责中继连接 。
图2 采用SOCKS64技术的网络通信原理
在SOCKS5中规定 , IPv4地址、IPv6地址和域名的全限定域名(FQDN)信息可以用在SOCKS协议格式的地址类型(ATYP)域 。SOCKS64技术就是利用这一点 , 通过DNS域名解析代表将FQDN信息用在ATYP域中从客户机C传到网关G来指出目的地D的位置 。
为此 , SOCKS64技术也和BIA技术一样使用了IPv4中未使用的保留地址(称之为伪IP地址) , 并在*SocksLib*(客户机C处)中引入一个映射表来管理伪IP地址和FQDN之间的映射 。
客户机C[IPvX]使用SOCKS64技术通过双栈网关G[IPvX|IPvY]与目的主机D[IPvY]通信的过程如下:
·源节点(客户机C)上的应用尽力通过调用DNS域名解析函数来获得目的节点(目的地D)的IP地址信息 。这时 , 目的地D的逻辑主机名(即FQDN)信息被作为被调用的API的一个参数传递给应用的*SocksLib* 。
·FQDN信息被注册到*SocksLib*中的一个映射表内 。*SocksLib*选择一个伪IP地址回复给应用 。
·应用利用收到的伪IP地址信息组织一个socket , 并将socket用作API的一个参数来调用socketAPI启动通信 。
·由于*SocksLib*已经取代了这些socketAPI , 真正的socket 函数将不再调用 , 而是先检查socket的IP地址信息 。如果该地址是伪IP地址 , 则从映射表中获取与该伪IP地址相匹配的登记过的FQDN信息 。通过使用与调用的socketAPI相匹配的SOCKS命令(例如与conNECt()对应的CONNECT命令) , FQDN信息被传送到中继服务器(网关G)上的*Gateway* 。
·*Gateway*通过接收到的FQDN信息调用真正的DNS域名解析API从一个DNS服务器处获得一个真IP地址 , 并利用真IP地址信息创建一个socket 。*Gateway*再将socket用作API的一个参数来调用socketAPI与目的地D通信 。

    推荐阅读