NAT基本原理及穿透详解(打洞) 您所在的位置:网站首页 网络穿透技术包括哪些 NAT基本原理及穿透详解(打洞)

NAT基本原理及穿透详解(打洞)

2024-07-14 21:39| 来源: 网络整理| 查看: 265

一、NAT概述

本文主要是摘录了网上许多其他文章的内容并进行了整理,信息略多。

1.NAT简介:

NAT(Network Address Translation,网络地址转换), 用来将内网地址和端口号转换成合法的公网地址和端口号,建立一个会话,与公网主机进行通信。NAT的使用是为了解决公网IP有限及局域网安全性的问题。

实际上NAT分为基础型NAT(静态NAT即Static NAT,动态NAT即Dynamic NAT/Pooled NAT)和NAPT(Network Address Port Translation)两种,但由于基础型NAT已不常用,我们通常提到的NAT就代指NAPT。NAPT是指网络地址转换过程中使用了端口复用技术,即PAT(Port address Translation)。

NAT类型

 

2.NAT部署:

在内部网络和公网之间,需要有程序完成网络地址转换,这种程序(NAT网关)可以部署在路由器、防火墙等位置。

注:事实上,NAT类型的划分是很多混淆的起源。现实中的很多NAT设备是将这些转换方式混合在一起工作的,而不单单使用一种,所以NAT类型的定义只适合描述一种工作方式,而不是一个设备。比如,很多NAT设备对内部发出的连接使用对称型NAT方式,而同时支持静态的端口映射,后者可以被看作是全锥型NAT方式。而有些情况下,NAT设备的一个公网地址和端口可以同时映射到内部几个服务器上以实现负载分担,比如一个对外提供WEB服务器的站点可能是有成百上千个服务器在提供HTTP服务,但是对外却表现为一个或少数几个IP地址。

3.NAT网络结构:

下图是NAT网络结构,仅示意部署在路由器上的NAT:

NAT网络结构

 

4.NAT工作原理: 网络被分为私网和公网两个部分,NAT网关设置在私网到公网的路由出口位置,双向流量必须都要经过NAT网关;网络访问只能先由私网侧发起,公网无法主动访问私网主机;NAT网关在两个访问方向上完成两次地址的转换或翻译,出方向做源信息替换,入方向做目的信息替换;NAT网关的存在对通信双方是保持透明的;NAT网关为了实现双向翻译的功能,需要维护一张关联表,把会话的信息保存下来。

从上面的特征来看,NAT将内部网络的信息隐藏和转换,如果要实现隐藏在NAT下的设备之间通信(对等网络传输),则必须穿透NAT;此外,NAT网关实际上并不能实现对通信双方的全透明,因为用户可以在传输的数据包中携带ip和port信息(而不是在IP header中)。

5.NAT引起的问题: 对等网络传输需穿透NAT:IP协议的定义中,在理论上,具有IP地址的每个站点在协议层面有相当的获取服务和提供服务的能力,不同的IP地址之间没有差异。但NAT工作原理破坏了这个特征,如需实现真正意义上的对等网络传输,则需要穿透NAT。这是本文重点。应用层需保持UDP会话连接:由于NAT资源有限,会根据一定规则回收转换出去的资源(即ip/port组合),UDP通信又是无连接的,所以基于UDP的应用层协议在无数据传输、但需要保持连接时需要发包以保持会话不过期,就是通常的heartbeat之类的。基于IP的访问限制策略复杂化 二、技术点和原理 1.术语: 1.内部Tuple:指内部主机的私有地址和端口号所构成的二元组,即内部主机所发送报文的源地址、端口所构成的二元组;2.外部Tuple:指内部Tuple经过NAT的源地址/端口转换之后,所获得的外部地址、端口所构成的二元组,即外部主机收到经NAT转换之后的报文时,它所看到的该报文的源地址(通常是NAT设备的地址)和源端口;3.目标Tuple:指外部主机的地址、端口所构成的二元组,即内部主机所发送报文的目标地址、端口所构成的二元组。4.打洞hole punch:穿透NAT 2.NAT类型 1).基础型NAT

