什么是NAT
或许你在前一段时间听闻IPv4地址枯竭的新闻,IPv4地址只有32位长,理论最多42.9亿条。大概在94年时候,提出了IP网络地址转换NAT 的RFC规范,作为一个临时方案来解决IPv4地址枯竭的问题。
这个方案就是要把IP地址重用。在边缘网络引入NAT设备,由它来负责维护本地服务IP和端口的映射到公网IP和端口。NAT内部的本地IP地址空间可以被许多不同的子网络重用,从而解决地址耗尽的问题。
可是,后面临时方案很快成为了最终方案,NAT成为了互联网基础设施的组成部分。它不仅用来解决IP地址枯竭的问题,你会发现路由器、防火墙、代理设备都具备NAT功能。
NAT类型
关于NAT被人们研究总结过,大体两种:锥型和对称型。而锥型又可分细分为三种。
所以归纳起来,总共四种类型:完全锥型、IP限制锥型、端口限制锥型 和 对称型。
- 完全锥型
当内网host与外网机器通讯,就会在NAT上打洞,这个过程就是指在NAT建立内外网映射表,这个表上记录内外网IP端口映射关系。外网机器与P地址p端口的通讯,都会在NAT上转发到对应的内网地址与端口,从而实现和内网host机器通讯。
- IP限制型
IP限制锥型更加严格,在完全锥形基础上,只允许Host访问过的IP通过打洞。(映射表多记录了被访问外网的IP地址)如图,A和C等其他外网主机想通过B机的打洞IP端口,也是无法和Host通讯。
- 端口限制锥型
4.对称型
对称型,是最严格的NAT类型,他一样有IP和端口限制(这点和端口限制锥型一致)。它最大不同在于,每次连接都会在NAT上新开IP地址或者新开IP地址和端口与外网通讯。也就是说每一次NAT的打洞都不相同。基本上对称型NAT是无法穿越的。
NAT类型检测
下图是在STUN(Session Traversal Utilities for NAT 翻译过来会话穿越NAT实现,可以理解为NAT穿越的算法协议。)中,对于NAT类型检测的流程图。当走到红色结束时:表明穿越失败,无法UDP通讯。当走到绿色(公网地址)或黄色时(锥型NAT)才可能进行通讯。
整个流程大体上发起了5次检测 test1
- 主机向服务器IP端口发请求,服务器通过同样IP端口返回,收到返回?yes:next。no:udp不通。
- 是否为同一个地址?yes:没有NAT=>走test2。 no:在NAT后=>走test3。
test2
- 判断返回的主机外网IP地址是否与主机自身IP地址是否一样? yes:是公网地址;no:存在对称型防火墙。
test3
- 在 NAT背后,主机向服务器发请求,服务器通过另一个网卡IP和不同端口返回,是否收到。 yes:完全锥型;no:限制锥形=>test4。
test4
- 主机向另一台服务器发请求,对比服务器1和2的上获取的本机映射的公网IP端口是否一致? yes:非对称型(至少IP不限制);no:对称型=>test5。
test5
- 主机向test4的服务器再发一次请求,该服务器用相同IP但不同的端口返回? yes:IP限制锥型;no:端口限制锥型
以上关于NAT,及其打洞和穿越原理的介绍。实际穿越比这个更多细节且更加复杂,有相应的RFC规范RFC5389。虽然过程是复杂的,但是整过程耗时还是相当快的。