udp打洞( NAT traversal )的方法介绍

http://www.cnblogs.com/whyandinside/archive/2010/12/08/1900492.htmlhtml

http://www.gzsec.com/oldversion/filesys/news_view.asp?newsid=84服务器

 

在现实Internet网络环境中,大多数计算机主机都位于防火墙或NAT以后,只有少部分主机可以直接接入Internet。不少时候,咱们但愿网络中的两台主机可以直接进行通讯,即所谓的P2P通讯,而不须要其余公共服务器的中转。因为主机可能位于防火墙或NAT以后,在进行P2P通讯以前,咱们须要进行检测以确认它们之间可否进行P2P通讯以及如何通讯。这种技术一般称为NAT穿透(NAT Traversal)。最多见的NAT穿透是基于UDP的技术,如RFC3489中定义的STUN协议。网络

STUN,首先在RFC3489中定义,做为一个完整的NAT穿透解决方案,英文全称是Simple Traversal of UDP Through NATs,即简单的用UDP穿透NAT。session

在新的RFC5389修订中把STUN协议定位于为穿透NAT提供工具,而不是一个完整的解决方案,英文全称是Session Traversal Utilities for NAT,即NAT会话穿透效用。RFC5389与RFC3489除了名称变化外,最大的区别是支持TCP穿透。socket

TURN,首先在RFC5766中定义,英文全称是Traversal Using Relays around NAT:Relay Extensions to Session Traversal Utilities for NAT,即便用中继穿透NAT:STUN的扩展。简单的说,TURN与STUN的共同点都是经过修改应用层中的私网地址达到NAT穿透的效果,异同点是TURN是经过两方通信的“中间人”方式实现穿透。tcp

 

NAT(Network Address Translation,网络地址转换)的原理ide

NAT网络包含一个 NAT管理设备及该管理设备后面的网络节点。工具

NAT网络怎么可以节约公网IP地址呢?这是由于它可以让由私有IP构成的局域网内全部的计算机经过一台具备公网IP和NAT功能的计算机进入公网(Internet),好比上网冲浪,这样一个局域网就只须要一个或不多几个公网IP就好了,从而达到了节约公网IP地址的目的。也许你要问了,为何须要NAT呢?局域网的私有IP计算机不是可以经过网关直接进入公网吗?非也,内网IP的数据包根本就不可能在公网上传播,由于公网上的路由器都是屏蔽掉了这些私网IP的,这是由于私有IP原本就是人为保留出来专供私有网络通讯用的(RFC 1597中描述)。从另外一个角度说,即便私有数据包可以到达公网目标地址,目标地址的响应包也不可能返回真正的源地址,由于源地址是私有IP,目标发送的响应包一种多是被目标地址所在的拥有相同网络号的内网接收,一种可能就是这种子网不存在,数据包被抛弃。因此内网数据包在进入公网以前,必须被翻译成公网IP,这就是NAT网络的功能,并且NAT技术发展到如今,已不只局限于翻译IP地址,如今实际翻译时,它不光翻译IP地址,还会翻译TCP/UDP端口。因为这个功能,NAT一般都位于网关计算机上,起着一种路由器的做用,为了讲述方便,之后咱们就称这台网关计算机为NAT管理设备。下面就来看看NAT翻译的基本过程(假如局域网192.168.0.0的NAT设备公网IP是218.70.201.185,私有IP是192.168.0.1,如今客户机192.168.0.88要经过NAT管理设备访问cn.yahoo.com的网页,cn.yahoo.com的IP是202.43.216.55)。
当客户机192.168.0.88经过IE向 http://cn.yahoo.com发出请求时,它发出的数据包含有下面的信息:
源地址和源端口:192.168.0.88:1234
目标地址和目标端口:202.43.216.55:80
当这个数据包到达NAT管理设备时,它会检测到这个数据包是要发向公网的,因此它会对源IP地址和端口进行修改(翻译),并在映射表中新建IP和端口的映射条目,而后再把修改的数据包转发出去,下面就是修改后数据包的相关信息。
源:218.70.201.185:8999
目标:202.43.216.55:80 (无需变)
当cn..yahoo.com响应时,它会把数据包发给NAT管理设备,它的数据包含有下面的信息,
源:202.43.216.55:80
目:218.70.201.185:8999
当NAT管理设备收到响应时,它会检查它的IP地址/端口映射表,而且会找到218.70.201.185:8999与192.168.0.88:1234的映射条目,因而它又修改数据包,而后把数据包转发给192.168.0.88。相关数据包信息以下:
源:202.43.216.55:80
目:192.168.0.88:1234
具体的翻译步骤就如图1所示,其中图1黑线左侧是内网发向公网的翻译过程,右侧则是公网发向内网的翻译过程,从中能够看出,翻译过程也是从上层向下层进行的。

