natp资料

引言
近年来,随着Internet的迅猛发展,连入Internet的主机数量成倍增长。由于最初设计Internet的时候并没有考虑到需要支持这么大的规 模,因而Internet使用的Ipv4协议中IP地址的长度选择了32位,它可以使IP包的格式很好地对齐;但是,目前IP地址的短缺已经成为 Internet面临的最大问题之一。
为了解决IP地址短缺的问题,人们提出了许多解决方案,Internet能够支持到新一代IP协议Ipv6的出台。在众多的解决方案中,网络地址转换 NAT(Network Address Translation)技术提供了一种完全将私有网和公共网隔离的方法,从而得到了广泛的应用。图1 NAT工作原理示意图1 NAT技术
NAT技术的基本功能就是,用1个或几个IP地址来实现1个私有网中的所有主机和公共网中主机的IP通信。NAT技术可为TCP、UDP以及ICMP数据包提供透明转发。
1.1 NAT工作原理
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)转 发到私有网。对于通信双方而言,这种地址的转换过程是完全透明的。
1.2 NAPT技术
由于NAT实现是私有IP和NAT的公共IP之间的转换,那么,私有网中同时与公共网进行通信的主机数量就受到NAT的公共IP地址数量的限制。为了克服 这种限制,NAT被进一步扩展到在进行IP地址转换的同时进行Port的转换,这就是网络地址端口转换NAPT(Network Address Port Translation)技术。
    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的转 换是完全透明的。

NAPTNetwork Address Port Translation)即网络端口地址转换,就是将多个内部地址映射为一个合法公网地址,但以不同的协议端口号与不同的内部地址相对应。也就是<内部地址+内部端口><外部地址+外部端口>之间的转换。NAPT普遍用于接入设备中,它可以将中小型的网络隐藏在一个合法的IP地址后面。

NAPT使得一组主机可以共享唯一的外部地址,当位于内部网络中的主机通过NAT设备向外部主机发起会话请求时,NAT设备就会查询NAT表,看是否有相关会话记录,如果有相关记录,就会将内部IP地址及端口同时进行转换,再转发出去;如果没有相关记录,进行IP地址和端口转换的同时,还会在NAT表增加一条该会话的记录。外部主机接收到数据包后,用接受到的合法公网地址及端口作为目的IP地址及端口来响应,NAT设备接收到外部回来的数据包,再根据NAT表中的记录把目的地址及端口转换成对应的内部IP地址及端口,转发给该内部主机。

以下给出了一个实例(如图1-2),NAPT的基本过程与NAT类似,所不同的是:NAPT中内部端口与内部地址都进行了转换,而NAT中仅仅只对内部地址进行转换。

natp资料

1-2 网络端口地址转换(NAPT)的基本过程

1-2中,4个带有内部地址的数据包到达HiPER,其中数据包12来自同一个内部地址但有不同的源端口号,数据包34来自不同的内部地址但具有相同的源端口号。通过NAPT4个数据包都被转换到同一个外部地址,但每个数据包都赋予了不同的源端口号,因此区分了这4个数据包。当回复数据包到达时,NAPT就能根据回复数据包的目的地址和端口来区分该数据包应转发到的内部主机。

Internet中使用NAPT时,所有不同的TCPUDP信息流看起来好像来源于同一个IP地址。这种方式常用于拨号上网,通过从ISP处申请的一个IP地址,将多个连接通过NAPT接入Internet。在实际使用中可以把NAPT和基本NAT结合起来,即将一组外部地址和端口转换结合起来。

NAPT为每一个Session分配一个NAPT自己的端口号,依据此端口号来判断将收到的公网IP主机返回的TCP/IP数据包转发给那台内网IP地址的计算机。 在这里Session是虚拟的,UDP通讯并不需要建立连接,但是对于NAPT而言,的确要有一个Session的概念存在。NAPT对于UDP协议包的 透明传输面临的一个重要的问题就是如何处理这个虚拟的Session。我们都知道TCP连接的Session以SYN包开始,以FIN包结束,NAPT可 以很容易的获取到TCP Session的生命周期,并进行处理。但是对于UDP而言,就麻烦了,NAPT并不知道转发出去的UDP协议包是否到达了目的主机,也没有办法知道。而 且鉴于UDP协议的特点,可靠很差,因此NAPT必须强制维持Session的存在,以便等待将外部送回来的数据并转发给曾经发起请求的内网IP地址的计 算机。NAPT具体如何处理UDP Session的超时呢?不同的厂商提供的设备对于NAPT的实现不近相同,也许几分钟,也许几个小时,些NAPT的实现还会根据设备的忙碌状态进行智能 计算超时时间的长短。

                  [192.168.0.6:1827]
                            | UDP Packet[src ip:192.168.0.6 src port:1827 dst ip:61.51.76.102 dst port 8098]
                            v
        [pub ip: 61.51.99.86]NAT[priv ip: 192.168.0.1]
                            | UDP Packet[src ip:61.51.99.86 src port:9881 dst ip:61.51.76.102 dst port 8098]
                            v                  
                  [61.51.76.102:8098]
                 
                                    图四: NAPT 将内部发出的UDP协议包的源地址和源端口改变传输给公网IP主机。
                                   
                                   
                  [192.168.0.6:1827]
                            ^
                            | UDP Packet[src ip:61.51.76.102 src port:8098 dst ip:192.168.0.6 dst port 1827]
        [pub ip: 61.51.99.86]NAT[priv ip: 192.168.0.1]
                            ^  
                            | UDP Packet[src ip:61.51.76.102 src port:8098 dst ip:61.51.99.86 dst port 9881]   
                  [61.51.76.102:8098]
                 
                                    图五: NAPT 将收到的公网IP主机返回的UDP协议包的目的地址和目的端口改变传输给内网IP计算机。                               
