NAT-PT 协议转换网关的设计与实现

来源:互联网 发布:入侵五角大楼的网络 编辑:程序博客网 时间:2024/04/18 08:28

NAT-PT 协议转换网关的设计与实现
摘要:介绍NAT-PT 的技术原理,给出NAT-PT 协议转换网关的概念和系统结构。根据RFC 2766 文档和RFC 2765 文档的相关说明,参
照Linux 内核关于IPv4/IPv6 网络实现部分的源代码,设计并实现NAT-PT 网关应用程序。该程序由主体模块、应用层网关模块、网络地址
转换模块和协议转换模块组成。
关键词:NAT-PT 协议转换网关;NAT-PT 网关应用程序;Linux 内核
Design and Implementation of NAT-PT Protocol Translation Gateway
LI Sui-yi
(Department of Military Training and Management, Nanjing Army Command College, Nanjing 210045)
【Abstract】This paper introduces NAT-PT’s technology principle, depicts the concept of NAT-PT protocol translation gateway and its system
framework. According to RFC 2766 document and RFC 2765 document, and referring to source codes about the realization of IPv4/IPv6 network in
Linux kernel, it designs and implements NAT-PT gateway application program, which is composed of main model, application level gateway model,
network address translation model and protocol translation model.
【Key words】NAT-PT protocol translation gateway; NAT-PT gateway application program; Linux kernel
本文研究NAT-PT 协议转换网关,探讨如何在IPv4 向
IPv6[1-2]过渡的过程中构建下一代路由器。在不改变原有网络
节点的情况下,实现了IPv4 网络与IPv6 网络的互通。
1 NAT-PT 技术原理
NAT-PT[3]是用于实现IPv4 向IPv6 平滑过渡的协议转换
技术。它通常与SIIT 技术[4]结合以实现地址、协议的转换,
与DNS ALG 技术结合实现IPv4 和IPv6 间的域名系统解析或
寻址。NAT-PT 由网络地址翻译技术(Network Address Translation,
NAT)和协议翻译技术(Protocol Translation, PT)2 个部分组成。
NAT 技术是IPv4 和IPv6 间的网络地址转换技术,一般
需要设置一个IPv4 地址池,当IPv6 地址转换成IPv4 地址时,
从地址池中获取一个IPv4 地址,并把IPv6 源地址转换成该
IPv4 地址,提取IPv6 目的地址中的主机地址部分作为IPv4
目的地址,并重新计算包头的校验和。把该地址转换记录在
地址映射表中。将IPv4 地址转换成IPv6 地址时,可以根据
地址映射表中的地址转换记录来实现。
NAT 技术存在局限性,当IPv4 地址池的地址使用完后,
其他IPv6 节点不能与网络外部的IPv4 节点建立会话连接。
因此,研究者提出NAPT(Network Address Port Translation)技
术,它允许多个IPv6 节点通过一个IPv4 地址和IPv4 节点进
行通信,IPv6 节点的TCP/UDP 端口被转换为合法IPv4 地址
的TCP/UDP 端口。NAPT 解决了NAT 无法解决的问题,当
预留的IPv4 地址耗费完毕时,它能够提供6.3×104 个TCP
或UDP 会话。但该方法只适用于有端口号的协议类型(如TCP,
UDP 协议)。
PT 技术是IPv4 和IPv6 间的协议转换技术。它主要根据
IPv4 和IPv6 在语义上的不同对IP 包头的对应字段进行转换,
构建新的数据包。PT 技术基于SIIT 协议,在SIIT 协议中定
义了以下2 种转换形式:
(1)IPv4/IPv6[1]报头之间的转换。在IPv4 中需要根据报头
标志字段判断数据包在何处分片。而在IPv6 中数据包的分片
在主机上完成。因此,如果在数据传输时,IPv4 的数据包发
生分片,那么进行IPv4/IPv6 报头转换处理时,就需要在IPv6
报头后加上分片扩展头。
(2)ICMPv4/ICMPv6[2]之间的转换。ICMP 协议主要负责
为路由器或主机提供路径信息、路由可达信息以及报告传输
过程中出现的错误信息。在纯IPv4 节点和纯IPv6 节点之间
通信时,需要进行ICMPv4 和ICMPv6 间的转换。它们之间
的转换较简单,主要内容是重新计算校验和以及对包含错误
信息IP 报头的转换。
2 NAT-PT 协议转换网关
NAT-PT 协议转换网关[3]又称为NAT-PT 翻译网关,一般
被配置在边界路由器上,用来连接IPv4 网络和IPv6 网络,
负责IPv4 和IPv6 网络地址和协议的翻译工作,实现纯IPv4
节点和纯IPv6 节点之间的网络通信。为了保证IPv4 网络和
IPv6 网络间的互连互通,需要在边界路由器上安装IPv4/IPv6
双协议栈。NAT-PT 协议转换网关的网络拓扑如图1 所示。
NAT-PT 协议转换网关的系统结构如图2 所示,其中,2 个网
络设备接口层分别连接IPv4 网络和IPv6 网络。在NAT-PT
协议转换网关中,使用一个全球可路由的IPv4 地址池。当会
话穿越IPv4/IPv6 边界路由器时,NA(P)T-PT 层根据IPv4 地
址池中的IPv4 地址进行地址翻译和协议转换,并在IPv4/IPv6
地址映射表中为每个转换建立相应信息。IPv4/IPv6 协议转换
管理层对IPv4/IPv6 数据包进行转换、路由等控制管理。最上
面的ALG 模块层对数据包负载中包含的IP 地址进行转换,