从上面能够看出,最开始发起链接的内网计算机(这里是192.168.0.88)对网关进行NAT翻译是一无所知的,它根本就不知道网关对它的数据包“作了手脚”,上面所讲的能够说是最理想的翻译,这种翻译对IP地址和端口信息只存在于IP首部和TCP/UDP首部的数据包是很是适合的,但偏偏这个世界是复杂的,网络世界也不例外,每种技术都会有它的缺陷,下面就来看看NAT所面临的网络链接问题。ui

 

 

NAT有4种不一样的类型spa

1) Full Cone

这种NAT网络内部的机器A链接过外网机器C后,NAT会打开一个端口.而后外网的任何发到这个打开的端口的UDP数据报均可以到达A.无论是否是C发过来的.
例如 A:192.168.8.100 NAT:202.100.100.100 C:292.88.88.88
A(192.168.8.100:5000) -> NAT(202.100.100.100:8000) -> C(292.88.88.88:2000)
任何发送到 NAT管理设备(202.100.100.100:8000)的数据均可以到达A(192.168.8.100:5000)

2) Address Restricted Cone

这种NAT网络内部的机器A链接过外网的机器C后,NAT打开一个端口.而后C能够用任何端口和A通讯.其余的外网机器不行.
例如 A:192.168.8.100 NAT:202.100.100.100 C:292.88.88.88
A(192.168.8.100:5000) -> NAT(202.100.100.100 : 8000) -> C(292.88.88.88:2000)
任何从C发送到 NAT管理设备(202.100.100.100:8000)的数据均可以到达A(192.168.8.100:5000)

3) Port Restricted Cone

这种NAT网络内部的机器A链接过外网的机器C后,NAT打开一个端口.而后C能够用原来的端口和A通讯.其余的外网机器不行.
例如 A:192.168.8.100 NAT:202.100.100.100 C:292.88.88.88
A(192.168.8.100:5000) -> NAT(202.100.100.100 : 8000) -> C(292.88.88.88:2000)
C(202.88.88.88:2000)发送到 NAT管理设备(202.100.100.100:8000)的数据均可以到达A(192.168.8.100:5000)

以上三种NAT通称Cone NAT(圆锥形NAT).咱们只能用这种NAT进行UDP打洞.

4) Symmetric(对称形)

对于这种NAT。链接不一样的外部Server,NAT管理设备打开的端口会变化。也就是内部机器A链接外网机器B时,NAT管理设备会打开一个端口,链接外网机器C时又会打开另一个端口。

对于双方都是Port Restricted Cone NAT的时候,则须要利用UDP打洞原理进行“先打洞,而后才能直接通讯”。
对 于Cone NAT.要采用UDP打洞.须要一个公网机器server C来充当”介绍人”.处于NAT以后的内网的A,B先分别和C通讯,打开各自的NAT端口.C这个时候知道A,B的公网IP: Port. 如今A和B想直接链接.好比A给B直接发包,除非B是Full Cone,不然不能通讯.反之亦然.
为何啊?由于对于处于NAT管理设备以后的A,B。 若是想A要与外界的D通讯,则首先必需要A发包到D,而后A通过NAT管理设备NA,NA把A的内网地址和端口转换为NA的外网地址和端口。和D通讯以后,D 才能通过NA和A通讯。也就是说,只能A和外界主动通讯,外界不能主动和处于NA以后的A通讯。这种包会被NA直接丢弃的。这也就是上面所说的Port Restricted Cone 的情形啊! A(192.168.8.100:5000) -> NA(202.100.100.100:8000) -> D(292.88.88.88:2000)可是咱们能够这样.
A --- NA --- Server C --- NB --- B

  • A,B 为主机;
  • NA, NB 为NAT设备;
  • Server C为外网的机器;
  1. 若是A想与B通讯;
  2. A首先链接 C, C获得A的外网NA的地址和端口;
  3. B也要链接C,C获得B的外网NB的地址和端口;
  4. A告诉C说我要和B通信;
  5. C经过NB发信息给B,告诉B A的外网NA的地址和端口;
  6. B向NA发数据包(确定会被NA丢弃,由于NA上并无 A->NB 的合法session),可是NB上就创建了有B->NA的合法session了;
  7. B发数据包给C,让 C 通知 A,我已经把洞打好了;
  8. A接受到通知后向 B 的外网发NB数据包,这样就不会被丢弃掉了。由于对于NB来讲,它看到的是A的外网NA的地址,而经过第6步,B已经让NA成为NB的合法通讯对象了。因此当NA发数据包给NB时,NB就会接收并转发给B;
  9. B给A发数据反过来走一遍就能够了。