现在我们大概明白了NAPT如何实现内网计算机和外网主机间的透明通讯。现在来看一下我们最关心的问题,就是NAPT是依据什么策略来判断是否要为一个请求发出的UDP数据包建立Session的呢?主要有一下几个策略:

A. 源地址(内网IP地址)不同,忽略其它因素, 在NAPT上肯定对应不同的Session
B. 源地址(内网IP地址)相同,源端口不同,忽略其它的因素,则在NAPT上也肯定对应不同的Session
C. 源地址(内网IP地址)相同,源端口相同,目的地址(公网IP地址)相同,目的端口不同,则在NAPT上肯定对应同一个Session
D. 源地址(内网IP地址)相同,源端口相同,目的地址(公网IP地址)不同,忽略目的端口,则在NAPT上是如何处理Session的呢?

D的情况正式我们关心和要讨论的问题。依据目的地址(公网IP地址)对于Session的建立的决定方式我们将NAPT设备划分为两大类:

Symmetric NAPT:
对于到同一个IP地址,任意端口的连接分配使用同一个Session; 对于到不同的IP地址, 任意端口的连接使用不同的Session.
我们称此种NAPT为 Symmetric NAPT. 也就是只要本地绑定的UDP端口相同, 发出的目的IP地址不同,则会建立不同的Session.

        [202.223.98.78:9696] [202.223.98.78:9696] [202.223.98.78:9696]
                ^               ^                       ^
                |               |                       |
                v               v                       v
               9883            9882                    9881
                                 |
                             [NAT] /
                                 ^
                                 |
                                 v                       
                          [192.168.0.6:1827]
                         
                          图六: Symmetric 的英文意思是对称。多个端口对应多个主机,平行的,对称的!
                 
Cone NAPT:
对于到同一个IP地址,任意端口的连接分配使用同一个Session; 对于到不同的IP地址,任意端口的连接也使用同一个Session.
我们称此种NAPT为 Cone NAPT. 也就是只要本地绑定的UDP端口相同, 发出的目的地址不管是否相同, 都使用同一个Session.

        [202.223.98.78:9696] [202.223.98.78:9696] [202.223.98.78:9696]

                        ^          ^         ^
                                  |        /
                          v        v       v
                                 9881
                                 [NAT]
                                   ^
                                   |
                                   v                     
                          [192.168.0.6:1827]
                         
                          图七: Cone 的英文意思是锥。一个端口对应多个主机,是不是像个锥子?

现在绝大多数的NAPT属于后者,即Cone NAT。本人在测试的过程中,只好使用了一台日本的Symmetric NAT。还好不是自己的买的,我从不买日货, 希望看这篇文章的朋友也自觉的不要购买日本的东西。Win9x/2K/XP/2003系统自带的NAPT也是属于 Cone NAT的。这是值的庆幸的,因为我们要做的UDP穿透只能在Cone NAT间进行,只要有一台不是Cone NAT,对不起,UDP穿透没有希望了,服务器转发吧。后面会做详细分析!

下面我们再来分析一下NAPT 工作时的一些数据结构,在这里我们将真正说明UDP可以穿透Cone NAT的依据。这里描述的数据结构只是为了说明原理,不具有实际参考价值,真正感兴趣可以阅读Linux的中关于NAT实现部分的源码。真正的NAT实现 也没有利用数据库的,呵呵,为了速度!

Symmetric NAPT 工作时的端口映射数据结构如下:

内网信息表:

[NAPT 分配端口] [ 内网IP地址 ] [ 内网端口 ] [ 外网IP地址 ] [ SessionTime 开始时间 ]

PRIMARY KEY( [NAPT 分配端口] ) -> 表示依据[NAPT 分配端口]建立主键,必须唯一且建立索引,加快查找.
UNIQUE( [ 内网IP地址 ], [ 内网端口 ] ) -> 表示这两个字段联合起来不能重复.
UNIQUE( [ 内网IP地址 ], [ 内网端口 ], [ 外网IP地址 ] ) -> 表示这三个字段联合起来不能重复.

映射表:

[NAPT 分配端口] [ 外网端口 ]

UNIQUE( [NAPT 分配端口], [ 外网端口 ] ) -> 表示这两个字段联合起来不能重复.