ALG 与NAT-PT 配合使用可以提供对多种应用层(如DNS,
FTP)的支持。
图 1 NAT-PT 协议转换网关的网络拓扑
图 2 NAT-PT 协议转换网关的系统结构
网络间的会话必须在一个 NAT-PT 网关上完成,因为它
会跟踪它支持的所有会话,并要求进出的数据包通过同一个
NAT-PT 转换器。NAT-PT 网关允许大量应用程序在纯IPv4
节点和纯IPv6 节点间进行互操作,是目前实现从IPv4 向IPv6
过渡的较理想方法。IPv4 网络使用者或IPv6 网络使用者通过
NAT-PT 网关发送或接收数据包时,可以像使用本地网络一
样,感觉不到网络间的差异。
3 NAT-PT 网关应用程序的设计与实现
根 据 文 献[3-4] 的相关说明, 参照Linux 内核关于
IPv4/IPv6 网络实现部分的源代码,设计并实现NAT-PT 网关
应用程序。该程序由以下4 个模块组成:
(1)主体模块nat-pt.c 是NAT-PT 的主体程序,它通过初
始化数据包过滤器packet filter 来接收IPv4 或IPv6 的数据包,
将经过协议转换处理后的新数据包转发到其他网络上。它还
负责处理ARP( 地址解析协议) 请求响应以及Neighbour
Discovery(邻居发现协议)的请求响应。其中,对ARP 和
Neighbour Discovery 的处理是为了获取IPv4 目的主机和IPv6
目的主机的以太网地址。
(2)网络地址转换模块address_pool.c 提供了将IPv4 地址
转换为IPv6 地址的地址转化功能,它使用一个IPv4 的地址
池,用来在一个会话中实现IPv4 与IPv6 的地址映射。
(3)协议转换模块protocol_translator.c 主要负责将IPv4 数
据包的IPv4 和ICMPv4 报头翻译成语义上等价的IPv6 数据
包的IPv6 和ICMPv6 报头,反之亦然。
(4)应用层网关模块alg_manager.c 主要用来判断数据包
是否需要交由上层ALG(应用层网关)进行进一步处理,如果
在数据包的载荷中包含IP 地址应用,那么必须由ALG 进行
特定的地址翻译和协议转换,目前在该模块中主要实现了
DNS ALG 功能。
在上述 4 个模块中,主体模块nat-pt.c 是核心程序,用来
检测网卡接口是否有新的数据包到来,若有则通过地址翻译
和协议转换,根据数据包的目的地址将转换后的数据包转发
到其他网络上。其他3 个模块程序实现具体的功能函数,主
体模块nat-pt.c 通过调用它们来实现新数据包的地址翻译和
协议转换。
nat-pt.c 是在Linux 下实现的源程序,需要包含Linux 内
核的一些头文件,如<net/bpf.h>, <net/if.h>, <net/if_arp.h>,
<netinet/in.h>, <netinet/if_ether.h>, <netinet/icmp6.h>, <arpa/
inet.h>, <net/route.h>等。在nat-pt_global.h 头文件中建立了一
些nat-pt.c 和其他3 个模块需要使用的全局数据结构和函数。
例如,数据结构IP_header_info 用来存储IPv4 和IPv6 的报头
信息,在nat-pt.c 中被经常使用,其格式如下:
struct IP_header_info /*数据结构IP_header_info 的格式*/
{ Network_Source Network_source;
/*定义数据包的源网络*/
Network_Destination Network_destination;
/*定义数据包的目的网络*/
unsigned short Payload_length;
/*IP 数据包中载荷的字节长度*/
Packet_Type Payload_type;
/*数据包使用的协议*/
unsigned char TTL;
/*数据包的生存周期*/
struct
{ struct in_addr *Source_address;
struct in_addr *Destination_address;
}IPv4;
struct
{ struct in6_addr *Source_address;
struct in6_addr *Destination_address;
}IPv6;};
在 nat-pt_global.h 头文件中声明了宏#define IPv6_
PREFIX_HOST “fe80:0000:0000:0000:0000:0000”用来表示
IPv6 网络侧所有主机的地址前缀,这些主机的默认路由器是
NAT-PT 网关。nat-pt.c 主要以双网卡系统实现,一个网卡(eth0)
用来连接IPv4 网络,另一个网卡(eth1)用来连接IPv6 网络。
nat-pt.c 程序实现IPv4 与IPv6 之间地址翻译和协议转换
的步骤如下:先为IP 数据包分配内存缓冲区pBufferIPin 和
pBufferIPout,为ARP 和Neighbour Discovery 数据包分配内
存缓冲区pBufferARP4ReqIn, pBufferARP4RplIn, pBufferND
6in 和pBufferARPout。然后将IP_header_info 结构变量
pIP_header 作为存储IPv4 或IPv6 报头信息的缓冲区。利用
initialise_network_interface()函数初始化由Berkeley Packet
Filter(BPF)接口定义的5 个网络接口IPv4, IPv6, ARPv4Req,
ARPv4Rpl 和NDv6,其中,IPv4, ARPv4Req 和ARPv4Rpl 与
eth0 接口相关联,IPv6 和ND6 与eth1 接口相关联。利用宏
IPv6_PREFIX_HOST 生成IPv6 地址前缀。获取NAT-PT 主机
eth0 的硬件地址、IPv4 地址和IPv4 地址池中的地址,然后获
取eth1 的硬件地址和它的IPv6 地址。再利用
initialise_packet_filter()函数初始化上述5 个网络接口,清空
数据输入缓冲区。初始化地址池和ALG_Manager 堆,将
NAT-PT 开始工作的时间信息加入数据包统计信息日志文件。
完成上述处理后,开始运行读取、翻译和发送数据包的
无限循环体,它是程序的主要语句体,用来把接收到的数据
包翻译成不同地址格式的数据包,并根据目的地址的不同,
通过不同网络接口转发出去,其主具体步骤如下:
(1)检查IPv4 接口(即eth0 接口)是否有IPv4 数据包到来,
若有数据包到来,则读取缓冲区中的所有数据包,并调用协
议转换模块protocol_translator.c 程序中的PT_Translate_IPv4_
Packet()函数,检验和翻译每个IPv4 数据包。若翻译失败,
则丢弃数据包,将morestatsIP4.bs_discarded 变量的值增1。

