怎么编程实现NAT网络地址转换(200分)

  • 主题发起人 主题发起人 盛利
  • 开始时间 开始时间

盛利

Unregistered / Unconfirmed
GUEST, unregistred user!
怎么样编程实现NAT网络地址转换。
 
唉,这么多人看,也没个人回答
众位兄弟,会的多答点,不会的踢一脚
 
我来踢一脚!
 
使用Socks5代理技术,不是更好吗?
 
我不懂,但我可以告诉你到哪里查
你可以看看linux下相应程序的源代码.
 
楼上的为什么要自己写?我觉得没必要啊,什么都要自己写还要操作系统做什么?
WIN2000就带这个功能,还有winroute
 
呵呵,什么都让别人做,自己干什么阿!
 
没人关心这个问题吗?

怎么没有人解决呢?
 
我发的一个帖子,也一样,,没人理!

难道这个NAT这么神秘吗?还是想技术保密呀??


http://www.delphibbs.com/delphibbs/dispq.asp?lid=1707554
 
NAT到不是很神秘,也没有技术保密
其实原理都是很简单,在linux下都可以轻松实现
而且网上也有不少类似代码.

但是在windows下不好办,微软封装得太厉害,没有提供底层接口!
 
一个PDU里面有源地址,源端口,目的地址,目的端口。NAT就是根据不同的策略改这四个东西。
 
可以用linux作很简单!!
 
其实就是M$给接口太少了,在WIN32上面实现起来有点难。因为linux开放式的,所以实现容易。
 
