NAT简介

来源:互联网 发布:linux 70秒漏洞 编辑:程序博客网 时间:2024/06/05 20:07


下面是NAT的几种类型

NAT设备的类型对于TCP穿越NAT,有着十分重要的影响,根据端口映射方式,NAT可分为如下4,3NAT类型可统称为cone类型。
(1)
全圆锥( Full Cone) :NAT把所有来自相同内部IP地址和端口的请求映射到相同的外部IP地址和端口。任何一个外部主机均可通过该映射发送IP包到该内部主机。
(2)
限制性圆锥(RestrictedCone) : NAT把所有来自相同内部IP地址和端口的请求映射到相同的外部IP地址和端口。但是,只有当内部主机先给IP地址为X的外部主机发送IP,该外部主机才能向该内部主机发送IP包。
(3)
端口限制性圆锥( PortRestricted Cone) :端口限制性圆锥与限制性圆锥类似,只是多了端口号的限制,即只有内部主机先向IP地址为X,端口号为P的外部主机发送1IP,该外部主机才能够把源端口号为PIP包发送给该内部主机。

(4)对称式NAT ( Symmetric NAT): 对称式NAT与端口限制性圆锥类似,唯一不同的是当同一内部主机使用相同的端口与不同IP地址或端口的外部主机进行通信时, NAT对该内部主机的端口映射会有所不同,这种情况下NAT会针对不同IP地址或端口的外部主机为内部主机的相同端口分配新的外部端口号。对称式NAT不保证所有会话中的私有地址端口和公开地址端口之间绑定的一致性。相反,它为每个新的会话分配一个新的端口号。这种情况下内部主机的“内网IP地址和端口”与“NAT IP地址和端口”之间会形成一对多关系。

 

这是我在网上找到的另一份关于NAT四种类型的解释,我觉得这个叙述更加清楚明了,这里写下来作为补充,请按照顺序和上面叙述的四种NAT类型进行对照理解:

从内网主机发出报文访问外网目标时,可用四元组[源IP,源端口,目标IP,目标端口]来表示会话:
[私有源地址,私有源端口,全局目标地址,全局目标端口]
    ↓NAT
[全局源地址,全局源端口,全局目标地址,全局目标端口]
   NAT在对不同的私有源地址进行转换的时候,可能转换成同一全局源地址,也可能转换成不同的全局源地址(如果NAT地址池配置有多个全局地址)。
   而对于同一私有源地址和端口的转换情况则分为以下几种:
(1)完全Cone NAT 无论目标地址和端口怎样,每次都把该私有源IP地址/端口映射到同一个全局源地址/端口;外网的任何主机都可以发送报文到该映射的全局地址而访问到该内部主机。路由器的静态地址映射就是属于这种。
(2)限制Cone NAT 地址/端口映射的情况同完全Cone NAT的,但外网的主机要访问内网主机,该内网主机必须先发送过报文给该外网主机的地址。
(3)端口限制Cone NAT地址/端口映射情况同完全Cone NAT的,但外网主机要访问内网主机,该内网主机必须先发送过报文给该外网主机的地址和端口。大多数路由器的NAPT就是属于这种情况。本文后面论及的Cone NAT也是指这种情况。

(4)Symmetric NAT 对不同的目标地址/端口,源私有地址映射到源全局地址不变,但是映射的全局端口会改变。外网主机必须先收到过内网主机的报文,才能访问到该内网主机。一些路由器和防火墙产品的NAT就是属于这种情况。

    Symmetric NAT并不对新会话进行端口绑定,而是分配一个全新的NAT端口给每一个新的会话.
     Server S1                                    Server S2
       18.181.0.31:1235                             138.76.29.7:1235
              |                                            |
              |                                            |
              +----------------------+----------------------+
                                     |
          ^  Session 1(A-S1)  ^      |     ^  Session 2 (A-S2)  ^
          | 18.181.0.31:1235  |     |      |  138.76.29.7:1235  |
          v 155.99.25.11:62000v      |      v155.99.25.11:62001 v
                                     |
                                Symmetric NAT
                                155.99.25.11
                                     |
          ^  Session 1(A-S1)  ^      |     ^  Session 2 (A-S2)  ^
          | 18.181.0.31:1235  |     |      |  138.76.29.7:1235  |
          v  10.0.0.1:1234    v     |      v   10.0.0.1:1234    v
                                     |
                                  Client A
                               10.0.0.1:1234
    如上图,如果ClientA同时发起两个会话到S1和S2,对称NAT会分配NAT地址155.99.25.11:62000给Session1,然后分配另一个不同的NAT地址155.99.25.11:62001给Session2.对称NAT能够区别两个不同的会话并进行地址转换,应用程序每发出一个会话都会使用一个新的端口.

 