仅将内网主机的私有IP地址一对一地转换成公网的IP地址,并不将TCP/UDP端口信息进行转换,分为静态NAT和动态NAT。

2).NAPT

NAPT不但会改变经过这个NAT设备的IP数据报的IP地址,还会改变IP数据报的TCP/UDP端口。

全锥型(Full Cone NAT):所有来自同一个内部Tuple X的请求均被NAT转换至同一个外部Tuple Y,而不管这些请求是不是属于同一个应用或者是多个应用的。除此之外,当X-Y的转换关系建立之后,任意外部主机均可随时将Y中的地址和端口作为目标地址和目标端口,向内部主机发送UDP报文,由于对外部请求的来源无任何限制,因此这种方式虽然足够简单,但却不那么安全。

全锥型网络结构

全锥型访问示意图

全锥型NAT打洞原理:在不同内网的主机A和B各自连接到服务器C,服务器收到A和B的连接后知道了他们的公网地址和NAT分配给他们的端口号,然后把这些NAT地址和端口号交叉告诉B和A。A和B给服务器所打开的“孔”可以给任何主机使用。受限锥型(Restricted Cone NAT):Full Cone的受限版本,亦可认为是IP地址受限锥型。所有来自同一个内部Tuple X的请求均被NAT转换至同一个外部Tuple Y,这与Full Cone相同,但不同的是,只有当内部主机曾经发送过报文给外部主机(假设其IP地址为Z)后,外部主机才能以Y中的信息作为目标地址和目标端口,向内部 主机发送UDP请求报文,这意味着,NAT设备只向内转发(目标地址/端口转换)那些来自于当前已知的外部主机的UDP报文,从而保障了外部请求来源的安 全性。

受限锥型网络结构

受限锥型访问示意图

受限锥型NAT打洞原理:主机A和B同样需要各自连接服务器C,同时把A和B的地址告诉B和A,但一般情况下它们只能与服务器通信。要想直接通信需要发送消息给服务器C,如主机A发送一个UDP消息到主机B的公网地址上,与此同时,A又通过服务器C中转发送一个邀请信息给主机B,请求主机B也给主机A发送一个UDP消息到主机A的公网地址上。这时主机A向主机B的公网IP发送的信息导致NAT A打开一个处于主机A的和主机B之间的会话,与此同时,NAT B 也打开了一个处于主机B和主机A的会话。一旦这个新的UDP会话各自向对方打开了,主机A和主机B之间才可以直接通信。IP相同,port随便,就能和先前内部节点被映射的外部Tuple进行通信。端口受限锥型(Port Restricted Cone NAT):Restricted Cone NAT的进一步受限版。只有当内部主机曾经发送过报文给外部主机(假设其IP地址为Z且端口为P)之后,外部主机才能以Y中的信息作为目标地址和目标端 口,向内部主机发送UDP报文,同时,其请求报文的源端口必须为P,这一要求进一步强化了对外部报文请求来源的限制,从而较Restrictd Cone更具安全性。

端口受限锥型网络结构

端口受限锥型访问示意图

端口受限锥型NAT打洞原理:与受限制锥型类似,与之不同的是还要指定端口号。IP,port都得一样;只能用先前内部节点被映射的外部Tuple与内部节点进行通信对称型:内部主机的内部Tuple与外部Tuple的转换映射关系是独立于内部主机所发出的UDP报文中的目标地址及端口的,即与目标Tuple无关; 在Symmetric NAT中,目标Tuple则成为了NAT设备建立转换关系的一个重要考量:只有来自于同一个内部Tuple、且针对同一目标Tuple的请求才被NAT转换至同一个外部Tuple,否则的话,NAT将为之分配一个新的外部Tuple;打个比方,当内部主机以相同的内部Tuple对2个不同的目标Tuple发送UDP报文时,此时NAT将会为内部主机分配两个不同的外部Tuple,并且建立起两个不同的内、外部 Tuple转换关系。与此同时,只有接收到了内部主机所发送的数据包的外部主机才能向内部主机返回UDP报文,这里对外部返回报文来源的限制是与Port Restricted Cone一致的。不难看出,如果说Full Cone是要求最宽松NAT UDP转换方式,那么,Symmetric NAT则是要求最严格的NAT方式,其不仅体现在转换关系的建立上,而且还体现在对外部报文来源的限制方面。