注意: 路由器和防火墙的UDP打洞的端口有个时间限制的,在必定时间内若是没有数据通信会自动关闭

STUN

STUN 的全称是Simple Traversal of UDP Through NAT,即UDP对NAT的简单穿越方式。应用程序(即STUN CLIENT)向NAT外的STUN SERVER经过UDP发送请求STUN 消息询问自身的转换后地址,STUN SERVER收到请求消息,产生响应消息,响应消息中携带请求消息的源端口,即STUN CLIENT在NAT上对应的外部端口。而后响应消息经过NAT发送给STUN CLIENT,STUN CLIENT经过响应消息体中的内容得知其在NAT上对应的外部地址,而且将其填入之后呼叫协议的UDP负载中,告知对端,同时还能够在终端注册时直接注 册这个转换后的公有IP地址,这样就解决了H.323/MGCP/SIP穿越NAT的通讯创建问题以及做为被叫时的问题。本端的接收地址和端口号为NAT 外的地址和端口号。因为经过STUN协议已在NAT上预先创建媒体流的NAT映射表项,故媒体流可顺利穿越NAT。
须要注意的是,NAT/PAT 对于地址转换关系是有必定生命期的,某个地址转换后在一段时间内没有被使用将会被清除,当这个业务流再次出现时,将会创建一个新的地址转换关系,这就意味 着STUN的询问过程以及终端的注册过程都须要再执行一遍才能保证通讯的正确。解决这个问题一个比较通行的方案是采用某种方式保持NAT/PAT的转换关 系,例如在NAT/PAT生命期内重复注册一次,好比NAT/PAT的生命期是3分钟,那么就将注册重复周期设置为2分钟。

另外STUN server并不是指一个专用的服务器,而是指一种功能、一个协议,咱们能够在softswitch或者任何一个须要此功能的服务器上内置此协议, 后面代码也包含一个简单的Server实现。

但 是在NAT采用对称模式(symmetric NAT)工做时,STUN的方案就会出现问题。假如咱们在softswitch上提供STUN server功能,终端A经过STUN能够得到NAT为终端A与softswitch之间通讯分配的地址A',并将这个地址注册在softswitch 上,当一个公网上的终端B呼叫终端A时,A'和B经过softswitch完成呼叫创建过程。当B试图向A'发送媒体流时,问题就出现了。由于对称NAT 只容许从softswitch发送数据给地址A',从B发送的媒体流将被丢弃。因此STUN没法应用于工做在对称模式的NAT.

STUN协议最大的优势是无需现有NAT/FW设备作任何改动,同时STUN方式可在多个NAT串联的网络环境中使用. STUN的局限性在于STUN并不适合支持TCP链接的穿越,同时STUN方式不支持对对称NAT(Symmetric NAT).

TURN

这 种方式又称SPAN(Simple Protocol for Augmenting NATs)方式. TURN方式解决NAT问题的思路与STUN类似,也是基于私网接入用户经过某种机制预先获得其私有地址对应在公网的地址(STUN方式获得的地址为出口 NAT上的地址,TURN方式获得地址为TURNServer上的地址),而后在报文负载中所描述的地址信息直接填写该公网地址的方式,实际应用原理也是 同样的。
TURN的全称为Traversal Using RelayNAT,即经过Relay方式穿越NAT,TURN应用模型经过分配TURNServer的地址和端口做为客户端对外的接受地址和端口,即私网 用户发出的报文都要通过TURNServer进行Relay转发,这种方式除了具备STUN方式的优势外,还解决了STUN应用没法穿透对称 NAT(Symmetric NAT)以及相似的Firewall设备的缺陷,即不管企业网/驻地网出口为哪一种类型的NAT/FW,均可以实现NAT的穿透,同时TURN支持基于 TCP的应用,如H323协议。TURN的局限性在于全部报文都必须通过TURNServer转发,增大了包的延迟和丢包的可能性.

 ICE

