目前支持我们互联网的基石,IPv4网络地址最初定义于1981年,至今也没有什么变化。当时全世界的计算机不过几百台,IPv4毫无压力,但其32位的地址结构早已不足以支撑现在庞大的互联网。
虽然出现了解决这一问题的IPv6,但是很难平滑过度,而今解决时间上数十万终端连入互联网的,是NAT技术。NAT技术在缓解ipv4不足,以及带来安全性提升的好处的同时,也带来了一些问题。下面就来对NAT的原理、好处以及带来的问题做简略的介绍。
1.1. NAT的实现原理
NAT是Network Address Translation的简写,即网络地址转换,一般在网关设备上实现,比如我们家里常用的小路由器,其实里面就实现了NAT。其作用是将网关内部的私有ip地址与网关外部的共有ip地址进行映射,修改数据包中的源IP与目的IP。这样主机的IP地址就不会暴露在外网中,而是隐藏在网关的后面,网关就帮助内部主机阻挡住了大多数的网络攻击。
NAT的实现方式有三种:
1. 静态转换:将内部的一个私有IP固定的映射为外部的一个公有IP。这要求公网IP的数量足够映射内网的主机数量,同时要求网关设备上要配置静态NA映射,所以这种应用一般用在服务器端,用于网络隔离。
2. 动态转换:将内部的私有IP随机转换为一个外部公有IP,同时上网设备的数量仍然不能大于已有的公有IP数量。
端口多路复用(Port Address Translation, PAT):也叫网络端口地址转换(Network Address Port Translation),这是我们目前应用最多的一种NAT实现方式,家中的小路由器用的就是这种,这种实现方式可以将内部不同的私有IP转换为同一公有IP,从而实现了大家用一个公有IP共同上网,节约IP的作用。那么NAT设备怎么区分内部不同私有IP与外部连接的对应能,使用的是端口号。具体的映射过程见图1
图1 NAT转换过程
图中,内部有两台PC,内部私有ip分别为Ai1和Ai2,但是他们经过NAT设备访问外网的公有ip只有一个Ao2,于是NAT设备做了一个上面第三种实现所说的端口多路复用,过程如下:
nat内部终端经nat设备发送出去的数据包被nat设备替换了数据包的源ip和源端口号,在图1中,PC1发出的一个数据包源ip和源端口号Ai1 Pi1被替换为外网的一对源ip和源端口号Ao1 Po1,于是因特网上其他设备收到的PC1上发来的数据包就隐藏了PC1的身份,转而变成NAT设备发来的了。当网上的设备回复数据包给PC1时,其目的ip和目的端口号就成了Ao1和Po1,于是NAT设备接到了这个数据包。NAT设备给句内部存储的映射关心,将该数据包的目的ip和目的端口号替换为Ai1和Pi1,于是PC1收到了来自外网的数据包。同样的,来之内部另外一台终端PC2的数据包也会被映射为外网的ip和端口号Ao1和Po2,公有ip相同,但是公有端口号不同,于是实现了内部不同私有ip通过同一公有ip访问外网。
在这一映射的过程中,一切内幕都掌握在NAT设备的手中,它在向外转发的过程中偷偷替换了源ip和端口号,在向内转发的过程中又根据记录下来的映射关系将目的ip和目的端口号替换回去。内网终端不知道这个过程,以为自己是直接与外网的服务器进行通信;外网的服务器也不知道有内部终端的存在,以为与自己通信的就是那台NAT设备。这时一个问题出现了,如果外网想要主动连接内网的设备怎么办。
这种应用时存在的,比如一台服务器要集中管理NAT下面的设备,比如现在流行的终端对终端的多媒体实时聊天,比如各种p2p应用,都需要跨越NAT访问内网。本文介绍其中比较古老的一种——STUN(Simple Traversal of UDP Through NATs,Nat的UDP简单穿越)。
1.2. NAT的四种类型
要想穿透NAT,还要了解NAT(后面我们提到NAT,专指端口多路复用这种实现方式)的几种类型。
NAT根据NAT处理UDP数据包的行为细分为四种类型分别是:完全圆锥形(Full Cone),受限圆锥形(Restricted Cone),端口受限圆锥形(Port Restricted Cone)和对称形(Symmetric)。他们的特性如下:
1. 完全圆锥形:
来自内部同一IP地址和端口号的所有请求都会映射为相同的外部IP地址和端口号,所有的外部主机都可以通过这个映射后的IP地址和端口号向内部主机发送数据包。
2. 受限圆锥形:
来自内部同一IP地址和端口号的所有请求都会映射为相同的外部IP地址和端口号,不同于完全圆锥形,一个外部主机(假设其IP地址为X),只有当内部主机已经向IP地址X发送过数据包了,该外部主机才能向内部主机发送数据包。
3. 端口受限圆锥形:
跟受限圆锥形相似,但是端口受限圆锥形还限制了外部主机的端口,即只有当内部主机向外部某一IP和端口发送过数据包后,该IP和端口才能向内部主机发送数据包。
4. 对称形:
从同一内部IP地址和端口发往一个特定目的的IP地址和端口号的请求映射为同一外部IP地址和端口。如果同一主机用同一地址和端口向不同的目的地址发送数据包,将使用一个不同的映射,而且,只有当外部主机收到一个来自内部的包时,才能向该内部主机发送数据包。
stun最早定义在2003年发布的RFC3489中,之后该协议被2008年发布的RFC5389所取代。但是鉴于仍有老的stun的应用场景,我们这里介绍老版stun,并把它称为classic stun。classic stun并不能完全满足上面四种,其中对称形NAT就无法使用classic stun进行穿透,所以,判断NAT类型是进行classic stun NAT穿透的重要部分。