STUN(RFC3489)的NAT类型检测方法

作者&投稿:竺宜 (若有异议请与网页底部的电邮联系)
~

在现实Internet网络环境中,大多数计算机主机都位于防火墙或NAT之后,只有少部分主机能够直接接入Internet。很多时候,我们希望网络中的两台主机能够直接进行通信(即所谓的P2P通信),而不需要其它公共服务器的中转。由于主机可能位于防火墙或NAT之后,在进行P2P通信之前,我们需要进行检测以确认它们之间能否进行P2P通信以及如何通信。这种技术通常被称为NAT穿透(NAT Traversal)。最常见的NAT穿透是基于UDP的技术(如下面的RFC3489/STUN),也有基于TCP的穿透技术。NAT穿透技术最重要的是识别目标主机的NAT类型,这也是本文所要介绍的内容。

NAT有两大类,基本NAT和NAPT。

静态NAT:一个公网IP对应一个内部IP,一对一转换
动态NAT:N个公网IP对应M个内部IP,不固定的一对一转换关系

现在基本使用这种,又分为对称和锥型NAT。
锥型NAT ,有完全锥型、受限制锥型、端口受限制锥型三种:

对称NAT ,把所有来自相同内部IP地址和端口号,到特定目的IP地址和端口号的请求映射到相同的外部IP地址和端口。如果同一主机使用不同的源地址和端口对,发送的目的地址不同,则使用不同的映射。只有收到了一个IP包的外部主机才能够向该内部主机发送回一个UDP包。对称的NAT不保证所有会话中的(私有地址,私有端口)和(公开IP,公开端口)之间绑定的一致性。相反,它为每个新的会话分配一个新的端口号。

在RFC3489/STUN[1]中,基于UDP的NAT(Network Address Translation)穿透技术把主机划分为如下七种NAT类型:
UDP Blocked、Open Internet、Symmetric Firewall、Full Cone NAT、Restricted Cone NAT、Port Restricted Cone NAT、Symmetric NAT。具体解释如下:

(1) Open Internet :主机具有公网IP,允许主动发起和被动响应两种方式的UDP通信。

(2) UDP Blocked :位于防火墙之后,并且防火墙阻止了UDP通信。

(3) Symmetric Firewall :主机具有公网IP,但位于防火墙之后,且防火墙阻止了外部主机的主动UDP通信。

(4) Full Cone NAT :当内网主机创建一个UDP socket并通过它第一次向外发送UDP数据包时,NAT会为之分配一个固定的公网{IP:端口}。此后,通过这个socket发送的任何UDP数据包都是通过这个公网{IP:端口}发送出去的;同时,任何外部主机都可以使用这个公网{IP:端口}向该socket发送UDP数据包。即是说,NAT维护了一个映射表,内网主机的内网{IP:端口}与公网{IP:端口}是一一对应的关系。一旦这个映射关系建立起来(内部主机向某一外部主机发送一次数据即可),任何外部主机就可以直接向NAT内的这台主机发起UDP通信了,此时NAT透明化了。

(5) Restricted Cone NAT :当内网主机创建一个UDP socket并通过它第一次向外发送UDP数据包时,NAT会为之分配一个公网{IP:端口}。此后,通过这个socket向外发送的任何UDP数据包都是通过这个公网{IP:端口}发送出去的;而任何收到过从这个socket发送来的数据的外部主机(由IP标识),都可以通过这个公网{IP:端口}向该socket发送UDP数据包。即是说,NAT维护了一个内网{IP:端口}到公网{IP:端口}的映射,还维护了一个{外部主机IP, 公网{IP:端口}}到内网{IP:端口}的映射。因此,要想外部主机能够主动向该内部主机发起通信,必须先由该内部主机向这个外部发起一次通信。

(6) Port Restricted Cone NAT :当内网主机创建一个UDP socket并通过它第一次向外发送UDP数据包时,NAT会为之分配一个公网{IP:端口}。此后,通过这个socket向外部发送的任何UDP数据包都是通过这个公网{IP:端口}发送出去的;一旦外部主机在{IP:端口}上收到过从这个socket发送来的数据后,都可以通过这个外部主机{IP:端口}向该socket发送UDP数据包。即是说,NAT维护了一个从内网{IP:端口}到公网{IP:端口}的映射,还维护了一个从{外部主机{IP:端口}, 公网{IP:端口}}到内网{IP:端口}的映射。

