网站首页  词典首页

请输入您要查询的论文:

 

标题 面向Windows的CLAT及其接入系统的设计与实现
范文

    王艺凝++赵钦++张晓冬

    

    

    

    摘要:因为IPv4地址池的耗尽,对很多网络来说给终端用户分配地址是一件很困难的事情,所以IPv6开始实际部署与应用。为了实现IPv4与IPv6的过渡,本文提出了一种基于双重翻译方式的IPv4与IPv6的过渡技术。首先捕获本地即将发送的数据包,然后使用数据包转换算法对已经捕获的数据包进行翻译。进而将翻译出的结果即IPv6数据包发送给纯IPv6的网络环境。通过接收数据包的服务器对IPv6数据包的进一步转换,实现与目标IPv4主机的通信。

    关键词:IPv4与IPv6过渡技术;双重翻译技术;Windows平台下开发;数据包捕获与发出

    中图分类号:TP393.0

    文献标识码:A

    DOI:10.3969/j.issn.1003-6970.2015.11.021

    0 引言

    因为IPv4地址池的耗尽,对很多网络来说给终端用户分配地址是一件很困难的事情,所以IPv6开始实际部署应用。由此可以预见IPv6结点会越来越多,但是现在网络中仍然存在数目庞大的IPv4用户,在短期内现行的IPv4网络仍然不可能全部被IPv6网络替代。在现阶段以IPv4为主导的环境下,在未来很长一段时间内,IPv6与IPv4两者将共存。因此,需要有一些技术来保证IPv4与IPv6节点之间的通信,从而实现两者之间的过渡。

    目前用来解决IPv4与IPv6过渡问题的技术主要有三种:双协议栈技术、隧道技术、NAT-PT(地址/协议转换)技术。其中,用来解决来解决IPv6节点与IPv4节点间的互通问题的技术主要是双协议栈技术和隧道技术,而NAT-PT(地址/协议转换)技术则用来解决IPv6节点与IPv4节点间的互访问题。本文讨论通过464Xlat实现IPv4到IPv6的数据包转换正是一种NAT-PT技术。与隧道机制相比,464Xlat双重翻译机制的带宽利用率更高、暴露了更多的内部IPv4地址信息,理论上为网络运营商的流量优化提供了更多的便利。

    该方案是面向用户侧是IPv4网络的环境,通过的网络是纯IPv6网络,实现一种用于由IPv4向IPv6过渡的解决方案,希望可以对IPv4与IPv6过渡的问题有所助益。具体操作是在安装了Windows操作系统的主机上安装Clat客户端程序,该客户端主要工作内容包括两个部分,一是IP层数据包的截获,二是已经截获的数据包的转换和发出,工作示意图如图1所示。

    1 地址翻译技术简介

    IPv4/IPv6翻译技术能够成功实现IPv4网络与IPv6网络之间的互相访问。翻译技术可以分为无状态翻译技术(stateless translation)和有状态翻译技术(stateful translation)两种,有状态地址翻译(stateful translation)通过存储相应的地址和端口状态映射表,来实现IPv4地址复用,在这种方式中,端口状态映射表简称状态表,是基于连接(session)而建立的,因而状态表非常庞大,动态性显著。而无状态地址翻译(stateless translation)中,IPv4地址和端口范围直接被内嵌入IPv6地址中,这样就不需状态表维护地址、端口的对应关系,然而此种无状态的方式中IPv6地址格式受到限制,不能够支持灵活的IPv6地址分配。

    NAT64是一种用于网络地址与协议转换的技术,它是有状态的。NAT64 -般只支持IPv6网络端用户发起连接,并且以访问IPv4端的网络资源为目标。同时,NAT64技术也支持通过手工方式配置静态映射关系,从而实现IPv4端网络主动发起连接访问,访问的目标是IPv6网络侧资源。NAT64主要解决的问题是:在IPv6网络接入环境下,纯IPv6客户端可以访问只支持IPv4的业务。DNS64则主要用于配合NAT64的工作,把DNS查询信息中的A即IPv4记录合成到AAAA即IPv6记录中,然后返回合成的IPv6记录给IPv6用户。

    NAT64解决了NAT-PT中的大部分缺陷,同时配合DNS64的协同工作,而不需要在IPv6客户端或IPv4服务器端做任何修改。

    2 Clat技术简介

    464Xlat不是一对一的完全替换IPv4的功能。464Xlat架构,只支持以客户端一服务器模式工作的IPv4,其中的服务器端有一个全球的IPv4地址,这意味着它不适合IPv4端到端的通信,或者入站连接。464Xlat建立在IPv6传输之上,并且包含的了IPv6节点之间的通信。

    本文讨论的464Xlat架构使用IPv4、IPv6传输标准RFC6145和RFC6146,并且不需要使用DNS64的功能。当一个IPv4的主机只可以发送IPv4的数据包(包括发送给IPv4 DNS服务器的数据包)时,数据包会在客户端Clat被翻译成IPv6的数据包,而在服务端Plat被翻译回来。

    但在一些情况下,464Xlat网络也可以使用DNS64来实现单个有状态翻译,用以替换464Xlat双重转换。464Xlat架构通过使穿过纯IPv6网络的IPv4服务可达,和提供IPv6和IPv4的连接给单栈IPv4或者IPv6服务器或者客户端,以鼓励IPv6传输的发展。

    3 面向Windows的CLAT及其接入系统的设计

    3.1 方案设计

    设置一台安装有单个IPv6物理网卡的用户主机,另一台为有两个物理网卡的主机,这两台主机为方案的主要设备,其中第一台作为具有Clat功能的客户端设备,此设备只有单协议栈(IPv6协议栈),另一台作为具有Plat功能的服务端设备,此设备具有双协议栈。Clat的物理网卡接入IPv6的网络中,Plat和Clat之间以纯IPv6网络互联。同时Plat又可以通过IPv4网络访问IPv4的网络资源。

    Clat系统分为虚拟网卡驱动程序、NDP功能模块两个主要模块。

    其中虚拟网卡驱动程序起到截获和发送来自应用的数据包的的功能。针对主机发送数据包流程而言可以分两种情况考虑:如果主机发出的为IPv4的数据包,NDIS中间层驱动不做任何处理,直接将此数据包交给下层的微端口驱动发送出去;如果主机发送的是IPv6的分组数据包,驱动程序需要对该数据包完成封装操作,然后将封装好的新的数据包交由NDIS微端口驱动程序发送。根据主机接收数据包的处理流程,分为以下两种场景:如果虚拟网卡tap-win32接收的数据包为IPv6 in IPv4形式封装的数据包,驱动程序需要对该数据包进行相应的解封装,然后将解封装后构造的新的IPv6数据包通知上层协议驱动进行接收;如果虚拟网卡驱动收到的是其他的IPv4数据包,NDIS中间层驱动不做处理直接交付协议驱动。对虚拟网卡的使用是Clat实现其主要功能的基础。

    NDP功能起到通过物理网卡,将虚拟网卡截获的数据包发送的功能。其中包含ARP功能,且运行于Intemet控制报文协议ICMPv6之上。邻居发现报文技术基于组播和单播两种方式。同时,NDP有可达性检测的功能,它的目的是确认相应IP地址代表的主机或路由器是否还能收发报文,保证IP报文不会发送给无效的目的地。

    3.2 技术实现

    3.2.1虚拟网卡驱动程序注册并初始化

    DriverEntry()函数为本模块驱动程序的入口函数,中间层驱动程序的初始化工作就是在该入口函数中完成。该函数中声明了如下两个变量:

    NDIS—PROTOCOL—CHARACTERISTICS PChars:

    NDIS—MINIPORT—CHARACTERISTICSMChars:

    这两个类型均是由NDIS定义,其中PChars是中间层驱动中协议驱动的相关描述结构体,包含了协议驱动的版本与一些回调函数,如SendCompleteHandler, ReceiveHandler, ReceivePacketHandler, BindAdapterHandler等。MChars是微端口驱动的相关结构体,包含了微端口版本与一些NDIS的回调函数入口,如SendHandler, SendPacketsHandler, InitializeHandler等。

    3.2.2 应用程序与驱动程序接口

    中间层驱动处于底层,用户无法直接为其配置参数,为了使得驱动程序获得正确参数以保证工作的正确性,需要驱动程序为应用程序设计好相应的交互接口。结合应用需求,课题中需要配置给驱动程序的数据与宏定义对应关系如表4-1:

    结合实际使用需求,我们实现以下功能。1)封装与解封装操作流程;2)通知驱动本机IPv4地址;3)通知驱动Plat的IPv4地址;4)通知驱动IPv4网关的MAC地址。

    3 .2.3 接收数据包的处理

    tap-win32收到数据包时,调用NdisMIndicateReceivePacket()通知NDIS框架,现在有新的数据包到达。此时,数据包会被转发给所有绑定到这个网卡的中间层驱动。中间层驱动得到数据包的包描述符后将包描述符指向的内容拷贝至新开辟的内存缓冲区中。

    获得数据包中的数据部分后,我们分析此包是否为IPv6 iIl IPv4的封装数据包,如果为否定,就将数据包原封不动的直接传给上层协议驱动程序而不需要做改动;如果是肯定,需要完成数据包的解封装操作流程。

    开辟一块新的数据缓冲区,其长度为原数据包长度减20。将原数据包的以太网数据帧的头部拷贝至新的数据缓冲,修改数据帧头中标示包含数据类型的字段,原值为IPv4的值,将其修改为IPv6的值。跃过IPv4的包头,将IPv6数据包所含数据全部拷贝至新缓冲当中,此时,数据包的解封装T作完成,新的缓冲区中数据即解封装后的数据。通过调用NdisAllocateBuffer和NdisChainBufferAtFront两个函数,新的缓冲区可以组成NDIS不同驱动层次间传送数据的封装格式,然后调用NdisMIndicateReceivePacket通知上层协议层驱动。

    3.2.4 发送数据包的处理

    协议层驱动有数据包要向下层发送时,调用NdisSend/NdisSendPackets请求NDIS发送数据包,NDIS将调用中间层初始化时注册的函数MiniportSend/MiniportSendPackets,中间层的MiniportSend/MiniportSendPackets就会对数据包进行相应的处理。此处在中间层向NDIS注册时可以只注册MiniportSendPackets函数。当中间层驱动收到要发送的数据包时,同接受包一样,通过循环调用NdisQueryBuffer与NdisGetNextBuffer获得数据包中的内容。检查发送的数据包是否为IPv6数据包,如果不是则将原始数据包通过调用NdisSend发往下层小端口驱动,如果是的话则需要做封装处理。

    创建新的数据缓冲区,将原始包的以太网帧头拷贝至新的数据缓冲区,修改以太帧中的下一个协议标记为IPv4。紧跟其后将IPv4包头复制到新的数据缓冲区,IPv4包头的源地址是主机的IPv4地址,IPv4包头的目的地址为Plat的IPv4地址,IPv4包头的下一个协议值为41(IPv6数据包),最后计算IPv4包头的校验和。将新的缓冲区通过调用NdisAllocateBuffer和NdisChainBufferAtFront两个函数组成NDIS不同驱动层次间传送数据的封装格式,然后调用NdisSend通知下层小端口驱动发送封装好的数据包。发包过程中有两点需要特殊处理。第一个问题是MTU值的问题。由于Clat是一种翻译技术,所以会将原始的数据包加长,有可能导致超过以太网能承受的最大值l 500。对于这个情况,参考Windows平台的isitap隧道的实现,当隧道工作时将网卡的MTU设置为1280。1280是IPv6协议中规定的最小的MTU值。当隧道停止工作时需要将此MTU修改回原来的值以提高网络的有效载荷。

    3.2.5 IPv6协议的邻居发现过程

    依据RFC 5969文档,在Clat技术规范当中,从IPv6协议角度出发,IPv4协议被视为是处在下层的数据链路层。所以IPv6协议在与对端通信前会先查询对端或者下一跳的MAC地址,这样才可以将三层的数据包交由二层封装成帧发送,否则二层不知道目的地址数据包无法发送。由于NDIS开放框架处于网络协议的下层,同时网络协议不允许被修改,也就是不允许修改Windows系统的IPv6协议,使得IPv6协议把IPv4协议视为数据链路层协议。

    于是本课题所论述的主要问题如下:当主机完成IPv6配置,上层应用开始发送IPv6数据包时,主机为了获取对端MAC地址,按照IPv6协议的规定,通过发送ICMPv6邻居发现(Neighbor Discovery)数据包来请求下一跳网关的MAC地址。

    参考Linux对双重翻译技术的实现,系统中位于IPv6协议下层的应该是IPv4协议,而非以太网链路层协议。针对于此,本课题采用如下的方式解决该类问题。

    首先通过本课题的应用层程序获得主机网关的MAC地址,然后将此MAC地址通过IOControl函数通知给中间层驱动程序。此后,如果中间层驱动程序再收到由IPv6协议发出的ICMPv6的ND请求时,则使用此MAC地址伪造NA数据包作为应答。本课题采用这个方法的原因是因为不论ICMPv6 ND请求的IPv6地址是哪一台主机的地址,对于这个隧道而言,实际传输的IPv6数据包必定是先通过IPv6网络的网关送达至本机Clat程序后才可以传输至主机的IPv4虚拟网卡。如果这里使用网关的MAC地址,对于数据包封装而言,至于要在以太网帧头和IPv6包头之间插入IPv4包头即可,而不需要再修改以太网帧中的目的地址。

    4 结果与分析

    为与Linux系统下双重翻译技术Clat的实现进行对比和一致性测试研究,本文在测试时搭建了以下测试环境。Windows主机运行本文所述的Clat终端,在Ubuntu主机上运行着Linux的Clat终端。在该测试环境中Windows主机与Ubuntu主机均运行在IPv6网络环境中。

    Clat对应的的Plat是一台Ubuntu系统的Server。同时,在目标IPv4环境中配置了一台单IPv4协议栈的Windows主机。

    论文中使用的主要测试方法是在Router A上各个端口捕捉数据包,从而查看目标数据包的包结构。本文测试Windows主机ping Win7 host,Windows主机ping Ubuntu主机。

    第一步测试中,可以通过观察eth0接口可以看到数据包的源地址为2001: db8: aaaa::192.168.1.2,目的地址是2001: db8: 1234::198.51.100.1地址的IPv6数据包封装着源地址是192.168.1.2,目的地址是198.51.100.1的ICMP ECHO request数据包。同时Windows主机也收到了ICMP ECHO response数据包,说明可以ping通。

    第二个测试中在RouterA主机的ethl口抓包观察,可以看到源地址是2001: db8: aaaa:: 192.168.1.2,目的地址是2001: db8: cafe:: 7.7.7.3地址的IPv6数据包封装着源地址是192.168.1.2、目的地址7.7.7.3的ICMP ECHO request数据包。同时Windows也收到了ICMP ECHO response数据包,主机显示可以ping通。

    5 结束语

    本文使用微软提供的网络驱动接口规范(NDIS)的框架为基础,设计并实现了Windows系统之上的,以双重翻译技术为设计关键点的Clat终端。该系统基于NDIS中间层驱动程序,采用的是对数据包进行封装与解封装的方式。本文中系统可以对通过中间层的数据包进行透明的IPv4数据包封装与IPv4 in IPv6解封装,使用户不需要了解底层程序的运行机制,对Windows用户而言真正拥有了通过纯IPv6网络,对另一端IPv4网络的接入能力。

随便看

 

科学优质学术资源、百科知识分享平台,免费提供知识科普、生活经验分享、中外学术论文、各类范文、学术文献、教学资料、学术期刊、会议、报纸、杂志、工具书等各类资源检索、在线阅读和软件app下载服务。

 

Copyright © 2004-2023 puapp.net All Rights Reserved
更新时间:2025/3/21 20:36:21