NAT路由器打洞原理

什么是打洞,为何要打洞html

因为Internet的快速发展 IPV4地址不够用,不能每一个主机分到一个公网IP 因此使用NAT地址转换。服务器

下面是我在网上找到的一副图网络

 

通常来讲都是由私网内主机(例如上图中“电脑A-01”)主动发起链接,数据包通过NAT地址转换后送给公网上的服务器(例如上图中的“Server”),链接创建之后可双向传送数据,NAT设备容许私网内主机主动向公网内主机发送数据,但却禁止反方向的主动传递,但在一些特殊的场合须要不一样私网内的主机进行互联(例如P2P软件、网络会议、视频传输等),TCP穿越NAT的问题必须解决。并发

 

下面是NAT的几种类型spa

NAT设备的类型对于TCP穿越NAT,有着十分重要的影响,根据端口映射方式,NAT可分为以下4类,前3种NAT类型可统称为cone类型。
(1)全克隆( Full Cone) : NAT把全部来自相同内部IP地址和端口的请求映射到相同的外部IP地址和端口。任何一个外部主机都可经过该映射发送IP包到该内部主机。
(2)限制性克隆(Restricted Cone) : NAT把全部来自相同内部IP地址和端口的请求映射到相同的外部IP地址和端口。可是,只有当内部主机先给IP地址为X的外部主机发送IP包,该外部主机才能向该内部主机发送IP包。
(3)端口限制性克隆( Port Restricted Cone) :端口限制性克隆与限制性克隆相似,只是多了端口号的限制,即只有内部主机先向IP地址为X,端口号为P的外部主机发送1个IP包,该外部主机才可以把源端口号为P的IP包发送给该内部主机。
(4)对称式NAT ( Symmetric NAT): 对称式NAT与端口限制性克隆相似,惟一不一样的是当同一内部主机使用相同的端口与不一样IP地址或端口的外部主机进行通讯时, NAT对该内部主机的端口映射会有所不一样,这种状况下NAT会针对不一样IP地址或端口的外部主机为内部主机的相同端口分配新的外部端口号。对称式NAT不保证全部会话中的私有地址端口和公开地址端口之间绑定的一致性。相反,它为每一个新的会话分配一个新的端口号。这种状况下内部主机的“内网IP地址和端口”与“NAT IP地址和端口”之间会造成一对多关系。3d

 

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

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

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

    Symmetric NAT并不对新会话进行端口绑定,而是分配一个全新的NAT端口给每个新的会话.路由

如下是文本形式的展示,能够把下面的内容复制到txt等文本文件中查看。


     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:62000 v      |      v 155.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
    如上图,若是Client A同时发起两个会话到S1和S2,对称NAT会分配NAT地址155.99.25.11:62000给Session1,而后分配另外一个不一样的NAT地址155.99.25.11:62001给Session2.对称NAT可以区别两个不一样的会话并进行地址转换,应用程序每发出一个会话都会使用一个新的端口.

 

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

先假设:有一个服务器S在公网上有一个IP,两个私网分别由NAT-A和NAT-B链接到公网,NAT-A后面有一台客户端A,NAT-B后面有一台客户端B,如今,咱们须要借助S将A和B创建直接的TCP链接,即由B向A打一个洞,让A能够沿这个洞直接链接到B主机,就好像NAT-B不存在同样。

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

 

有了必定的知识补充,接下来开始实现UDP和TCP打洞。由于没干过这个 可能要花必定的时间

 

本文转自原文:http://www.cnblogs.com/yuanfan/archive/2010/12/17/1909379.html

出处:http://www.cnblogs.com/OpenCoder/diary/2011/06/29/2093895.html

相关文章
相关标签/搜索