NAT类型与UDP穿透

来源:互联网 发布:学通网络红尘老师QQ 编辑:程序博客网 时间:2024/06/05 06:39

在现实的Internet环境中,主机大多位于防火墙或NAT之后,只有少部分主机是直接接入Internet的(这些主机拥有全网可访问的IP,即公网IP)。很多时候,我们希望网络中的两台主机能够直接通信(即P2P通信),而不是通过中转服务器。这就需要NAT穿透技术,NAT穿透的最主要一步是检测NAT类型以确认它们之间是否能够进行P2P通信。下面将要谈及NAT的类型、检测NAT类型的方法以及NAT类型对穿透的影响。

NAT类型

根据STUN协议,NAT大致分为下面4类

1 Full Cone

当内网主机创建一个UDP socket并通过它第一次向外发送UDP数据时,NAT会为之分配一个固定的公网[IP, 端口]。此后,通过该socket发送的任何数据包都是通过这个公网[IP, 端口]发送出去的。同时,任何外部主机发送到这个公网[IP, 端口]的UDP数据包都会被转交给该内网主机。即是说,NAT维护了一个映射表,内网主机的内网[IP, 端口]公网[IP, 端口]是一一对应的。一旦这个映射关系建立起来(内部主机向某一外部主机发送一次数据即可),任何外部主机都可以向该NAT内的主机发起UDP通信。

下面的例子比较直观:

例如 A:192.168.8.100 NAT:202.100.100.100C: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)


如上图所示,一个映射关系对应着多台外部主机,看起来像一个圆锥,所以叫Full Cone吧。如果了解穿透的原理,就容易看出这种类型的NAT完全可以穿透。

方法很简单:

首先内网主机A向穿透服务器S发送数据,S从而知道主机A的公网[ip, 端口]。S可以把这个信息告诉另一台内网主机B,B就可以直接向A发起连接。

 

需要注意的是,这里的映射关系是:

内网[ip, 端口]  -------------  公网[ip, 端口]

如果是同一台内网主机,但是不同的端口,那会是另一个映射关系(也不是绝对的,但这是比较常见的情况,还有一种IP对IP的映射)。

换句话说,所有通过内网主机A的端口P1发送的UDP数据,都是通过一个固定公网[ip, 端口]发送出去的。即是说,内网主机A在端口P1上创建了一个socket并发送了数据,然后把它关闭,再在该端口上创建socket,该映射关系依然有效。另一方面来说,该映射关系也是临时的,即如果在一定时间内该映射上没有数据通信,该映射关系就会被删除。下一次用到,会重新分配一个。

2 Restricted Cone

这种类型与上一种类型的区别在于:只有收到过内网主机发送的数据的外部主机才能向该内网主机发送数据。这种类型的NAT除了维护一个内网[ip,端口]公网[ip, 端口]的映射外,还维护了一个[外部主机ip, 公网[ip, 端口]]内网[ip, 端口]的映射。即,当NAT收到某个发送到公网[ip, 端口]的数据包时,还要检查是否存在[该外部主机ip, 公网[ip, 端口]]内网[ip, 端口]的这样的映射,如果不存在,就当做非法数据丢弃。

例如 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)

 

这种类型的NAT也是可以穿透的。

假设欲通信的两台内网主机A, B均位于Restricted Cone NAT之后,可以这样建立P2P通信。

1 A向穿透服务器S发送数据,S从而知道A的公网[ip, 端口]

2 B向穿透服务器S发送数据,S从而知道B的公网[ip, 端口]

3 A和B通过S交换各自的公网[ip, 端口]信息

4 A和B都向对端的公网[ip, 端口]发送连接,这样A和B都在各自的NAT打开了相应的端口,从而A发给B的数据能够穿透B的NAT,B发给A的数据也能穿透A的NAT

3 Port Restricted Cone

这是Restricted Cone近一步受限。即内网主机A向外网主机C的端口P1发送过数据,那么C只能通过端口P1给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和上面一种穿透方法一样。

 

以上三种NAT通称Cone NAT

4 Symmetric NAT

对于这种NAT,内网主机连接不同的外部主机时,NAT会为其分配不同的端口。这种类型的NAT比难穿透,有时候可以用端口预测的方法,但是成功率不高。(一部分NAT会连续分配端口,一部分NAT是随机分配端口)。

 

能穿透的组合:
Any Type NAT  --- Full Cone NAT
One of Cone NAT  -- One of Cone NAT

 如果欲穿透的两台主机中有一个位于对称型NAT之后,并且另一台主机不是位于Full Cone之后,就不能穿透。

检测NAT类型

从上面的分析看来,因为Cone NAT我们都可以用同样的方法进行穿透,所有我们只需要判断是否有对称型NAT存在。方法也简单:只需要内网主机通过同一端口分别向两台不同IP的穿透服务器(具有公网IP)发送数据,服务器把它看到的公网[ip, 端口]信息反馈给内网主机,如果内网主机收到的两个公网[ip, 端口]信息不一样,那么该主机就位于对称型NAT之后。

更详细的检测方法:http://www.cnblogs.com/my_life/articles/1908552.html

参考:

http://www.rosoo.net/a/201111/15293.html

http://opsunv.com/programming/2010/02/nat-type/