ICE跟STUN和TURN不同,ICE不是一种协议,而是一个framework,它整合了STUN和TURN。

 UPnP

UPnP是若干网络协议的组合,主要用于设备的互联,可是一种叫作Internet Gateway Device (IGD) Protocol的防火墙穿越技术是基于UPnP的。

 

 

http://blog.chinaunix.net/uid-11572501-id-2868684.html

STUN简介 STUNSimple Traversal of UDP over NATsNAT UDP简单穿越)是一种网络协议,它容许位于NAT(或多重NAT)后的客户端找出本身的公网地址,查出本身位于哪一种类型的NAT网络以后以及NAT管理设备为某一个本地端口所绑定的Internet端端口。这些信息被用来在两个同时处于NAT路由器以后的主机之间创建UDP通讯。该协议由RFC 3489定义。
一旦客户端得知了Internet端的UDP端口,通讯就能够开始了。
SIP之类的协议是使用UDP分组在Internet上传输音频和/或视频数据的。不幸的是,因为通讯的两个末端每每位于NAT管理设备以后,所以用传统的方法是没法创建链接的。这也就是STUN发挥做用的地方。
STUN是一个客户机-服务器协议。一个VoIP电话或软件包可能会包括一个STUN客户端。这个客户端会向STUN服务器发送请求,以后,服务器就会向STUN客户端报告NAT路由器的公网IP地址以及NAT为容许传入流量传回内网而开通的端口。
以上的响应同时还使得STUN客户端可以肯定正在使用的NAT类型——由于不一样的NAT类型处理传入的UDP分组的方式是不一样的。四种主要类型中有三种是可使用的:彻底圆锥型NAT、受限圆锥型NAT和端口受限圆锥型NAT——但大型公司网络中常常采用的对称型NAT(又称为双向NAT)则不能使用。

NAT工做原理:NAT主要的经过对数据包头的地址替换来完成内网计算机访问外网服务的。当内部机器要访问外部网络时,NAT管理设备把内部的IP1与端口号1(网络层地址与传输层地址),转换成NAT的外部IP2与新的端口号2,再送给外部网络,数据返回时,再把目的为IP2:端口2的数据包替换为IP1:端口 1,送给内网机器。若通信协议的内容中有IP地址的传递,如FTP协议,NAT管理设备在翻译时还要注意数据包内涉及协议地址交互的地方也要替换,不然协议就会出现地址混乱。在NAT管理设备中维护了这个要替换地址的映射表,并根据内部计算机的通信需求维护该表。外部网络来数据包可否进入NAT,主要是看是否已经有可映射的表项,若没有就会丢弃

NAT给P2P带来的问题是:NAT只容许单方面发起链接,通信的双方不是平等的,P2P网络的基础有了问题,具体的表现为:

  • 内网主机IP是私有的,外部主机看不到,也没法主动发起链接
  • 即便知道了内网IP,但NAT管理设备会丢弃没有在影射表的数据包
  • 内网主机能够做为客户端访问外网,但不能做为服务器提供服务
  • 当两个主机都位于各自的NAT管理设备以后,要实现P2P的链接,就不只是谁主动的问题,而是如何解决在两个NAT管理设备上同时有对方映射表项的问题。

STUN标准中,根据内部终端的地址(P:p)到NAT出口的公网地址(A:b)的影射方式,把NAT分为四种类型:

1. Full Cone:来自相同的内部地址的请求消息映射为相同的外部地址,与外部地址(目的地址)无关。映射关系为P:p↔A:b,任何外部主机可经过(A:b)发送到数据到(P:p)上。

  2. Restricted Cone:来自相同的内部地址的请求消息映射为相同的外部地址,返回的数据只接受该内部节点曾发数据的那个目的计算机地址X。映射关系为P:p↔A:b↔X,只有来自X的数据包才可经过(A:b)发送到数据到(P:p)上。

  3. Port Restricted Cone:来自相同的内部地址的请求消息映射为相同的外部地址,返回的数据只接受该内部节点曾发数据的那个目的地址X:x。映射关系为 P:p↔A:b↔X:x,只有来自X:x的数据包才可经过(A:b)发送到数据到(P:p)上。

  4. Symmetric(对称) NAT:只有来自相同的内部地址(P:p),而且发送到同一个地址(X:x) 的请求消息,才被映射为相同的外部地址(A:b),返回的数据只接受该内部节点曾发数据的那个目的地址X:x。映射关系为P:p↔A:b↔X:x,当 (P:p)访问(Y:y)时,映射为P:p↔B:c↔Y:y。

P2P利用STUN穿越NAT

  位于NAT后面终端A与B要穿越NAT直接通信,能够借助在公网上的第三者Server来帮助。

  穿越NAT的状况分为为两种方式:

一、一方在NAT管理设备以后,一方在公网上。这种状况相对简单,只要让NAT管理设备以后的终端先发起通信,NAT管理设备就没有做用了,它能够从Server上取得另外一个Peer的地址,主动链接,回来的数据包就能够方便地穿越NAT。

二、双方都在NAT管理设备以后,链接的成功与否与两个NAT网络的类型有关。

主要的思路的先经过终端与Server的链接,得到两个终端在NAT管理设备的外部地址(IP与端口号),再由终端向对方的外部地址发邀请包,获取本身与对方通信的外部地址,俗称为“打洞”。关键是获取了NAT管理设备外部映射的地址,就能够发包直接沟通,创建链接。但当一方是对称型,另外一方是Port Restricted或对称型时,没法有效获取外部地址,邀请包没法到达对方,也就没法穿越NAT。具体的分析能够根据两个NAT网络的类型分红若干状况分析,这里给通常的穿越例子。

实例:UDP穿越NAT管理设备

  A登陆Server,NAT管理设备A 分配端口11000,Server获得A的地址为100.10.10.10:11000   (其实是NAT管理设备A的地址和端口)

  B登陆Server,NAT管理设备B 分配端口22000,Server获得B的地址为200.20.20.20:22000

  此时B会把直接来自A的包丢弃(A也会直接把来自B的包丢弃),因此要在NAT管理设备B 上打一个方向为A的洞,那么A就能够向200.20.20.20:22000发送数据了

  打洞的指令来自Server。即Server告诉B向A的地址100.10.10.10:11000发一个UDP报文,被NAT管理设备A 丢弃,但在NAT管理设备B上创建了映射记录,NAT管理设备B不在丢弃来自A的报文。

  Server通知A当即与B进行通信,A发起数据UDP包给B,NAT管理设备B放行,B收到A的包,双方开始通信

  注:如果对称NAT网络,当B向A打洞的端口要从新分配(NAT A不会再分配11000端口),B没法获取这个端口,因此不适用本方法。

  实例:TCP穿越NAT:

tcp打洞与udp打洞的区别:tcp在传输数据前要connect,connect 过程当中两方要通讯

  A登陆Server,NAT管理设备A 分配端口11000,Server获得A的地址为100.10.10.10:11000

  B登陆Server,NAT管理设备B 分配端口22000,Server获得B的地址为200.20.20.20:22000

  Server告诉A向B发送TCP数据包 SYN:192.168.10.11:1234 => 200.20.20.20:22000,在NAT管理设备A上打洞

  Server再告诉B向A发送TCP数据包 SYN:192.168.20.22:1234 => 100.10.10.10:11000,在NAT管理设备B上打洞

  通道创建,A与B三次握手创建TCP链接

 


TCP(传输控制协议)和UDP(用户数据报协议是网络体系结构TCP/IP模型中传输层一层中的两个不一样的通讯协议。

TCP:传输控制协议,一种面向链接的协议,给用户进程提供可靠的全双工的字节流,TCP套接口是字节流套接口(stream socket)的一种。

UDP:用户数据报协议。UDP是一种无链接协议。UDP套接口是数据报套接口(datagram socket)的一种。

相关文章
相关标签/搜索