组织:中国互动出版网(http://www.china-pub.com/)
RFC文档中文翻译计划(http://www.china-pub.com/compters/emook/aboutemook.htm)
E-mail:ouyang@china-pub.com
译者:spacelu(spacelu wuchun_lu@china.com)
译文发布时间:2001-5-11
版权:本中文翻译文档版权归中国互动出版网所有。可以用于非商业用途自由转载,但必须
保留本文档的翻译及版权信息。


Network Working Group P. Srisuresh
Request for Comments: 3022 Jasmine Networks
Obsoletes: 1631 K. Egevang
Category: Informational Intel Corporation
January 2001


传统IP网络地址转换(传统NAT)
(RFC3022 Traditional IP Network Address Translator (Traditional NAT))

备忘录状态
这个备忘录为因特网社区提供信息。它没有详细说明任何一种网络标准。这个备忘录的
发布没有限制。

版权声明
版权属于因特网社会(2001)。保留所有权利。


前言
在这个文档中描述的IP地址转换操作扩展了RFC1631介绍的地址转换和包括了一类
的网络地址和TCP/UDP端口转换。另外,这个文档更正了RFC1631的校验适用算法和试图
详细讨论NAT操作和限制。
摘要:
基于基本NAT的基本网络地址转换是IP地址从一个组到另外一个组映射的一种方式,
对终端用户是透明的。网络地址端口转换或NAPT是很多网络地址和它们的TCP/UDP(传
输控制协议/用户数据报协议)端口转换成一个唯一的网络地址和它的TCP/UDP端口。同时,
参考传统NAT这两个操作提供一种机制,这种机制用全球唯一注册地址连接私人地址领域
到外部领域。
1. 介绍
IP地址转换的需要的提出是因为一个网络的IP内部地址不能用在外部网不论是因为人
原因还是因为它们在外部网不合法。在一个局域网的网络拓补学可以用很多方式改变,顾客
可以改变他们的提供商,公司骨干可能重组或则提供商可能合并或分裂。不论外部网随着时
间何时改变,局域网所在的节点被附以的地址肯定随着外部网的改变而改变。用户可能在这
种方式的改变被隐藏在区域里,因为集中改变到单一地址转换路由器中。
基本地址转换将(在很多情况下,除了[NAT-TERM]和这个文档第6部分所有指的)允
许在局域网中的主机可以透明的连接外部网和可以连接外部网中可选的主机。网络组织
的建立首先是为了局域网内部的应用,还有和广域网的连接需要是这个规划的很好候补。
许多小公司,家庭办公室(SOHO)用户和电信员工在它们的办公室有多个网络节点运
行TCP/UDP应用程序,但是服务提供商只有给他们在远程连通路由提供唯一的IP地址。
这个远程连接用户渐增的社区将从NAPT中获得好处,NAPT将允许在局域网中有多个
节点同时用路由器附以的唯一IP地址连接远程网络。
用这种方式有许多局限性。属于一个会议的所有请求和应答强制路游通过相同的
NAT路由器。一种确认的方式将是有一个基于唯一残缺网段路由的NAT,在那所有的IP
包或者从那个起始或者以那个为目的地。还有其他方法用多NAT设备来确保这个规则。
例如,一个单一能够拥有两个不同的出口到不同的提供者和局部网络的主机之间的会议
能够穿过NAT设备到达外部主机的最好途径。当一个NAT路由器不正常 ,其他的路由
器能够路由所有连接。但是在这中方法下有可能有一个警告,因为再次路由的流量可能
在新的NAT路由交换时间里交换失败。一种解决这个问题的方法是路由器共享相同的
NAT配置和交换状态信息一保证互相失败备份。
地址转换是独立的应用,经常伴随特殊应用网关(ALOGS)执行有效负荷检测
和变换。FTP是NAT设备里最常用ALG功能。要求ALG干涉的应用一定不能有他们自
己的有效负荷编码,因为那样可能影响到使ALG失笑,直到ALG有解密有效负荷的主
键。
这个方法有个缺陷是取消了IP地址点对点的意义,和在网络中用增加的状态来
补偿。总之,通过IPSec保证的点对点IP网络层安全不能适用于终端主机,如果有NAT
设备路由。但是,这个方法的优点是它在不需要变换主机和路由器的情况下安装。
在这篇文章里一些概念的定义例如“地址域”,“透明路由”,“TV端口”,“ALG”
和其它概念可以在NAT-TERM里找到。
2. 传统NAT概述:
在这个文档里描述的地址转换操作是根据“传统NAT”。其它的NAT在这个文档里
没有给以描述。在大部分情况下,传统NAT允许在局域网的主机透明的和外部主机连接。
在传统NAT中,从局域网到广域网方式是单一方向的。相反方向的两个任务可能允许预
选择主机状态地址影射的异常。基本NAT和NAPT是不同的两种传统NAT,因为基本
NAT地址转换只是限于IP地址,然而NAPT的地址转换包括IP地址转换和传输认证(例
如TCP/UDP端口或ICMP询问ID)。
除了提到的那些外,贯穿这篇文章的地址转换或NAT属于传统NAT,也就是基本NAT
和NAPT。只有如底下图一中所描述的残段网可能配置成执行地址转换。








2.1基本NAT的概述:
基本NAT的操作如下。拥有一系列IP地址的残域能够和外部网络通讯,通过映射
本地地址成全球统一地址。如果本地节点数量等于或小于有效通用地址的数量,每个本
地地址都能保证映射到。另外,能够多个出口到广域网的节点数受通用地址的数量限制。
单一本地地址应该映射成一个专门的全球通用地址来保证连通外部或者通过一个公共地
址来与外部连接。多路同时任务可以从一个本地节点进行初始化,用相同的地址映射。
在一个残域里的地址只是在本地有效而在此域外却是无效的。但是,在一个残域里
的地址可以被任何其他的残域从新使用。例如,一个单一类A地址能够被许多残域地址
所使用。在每一个残域和主干网的出口点安装NAT。如果有多个出口,每个出口应该有
相同的转换表。
例如,如图2,残域A和B内部都用类A地址段10.0.0.0/8[RFC1918]。残域A的
NAT附议C类地址段198.76.29.0/24,而残域B的NAT附议C类地址段198.76.28.0/24。
C类地址是全球通用的唯一地址,其他NAT都不能用它们。
























当残域A主机10.33.96.5试图发送一个包到残域B主机10.81.13.22时,用全球通用地址
198.76.28.4作为目标主机地址,然后送包到第一个路由器。残域路由器对网络198.76.28.4
有一个静态所以包可以继续往前到广域网路由器。但是,NAT在包被继续向前送之前转
换源地址10.33.96.5成198.76.29.7。相应的,IP包往回传时依据相同的地址转换。
需要注意的是主机或路由器不要改变。例如,针对残域A主机,198.76.28.4是残域B
中的地址。在绝大多数情况下,地址转换对目标主机是通明的。当然,这个只是一个简
单的例子。还有很多问题待解决。
2.2 NAPT概述:
有一种说法,一个组织有一个局域网和一个广域网连接到服务提供商。局域网络的
残域路由器附议在广域网连接中的有效地址而此组织中剩余的节点拥有只是在本地有效
的IP地址。在这种情况下,局域网的多个节点允许多个连接到广域网,在NAPT的帮助
下用登记的唯一IP地址。NAPT允许映射两个类型(登记IP地址,TV端口数)到两个
类型( 登记IP地址,TV端口数)。这种模型符合大部分小公司家庭公司(SOHO)团
体用服务提供商提供的登记IP地址连接广域网的要求。这个模型能够扩展趁允许内部连
接通过映射登记IP地址的每一个服务TV端口的本地节点。
在下面的图3中,残域A内部用A类地址段10.0.0.0/8。残域路由器接口被服务提供
商附以IP地址138.76.28.4.
当残域A主机10.0.0.10发送一个远程登陆包到主机138.76.29.7,用全球通用地址
138.76.29.7作为目标地址,然后送包到第一个路由器。残域路由器有一个子网
138.76.0.0/16静态路由,所以包可以继续往前传送到广域网。但是,在包被网前传之前,
NAPT 转换IP和TCP包头里源地址10.0.0.10和源TCP端口3017成通用唯一地址
138.76.28.4和唯一TCP端口。在往回传的包经过同样的地址和TCP端口转换。和上边
一样,我们必修注意,这个转换不需要改变主机或路由器。这个转换是完全透明的。
在这个设置中,只有TCP/UDP任务允许且必须从本地局域网中初始化。但是,有
些服务例如DNS要求内部访问。还有其它服务一个组织想允许内部任务访问。在路由器
上,静态配置一个残域网众所周知的端口是可能的[RFC 1700],可以直接连向专门的




















局域网节点。
除了重定向信息类型,TCP/UDP任务和ICMP信息都可以通过NAPT路由器来控制。
ICMP查询类型包和TCP/UDP包的转换类型一样,在于ICMP包头的标志域一对一地和
登记IP地址的查询标志对应。在ICMP查询信息中的标志域由发送者设置并且从查询问
答端毫无改变的反馈。所以,一对地址(本地IP地址,本地ICMP查询标志)通过NAPT
路由器映射成一对(登记IP地址,附议的ICMP查询标志),这个过程保证从任何本地
主机来的任何类型有唯一的标志。ICMP错误信息的更改在以后的章节中给以讨论,包
括ICMP有效负荷的改变和IP和ICMP报头。
在NAPT设置中,任何登记IP地址和残域网路由器的广域网接口的IP地址一样的地
方,路由器必须保证区分发生于自己的TCP,UDP或ICMP查询任务 和那些发生于局
域网节点的任务。所有内部任务(包括TCP,UDP和ICMP查询任务)被假设为直接到
NAT路由器作为终节点,除非目标服务端口静态映射于局域网中的不同节点。
除了TCP,UDP和ICMP查询类型的任务不允许从本地节点由NAPT路由器传输。
3.0 任务传输过程
传统NAT的传输过程和[NAT-TERM]中描述的一样。下面的部分说明和传统NAT
的特殊的内容。
3.1 地址绑定:
用基本NAT,当第一个外传任务从私有主机初始化时,一个内部私有地址绑定一个
外部地址。后来,所有其它的外传任务从相同的私有地址初始化将用相同的地址绑定来
传输包数据。
对NAPT而言,在许多私有地址映射一个全球唯一地址时,绑定是从成对地址(私
有IP地址,私有TV端口)到另外一对地址(指派地址,指派TV端口)。和基本NAT
一样,绑定是在第一个外传任务有一对地址(私有IP地址,私有TV端口)发动时决定
的。由于不是一个普通实践,有可能同时多个任务初始化一对相同地址(私有地址,私
有端口)在一个私有主机中建立是可能的。在这种情况下,一对地址(私有地址,私有
TV端口)的一个唯一绑定可能用于所有从相同地址主机中的任务传送的包。
3.2 地址查询和转换:
在一个地址绑定或地址对绑定(假设NAPT以建立),一个软状态将用绑定来维持
任何连接。属于相同任务的包将服从转换目的的任务查询。转换的确切属性将在接下去
的章节中进行讨论。
3.3 解开地址
当基于单个地址或成对地址绑定的最后一个任务终止时,绑定自己将终止。
4.0 包传输
属于NAT管理任务的包经历任何方向的转换。对立包数据任务在接下去进行详细的描
述。
4.1 IP,TCP,UDP 和ICMP报头操作:
在基本NAT模型,每个包的IP头必须改变,包括IP地址(外传包的源IP地址,往里
传的目的IP地址)和IP校验和。
对TCP和UDP任务,改变包括TCP和UDP报头的校验和的更正。这是因为TCP/UDP
校验和同时有一个假头包含源和目的IP地址。有一个例外,校验和为0的UDP报头不需要
改变。至于ICMP查询包,由于在ICMP报头中不包含IP地址,所以不需要额外的变化。
在NAPT模型中,IP头的变化和基本NAT中的相同。对TCP/UDP任务,在报头中变化
必须扩展成包含转换TV端口(外传数据的源TV端口和内传的目的TV端口)的转换。在
ICMP查询包中ICMP报头必须改变来代替查询ID和ICMP报头校验和。私有主机查询ID
必须转换成外传的指派ID和内传的相信转换。ICMP报头校验和必须更正来说明查询ID转
换。
4.2 校验和调整
NAT修正以每个包为准的,能够准确计算,因为除了简单域转换外,它们包括一个或多个
校验和修正。幸运的是,我们有一个算法,它能简单有效地调整IP,TCP,UDP和ICMP
报头校验和。因为所有这些报头用一个辅助校验和在转换时计算差距和把它加到校验和是足
够的。下面的算法只有对偶偏移有效(如:下面optr是从报头开始必须是偶偏移)和偶数
长度(如,下面的olen和nlen)。样本代码如下:

Void checksumadjust(unsigned char *chksum, unsigned char *optr, int olen,
unsigned char *nptr, int nlen)
/assuming:unsigned char is 8 bits, long is 32 bits.
- chksum points to the chksum in the packet
- optr points to the old data in the packet
- nptr points to the new data in the packet */
{
long x,old,new;
x=chksum[0]*256+chksum[1];
x=x&0xFFFF;
while(olen)
{
old = optr[0]*256+optr[1];
optr+=2;
x-=old&oxffff;
if(x<=0 ){ x--; x&=0xffff;}
olen-=2;
}
while(nlen)
{
new=nptr[0]*256+nptr[1];
nptr+=2;
x+= new& 0xffff;
if(x & 0x10000){ x++; x&=0xffff;}
nlen-=2;
}
x=x& 0xffff;
chksum[0]=x/256;
chksum[1]=x&0xff;
}
4.3 ICMP包错误修正:
ICMP错误信息的变化包括在外层的IP和ICMP报头的变化和嵌入在ICMP错误信息有
效负荷报头的改变。
为了使NAT对目的主机是透明的,嵌入在ICMP错误信息里的IP报头里的IP地址必
须改变,嵌入IP报头的校验和域也必须改变,最后ICMP报头校验和也必须随着有效负荷
的变化而变化。
在NAPT设置中,如果嵌入在ICMP里的IP信息和TCP,UDP或ICMP查询包同时发
生,你必须改变在TCP/UDP报头里的相应的TV端口数或ICMP查询报头里的查询标志域。
最后,传输ICMP包的IP头必须改变。
4.3 FTP支持
作为最通用的一种应用之一,FTP要求一个ALG来管理控制任务有效负荷来决定保证数
据传输参数。FTP ALG是大部分NAT执行的一个整数部分。
FTP ALG表需要一个一个专门的表来纠正TCP系列和确认源FTP或目的FTP端口数。
这个表里头应该有源地址,目的地址,源端口,目的端口,系列号和时间戳。新的内容只是
在FTP端口命令或PASV反馈时才增加。对每一个FTP端口命令或PASV反馈系列数有可
能增加或减少。系列数在外传时增加和确认数随往内传时减少。
对任何NAT,FTP有效负荷局限于私有地址和它们指派的外部地址(编码成ASCII码8
进制)。但是对NAPT设置,这个转换必须同时包括TCP端口(ASCII)。
4.5 DNS支持;
考虑传统NAT任务主要是从本地外传数据,DNS ALG可能避免和下面的传统NAT相关
使用。在局域网内部的DNS服务器维持内部主机地址或有可能外部主机地址和名字的映射。
外部DNS服务器只是维持外部主机地址和名字的映射,而不对内部主机进行映射。如果一
个局域网没有内部DNS服务器,所有DNS请求直接到外部DNS服务器去找外部主机的映
射。
4.6 IP选项处理
一个含有任何IP选项记录路由,严格源路由或松散源路由的IP数据包括记录和使用中
间路由器的IP地址。NAT中间路由器可能不支持这些选项或者处理这些选项时不对地址进
行转换。不对地址进行转换的结果将是在源路由中私有地址一直暴露出来。这个不会危害报
文的传输路径,因为每个路由器只看下一跳的路由器。
5 混杂的问题
5.1本地和通用地址的划分
在这个文档里描述的NAT操作,有必要划分IP地址空间为两部分—在内部残域里使用的私
有地址和通用唯一的地址。不论是私有地址还是全球通用地址给定的话,都不能重叠。
交迭的问题为如下。假设在残域A的一个主机试图传送数据报到残域B中的主机,但是残
域B中的全球地址和残域A的私有地址交迭。在这种情况下,在残域A中的路由器不能够
从分辨它自己的私有地址和残域B的全球通用地址。
5.2推荐的私有地址空间
[RFC1918]已经对地址空间的分配作了推荐。因特网授权数量权威(IANA)有3个IP地址
空间块,相应的为:10.0.0.0/8,172.16.0.0/12,和192.168.0.0/16。在pre-CIDR符号中,第一个
为唯一的A类网络块,第二块为有16个相邻的B类网络块,第三块为有256个C类网络
的网络块。一个组织内部需要用如上的IP地址不需要和IANA或因特网注册机构有任何调
和。这些地址空间能够同时被许多对立组织使用,用边界路由器来执行NAT操作。
5.3 NAT上路由
路由器运行NAT不应该用局域网影响到主干网。只有有通用地址的网络才能在残域网外
被识别。但是,NAT从残域边界路由器获得的全球信息能够进入残域。特别的是,NAT残
域路由器有一个静态路由配置来通过广域网连接传送外部流量到服务商路由器,和服务商路
由器有一个静态路由配置在广域网连接来传输NAT报文(如,目标IP地址在NAT管理通
用地址范围列表里)到NAT路由器。
5.4 从基本NAT到NAPT的交换
在基本NAT设置里,当私有节点比通用地址数量多时(也就是说,一个B类私有网络
映射一个C类地址网络块),外面网络连接本地节点有可能突然中断在最后一个通用地址用
完之后。这个是非常不方便和受限制的。这样的情况能够安全的避免通过有选择地允许基本
NAT路由器为在地址表最后一个通用地址交换成NAPT设置。这能保证局域网里主机能够
和外部节点和服务能够在大部分应用中连续的连接。但是记住,如果一些基于基本NAT的
应用由于交换到NAPT突然中断有可能引起混乱。
6.0 NAT局限性
广泛的说,[NAT-TERM]包括所有NAT类型的局限性。下面的部分说明传统NAT的局限
性。
6.1 私有和安全
传统NAT被认为提供一种私有机制,因为任务是从主机出发的单向连接和私有主机地址
的确切地址对外部网络是不可见的。增强私有性的相同特性使调试问题更加困难(包括安全
问题)。如果私有网络里的一个主机用某种方式乱用因特网(例如试图攻击另外一台机器或
甚至发送大的垃圾数据报),那么更加困难追击确实的原因因为主机隐藏在NAT服务器中)。
6.2在局域网中根据映射通用地址NAT的ARP接口
NAT必须只能在边缘路由器或残域中。在这个文档中提供的例子寿命了基本NAT和
NAPT可以从NAT路由器维持一个广域网连接到外部路由器中。(如,服务提供商路由器)。
但是,如果广域网连接由局域网连接代替和如果所有NAT映射的通用地址属于局域网段有
相同的IP子网,NAT路由器将提供属于相同子网的地址范围ARP支持。根据ARP要求NAT
映射通用地址用它自己的MAC地址 在基本NAT中是必须的设置。如果一个NAT路由器
不适应这些要求,在网络中没有其它节点拥有这些地址然后没有反映。
这些设想不可能用NAPT设置除了当在NAPT映射中的单个地址不是NAT路由器的接
口地址。(例如,在上面5。4中谈到的从基本NAT到NAPT 的交换一样)。用NAT地址映
射直接连接的子网范围内的一个地址可以避免在服务提供商路由器的静态路由设置。
作者的意见是一个局域网连接到服务提供商路由器不是非常普通的。但是,销售商在这种情
况下对支持代理ARP比较感兴趣。
6.3在NAPT设置中外发TCP/UDP数据报的转换
在NAPT设置中外发TCP/UDP数据报的转换(如,那些从私有主机发出的地址)注定要失
败。它的原因如下:只有第一个数据片包含TCP/UDP报头,而这个数据报头对数据报的发
送又是必须的。接下去的片段不包含TCP/UDP端口信息,但是包含其它第一个数据报中包
含的一些标志信息。也就是说,两个私有主机发送TCP/UDP数据报到相同的目的主机。和,
它们用相同的片标志。当目的主机收到这两个没有相关的数据报,它们有相同的片标志,和
相同的指派主机地址,所以不可能决定数据报是属于哪个发送任务。相应的,两个任务同时
崩溃。
7.0 当前实现
很多行业应用商业应用,这些商业应用和这个文档中描述的NAT紧密关联。LINUX公众软
件在IP伪装下有NAT。FreeBSD公众软件用NAPT来运行用作邮件收发的后台程序。但是
必须注意,LINUX源程序包含GNU声明,而FreeBSD软件包含UC Berkeley 声明。8。0 安
全考虑
在{NAT-TERM}描述中的对任何NAT的安全考虑对传统NAT也是适用的。

参考资料
[NAT-TERM] Srisuresh, P. and M. Holdrege, "IP Network Address
Translator (NAT) Terminology and Considerations", RFC
2663, August 1999.

[RFC 1918] Rekhter, Y., Moskowitz, B., Karrenberg, D., de Groot, G.
and E. Lear, "Address Allocation for Private Internets",
BCP 5, RFC 1918, February 1996.

[RFC 1700] Reynolds, J. and J. Postel, "Assigned Numbers", STD 2, RFC
1700, October 1994.

[RFC 1122] Braden, R., "Requirements for Internet Hosts --
Communication Layers", STD 3, RFC 1122, October 1989.

[RFC 1123] Braden, R., "Requirements for Internet Hosts --
Application and Support", STD 3, RFC 1123, October 1989.

[RFC 1812] Baker, F., "Requirements for IP Version 4 Routers", RFC
1812, June 1995.

[FTP] Postel, J. and J. Reynolds, "FILE TRANSFER PROTOCOL
(FTP)", STD 9, RFC 959, October 1985.

[TCP] Defense Advanced Research Projects Agency Information
Processing Techniques Office, "TRANSMISSION CONTROL
PROTOCOL (TCP) SPECIFICATION", STD 7, RFC 793, September
1981.

[ICMP] Postel, J., "INTERNET CONTROL MESSAGE (ICMP)
SPECIFICATION", STD 5, RFC 792, September 1981.

[UDP] Postel, J., "User Datagram Protocol (UDP)", STD 6, RFC
768, August 1980.

[RFC 2101] Carpenter, B., Crowcroft, J. and Y. Rekhter, "IPv4 Address
Behaviour Today", RFC 2101, February 1997.
RFC3022 Traditional IP Network Address Translator (Traditional NAT) 传统IP网络地址转换(传统NAT)


1
RFC文档中文翻译计划

 
接受答案了.
 
后退
顶部