Cone NAPT 工作时的端口映射数据结构如下:

内网信息表:

[NAPT 分配端口] [ 内网IP地址 ] [ 内网端口 ] [ SessionTime 开始时间 ]

PRIMARY KEY( [NAPT 分配端口] ) -> 表示依据[NAPT 分配端口]建立主键,必须唯一且建立索引,加快查找.
UNIQUE( [ 内网IP地址 ], [ 内网端口 ] ) -> 表示这两个字段联合起来不能重复.

外网信息表:

[ wid 主键标识 ] [ 外网IP地址 ] [ 外网端口 ]

PRIMARY KEY( [ wid 主键标识 ] ) -> 表示依据[ wid 主键标识 ]建立主键,必须唯一且建立索引,加快查找.
UNIQUE( [ 外网IP地址 ], [ 外网端口 ] ) -> 表示这两个字段联合起来不能重复.

映射表: 实现一对多,的

[NAPT 分配端口] [ wid 主键标识 ]

UNIQUE( [NAPT 分配端口], [ wid 主键标识 ] ) -> 表示这两个字段联合起来不能重复.
UNIQUE( [ wid 主键标识 ] ) -> 标识此字段不能重复.

看完了上面的数据结构是更明白了还是更晕了? 呵呵! 多想一会儿就会明白了。通过NAT,内网计算机计算机向外连结是很容易的,NAPT会自动处理,我们的应用程序根本不必关心它是如何处理的。那么外部的计算机想访问内网中的计算机如何实现呢?我们来看一下下面的流程:

c 是一台在NAPT后面的内网计算机,s是一台有外网IP地址的计算机。c 主动向 s 发起连接请求,NAPT依据上面描述的规则在自己的数据结构中记录下来,建立一个Session. 然后 c 和 s 之间就可以实现双向的透明的数据传输了。如下面所示:

   c[192.168.0.6:1827] <-> [priv ip: 192.168.0.1]NAPT[pub ip: 61.51.99.86:9881] <-> s[61.51.76.102:8098]

由此可见,一台外网IP地址的计算机想和NAPT后面的内网计算机通讯的条件就是要求NAPT后面的内网计算机主动向外网IP地址的计算机发起一个 UDP数据包。外网IP地址的计算机利用收到的UDP数据包获取到NAPT的外网IP地址和映射的端口,以后就可以和内网IP的计算机透明的进行通讯了。
   
现在我们再来分析一下我们最关心的两个NAPT后面的内网计算机如何实现直接通讯呢? 两者都无法主动发出连接请求,谁也不知道对方的NAPT的公网IP地址和NAPT上面映射的端口号。所以我们要靠一个公网IP地址的服务器帮助两者来建立 连接。当两个NAPT后面的内网计算机分别连接了公网IP地址的服务器后,服务器可以从收到的UDP数据包中获取到这两个NAPT设备的公网IP地址和这 两个连接建立的Session的映射端口。两个内网计算机可以从服务器上获取到对方的NAPT设备公网IP地址和映射的端口了。

我们假设两个内网计算机分别为A和B,对应的NAPT分别为AN和BN, 如果A在获取到B对应的BN的IP地址和映射的端口后,迫不急待的向这个IP
地址和映射的端口发送了个UDP数据包,会有什么情况发生呢?依据上面的原理和数据结构我们会知道,AN会在自己的数据结构中生成一条记录,标识一个新 Session的存在。BN在收到数据包后,从自己的数据结构中查询,没有找到相关记录,因此将包丢弃。B是个慢性子,此时才慢吞吞的向着AN的IP地址 和映射的端口发送了一个UDP数据包,结果如何呢?当然是我们期望的结构了,AN在收到数据包后,从自己的数据结构中查找到了记录,所以将数据包进行处理 发送给了A。A 再次向B发送数据包时,一切都时畅通无阻了。

PS:

端口映射的原理
内网的一台电脑要上因特网,就需要端口映射
端口映射分为动态与静态
动态端口映射:
内网中的一台电脑要访问新浪网,会向NAPT网关发送数据包,包头中包括对方
(新浪网)IP,端口和本机IP,端口,NAPT网关会把本机IP,端口替换成自己的公网一个
未使用的端口,并且会记下这个映射关系,为以后转发数据包使用。然后再把数据发判断
给新浪网,新浪网收到数据后做出反应,发送数据到NAPT网关的那个未使用的端口,
然后NAPT网关将数据转发给内网中的那台电脑,实现内网和公网的通讯,当连接
关闭时,NAPT网关会释放分配给这条连接的端口,以便以后的连接可以继续使用。
NAPT网关的工作方式,由网关自动添加NAPT记录,一个映射关系

静态端口映射:
就是在NAPT网关上开放一个固定的端口,然后设定此端口收到的数据要转发给
内网的哪个IP和端口,不管有没有连接,这个映射关系都会一直存在。就可以
让公网主动访问网的一个电脑。

你可能感兴趣的:(natp资料)