下面我们接着来看看对NAT进行打洞的流程与原理

先假设:有一个服务器S在公网上有一个IP,两个私网分别由NAT-ANAT-B连接到公网,NAT-A后面有一台客户端ANAT-B后面有一台客户端B,现在,我们需要借助SAB建立直接的TCP连接,即由BA打一个洞,让A可以沿这个洞直接连接到B主机,就好像NAT-B不存在一样。

实现过程如下:
1
S启动两个网络侦听,一个叫【主连接】侦听,一个叫【协助打洞】的侦听。
2
AB分别与S的【主连接】保持联系。
3
A需要和B建立直接的TCP连接时,首先连接S的【协助打洞】端口,并发送协助连接申请。同时在该端口号上启动侦听。注意由于要在相同的网络终端上绑定到不同的套接字上,所以必须为这些套接字设置 SO_REUSEADDR 属性(即允许重用),否则侦听会失败。
4
S的【协助打洞】连接收到A的申请后通过【主连接】通知B,并将A经过NAT-A转换后的公网IP地址和端口等信息告诉B
5
B收到S的连接通知后首先与S的【协助打洞】端口连接,随便发送一些数据后立即断开,这样做的目的是让S能知道B经过NAT-B转换后的公网IP和端口号。
6
B尝试与A的经过NAT-A转换后的公网IP地址和端口进行connect,根据不同的路由器会有不同的结果,有些路由器在这个操作就能建立连接,大多数路由器对于不请自到的SYN请求包直接丢弃而导致connect失败,但NAT-B会纪录此次连接的目标地址和端口号(即A经过NAT-A转换后的公网IP和端口号),为接下来真正的连接做好了准备,这就是所谓的打洞,即BA打了一个洞,下次A就能直接连接到B刚才使用的端口号了。
7
客户端B打洞的同时在相同的端口上启动侦听。B在一切准备就绪以后通过与S的【主连接】回复消息我已经准备好S在收到以后将B经过NAT-B转换后的公网IP和端口号告诉给A
8
A收到S回复的B的公网IP和端口号等信息以后,开始连接到B公网IP和端口号(此时NAT-A也会纪录此次连接的目标地址和端口号(即B经过NAT-B转换后的公网IP和端口号),即A也向B打了一个洞,之后B也能直接连接到A的公网IP和端口号了),由于在步骤6B曾经尝试连接过A的公网IP地址和端口,NAT-B纪录了此次连接的信息,所以当A主动连接B时,NAT-B会认为是合法的SYN数据,并允许通过,从而直接的TCP连接建立起来了。

【内网主机发送报文访问外网目标时,用四元组来表示会话【源IP\源端口\目标IP\目标端口】】 

NAT地址转换,将私网IP、端口和公网IP端口相映射,同时对访问顺序做了限制。

内-》NAT-》other

如果是完全型NAT,则私网IP\PORT和公网IP\端口是一对一的,和服务无关,静态NAT,同时对访问顺序没有限制,外界可以直接通过公网IP\端口访问到私网IP\端口。

如果是限制性圆锥,则私网IP\PORT和公网IP\PORT依然是绑定的一对一,但是此时,必须私网中主机先给该公网IP发送数据时,外部主机才能发送数据给私网;

如果是端口限制型圆锥,则私网IP\PORT和公网IP\PORT依然是一对一的绑定,但是此时,必须私网中主机向该公网IP\PORT发送数据,外部主机才能发送数据给私网主机;

 

对称式NAT:私网IP\PORT和公网的IP\PORT是一对多的关系,私网主机和外部不同IP\PORT通信时,端口不同,为新的会话增加新的映射。外网主机必须先收到内网主机的报文才能访问内部主机。

 

打洞和NAT类型有关系,从最后面的几段表述看,一开始A\B只知道S的地址,不知道彼此的IP和地址,所以需要S转发。但是A\B知道彼此的地址以后,需要面对的就是NAT的类型对访问所做的限制了。

如果NAT是静态的NAT,应该是可以直接P2P的;

而如果是其他形式,比如A-S-B,则B得到A的公网IP\PORT后,会尝试连接,并记录这次连接请求,NAT拒绝,则B会尝试通过S转发,之后A通过S获得B的公网IP\PORT,则A尝试直接和B连接,此时对B来说,是一次B发出报文后的A连接,然后B接受报文,然后就打洞成功,直接P2P。

0 0
原创粉丝点击