如果翻译后IPv4 报头的目的地址是IPv4 网络,那么使
用ARP 协议获得IPv4 网络中目的主机的物理硬件地址(目的
主机的IP 地址在IP_header_info 结构中),并将该IPv4 数据
包通过IPv4 接口(即eth0 接口)转发出去。若转发失败,则丢
弃数据包,将morestatsIP4.bs_discarded 变量的值增1。如果
目的地址不是IPv4 网络,则一定是IPv6 网络,此时使用
ICMPv6 的邻居发现协议获得IPv6 网络中目的主机的物理硬
件地址(目的主机的IP 地址在IP_header_info 结构中)。将此
翻译的IPv4 数据包通过IPv6 接口(即eth1 接口)转发出去,
如果转发失败,则丢弃数据包,将morestatsIP6.bs_discarded
变量的值增1。
(2)检查IPv6 接口(即eth1 接口)是否有IPv6 数据包到来,
如果有数据包到来,那么读取缓冲区中的所有数据包,并调
用协议转换模块protocol_translator.c 程序中的PT_Translate_
IPv6_Packet()函数,检验和翻译每个IPv6 数据包。若翻译失
败,则丢弃数据包,将morestatsIP6.bs_discarded 变量的值增1。
如果翻译后 IPv6 报头的目的地址是IPv4 网络,那么使
用ARP 协议获得IPv4 网络中目的主机的物理硬件地址(目的
主机的IP 地址在IP_header_info 结构中),并将此翻译的IPv6
数据包通过IPv4 接口(即eth0 接口)转发出去。如果转发失败,
则丢弃数据包,将morestatsIP4.bs_discarded 变量的值增1。
如果目的地址不是IPv4 网络,那么一定是IPv6 网络,此时
使用ICMPv6 的邻居发现协议获得IPv6 网络中目的主机的物
理硬件地址(目的主机的IP 地址在IP_header_info 结构中),
并将此翻译的IPv6 数据包通过IPv6 接口(即eth1 接口)转发
出去,如果转发失败,则丢弃数据包,将morestatsIP6.bs_
discarded 变量的值增1。
(3)检查ARPv4Req 接口(即eth0 接口)是否有数据包到
来,如果有数据包到来,则读取缓冲区中的所有数据包,判
断目的IPv4 主机的IP 地址是否在IPv4 地址池中。如果在地
址池中,则表明该地址已经被使用,丢弃数据包。如果不在,
则构建数据帧和ARP 报头,交换源地址和目的地址,将ARP
请求模式改为ARP 响应模式,并通过ARPv4Req 接口(即eth0
接口)将数据包发送出去。
(4)完成上述步骤后,回到第(1)步循环重复执行。
4 结束语
NAT-PT 协议转换网关用于实现IPv4 向IPv6 的平稳过
渡[5]。未来IPv6 网络将快速发展,因此,有必要进一步研究
NAT-PT 技术。