对称型网络结构

 

对称型NAT打洞原理:常规的打洞方式都不可用,目前可以尝试的有TCP+UDP打洞、UDP端口预测方法。

3.NAT对比: NAT类型复杂度安全性全锥型最简单低受限锥型简单中端口受限锥型稍复杂高对称型很复杂最高 4.不同NAT之间打洞对比: Peer APeer B是否可以打洞全锥型全锥型是全锥型受限锥型是全锥型端口受限锥型是全锥型对称型是受限锥型受限锥型是受限锥型端口受限锥型是受限锥型对称型是端口受限锥型端口受限锥型是端口受限锥型对称型一般否对称型对称型一般否 三、穿透服务/协议 1.穿透方式

详情参考NAT概述

应用层网关(ALG):一般都内置在NAT装置中,ALG会随着协议的扩充,不断更新和支持新的协议,但为每个应用协议开发ALG代码并跟踪最新标准是不可行的,ALG只能解决用户最常用的需求。此外,出于安全性需要,有些应用类型报文从源端发出就已经加密,这种报文在网络中间无法进行分析,所以ALG无能为力。探针技术——NAT探测和穿透协议:NAT网关无需任何修改,通过协议探测NAT类型,并对不同类型NAT实行穿透,比如STUN/TURN。当NAT可以直接穿透时,服务器协助完成穿透以及连接的建立,当NAT无法穿透时,TURN服务与STUN绑定,形成“ip-port”对,将链路中的数据包在TURN服务器上转发。相对于ALG方式有一定普遍性。但是TURN中继服务会成为通信瓶颈。而且在客户端中增加探针功能要求每个应用都要增加代码才能支持。这是本部分重点关注的方式中间件技术:开发通用方法解决NAT穿越问题的努力。与前者不同之处是,NAT网关是这一解决方案的参与者。与ALG的不同在于,客户端会参与网关公网映射信息的维护,此时NAT网关只要理解客户端的请求并按照要求去分配转换表,不需要自己去分析客户端的应用层数据。其中UPnP就是这样一种方法。这种方案需要网关、内部主机和应用程序都支持UPnP技术,且组网允许内部主机和NAT网关之间可以直接交换UPnP信令才能实施。(好像经常有安全性问题)中继代理技术:实际上并非NAT穿透,而是NAT旁路技术,在NAT旁架设一个中继服务器,这个服务器在内部网络和外部公网分别有自己的网络连接。客户端特定的应用产生网络请求时,将定向发送到应用代理服务器。应用代理服务器根据代理协议解析客户端的请求,再从服务器的公网侧发起一个新的请求,把客户端请求的内容中继到外部网络上,返回的相应反方向中继。这项技术和ALG有很大的相似性,它要求为每个应用类型部署中继代理业务,中继服务器要理解这些请求。特定协议穿越:所有方法中最复杂也最可靠的就是自己解决自己的问题。比如IKE和IPsec技术,在设计时就考虑了到如何穿越NAT的问题。详情见IPSec及IKE原理 2.基于NAT探测的穿透协议 1).RTMFP

Adobe定义的一种UDP穿透NAT协议,在flash p2p中使用,也可以用openrtfmp的开源项目实现其他设备上的nat穿透。 RTMFP协议详解

2).STUN/TURN

IETF定义的一种UDP穿透规范,最为普遍。 STUN/TURN协议详解

3).ICE

包括ALG,STUN,TURN等各种穿透方式的组合。 ICE协议详解

花生壳DDNS穿透——是指将用户X的动态tuples绑定到某个域名A上,其他用户访问该域名来与用户X通信,这种方式显然不适用于大规模对等网络传输。

3.对称型NAT穿透方式

详情见对称型NAT穿透方式

1).同时开放TCP(SimultaneousTCP open)策略

如果 Client A-1和 Client B-1能够彼此正确的预知对方的NAT将会给下一个TCP连接分配的公网TCP端口,并且两个客户端能够同时地发起一个面向对方的“外出”的TCP连接请求,并在对方的 SYN 包到达之前,自己刚发送出去的SYN包都能顺利的穿过自己的NAT的话,一条端对端的TCP连接就能成功地建立了。