(7) Symmetrict NAT :当内网主机创建一个UDP socket并通过它第一次向外部主机1发送UDP数据包时,NAT为其分配一个公网{IP1:端口1},以后内网主机发送给外部主机1的所有UDP数据包都是通过公网{IP1:端口1}发送的;当内网主机通过这个socket向外部主机2发送UDP数据包时,NAT为其分配一个公网{IP2:端口2},以后内网主机发送给外部主机2的所有UDP数据包都是通过公网{IP2:端口2}发送的。公网{IP1:端口1}和公网{IP2:端口2}一定不会完全相同(即要么IP不同,要么端口不同,或者都不同)。这种情况下,外部主机只能在接收到内网主机发来的数据时,才能向内网主机回送数据。

所谓锥形NAT 是指:只要是从同一个内部地址和端口出来的包,无论目的地址是否相同,NAT 都将它转换成同一个外部地址和端口。

“同一个外部地址和端口”与“无论目的地址是否相同”形成了一个类似锥形的网络结构,也是这一名称的由来。反过来,不满足这一条件的即为对称NAT 。

举例说明,假设:

NAT 内的主机 A : IP 记为 A ,使用端口 1000
NAT 网关 : IP 记为 NAT ,用于 NAT 的端口池假设为( 5001-5999 )
公网上的主机 B : IP 记为B ,开放端口 2000
公网上的主机 C : IP 记为C ,开放端口 3000
假设主机 A 先后访问主机 B 和 C

1 )如果是锥形 NAT :
那么成功连接后,状态必然如下:

A ( 1000 ) —— > NAT ( 5001 )—— > B ( 2000 )
A ( 1000 ) —— > NAT ( 5001 )—— > C ( 3000 )
也就是说,只要是从 A 主机的 1000 端口发出的包,经过地址转换后的源端口一定相同。

2 )如果是对称形 NAT :
连接后,状态有可能(注意是可能,不是一定)如下:

A ( 1000 ) —— > NAT ( 5001 )—— > B ( 2000 )
A ( 1000 ) —— > NAT ( 5002 )—— > C ( 3000 )
两者的区别显而易见。

三种CONE NAT之间的区别
仍然以上面的网络环境为例, 假设 A 先与 B 建立了连接:

A ( 1000 ) —— > NAT ( 5001 )——— > B ( 2000 )

1) Port Restricted Cone NAT:
只有 B ( 2000 )发往 NAT ( 5001 )的数据包可以到达 A ( 1000 )

该nat 将内网中一台主机的IP和端口映射到公网IP和一个指定端口,只有访问过的IP和端口可以通过映射后的IP和端口连接主机A

2) Restricted Cone NAT
只要是从 B 主机发往 NAT ( 5001 )的数据包都可以到达 A ( 1000 )

该nat 将内网中一台主机的IP和端口映射到公网IP和一个指定端口,只有访问过的IP可以通过映射后的IP和端口连接主机A

3) Full Cone NAT
任意地址发往 NAT ( 5001 )的数据包都可以到达 A ( 1000 )

该nat 将内网中一台主机的IP和端口映射到公网IP和一个指定端口,外网的任何主机都可以通过映射后的IP和端口发送消息

Linux的NAT
Linux的NAT“MASQUERADE”属于对称形NAT。说明这一点只需要否定 MASQUERADE 为锥形 NAT 即可。

linux 在进行地址转换时,会遵循两个原则:

尽量不去修改源端口,也就是说,ip 伪装后的源端口尽可能保持不变。
更为重要的是,ip 伪装后必须 保证伪装后的源地址/ 端口与目标地址/ 端口(即所谓的socket )唯一。
假设如下的情况( 内网有主机 A 和 D ,公网有主机 B 和 C ):
先后 建立如下三条连接:

可以看到,前两条连接遵循了原则 1 ,并且不违背原则 2 而第三条连接为了避免与第二条产生相同的 socket 而改变了源端口比较第一和第三条连接,同样来自 A(1000) 的数据包在经过 NAT 后源端口分别变为了 1000 和1001 。说明 Linux 的 NAT 是对称 NAT 。

对协议的支持
CONE NAT 要求原始源地址端口相同的数据包经过地址转换后,新源地址和端口也相同,换句话说,原始源地址端口不同的数据包,转换后的源地址和端口也一定不同。

那么,是不是 Full Cone NAT 的可穿透性一定比 Symmetric NAT 要好呢,或者说,通过 Symmetric NAT 可以建立的连接,如果换成 Full Cone NAT 是不是也一定能成功呢?

假设如下的情况:

(内网有主机A和D,公网有主机B和C,某 UDP 协议服务端口为 2000 ,并且要求客户端的源端口一定为 1000 。 )

1)如果A使用该协议访问B:
A ( 1000 ) —— > NAT ( 1000 )——— > B ( 2000 )

由于 Linux 有尽量不改变源端口的规则,因此在 1000 端口未被占用时,连接是可以正常建立的如果此时D也需要访问B:

D ( 1000 ) —— > NAT ( 1001 )—X— > B ( 2000 )

端口必须要改变了,否则将出现两个相同的 socket ,后续由 B(2000) 发往NAT( 1000 )的包将不知道是转发给A还是D。于是B将因为客户端的源端口错误而拒绝连接。在这种情况下, MASQUERADE 与 CONENAT 的表现相同。

2)如果A连接B后,D也像C发起连接,而在此之后,A又向C发起连接

① A ( 1000 ) —— > NAT ( 1000 )——— > B ( 2000 )

如果是 MASQUERADE :

② D ( 1000 ) —— > NAT ( 1000 )——— > C ( 2000 )

③ A ( 1000 ) —— > NAT ( 1001 )—X— > C ( 2000 )

如果是 CONE NAT :

② D ( 1000 ) —— > NAT ( 1001 )—X— > C ( 2000 )

③ A ( 1000 ) —— > NAT ( 1000 )——— > C ( 2000 )

对于 MASQUERADE 来说,只要在没有重复的 socket 的情况下,总是坚持尽量不改变源端口的原则,因此第二条连接仍然采用源端口 1000 ,而第三条连接为了避免重复的 socket 而改变了端口。

对于 CONE NAT ,为了保证所有来自 A(1000) 的数据包均被转换为 NAT(1000) ,因此 D 在向 C 发起连接时,即使不会产生重复的 socket ,但因为 NAT 的 1000 端口已经被 A(1000) “占用”了,只好使用新的端口。

可以看出,不同的 target 产生不同的结果。我们也不能绝对的说,在任何时候,全锥形 NAT 的可穿透性都比对称 NAT 要好,比如上面的例子,如果只存在连接①和②,显然是对称形 NAT 要更适用。因此,选择哪种 NAT ,除了对网络安全和普遍的可穿透性的考虑外,有时还需要根据具体应用来决定。

输入和输出准备好后,附上一张维基百科的流程图,就可以描述STUN协议的判断过程了。

STEP2 :检测客户端防火墙类型 -- Test2
STUN客户端向STUN服务器发送请求,要求服务器从其他IP和PORT向客户端回复包:
a)收不到服务器从其他IP地址的回复,认为包前被前置防火墙阻断,网络类型为对称NAT;
b)收到则认为客户端处在一个开放的网络上,网络类型为公开的互联网IP。

STEP3 :检测客户端NAT是否是FULL CONE NAT -- Test2
客户端建立UDP socket然后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器用另一对(IP-2,Port-2)响应客户端的请求往回发一个数据包,客户端发送请求后立即开始接受数据包。 重复这个过程若干次。
a)如果每次都超时,无法接受到服务器的回应,则说明客户端的NAT不是一个Full Cone NAT,具体类型有待下一步检测(继续);
b)如果能够接受到服务器从(IP-2,Port-2)返回的应答UDP包,则说明客户端是一个Full Cone NAT,这样的客户端能够进行UDP-P2P通信。

STEP4 :检测客户端NAT是否是SYMMETRIC NAT -- Test1#2
客户端建立UDP socket然后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器返回客户端的IP和Port, 客户端发送请求后立即开始接受数据包。 重复这个过程直到收到回应(一定能够收到,因为第一步保证了这个客户端可以进行UDP通信)。
用同样的方法用一个socket向服务器的(IP-2,Port-2)发送数据包要求服务器返回客户端的IP和Port。
比较上面两个过程从服务器返回的客户端(IP,Port),如果两个过程返回的(IP,Port)有一对不同则说明客户端为Symmetric NAT,这样的客户端无法进行UDP-P2P通信(检测停止)因为对称型NAT,每次连接端口都不一样,所以无法知道对称NAT的客户端,下一次会用什么端口。否则是Restricted Cone NAT,是否为Port Restricted Cone NAT有待检测(继续)。

