|
|
摘要:介绍NAT、NAPT的基本概念和工作原理;结合VxWorks的网络协议栈,描述一种利用VxWorks操作系统提供的钩子函数来开发实现NAT和NAPT的方法。7 w9 J9 s, H6 n( Y6 I
4 l: M! Z- Q5 K5 R8 e
关键词:钩子函数 网络协议栈 vxworks操作系统培训 vxworks调试教程 nat设置技术 napt实现! l6 J$ ~" g" ^6 f1 J
8 P5 \2 ]' a! E, Z* z& T
近年来,随着Internet的迅猛发展,连入Internet的主机数量成倍增长。由于最初设计Internet的时候并没有考虑到需要支持这么大的规模,因而Internet使用的Ipv4协议中IP地址的长度选择了32位,它可以使IP包的格式很好地对齐;但是,目前IP地址的短缺已经成为Internet面临的最大问题之一。为了解决IP地址短缺的问题,人们提出了许多解决方案,nternet能够支持到新一代IP协议Ipv6的出台。在众多的解决方案中,网络地址转换NAT(Network Address Translation)技术提供了一种完全将私有网和公共网隔离的方法,从而得到了广泛的应用。
7 E- X2 a7 D& u; M9 I/ i; |$ T* x& { C8 V0 [' ^" d- L) W
图1 NAT工作原理示意图
! g- P% k2 _' G! ^0 l1 W( j% c" i6 O) S& y
一、NAT技术; n s* n# [2 J2 m. m2 Y
NAT技术的基本功能就是,用1个或几个IP地址来实现1个私有网中的所有主机和公共网中主机的IP通信。NAT技术可为TCP、UDP以及ICMP数据包提供透明转发。
7 a+ B- O5 ^# g. E& A7 ]$ \7 U# ~+ K" W! u9 b/ X
1.1 NAT工作原理4 y2 g& r& f5 ]& [% D3 f9 C
NAT的基本工作原理是,当私有网主机和公共网主机通信的IP包经过NAT网关时,将IP包中的源IP或目的IP在私有IP和NAT的公共IP之间进行转换。如图1所示,NAT网关有2个网络端口,其中公共网络端口的IP地址是统一分配的公共IP,为202.204.65.2;私有网络端口的IP地址是保留地址,为192.168.1.1。私有网中的主机192.168.1.2向公共网中的主机166.111.80.200发送了1个IP包(Des=166.111.80.200,Src=192.168.1.2)。当IP包经过NAT网关时,NAT会将IP包的源IP转换为NAT的公共IP并转发到公共网,此时IP包(Des=166.111.80.200,Src=202.204.65.2)中已经不含任何私有网IP的信息。由于IP包的源IP已经被转换成NAT的公共IP,响应的IP包(Des=202.204.65.2,Src=166.111.80.200)将被发送到NAT。这时,NAT会将IP包的目的IP转换成私有网中主机的IP,然后将IP包(Des=192.168.1.2,Src=166.111.80.200)转发到私有网。对于通信双方而言,这种地址的转换过程是完全透明的。- B$ L1 J6 Z6 x
0 }4 V$ A( F9 B+ Z- [; \
1.2 NAPT技术由于NAT实现是私有IP和NAT的公共IP之间的转换,那么,私有网中同时与公共网进行通信的主机数量就受到NAT的公共IP地址数量的限制。为了克服这种限制,NAT被进一步扩展到在进行IP地址转换的同时进行Port的转换,这就是网络地址端口转换NAPT(Network Address Port Translation)技术。0 n( G' u' n' S
0 y/ K' s6 l+ G/ {" L+ J" j
. `* f3 N. ~3 f& q! M2 ~ NAPT与NAT的区别在于,NAPT不仅转换IP包中的IP地址,还对IP包中TCP和UDP的Port进行转换。这使得多台私有网主机利用1个NAT公共IP就可以同时和公共网进行通信。如图2所示,私有网主机192.168.1.2要访问公共网中的Http服务器166.111.80.200。首先,要建立TCP连接,假设分配的TCP Port是1010,发送了1个IP包(Des=166.111.80.200:80,Src=192.168.1.2:1010),当IP包经过NAT网关时,NAT会将IP包的源IP转换为NAT的公共IP,同时将源Port转换为NAT动态分配的1个Port。然后,转发到公共网,此时IP包(Des=166.111.80.200:80,Src=202.204.65.2:2010)已经不含任何私有网IP和Port的信息。由于IP包的源IP和Port已经被转换成NAT的公共IP和Port,响应的IP包(Des=202.204.65.2:,Src=2010166.111.80.200:80)将被发送到NAT。这时NAT会将IP包的目的IP转换成私有网主机的IP,同时将目的Port转换为私有网主机的Port,然后将IP包(Des=192.168.1.2:1010,Src=166.111.80.200:80)转发到私网。对于通信双方而言,这种IP地址和Port的转换是完全透明的。0 n8 r+ h8 S H8 S; ^
$ `- k* g' B) n& `
* V$ j8 D3 U5 Q6 ~- y" X( d" r: F3 a0 F
二、VxWorks的网络协议栈与VxWorks操作系统捆绑发行的标准网络协议栈,是一个与BSD4.4兼容、功能齐全并针对嵌入式应用作了大量优化的TCP/IP协议栈。该网络协议栈与VxWorks操作系统、开发工具、设备管理工具以及上层协议和应用可以集成在一起,有完整的路由功能并可以根据需要进行剪裁。VxWorks的网络协议栈的分层结构如图3所示。VxWorks网络协议栈传输数据使用的内存,是在系统启动进行网络协议初始化的时候就申请下来的,并使用系统提供的netBufLib建立内存字点池来管理这些内存空间。网络协议栈传输数据所需的内存都是从这些内存节点池中申请,使用完毕后再释放。NetBufLib通过3种数据结构处理网络协议栈传输的数据:mBlk、clBlk和Cluster。其中,Cluster保存的是实际的数据,mBlk和clBlk中保存的信息是用来管理Cluster中保存的数据的。为了满足传输不同大小数据的需要,Cluster是一些大小不同的内存块;缺省情况下,VxWorks网络协议栈创建了大小从64~2048字节的6个不同的内存节点池。由于mBlk中保存的只是指向数据的指针,因此,网络协议栈不同层之间的数据传输可以避免数据拷贝。此外,对于分布在多个Cluster中的数据,可以通过mBlk把它们链在一起,并且只需要传递链首的mBlk就可以了。VxWorks网络协议栈的“零拷贝”技术就是建立在这种机制的基础之上的。图4描述了2个提交给网络协议栈TCP层的包的数据结构。在mBlk结构中,有2个指向其它mBlk的指针:1个指向同一个包的下一个mBlk;另一个指向下一个包的链首的mBlk。ClBlk指向的就是实际存储数据的Cluster。6 K+ X! X# R8 l, N
' m0 t, v, B9 Q论文在VxWorks下设置、实现NAT/NAPT的方法来自www.66wen.com免费论文网 * `6 `6 @7 L5 I+ t
5 R! t$ n3 c; B' }. K9 r, Z6 N
" q# E6 r# N# t6 k* T" a; L 三、向VxWorks网络协议栈加入NAT为了向VxWorks网络协议栈中加入NAT,必须实现2个基本操作:IP包的截获得IP包的处理。9 K6 |5 v6 H+ g* b0 X( K
9 e g5 ~8 M# p& [5 @1 p
3.1 VxWorks下IP包的截获VxWorks网络协议栈在物理驱动层和IP层上分别提供了两类钩子函数:EtherHook和IpFilterHook。利用这两类钩子函数,可以实现对IP包的截获。
* z2 R7 @& |3 R+ x0 i (1)EtherHookEtherHook提供对以太帧的截获功能。它包括2个钩子函数:以太帧接收钩子函数EtherInputHook和以太帧发送钩子函数EtherOutPutHook。它们分别用函数EtherInputHookAdd和EtherOutputHookAdd安装。安装了这些钩子函数后,每当有以太帧被接收到时,函数EtherInputHook就会在该以太帧被提交给上层处理前被自动调用;每当有以太帧被发送时,函数EtherOutputHook会在该以太帧被发送前被自动调用。通过截获以太帖,可以达到截获IP包的目的。3 L& G9 p; |+ X3 u# n/ H
(2)IpFilterHookIpFilterHook提供对IP包的截获功能。它只对应1个钩子函数,用函数ipFilterHookAdd就可以完成IpFilterHook的安装。安装了IpFilterHook后,每当有IP包被接收到时,函数IpFilterHook就会被自动调用,从而实现对IP包的截获。
8 S3 N6 @1 x. V6 U, {3 F; r8 u& d# _! w4 e5 V& V7 }, N- D
3.2 NAT过程中IP包的处理利用钩子函数完成IP包的截获后,就可以根据需要对IP包进行处理。首先,可以从IP包中剥离出IP头,根据IP头中的“协议”域可以判断出是UDP包还是TCP包。然后,从IP包中剥离出UDP头或TCP头,利用IP头和UDP头或者TCP头中的相关信息,就可以根据需要进行IP地址和Port的转换处理。NAT一般采用1个映射表来实现IP地址和Port的转换。对于截获到的IP包,通过比较IP包的目的IP、目的Port、源IP、源Port和NAT映射表中的相应表现,对IP包的目的IP、目的Port、源IP、源Port进行转换。典型的NAT映射表如图5所示。
2 s, K% R# b1 |4 } (1)处理由内到外的IP包由内到外的IP包指的是私有网主机通过NAT发送到公共网主机的IP包。它的源IP是私有IP,目的IP是公共IP。当截获到1个由内到外的IP包时,NAT首先以IP包的源IP和源Port作为Real Src DownloadFiles\content\2005-4-6\DownloadFiles\content\2005-4-6\DownloadFiles\content\2005-4-6\IP和Real Src DownloadFiles\content\2005-4-6\Port的匹配条件,在映射表中进行搜索。如果找到1个对应的表项,就用表项的NAT IP和NAT Port替换IP包的源IP和源Port,而保持IP包的目的IP和目的Port不变。然后,重新计算TCP或UDP的校验和,就可把IP包归还给VxWorks网络协议栈。如果在映射表中没有搜索到对应的表项,NAT就会向映射表中添加1个新的表现。该表项中的Real Src DownloadFiles\content\2005-4-6\DownloadFiles\content\2005-4-6\DownloadFiles\content\2005-4-6\IP和Real Src DownloadFiles\content\2005-4-6\Port用IP包的源IP和源Port来填充;NAT Port用NAT分配的1个空闲Port填充。然后,根据新增加的表项,按照上面相同的步骤完成对IP包的处理。后续相同的IP包也都用这个表项来处理。& ^/ [4 t/ n% h. b: {; r
(2)处理由外到内的IP包由外到内的IP包指的是从公共网通过NAT发送到私有用的IP包。它的源IP是公共IP,目的IP是NAT的公共IP。当截获到1个由外到内的IP包时,NAT就以IP包的目的IP和目的Port作为NAT IP和NAT Port的匹配条件,在映射表中进行搜索。如果找到1个对应的表项,就用表项的Real Src DownloadFiles\content\2005-4-6\DownloadFiles\content\2005-4-6\DownloadFiles\content\2005-4-6\IP和Real Src DownloadFiles\content\2005-4-6\Port来替换IP包的目的IP和目的Port,而保持IP包的源IP和源Port不变。然后,重新计算TCP或UDP的校验和,就可把IP包归还给VxWorks网络协议栈。
U( E. w7 \# w; B" `) g" `
: \# I7 d) t( ~2 N
3 k0 b' w( H; P/ W3 D1 ?4 | (3)nat映射表的配置
$ d( e1 O. a8 [1 Y8 r% y/ ]! M, o0 o 作为nat完成ip包中ip和port转换的依据,nat映射表的管理关系到nat的功能和性能。nat映射表的配置可以分为2部分:静态配置部分和动态配置部分。静态配置部分主要用于nat ip、nat port和私有ip、私有port的映射关系可以预见的应用,例如udp通信和tcp server运行在私网中某个主机等情况。nat映射表静态配置部分可以在nat运行前根据规划直接完成配置。动态配置部分主要用于nat ip、nat port和私有ip、私有port的映射关系不可预见的应用,例如在私有网中某个主机上运行tcp client来与公共网中某个主机上的tcp server建立连接进行通信。因这种情况下,私有网主机使用的port是动态分配的。为了实现需要nat ip、nat port和私有ip、私有port的转换,必须动态配置nat映射表。相对于静态配置部分而言,动态配置部分的数据结构、数据组织和搜索算法的设计和实现的难度要大得多,关键是要实现一个高效的搜索算法。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
×
|