WebRTC连接:一些关于NAT穿越的简要原理

1,504 阅读4分钟

什么是NAT

或许你在前一段时间听闻IPv4地址枯竭的新闻,IPv4地址只有32位长,理论最多42.9亿条。大概在94年时候,提出了IP网络地址转换NAT 的RFC规范,作为一个临时方案来解决IPv4地址枯竭的问题。

这个方案就是要把IP地址重用。在边缘网络引入NAT设备,由它来负责维护本地服务IP和端口的映射到公网IP和端口。NAT内部的本地IP地址空间可以被许多不同的子网络重用,从而解决地址耗尽的问题。

可是,后面临时方案很快成为了最终方案,NAT成为了互联网基础设施的组成部分。它不仅用来解决IP地址枯竭的问题,你会发现路由器、防火墙、代理设备都具备NAT功能。

NAT类型

关于NAT被人们研究总结过,大体两种:锥型和对称型。而锥型又可分细分为三种。

所以归纳起来,总共四种类型:完全锥型、IP限制锥型、端口限制锥型 和 对称型。

  1. 完全锥型

当内网host与外网机器通讯,就会在NAT上打洞,这个过程就是指在NAT建立内外网映射表,这个表上记录内外网IP端口映射关系。外网机器与P地址p端口的通讯,都会在NAT上转发到对应的内网地址与端口,从而实现和内网host机器通讯。

  1. IP限制型

IP限制锥型更加严格,在完全锥形基础上,只允许Host访问过的IP通过打洞。(映射表多记录了被访问外网的IP地址)如图,A和C等其他外网主机想通过B机的打洞IP端口,也是无法和Host通讯。

  1. 端口限制锥型

端口限制锥型比IP限制锥型更加严格,IP限制锥型不限制端口。IP限制锥型情况下,同一外网主机的其他端口服务,都能和内网Host通讯。但是端口限制性情况下,只允许外网机器指定的端口服务通过打洞。(映射表多记录了被访问的外网的IP地址和端口

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。虽然过程是复杂的,但是整过程耗时还是相当快的。