STEP5 :检测客户端NAT是Restricted Cone 还是 Port Restricted Cone -- Test3
客户端建立UDP socket然后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器用IP-1和一个不同于Port-1的端口发送一个UDP 数据包响应客户端, 客户端发送请求后立即开始接受数据包。重复这个过程若干次。如果每次都超时,无法接受到服务器的回应,则说明客户端是一个Port Restricted Cone NAT,如果能够收到服务器的响应则说明客户端是一个Restricted Cone NAT。以上两种NAT都可以进行UDP-P2P通信。

一些说明:

[1] RFC3489中的STUN协议(Simple Traversal of UDP Through NATs)是一个完整的NAT穿透方案,但其修订版本(RFC5389)把STUN协议(Session Traversal Utilities for NAT)定位于为穿透NAT提供工具,并不提供一个完整的解决方案。此外,RFC3489只提供了UDP的NAT穿透,而RFC5389还支持TCP的穿透)。

Reference




谁有AIDA64序列号
aida64 extreme是业界领先的系统硬件检测软件,该软件不仅可以提供有关硬件和已安装软件的详细信息,还可以帮助用户诊断问题并提供衡量计算机性能的基准。aida64 extreme破解版安装教程:1、下载解压,得到aida64 extreme中文原程序和注册机;2、双击文件“aida64.exe”打开软件,弹出注册界面,点击输入序列号;3...

鄂城区17894865382: udp打洞四问 -
郜钩复方: UDP"打洞"原理1. NAT分类 根据Stun协议(RFC3489),NAT大致分为下面四类1) Full Cone 这种NAT内部的机器A连接过外网机器C后,NAT会打开一个端口.然后外网的任何发到这个打开的端口的UDP数据报都可以到达A.不管是不是C发过...

鄂城区17894865382: c#udp通讯端口 -
郜钩复方: 1. 端口由服务器本身打开,用于监听会话请求2. 客户端发请求到服务器那个打开的端口,进行会话3. 服务器那段的服务停止,打开的端口自然会释放出来!

鄂城区17894865382: 什么是STUN服务器? -
郜钩复方: 虽然是在UDP 端口3478连接STUN服务器,但会暗示客户终端在另外一个IP和端口号上实施测试(STUN服务器有两个IP地址).

鄂城区17894865382: 有谁做过关于穿越各种NAT的程序啊? -
郜钩复方: 用STUN实现了一个,但不能穿越对称NAT,华为用的ICE,比较复杂,要自己的服务器.STUN只能用于SIP等UDP穿越,H323等TCP的只能用TURN之类的技术

鄂城区17894865382: 如何编程确定NAT的类型? -
郜钩复方: 可以利用STUN的客户端查看, 软件可以从这里获取: Linux版: http://sourceforge.net/projects/stun/ Java版(适用各种操作系统): http://jstun.javawi.de/

鄂城区17894865382: 如何配置配置 stun 服务器 -
郜钩复方: 1、Webrtc是基于P2P的,在两个客户端建立连接之前需要服务器建立连接,这时两台设备一般都处于一个或者多个NAT中,那么两台设备建立连接就需要穿墙技术2、这时就用到了turn服务器,他包括stun服务器,stun服务器主要用来获得外网的地址,而turn服务器则负责在P2P连接失败时进行转发3、建议下载ActiveFax Server(传真服务器)www.3322.cc/soft/27414.html

鄂城区17894865382: SIP怎么使用STUN -
郜钩复方: 其实这是个很简单的问题,SIP通过STUN得到NAT的外网IP和SIP的信令监 听端口的外网port,替换SIP注册包中的contact头中的IP和port,然后注册.这样就可以确保当有人呼叫你的的时候注册服务器能找到你.需 要提醒你的是,NAT发现一个连接超过一段时间后没有活动,它就会关闭这个影射,因此你必须间隔一端时间发送一个数据包出去以keep alive.

鄂城区17894865382: natNAT穿透方法有什么?
郜钩复方: natNAT穿透方法目前常用的针对UDP的NAT穿透(NATTraversal)方法主要有:STUN、TURN、ICE、uPnP等

鄂城区17894865382: 支持UPnP的P2P软件(如电驴,VAGAA,BT等)是否可以穿透对称NAT? -
郜钩复方: 需要打开uPnP

鄂城区17894865382: webrtc支持rtmp协议吗 -
郜钩复方: 一) sipdroid 1)架构 sip协议栈使用JAVA实现,音频Codec使用skype的silk(Silk编解码是Skype向第三方开发人员和硬件制造商提供免版税认证(RF)的Silk宽带音频编码器)实现.NAT传输支持stun server. 2)优缺点: NAT方面只支持STUN,无ICE框架,...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网