【转】NAT路由器打洞原理

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

由于Internet的快速发展 IPV4地址不够用,不能每个主机分到一个公网IP 所以使用NAT地址转换。

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

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

下面是NAT的几种类型

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地址和端口”之间会形成一对多关系。

这是我在网上找到的另一份关于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: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不存在一样。

实现过程如下:
1、 S启动两个网络侦听,一个叫【主连接】侦听,一个叫【协助打洞】的侦听。
2、 A和B分别与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和端口号),为接下来真正的连接做好了准备,这就是所谓的打洞,即B向A打了一个洞,下次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和端口号了),由于在步骤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

【转】NAT路由器打洞原理

时间: 2024-08-06 16:00:11

【转】NAT路由器打洞原理的相关文章

UDP 打洞 原理解释

终于找到了一份满意的UDP打洞原理解释,附上正文,自己整理了一下源码 3.3. UDP hole punching UDP打洞技术 The third technique, and the one of primary interest in this document, is widely known as "UDP Hole Punching." UDP hole punching relies on the properties of common firewalls and c

鸽子洞原理或者称为抽屉原理

原理概述: 有n只鸽子和m个鸽洞,所有鸽子都住在鸽洞里,如果n>m,那么至少有二只鸽子必须住在同一鸽洞里. 函数观点: 把鸽子看成是定义域A中元素ai,鸽洞看成是值域B中的元素bj,鸽子住鸽洞作为函数关系. 鸽洞原理: 设f是从有限集A到有限集B的函数,若|A|>|B|,则必有a1,a2∈A,a1≠a2,使f(a1)=f(a2)=b∈Bf 包含于B(Bf是象域). 反证:若对任意a1,a2∈A,a1≠a2,f(a1)≠f(a2),|A|=|Bf|≤|B|与|A|>|B|矛盾 注: 鸽洞原

UDP打洞原理

源:UDP打洞原理

路由器的工作原理,路由表形成,静态路由器原理解封装过程,实际操作(重点5,网路小白必备精品知识)

一.路由器概述主机A想发数据给主机B,这个时候路由器就会选择最佳的相对路径到达主机B,我们把中间这几个路由器看成是一个互联网.二.路由器的工作原理主机A想要给主机B发送数据,必须要有路由表,在网络上主机A和B的地址,路由表当中网段和接口.我们一步步看一看数据是怎么到达主机B的.数据通过S0口到达A路由器,这个时候它查看路由表当中的目标IP网段.这个时候它还是根据目标IP地址去寻找最后这个数据会通过二层数据链路层到我们的主机B,详细讲解请看我之前的博客.三.路由表是怎么形成的首先这是我们新买来的两

P2P UPD打洞原理

转自:http://blog.pfan.cn/fengfei/18828.html 首先先介绍一些基本概念:            NAT(Network Address             Translators),网络地址转换:网络地址转换是在IP地址日益缺乏的情况下产生的,它的主要目的就是为了能够地址重用.NAT分为两大类,基本的NAT和NAPT(Network             Address/Port Translator).            最开始NAT是运行在路由器

UDP打洞原理介绍

 NAT穿越模块的设计与实现 Internet的快速发展以及IPv4地址数量的不足使得NAT设备得到了大规模的应用,然而这也给越来越多的端到端通信也带来了不少的麻烦.一般来说,NAT设备允许内网内主机主动向公网内主机发送数据,但却禁止内网外的主机主动向内网内的主机传递数据.由于很多的会话双方处于不同的NAT设备后,它们通信一般通过公网服务器中转,而要建立P2P通信,则必须解决NAT穿越问题才能建立通信. NAT 是介于内网和公网之间的设备,公网中的IP 地址是全球唯一的,而在内网中的IP 地址可

华为Basic NAT和NAPT实现原理

NAT是路由器的一项非常重要,且应用非常广泛的技术,但许多读者对NAT的各种实现方式的工作原理一直没有搞清楚,其实很简单.本篇先介绍两种NAT实现方式的工作原理,下篇再介绍另两种实现方式的工作原理. 6.1.2 Basic NAT实现原理 Basic NAT方式属于一对一的地址转换,但要注意它不是静态的一对一转换,而是动态的. 在这种转换方式下,在内网用户向公网发起连起请求时,请求报文中的私网IP地址就会通过事先准备好的公网IP地址池动态地建立私网IP地址与公网IP地址的NAT映射表项,并利用所

Cisco路由器IPSec 虚拟专用网原理与详细配置

博文目录一.虚拟专用网概述二.虚拟专用网技术涉及的加密算法三.数据报文验证四.IPSec 虚拟专用网五.ISAKMP/IKE阶段1和阶段2建立过程六.详细配置实现IPSec 虚拟专用网 由于"Virtual Private Network"(请看首字母,就知道是什么了)是敏\感词,所以在博文中使用它的中文名字"虚拟专用网"来代替. 一.虚拟专用网概述 1.虚拟专用网的定义 虚拟专用网就是在两个网络实体之间建立的一种受保护的连接,这两个实体可以通过点到点的链路直接相连

NAT路由打洞机制

  首先要注意,路由器有一个保护机制,就是不会无缘无故的接受陌生的IP发送过来的SYN包   NAT打洞机制:   1. 当前客户端A想和客户端B建立连接,服务器开了两个端口,一个是主连接端口,一个是辅助连接端口   2. 首先,A,B与主连接端口建立连接.这个时候A要和B建立连接,首先A要和协助端口建立连接,然后在这个端口启动监听   3. 然后服务器主连接将A经过NAT-A转换的公网IP和端口号发送给B,B收到之后首先和协助端口建立连接,发送一些数据之后断开,目的是让服务器知道B经过NAT-