内网穿透简介

NAT的类型

NAT一般有两种大的类型:cone(漏斗)类型和symmetric(对称)类型

cone

cone类型又分为三种小的类型,分别为:full cone、restricted cone和port restricted cone

在cone类型中,内网ip-port对在NAT中的映射是不变的,即使所访问的外网ip-port端口不一样,这也是其命名为cone的原因。

full cone

full cone是限制最少的类型,在NAT服务器上,一个内网的ip-port对只映射到一个公网的ip-port对,而不管内网主机访问的外网ip-port对的不同。

restricted cone

restricted cone相对于full cone类型增加了外网ip的限制,只有内网的机器访问了某个外网的机器,该外网机器的数据包才可以通过NAT的限制。在NAT的映射中,NAT维持一个映射关系:
{对端外网ip:内网ip:内网port}—->{公网ip:公网port},同一个外网ip的机器不同的port都可以通过该映射,从而实现与内网的通讯。

port restricted cone

port restricted cone类型在restricted cone类型的基础上增加了port的限制,必须又内网的机器访问外网机器的某个端口,该外网机器的对应端口发出的数据包才可以通过NAT。NAT维持的映射关系如下:
{对端外网ip:对端外网port:内网ip:内网port}—->{公网ip:公网port},同一个机器的特定端口才可以通过该映射。

注意,在以上的三种类型中,只要内网ip-port对不变,其在NAT的映射所对应的公网ip-port对就不会改变,也就是说,同一个内网ip-port在通讯过程中,其所对外的公网ip-port是不变的

symmetric

该类型的限制最严格,端口对端口的通讯都会有一个特定的映射,就拿port restricted cone来说,对于映射:{对端外网ip:对端外网port:内网ip:内网port}—->{公网ip:公网port}, 只要是四元组中的内网ip:内网port不变,那么所有的四元组都会被映射到同一个{公网ip:公网port},而在symmetric类型下,只要四元组中有一个是变化的,都会被映射到不同的而且唯一的{公网ip:公网port}。

cone 的映射是多对一的映射,类似于一个漏斗,而symmetric的映射是一个一对一的映射,也就是对称的映射。

NAT穿透

根据NAT的类型不同,具体的实现细节也是不同的。但是不管是NAT类型不同,还是所采用的打洞技术不同,都需要使用到第三方服务器作为彼此信息的转发者。采用UDP来实现打洞,成功率会比较高,实现起来也比较容易。而采用TCP来打洞的话,成功率较低,而且实现起来会比较的麻烦,主要的原因就是对于TCP来说,既要打洞又要建立监听,而两者所使用的端口都是一样的,而且如果两端同时收到对端的SYN,那么两端都会处于SYN-Received状态,具体进一步的处理就要看不同的系统的TCP栈处理程序了,这个也就会导致TCP在打洞方面的成功率低于UDP。