重学UDP(二) NAT
什么是NAT
NAT(Network Address Translation,网络地址映射)主要是将私有 IP 地址转换成可以在公网使用的公网 IP 地址。而能够进行映射的网络装置被称为 NAT 路由。
之所以需要NAT,是为了解决 IPv4 地址不够而诞生的。通过公网 IP 地址与端口映射到私网机器的 IP 地址与端口。这样就能通过少量的公有 IP 地址来代表较多的私有 IP 地址,有助于减缓 IPv4 地址的耗尽问题。如下图。
NAT 的分类
NAT 按功能分有两大类,锥型 NAT 和对称型 NAT。
所谓锥形NAT 是指:只要是从同一个内部地址和端口出来的包,无论目的地址是否相同,NAT 都将它转换成同一个外部地址和端口。
“同一个外部地址和端口”与“无论目的地址是否相同”形成了一个类似锥形的网络结构,也是这一名称的由来。反过来,不满足这一条件的即为对称NAT 。
Full Cone
完全锥型 NAT。IP 和端口都不受限。表现形式:将来自内部同一个 IP 地址同一个端口的主机监听/请求,映射到公网 IP 某个端口的监听。任意外部 IP 地址与端口对其自己公网的 IP 这个映射后的端口访问,都将重新定位到内部这个主机。该技术中,基于 C/S 架构的应用可以在任何一端发起连接。简单一点的说,就是只要客户端由内到外建立一个映射之后,其他 IP 的主机或端口都可以使用这个洞给客户端发送数据。
Restricted Cone
受限锥型 NAT。IP 受限,端口不受限。表现形式:与完全锥形 NAT 不同的是,在公网映射端口后,并不允许所有 IP 进行对于该端口的访问,要想通信必需内部主机对某个外部 IP 主机发起过连接,然后这个外部 IP 主机就可以与该内部主机通信了,但端口不做限制。举个栗子:当客户端由内到外建立映射,A 机器可以使用他的其他端口主动连接客户端,但 B 机器则不被允许。因为 IP 受限啦,但是端口随便。
Port Restricted Cone
端口受限型 NAT。IP 和端口都受限。表现形式:该技术与受限锥形 NAT 相比更为严格。除具有受限锥形 NAT 特性,对于回复主机的端口也有要求。也就是说:只有当内部主机曾经发送过报文给外部主机(假设其 IP 地址为 A 且端口为 P1)之后,外部主机才能以公网 IPORT 中的信息作为目标地址和目标端口,向内部主机发送 UDP 报文,同时,其请求报文的 IP 必须是 A,端口必须为 P1(使用 IP 地址为 A,端口为 P2,或者 IP 地址为 B,端口为 P1 都将通信失败)。这一要求进一步强化了对外部报文请求来源的限制,因此它比受限锥型 NAT 更具安全性。
Symmetric
对称型 NAT。对每个外部主机或端口的会话都会映射为不同的端口(洞)。表现形式:只有来自同一内部 IPort、且针对同一目标 IPORT 的请求才被 NAT 转换至同一个公网(外部)IPort,否则的话,NAT 将为之分配一个新的外部(公网)IPort。并且,只有曾经收到过内部主机请求的外部主机才能向内部主机发送数据包。内部主机用同一 IP 与同一端口与外部多 IP 通信。客户端想和服务器 A(IP_AORT_A)建立连接,是通过 NAT 映射为 NatIP:NatPortA 来进行的。而客户端和服务器 B(IP_BORT_B)建立连接,是通过 NAT 映射为 NatIP:NatPortB 来进行的。即同一个客户端和不同的目标 IP:PORT 通信,经过 NAT 映射后的公网 IP:PORT 是不同的。此时,如果 B 想要和客户端通信,也只能通过 NatIP:NatPortB 来进行,而不能通过 NatIP:NatPortA。以上,就是四种 NAT 类型。可以看出从类型 1 至类型 4,NAT 的限制是越来越大的,其穿透也越来越复杂。
具体判断如下图:
STUN
在现实Internet网络环境中,大多数计算机主机都位于防火墙或NAT之后,只有少部分主机能够直接接入Internet。很多时候,我们希望网络中的两台主机能够直接进行通信,即所谓的P2P通信,而不需要其他公共服务器的中转。由于主机可能位于防火墙或NAT之后,在进行P2P通信之前,我们需要进行检测以确认它们之间能否进行P2P通信以及如何通信。这种技术通常称为NAT穿透(NAT Traversal)。最常见的NAT穿透是基于UDP的技术,如RFC3489中定义的STUN协议。
STUN是一个完整的NAT穿透解决方案,英文全称是Simple Traversal of UDP Through NATs,即简单的用UDP穿透NAT。
在一个常见的STUN系统中,主要包括客户端、STUN Server、服务端,客户端通过UDP访问STUN Server,获取自己的公网IP和端口,并以此作为自己的外部地址,让其它客户端或服务端访问。以使一端或两端位内网ip的端能相互直接访问。
STUN协议最大的优点是无需现有NAT/FW设备做任何改动,同时STUN方式可在多个NAT串联的网络环境中使用. STUN的局限性在于STUN并不适合支持TCP连接的穿越,同时STUN方式不支持对对称NAT(Symmetric NAT).
WebRTC
作为一个开发者,直接使用WebRTC是快速实现STUN的一种方式。
WebRTC是一个由Google发起的实时通讯解决方案,其中包含视频音频采集,编解码,数据传输,音视频展示等功能,我们可以通过WebRTC快速地构建出一个音视频通讯应用。
它最初是为了解决浏览器上视频通话而提出的,即两个浏览器之间直接进行视频和音频的通信,不经过服务器。后来发展到除了音频和视频,还可以传输文字和其他数据。虽然其名为WebRTC,但是实际上它不光支持Web之间的音视频通讯,还支持Android以及IOS端,此外由于该项目是开源的,我们也可以通过编译C++代码,从而达到全平台的互通。
参考链接
- https://zh.wikipedia.org/wiki/STUN
- https://www.cnblogs.com/fangkm/p/4364553.html
- https://zhuanlan.zhihu.com/p/86751078