问题:时钟严格一致,很难做到。

2).UDP端口猜测策略

通常,对称NAT分配端口有两种策略,一种是按顺序增加,一种是随机分配。如果这里对称NAT使用顺序增加策略,那么,ClientB-1将两次被分配的Tuples发送给Server后,Server就可以通知ClientA-1在这个端口范围内猜测刚才ClientB-1发送给它的socket-1中被NAT映射后的Tuples,ClientA-1很有可能在孔有效期内成功猜测到端口号,从而和ClientB-1成功通信。

问题:不能为随机分配端口的对称型NAT打洞。

四、技术细节及流程、方法 1.NAT穿透流程

NAT穿透流程图

 

上图是P2P传输中节点打洞的基本流程,实际过程会复杂很多。基于本文第二部分中,不同NAT类型的打洞原理不一样,不同NAT之间的穿透成功率也不一样,所以实际工程经验中,打洞流程会非常复杂。

1).搭建NAT穿透服务器(俗称打洞服务器)

NAT穿透的基本前提是打洞服务器,该server需要部署在公网,并有两个公网IP。Server做监听(IP-1,Port-1),(IP-2,Port-2)并根据客户端的要求进行应答。

2).检测客户端是否有能力进行UDP通信以及客户端是否位于NAT后

客户端向打洞服务器发起UDP请求若干次,如每次超时未返回,即认为该客户端不具备UDP通信能力(可能是防火墙或NAT阻止UDP通信);若收到打洞服务器返回的数据包,且其中携带的客户端(IP,Port)和这个客户端socket的 (LocalIP,LocalPort)比较。如果完全相同则客户端不在NAT后,这样的客户端具有公网IP可以直接监听UDP端口接收数据进行通信(检 测停止)。否则客户端在NAT后要做进一步的NAT类型检测(继续)。

3).NAT类型探测

基于本文第二部分中不同NAT类型的特征及打洞原理,对于全锥型、受限锥型和端口受限锥型可以较容易实现P2P通信,而对称型NAT需要额外支持别的穿透方法(且不一定能成功)。

4).节点间借助打洞服务器提供的信息,尝试打洞连接 5).打洞不成功,则使用RELAY服务 2.不同NAT网络结构下的peer打洞示意图 1)同一个NAT设备下

同一NAT设备下的网络结构示意

 

打洞过程如下:

同一NAT下

 

打洞成功取决于NAT设备是否支持hairpin translation(端口回流)。——打开端口回流相当于与client A的数据经过NAT设备转发后才到达client B,即从外网NAT接口绕了一圈再访问到同一个子网里的client B。(优点是可以防止内部攻击) 优化方法:同一局域网,当A和B最初通过S交换地址信息时,他们应该包含自身的IP地址和端口号(从自己看),同时也包含从服务器看的自己的 地址和端口号。然后客户端同时开始从对方已知的两个的地址中同时开始互相发送数据,并使用第一个成功通信的地址作为对方地址。如果两个客户端在同一个 NAT后,发送到对方内网地址的数据最有可能先到达,从而可以建立一条不经过NAT的通信链路。

2)不同NAT设备下

不同NAT设备下的网络结构示意

 

打洞过程如下:

不同NAT设备下

 

就是常规的NAT穿透

3)多层NAT设备下

多层NAT下网络结构示意

 

打洞过程如下:

多层NAT设备下

 

client A和client B无法通过NAT A和NAT A进行P2P通信,因为它们属于NAT C的局域网地址,因此client A和client B只能通过NAT C的hairpin translation进行P2P通信,如果NAT C不支持hairpin translation,则它们很难进行P2P通信。

五、开源项目 1.coturn2.cumulus3.monaserver-cumulus升级版 六、参考 1.NAT穿透技术、穿透原理和方法详解2.IPSec及IKE原理3.NAT概述4.Peer-to-Peer Communication Across Network Address Translators5.P2P原理和常见实现方式

原文链接:https://juejin.cn/post/6844904098572009485  



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有