{
Boolean lookup(in string type_id)raises(NotFound);
};
};
4 基于CORBA 的P/S 使能技术
一个典型的 P/S 通信系统包括事件模型、订阅模型、匹
配算法、路由算法和服务质量保证等。基于CORBA 的P/S
通信使能技术包括如下几方面:
(1)事件模型又称发布模型,利用CORBA 的IDL 数据类
型几乎可定义所有已知的数据模型。
(2) 订阅模型也称注册模型,OMG Trader Constraint
Language 为基于内容的P/S 订阅模型提供了基础。CORBA
的通告服务的订阅模型就是在OMG Trader Constraint
Language 的基础上进行扩充后得到的一个注册模型。
(3)通知交付模型是指订阅者获取通知的方式,发布者可
通过notify 将事件发布到P/S 中间件,P/S 中间件将满足订阅
者兴趣的通知交付给订阅者,这种方式是push 方式,在
CORBA 中,通知服务只要有订阅者的某种形式的对象引用
就可调用订阅者的操作向其推送内容,很容易实现push 模
型。如果订阅者主动向P/S 中间件获取订阅,这种方式是pull
模型,在这种模型中,订阅者在获取通知的同时会指定自己
的兴趣,若没有符合自己兴趣的通知,订阅者立即返回(采用
非阻塞方式)。在基于CORBA 的P/S 系统中,利用基于方法
级的异步模型(如国防科大的AP 模型)很容易实现。混合
push/pull 模型可以在基于CORBA 的push 和pull 模型的基础
上实现。
(4)通知传播模型是指底层采用何种通信协议传播通知,
IIOP/IGOP 协议可作为一种P/S 系统传输协议,因为CORBA
具有平台无关、语言无关、操作系统无关和硬件体系结构无
关等特性,所以使用IIOP/IGOP 作为底层传输协议的P/S 系
统同样可受益于这些特性。网络层可使用TCP/IP 协议,因为
ORB 负责处理底层网络通信的细节,它可使用不同的底层网
络协议(如TCP/IP 等),从而避免了订阅端和发布端复杂的网
络编程。
5 结束语
基于 CORBA 的方法可以仅用标准IDL 定义事件,不需
要专门的编码包处理事件机制。编译IDL 后形成P/S 模式中
的发布端(框架)和订阅端(码根),发布者可以通过通知接口
(notify)将事件发布到P/S 中间件,信息订阅者以订阅的形式
指定自己感兴趣的事件,而双方事件的匹配完全交由P/S 中
间件处理,实现了时间、空间和流程的三方解耦。

原创粉丝点击