找回密码
 注册
搜索
查看: 5244|回复: 0

在VxWorks下设置、实现NAT/NAPT的方法

[复制链接]
发表于 2007-7-3 19:06:43 | 显示全部楼层 |阅读模式
摘要:介绍NAT、NAPT的基本概念和工作原理;结合VxWorks的网络协议栈,描述一种利用VxWorks操作系统提供的钩子函数来开发实现NAT和NAPT的方法。$ I( h# C, E- [% S

1 m6 Q0 K' m( F9 t0 C3 C6 S$ A关键词:钩子函数 网络协议栈 vxworks操作系统培训  vxworks调试教程  nat设置技术  napt实现& U/ f% D: @4 x* y7 l. M

* x5 b$ s  m; k$ x6 G0 H1 ^( B近年来,随着Internet的迅猛发展,连入Internet的主机数量成倍增长。由于最初设计Internet的时候并没有考虑到需要支持这么大的规模,因而Internet使用的Ipv4协议中IP地址的长度选择了32位,它可以使IP包的格式很好地对齐;但是,目前IP地址的短缺已经成为Internet面临的最大问题之一。为了解决IP地址短缺的问题,人们提出了许多解决方案,nternet能够支持到新一代IP协议Ipv6的出台。在众多的解决方案中,网络地址转换NAT(Network Address Translation)技术提供了一种完全将私有网和公共网隔离的方法,从而得到了广泛的应用。
: _6 H4 T6 h. {! Z
8 y! r0 C+ T8 P4 |# C. d图1 NAT工作原理示意图/ t! d! @$ W' E% i; U( ]( J

1 e4 m% T, l- B+ I' j& Z    一、NAT技术9 r+ o( z0 k, \
    NAT技术的基本功能就是,用1个或几个IP地址来实现1个私有网中的所有主机和公共网中主机的IP通信。NAT技术可为TCP、UDP以及ICMP数据包提供透明转发。7 C6 K! E7 L/ ^: R

' l9 j/ M) T9 [' U& t; Y    1.1 NAT工作原理% f, b+ o6 e' f8 n& I. T
    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)转发到私有网。对于通信双方而言,这种地址的转换过程是完全透明的。, Q5 O2 u4 ~7 v: e% }9 g

- N. k( g' f7 l: p6 _    1.2 NAPT技术由于NAT实现是私有IP和NAT的公共IP之间的转换,那么,私有网中同时与公共网进行通信的主机数量就受到NAT的公共IP地址数量的限制。为了克服这种限制,NAT被进一步扩展到在进行IP地址转换的同时进行Port的转换,这就是网络地址端口转换NAPT(Network Address Port Translation)技术。( g, K3 K4 ]) X( ~
4 H. L6 y% b. o) b) j5 Y( v7 B
9 t6 p3 p: E3 u  c
    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的转换是完全透明的。
8 }3 i) D' \- L
  f" {& X8 y! H8 u3 _" s- G0 R8 u% ]+ M( O+ j4 `
5 g9 G6 ]* o! Z% {
    二、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。
5 ~/ F! M/ N% l
1 d* p) _; @! g2 H5 H7 ^2 e/ R# m论文在VxWorks下设置、实现NAT/NAPT的方法来自www.66wen.com免费论文网
4 v' h$ T) X( y! u! Q, N, P) y+ b- ]9 J6 V; @
- O: R5 h, K6 G5 ?
    三、向VxWorks网络协议栈加入NAT为了向VxWorks网络协议栈中加入NAT,必须实现2个基本操作:IP包的截获得IP包的处理。: f7 P5 c9 w! z$ a( X5 G

, F2 K, S8 C' k9 }   3.1 VxWorks下IP包的截获VxWorks网络协议栈在物理驱动层和IP层上分别提供了两类钩子函数:EtherHook和IpFilterHook。利用这两类钩子函数,可以实现对IP包的截获。: G, S# K' ]( U, V* p
    (1)EtherHookEtherHook提供对以太帧的截获功能。它包括2个钩子函数:以太帧接收钩子函数EtherInputHook和以太帧发送钩子函数EtherOutPutHook。它们分别用函数EtherInputHookAdd和EtherOutputHookAdd安装。安装了这些钩子函数后,每当有以太帧被接收到时,函数EtherInputHook就会在该以太帧被提交给上层处理前被自动调用;每当有以太帧被发送时,函数EtherOutputHook会在该以太帧被发送前被自动调用。通过截获以太帖,可以达到截获IP包的目的。
7 E3 C+ q/ `3 ~% q& R    (2)IpFilterHookIpFilterHook提供对IP包的截获功能。它只对应1个钩子函数,用函数ipFilterHookAdd就可以完成IpFilterHook的安装。安装了IpFilterHook后,每当有IP包被接收到时,函数IpFilterHook就会被自动调用,从而实现对IP包的截获。% f% e* h8 T; F; o+ n- A1 ~
- k! m1 U- G* E! r# j( c
    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所示。
; c3 X2 z! \, T* r    (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包也都用这个表项来处理。
/ K$ s6 n8 d$ l7 C; c    (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网络协议栈。9 N' K" @4 N) J$ ^8 R
' d9 `7 T/ R3 \" x1 u: Q! l
: F) j% D6 I: p2 h: B
    (3)nat映射表的配置6 a6 S/ ~7 ?1 ]1 n
    作为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映射表。相对于静态配置部分而言,动态配置部分的数据结构、数据组织和搜索算法的设计和实现的难度要大得多,关键是要实现一个高效的搜索算法。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|宁德市腾云网络科技有限公司 ( 闽ICP备2022007940号-5|闽公网安备 35092202000206号 )

GMT+8, 2025-6-19 21:22 , Processed in 0.036402 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表