IVI翻译机制在Netfilter框架中的设计与实现*
2012-10-08王相林沈清姿陈国峰
王相林,朱 晨,沈清姿,陈国峰
(杭州电子科技大学计算机学院 杭州 310018)
1 引言
随着人们对网络应用及其服务性能要求的提高,IPv4(internet protocol version 4)[1]显现出许多难以克服的不足,IPv4向下一代网络协议 IPv6(internet protocol version 6)[2~4]的过渡刻不容缓。由于IPv4向IPv6的过渡得经历一段相当长的时间,所以在短时间内Intranet不可能实现将所有资源转移至IPv6,如何选取一种IPv6过渡策略,实现IPv4向IPv6的平滑过渡成为目前所必须面对的重要问题。2008年12月,李星教授团队提出了“基于无状态地址映射的IPv4与IPv6网络互连技术——IVI”[5~7],IVI翻译机制可以实现纯IPv6节点与纯IPv4节点之间的相互通信,且具有高效的翻译性能。本文的设计思路是基于Netfilter框架以扩展模块形式配合使用Xtables-addons插件,在Linux内核中实现了IVI翻译机制,并对其匹配模块、目标模块两大模块的具体实现进行详细分析,并将其应用于真实网络中进行测试,为Intranet设计实现了一种相对平滑的IPv6过渡方案。
2 IPv4向IPv6过渡技术的研究现状及进展
在IPv4网络向IPv6网络过渡的时期,改变整个网络硬件基础架构显得很困难,而通过软件形式来更新则显得相对容易且更加实际。在这期间产生了多种过渡策略,IVI过渡策略就是其中重要的一种。
2.1 主要的过渡技术
(1)双协议栈技术
双协议栈(dual stack)技术[8]是主机在同一网络接口上同时启用IPv4与IPv6协议栈,并分别配置IPv4地址与IPv6地址,然后通过这两套协议栈来各自访问IPv4网络和IPv6网络。当数据分组属于IPv4网络时,就走IPv4协议栈流程,而当数据分组是IPv6网络时,则通过IPv6协议栈,两种协议同时存在,互不影响[9,10]。
(2)隧道技术
隧道技术[11]是一种利用现有IPv4网络来传递IPv6数据分组的技术[12~14],它通过将IPv6数据分组封装在IPv4数据分组中,配合双栈技术穿越IPv4网络实现IPv6接入;同样,IPv4数据分组也可以封装在IPv6数据分组中,然后穿越IPv6网络完成IPv4接入。
(3)翻译技术
翻译技术不同于双栈技术与隧道技术,其可以实现IPv4与IPv6的直接通信。目前主要的翻译技术包括:SIIT(无状态IP/ICMP翻译技术)、NAT-PT(网络地址翻译与协议翻译技术)和IVI翻译技术。
2.2 IVI翻译机制的研究现状及进展
IVI翻译机制是在对SIIT技术与NAT技术进行改进优化后产生的方案,它是一种无状态地完成N到N映射的NAT机制(这里的N为特定IPv4子网与IPv6子网的规模),主要用于完成IPv4和IPv6之间的相互翻译。
IVI机制的主要思路是在尚未被分配出去的全球IPv4中取出一部分与IPv6地址中特定的一部分 (称为IVI6地址)进行一一映射,在这个范围内的每一个IPv4地址都有一个对应的IPv6地址,使用这部分地址的用户既可以访问IPv4资源又能访问IPv6资源,具有很大的优越性。随着IPv6资源的不断补充与丰富,必将吸引更多的用户放弃原来已占有的IPv4地址而加入到IVI6地址的队伍中去,被释放出的这部分IPv4地址又经过IVI算法映射被吸引到IVI6地址中,随着IVI6地址的不断扩大,当IVI6地址达到全球IPv4的规模时,就完成过渡。
IVI机制的出现源自于我国的CERNET(China education and research network)。起初,这只是一个单纯的想法,主要目的是希望能提供出一种新的网络地址转换算法用来代替已被废弃的NAT-PT(network address translation-protocol translation)技术,这种新的网络地址转换算法必须是无状态的,这可以用于克服网络规模无法扩大的问题,同时还要求必须能完成端到端的透明通信。
IVI的命名来源于罗马字符,是字符4(Ⅳ)和字符6(Ⅵ)的一个结合体。CERNET在定义IVI策略时,制定了一系列其需要遵守的原则,具体如下:
·必须同时支持由IPv6侧或IPv4侧发起的通信;
·必须沿用目前已存在的IPv4以及IPv6的路由系统,无需增加全球路由表的规模;
·必须能满足大规模部署的需求;
·由于IPv4地址非常紧缺,所以它必须有效地使用IPv4地址;
·必须是无状态的,以适应网络的不断升级;
·翻译网关必须与DNS功能相分离。
IVI地址由 40位 LIR(local internet registry,本地互联网注册处)前缀、32位IPv4嵌入地址以及全零3部分构成,IVI地址构成如图1所示。
IVI机制必须置于Linux系统内核中才能得以实现,每一台装载并启用IVI机制的Linux主机即成为一个IVI网关。IVI机制在内核中的系统结构如图2所示。
3 基于Netfilter框架IVI扩展模块的设计与实现
本文的设计思路是通过向Netfilter框架添加IVI扩展模块的形式实现IVI网关,添加方法采用了Xtables-addons插件技术。IVI扩展模块主要包括以下几个部分:IVI匹配模块、IVI目标模块以及这两个模块的头文件等。其中IVI匹配模块细分为IVI用户空间匹配模块(模块文件命名为libxt_ivimt.c)和IVI内核空间匹配模块(模块文件命名为xt_ivimt.c)。IVI目标模块则类似地分为IVI用户空间目标模块 (模块文件命名为libxt_ivitg.c)和IVI内核空间目标模块(模块文件命名为xt_ivitg.c)。其中两个用户空间模块主要作为用户接口实现内核与用户的交互,用于提取用户输入的参数、选项等数据,对其进行检测,然后以合理的形式传给相应的内核空间模块去处理,而两个内核空间模块用于接收来自用户空间模块传入的信息,然后在内核中调用相应的功能函数对数据分组进行匹配与目标处理。IVI扩展模块整体框架如图3所示。
3.1 Netfilter扩展模块机制
新一代Linux内核防火墙Netflter/IPtables的开放框架给了开发者在内核中添加扩展模块的可能性[15~18]。要完成所需添加的扩展模块,首先必须写出一个内核模块然后注册到这个框架中去。同时根据新特性的不同类别,还要写出一个IPtables用户空间模块。通过扩展模块的功能实现,可以对一个特定的数据分组进行匹配、丢弃、追踪或接收,也可以对一系列相关的数据流进行整合。
原先对Netfilter进行模块扩展时最常用的方法是patch-o-matic[19],这种方法是将内核扩展模块以打补丁形式置于内核,然后对内核进行重新编译来完成扩展模块的添加,由于操作费时繁琐,且极易出错,目前这种方法已经过时。最新的方法则是采用Xtables-addons这一强大的插件来完成,使用这种方法主要有两个优点。
(1)操作简单高效
由于该插件是置于内核外编译的,用户只需将编写好的扩展模块文件置于该框架中,并在配置文件中添加几行配置信息,然后对其进行重新编译安装,整个过程中无需重启电脑或者进行内核模块加载就可以完成对扩展模块的编译与安装。
(2)通用性强
Xtables-addons提供了一组可以与内核相融的代码,相融代码其实就是一大串定义集,它们可以将在原开发平台使用的功能函数进行修改并使其映射到当前正在使用的内核中。例如,当前内核版本为2.6.24,开发者使用了内核版本为2.6.18的功能函数,通过融合代码就可以实现将老版本的功能函数映射到新版本内核中正常使用,这样就屏蔽了底层内核平台的差异。
阴离子聚合被广泛用在聚合物的合成过程,一般用强碱(KOH或n-BuONa)作为引发剂.一般情况下,大位阻基团取代的环氧化合物通过聚合得到的聚合物其分子量低,主要是由于刚性大位阻基团阻碍了链增长.对于环氧化合物而言,阴离子引发是很好的聚合方式,适当改变条件可以得到较高聚合度的聚醚.
3.2 IVI用户空间匹配模块的设计与实现
IVI用户空间匹配模块主要接收从用户空间传入的关于匹配信息的选项及参数,该模块工作流程如图4(a)所示,主要实现的结构体包括以下几部分。
·struct xtables_match:匹配模块的主体结构体,里面注册了多个功能函数。
·ivimt_mt4(6)_opts:用于对该模块中匹配区域的选项进行可选项设置。
·ivimt_mt4(6)_parse函数:检测输入参数的正确性,并且写入将共享给内核空间程序的信息。
3.3 IVI内核空间匹配模块的设计与实现
当用户空间匹配模块从命令行中获得用户输入的选项及参数,然后复制到与内核空间扩展匹配模块共享的数据区后,用户空间匹配模块的使命也就完成了,接下去的工作由内核空间扩展匹配模块来完成。内核空间扩展匹配模块主要完成的工作包括:
·接收每一个IP数据分组,然后察看匹配模块相关的表;
·通知Netfilter匹配模块是否匹配上了这个IP数据分组。
3.4 IVI用户空间目标模块的设计与实现
IVI用户空间目标模块与IVI用户空间匹配模块极为相似,不同的是,这一模块接收的是用户空间在目标区域输入的选项与参数,该模块工作流程如图5(a)所示。主要实现的结构体包括以下几部分。
图5 IVI目标模块工作流程
·struct xtables_target:目标模块的主体结构体,里面注册了多个目标功能执行函数。
·ivitg_tg4(6)_opts:用于对该模块中目标区域的选项进行可选项设置。
·ivitg_tg4(6)_parse函数:检测命令行中目标区域输入参数的正确性,并且写入将共享给内核空间程序的信息。
3.5 IVI内核空间目标模块的设计与实现
IVI内核空间目标模块是整个扩展模块中真正完成不同协议之间翻译目标动作的模块,也是最核心的模块,它从用户空间获得用户输入的目标动作信息,执行用户的翻译工作,包括地址翻译和协议翻译。内核空间目标模块主要完成的工作如下。
(1)对已经匹配上的 skb(sk_buff,网络报文的控制结构)数据分组进行合理性检测,同时取出其网络层首部。
(2)生成一个新的skb数据结构,根据翻译算法,将原skb里的字段值转化成相应的值,然后存放于新的skb结构体中,翻译工作主要在这一步完成。
(3)当所有字段及数据转化拷贝结束以后,丢弃原有的skb结构体进行,释放内存,同时让新的skb数据结构进入正常的协议栈,进行再发送。
该模块工作流程如图5(b)所示。主要实现的功能函数包括:target函数(在网络内核中实现地址转换及协议翻译功能);check函数 (对用户空间输入信息进行合法性检查);destroy函数(释放动态分配的资源)。
4 IVI网关实验测试
本文实验采用将202.115.8.0/24网段作为映射到IVI6网络的IPv4地址段,同时将IVI6中的前缀规定为2001:250:6400::/40,IVI网关实验网络拓扑如图6所示。系统测试环境的搭建后,就可以进行实验测试工作,包括ICMP测试、DNS测试、HTTP测试等。
4.1 ICMP测试
(1)IPv6主机到IPv4主机的可达性测试
ICMP分为ICMPv4版本和ICMPv6版本,其中ping命令采用了ICMPv4协议,而ping6命令则采用ICMPv6协议。该部分测试可在IPv6实验网IVI6-PC2主机上,通过ping6命令来访问IPv4实验网中的IVI4-PC1主机来完成,结果如图 7(a)所示。
图中收到了 I CMPv6回送回答(echo reply)报文说明IVI网关对IPv4数据分组和IPv6数据分组可以进行正常转换,实现IPv6主机对IPv4主机的访问。
(2)IPv4主机到IPv6主机的可达性测试
在测试IPv4主机到IPv6主机的可达性时,可通过在IPv4实验网络IVI4-PC1主机上,使用ping命令来访问IVI6-PC2的IPv4映射地址,结果如图7(b)所示。
图中收到了ICMPv4回送回答报文说明通过IVI网关可以实现IPv4主机对IPv6主机的访问。
(3)测试结果对比
图 7(a)与图 7(b)是在 IPv4 主 机 IVI4-PC1 和 IPv6 主机IVI6-PC2之间两个方向上的测试,即IPv4 ping IPv6与IPv6 ping6 IPv4,测试结果对比见表1。
表1 使用ping命令的网络时延对比
由IPv4主机ping IPv6主机的平均网络时延是0.187 ms,而由IPv6主机ping6 IPv4主机的平均网络时延是0.189 ms。从测试的数据结果可以看出,两者网络时延非常接近,几乎相等,这是由于IVI策略对地址的翻译是无状态一一映射的,所以IVI网关在两个方向上的翻译性能是相同的。
4.2 DNS测试
这部分测试主要是为了验证IVI-DNS对DNS报文转换是否正常。测试方式为:在IPv6实验网络的IVI6-PC2主机上访问IPv4实验网络的IVI4-PC1主机域名host4a.edu.cn,结果如图8所示。
图8是IPv6网络主机通过域名ping IPv4网络主机IVI4-PC1的过程。由于是通过域名进行访问的,所以首先就需要域名解析。主机IVI6-PC2首先利用ICMPv6去ping6 IPv4的域名,由于该域名表示的是一台IPv4主机,IPv6 DNS服务器本地解析失败,所以DNS查询报文通过IVI-DNS代理转发到 IPv4 DNS,IPv4 DNS对 host4a.edu.cn进行域名解析后返回DNS应答报文,被IVI-DNS截获后将DNS查询报文中的A资源记录(IPv4地址形式的)翻译成AAAA资源记录 (IPv6地址形式的),同时将解析得到的IPv4地址修改为添加指定IVI前缀后的IPv6地址,最后将修改过的DNS应答报文返回给IVI6-PC2,这样IVI6-PC2就知道了域名host4a.edu.cn在IPv6网络中的IVI映射地址。在主机IVI6-PC2看来,IVI4-PC1就好像是IPv6网络中的一台主机,然后两者就实现了透明通信。该过程验证了IVI-DNS对DNS报文的翻译功能,实验表明IVI-DNS能够对DNS A类型与DNS AAAA类型以及IPv4地址与IPv6地址实现正常转换。
4.3 HTTP测试
首先在IVI4-PC1主机上搭建支持IPv6访问的Web服务器,然后在IVI6-PC2主机上使用浏览器访问IPv4网络主机上的IPv4网站,在浏览器地址栏中输入:http://host4a.edu.cn,测试结果如图9所示。
5 结束语
在添加IVI扩展模块上采用了最新的Xtables-addons插件方法来取代过时的patch-o-matic方法,为以后进行扩展模块开发提供了良好的借鉴;同时,扩展了ICMP的回送请求和回答报文类型的翻译,实现了对ping命令的支持,通过ping命令实验验证了ICMP回送请求和回答报文翻译的可行性;针对TCP和UDP校验和字段的计算需要考虑伪首部的问题,提出了一种校验和更新算法,实验验证该更新算法是合理可行的。
IVI翻译机制可以有效地解决在IPv4与IPv6网络共存时期IPv4主机与IPv6主机相互通信的问题,由于IVI网关是无状态翻译的,具有良好的翻译性能。同时IVI扩展模块在内核调用时是作为一个可加载的模块使用,可以十分方便地集成于现有内核中,具有很大的灵活性。本文所研究的IVI网关适合于在中大规模Intranet中使用,为广泛部署Intranet过渡网络提供实际应用参考。
1 Postel J.Internet Protocol.RFC791,September 1981
2 周逊.IPv6—下一代互联网的核心(第一版).北京:电子工业出版社,2003
3 Silvia Hagen.IPv6精髓.北京:清华大学出版社,2004
4 http://www.nav6tf.org/
5 Li X,Bao C,Chen M,et al.The CERNET IVI Translation Design and Deployment for the IPv4/IPv6 Coexistence and Transition.RFC6219,May 2011
6 Carpenter B,Moore K.Connection of IPv6 Domains via IPv4 Clouds.RFC3056,February 2001
7 Toutain B J,Medina L,Dupont O,et al.Dual Stack Transition Mechanism(DSTM).IETF Internet Draft,Jan 2002
8 邢宁.基于隧道技术的IPv6承载网过渡方案分析与测试.北京邮电大学硕士学位论文,2010
9 Nordmark E.Stateless IP/ICMP Translation Algorithm (SIIT).RFC2765,February 2000
10 Zhu Yuncheng,Chen Maoke,Zhang Hong,et al.Stateless mapping and multiplexing of IPv4 addresses in migration to IPv6 internet.Proceedings of Global Telecommunications Conference,New Orleans,USA,2008:1~5
11 Gilligan R,Nordmark E.Transition Mechanisms for IPv6 Hosts and Routers.RFC1993,August 1996
12 Templin F,Gleeson T,Thaler D.Intra-Site Automatic Tunnel Addressing Protocol(ISATAP).RFC5214,March 2008
13 Narten T,Nordmark E,Simpson W.Neighbor Discovery for IP Version 6(IPv6).RFC2461,December 1998
14 Carpenter B,Jung C.Transmission of IPv6 over IPv4 Domains Without Explicit Tunnels.RFC2529,March 1999
15 杨刚,陈蜀宇.Linux中基于Netfilter/Iptables的防火墙研究.计算机工程与设计,2007(17)
16 周珂,高仲合.Linux下Netfilter/Iptables防火墙的研究与实现.网络安全技术与应用,2007(12)
17 周增国,李忠明.Linux平台下Netfilter/Iptables包过滤防火墙的研究与应用.网络安全技术与应用,2008(1)
18 熊忠阳,张逢贵,张玉芳.Linux下基于Netfilter个人内核防火墙的设计与实现.计算机应用,2009(s1)
19 孙有越.IPv6网络部署中若干关键问题的研究.北京邮电大学博士学位论文,2004