NAT (Network Address Translation,网络地址映射)也叫做网络掩蔽或者 IP 掩蔽,主要是将私有 IP 地址转换成可以在公网使用的公网 IP 地址。而能够进行映射的网络装置被称为 NAT 路由。
在讲解 NAT 穿透之前我们先来想想为什么需要 NAT 呢?
要想回答这个问题就不得不了解 IPv4 与 IPv6 的区别了。IPv4 中规定 IP 地址长度为 32,即有 2^32-1 个地址,而 IPv6 中 IP 地址的长度为 128,即有 2^128-1 个地址。夸张点说,如果 IPv6 被广泛应用以后,全世界的每一粒尘埃都分配一个 IP 地址都够用。回到我们的问题,答案应该清楚了,那就是为了解决 IP 地址不够而诞生的。通过公网 IP 地址与端口映射到私网机器的 IP 地址与端口。这样就能通过少量的公有 IP 地址来代表较多的私有 IP 地址,有助于减缓 IPv4 地址的耗尽问题。放张图大家来直观地了解下。
先来提几个问题,带着问题去看文章,看完你就知道答案了。
两个都在 NAT 之后的终端怎么通信呢?
我们不知道对方的内网 IP,即使把消息发到对方的网关,然后呢?
网关怎么知道这条消息给谁,而且谁允许网关这么做了?
好了,接下来我们开始讲解 NAT 的种类。
NAT 按实现方式分有三种,即静态转换、动态转换和端口多路复用。
静态转换是指将内部网络的私有 IP 地址转换为公有 IP 地址,IP 地址对是一对一的,是一成不变的,某个私有 IP 地址只转换为某个公有 IP 地址。借助于静态转换,可以实现外部网络对内部网络中某些特定设备(如服务器)的访问。
动态转换是指将内部网络的私有 IP 地址转换为公用 IP 地址时,IP 地址是不确定的,是随机的,所有被授权访问上 Internet 的私有 IP 地址可随机转换为任何指定的合法 IP 地址。也就是说,只要指定哪些内部地址可以进行转换,以及用哪些合法地址作为外部地址时,就可以进行动态转换。动态转换可以使用多个合法外部地址集。当 ISP 提供的合法 IP 地址略少于网络内部的计算机数量时,就可以采用动态转换的方式。
端口多路复用是指改变外出数据包的源端口并进行端口转换,即端口地址转换(PAT,Port Address Translation)。采用端口多路复用方式,内部网络的所有主机均可共享一个合法外部 IP 地址实现对 Internet 的访问,从而可以最大限度地节约 IP 地址资源。同时,又可隐藏网络内部的所有主机,有效避免来自 internet 的攻击。因此,目前网络中应用最多的就是端口多路复用方式。
NAT 按功能分有两大类,锥型 NAT 和对称型 NAT。其中锥型 NAT 又分:完全锥型 NAT,对称 NAT,IP 限制锥型 NAT,端口限制锥形 NAT。概括的说:对称型 NAT 是一个请求对应一个端口;锥型 NAT(非对称 NAT)是多个请求(外部发向内部)对应一个端口,只要源 IP 端口不变,无论发往的目的 IP 是否相同,在 NAT 上都映射为同一个端口,形象的看起来就像锥子一样。下面来介绍一下这四种类型。
完全锥型 NAT(Full Cone NAT)特点:IP 和端口都不受限。表现形式:将来自内部同一个 IP 地址同一个端口的主机监听/请求,映射到公网 IP 某个端口的监听。任意外部 IP 地址与端口对其自己公网的 IP 这个映射后的端口访问,都将重新定位到内部这个主机。该技术中,基于 C/S 架构的应用可以在任何一端发起连接。简单一点的说,就是只要客户端由内到外建立一个映射之后,其他 IP 的主机或端口都可以使用这个洞给客户端发送数据。
受限锥型 NAT(Restricted Cone NAT)特点:IP 受限,端口不受限。表现形式:与完全锥形 NAT 不同的是,在公网映射端口后,并不允许所有 IP 进行对于该端口的访问,要想通信必需内部主机对某个外部 IP 主机发起过连接,然后这个外部 IP 主机就可以与该内部主机通信了,但端口不做限制。举个栗子:当客户端由内到外建立映射,A 机器可以使用他的其他端口主动连接客户端,但 B 机器则不被允许。因为 IP 受限啦,但是端口随便。
端口受限型 NAT(Port Restricted Cone NAT)特点:IP 和端口都受限。表现形式:该技术与受限锥形 NAT 相比更为严格。除具有受限锥形 NAT 特性,对于回复主机的端口也有要求。也就是说:只有当内部主机曾经发送过报文给外部主机(假设其 IP 地址为 A 且端口为 P1)之后,外部主机才能以公网 IPORT 中的信息作为目标地址和目标端口,向内部主机发送 UDP 报文,同时,其请求报文的 IP 必须是 A,端口必须为 P1(使用 IP 地址为 A,端口为 P2,或者 IP 地址为 B,端口为 P1 都将通信失败)。这一要求进一步强化了对外部报文请求来源的限制,因此它比受限锥型 NAT 更具安全性。
对称型 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 的限制是越来越大的,其穿透也越来越复杂。
NAT 可以同时让多个计算机同时联网,并隐藏其内网 IP,因此也增加了内网的网络安全性。此外,NAT 对来自外部的数据查看其 NAT 映射记录,对没有相应记录的数据包进行拒绝,提高了网络安全性。
首先是,NAT 设备会对数据包进行编辑修改,这样就降低了发送数据的效率。此外,各种协议的应用各有不同,有的协议是无法通过 NAT 的,这就需要通过 NAT 穿透技术来解决。要想使用 NAT 穿透,就不得不知道如何鉴别 NAT。
NAT类别图
从上图可知只用检测四种 NAT 类型,来欣赏笔者的一副手绘图~
我们先通过大学男生通过楼管阿姨能否进入女生宿舍的例子来简单理解下识别 NAT。
完全锥形 NAT:楼管阿姨不管男生是谁,都让进入女生宿舍(这是亲妈吧。。。)。
IP 限制锥形 NAT:楼管阿姨只让与校花是同专业的男生进。
端口限制:楼管阿姨只让与校花是同专业并且是班干部的男生进。
对称 NAT:进入的男生必须与阿姨对暗号,正确才能进。
我们在讲解 NAT 鉴别前来了解一个重要的概念,如下:
对称 NAT 与锥型 NAT 的区别,在于私网机器与不同的公网机器通信在 NAT 路由器上产 生映射表记录的条数。对称 NAT 与 N 台公网机器通信则生成 N 条记录;而锥形 NAT 与 N 台 公网机器通信则生成 1 条记录。因此对称 NAT 穿透比较麻烦。接下来开始讲如何鉴别 NAT。
1):Clinet(客户端)发送报文到 Server 1(服务器)时网关产生了对外公网 IP,此时 Server 1 获取到的 Client IP 地址即为 Client 的对外公网 IP。
2):Clinet 发送报文到 Server 2,Server 2 获取到 Client 的 IP 地址(ip:port)。
3):Server 1 将获取到的客户端的 IP 地址,发送给 Server 2,然后 Server 2 对比 Server 1 发过来的地址与自己获取的 Client IP 地址。如果两个 Client IP 地址完全一致,则为锥型 NAT,否则为对称 NAT。
1):Client(客户端)网络进程发送报文给 Server 1(服务器)。 Server 1 获取到 Client IP 地址(对外公网 IP 地址)。
2):Server 1 将获取的客户端 IP 地址发送给 Server 2。
3):Server 2 收到 Client IP 地址后,发送报文给 Client ,然后检测 Client 能否收到报文数据。若能收到,则是完全锥型 NAT,否则是限制锥形 NAT。
4):Client 网络进程收到报文数据后,继续发送报文给 Server 1。Server 1 收到报文数据,则为完全锥型 NAT,否则为限制锥型 NAT。
第 4 步是为了保证鉴别的准确性。
1): Client(客户端)网络进程发送报文给 Server 服务器(ip:8888)。然后服务器获取到客户端的 IP 地址。
2):服务器使用相同 IP 不同端口(ip:8889)发送报文数据给 Client(客户端)。如果 Client 能收到报文则为 IP 限制锥型 NAT,否则为端口限制锥型 NAT。
3):Client 网络进程回发报文给 Server 的 8888 端口,Server 收到报文数据,则为 IP 限制锥形 NAT,否则为端口限制锥型 NAT。
同样的第 3 步是为了保证鉴别的准确性。
两台客户端通过网关穿透总共有 16 种情况,但我们只需要考虑 3 种情况即可。
1、任意一端为完全锥形 NAT。
2、两端均为限制锥形 NAT。
3、两边均为对称 NAT 或者一端为限制锥形 NAT 一端为对称 NAT。
在穿透过程中,两端私网机器都是在 NAT 路由器之下的。两端 NAT 只要有一方为完全锥型 NAT 的时候,就是可以穿透的。完全锥形 NAT 穿透流程如下图所示, NAT1 为完全锥形 NAT,NAT2 为 任意 NAT。
穿透完全锥形 NAT
1):私网机器 1(192.168.1.3:2341)发送报文给服务器(180.93.45.46:8888)。服务器获取到私网机器 1 的公网 IP 地址与端口(112.93.14.56:43891)。
2):服务器收到报文信息后,通知私网机器 2(192.168.2.6:6583),通知信息内包含有私网机器 1 的公网 IP 地址与端口(112.93.14.56:43891)。
3):私网机器 2(192.168.2.6:6583)收到通知信息后直接发送数据给私网机器 1 的公网 IP 地址与端口 (112.93.14.56:43891),此时私网机器 1 就能收到私网机器 2 发送的报文数据,并且能获取到私网机器 2 的公网 IP 地址与端口(iAddr:iPort)。
4):私网机器 1 回发报文信息给私网机器 2 的公网 IP 地址与端口(iAddr:iPort),此时私网机器 2 也能收到私网机器 1 回发的报文数据。穿透结束。
限制锥型 NAT 的特点是限制了其他公网机器报文数据传输。如果这里采用上边穿透完全锥型 NAT 的穿透步骤来穿透限制锥型 NAT,那么在步骤 3 时私网机器 1 不能收到私网机器 2 发送的报文数据,穿透失败。
下边来讲限制锥形 NAT 的穿透,穿透流程如下图所示。
穿透限制锥形 NAT
1):私网机器 1(192.168.1.3:2341)发送报文给服务器(180.93.45.46:8888),服务器获取到私网机器的公网 IP 地址(112.93.14.56:43891)。
2):然后服务器发送通知报文给私网机器 2(192.168.2.6:6583),通知报文中包含私网机器 1 的公网 IP 地址(112.93.14.56:43891)。
3):私网机器 2 发送报文数据到私网机器 1 的公网 IP 地址(112.93.14.56:43891)。由 于 NAT1 是限制锥型 NAT,此时私网机器 1 不能收到报文数据。
4):私网机器 2 进行完步骤 3 以后,立即发送报文给服务器(180.93.45.46:8888),要求私网机器 1 发送数据给私网机器 2 的公网 IP 地址。
5):服务器通知私网机器 1,通知信息中包含私网机器 2 的公网 IP 地址(180.20.198.42.9681)。
6):私网机器 1 接到服务器通知后发送报文数据给私网机器 2 的公网 IP 地址。由于步骤 3 中私网机器 2 给私网机器 1 的公网 IP 地址发送过报文,此份报文此时会被 NAT2 的路由器认为是上述步骤 3 的回复,所以此步骤会被允许通过,此时穿透 NAT2 成功。
7):私网机器 2 回发报文给私网机器 1,此时穿透了 NAT1。穿透结束。
对称 NAT 的特点是每一个不同公网机器的通信,都会被分配不同的映射端口(NAT 会产生两条记录),如果参照限制锥型 NAT 的穿透流程,则不能准确地知道步骤 3 所产生的公网 IP 地址与端口,不知道通知对方的公网 IP 与端口,那就基本靠技术性的猜测了。 对称穿透流程如下图所示,NAT1 为限制锥型 NAT,NAT2 为对称 NAT。
穿透对称 NAT
1):私网机器 1(192.168.1.3:2341)发送报文数据给服务器(180.93.45.46:8888), 请求与私网机器 2 进行透传。
2):服务器(180.93.45.46:8888)发送通知信息给私网机器 2。通知信息内含私网机器 1 的公网 IP 地址(112.93.14.56:43891)。
3):私网机器 2 收到通知信息,发送报文数据给私网机器 1 的公网 IP 地址。此时由于 NAT1 为限制锥形 NAT,数据是不被允许进入私网的。同时由于 NAT2 为对称 NAT,所以会在 此次报文发送过程中,会被产生新的映射记录,分配新的公网地址与端口(iAddr:iPort)。
4):私网机器 2 进行完步骤 3 以后,发送报文信息给服务器的另一个端口 8889,此步骤也会在路由器上产生一条新的映射记录,分配公网地址与端口(mAddr:mPort)。服务器同时也获取到新的公网地址与端口(mAddr:mPort)。
5):服务器(180.93.45.46:8889)发送通知信息给私网机器 1。通知信息内包含步骤 4 产生的新记录公网地址与端口(mAddr:mPort)。此时可以根据 iPort 与 mPort 产生的时间间隔很短来判断 iPort 的值,即需要穿透的端口。为了判断的准确性,可以在产生 mPort 之前也加上一次新记录,即在步骤 3 以前让 NAT 路由器产生一条记录,这样会大大地提升穿透的概率。
6):根据 mPort 的值,来猜测 iPort 的值,发送报文信息给私网机器 2 的公网地址与端口(mAddr:mPort)。如果是准确的 mPort 值,则能够穿透 NAT2。
7):收到穿透报文信息后,回复报文信息,穿透结束。
注:第 6 步猜测端口可以多试几次。
Interactive Connectivity Establishment:翻译为互动式连接建立,ICE 不是一种协议,它是一个框架,整合了 STUN(简单的用 UDP 穿透 NAT,是个轻量级的协议,是基于 UDP 的完整的穿透 NAT 的解决方案) 和 TURN(使用中继穿透 NAT,是 STUN 的一个扩展),使各种 NAT 穿透技术可以实现统一。当穿越网络时,ICE 会先尝试 STUN,查出自己位于哪种类型的 NAT 之后以及 NAT 为某一个本地端口所绑定的 Internet 端端口从而建立 UDP 连接,如果失败了 ICE 就会再尝试 TCP(先尝试 HTTP,再尝试 HTTPS),如果仍然失败就使用中继的 TURN 服务器。因此,ICE 可以实现在未知网络拓扑结构中实现设备互连。除 ICE 技术外,还有 UPNP 技术,ALG 应用层网关识别技术,SBC 会话边界控制等等。
NAT 在互联网中被广泛应用,小到家庭网关,大到企业广域网出口甚至到运营商业务网络出口。NAT 也广泛用在音视频通信中,使用 NAT 打洞的方式让客户端直接通信从而减轻服务器压力。
目前国内主流的音视频解决方案厂商有 Agora(声网):https://www.agora.io/cn、环信:https://www.easemob.com/、ZEGO(即构科技):https://www.zego.im/等,其中 Agora(声网)使用其自研音视频编解码算法和优异弱网对抗能力,在 80% 丢包情况下音频通话流畅,70%情况丢包下视频通话流畅,是目前有国外音视频通信需求用户的首要选择。并且声网在声音处理上采用业界领先的 3A 算法,智能适应各类环境,全面消除回声,并提供超一流的双讲表现。可在不损伤语音音质的情况下,有效消除各类噪音。可实现音频的自动增益,即使在嘈杂环境下用户也能体验优异。点击链接体验:https://www.agora.io/cn/audio-demo
笔者尽量对 NAT 做了比较详细的介绍,但由于笔者也是初学音视频技术,有些技术观点可能不一定十分准确,如果有什么错误欢迎留言指正。如果本文对你有帮助,欢迎点个关注~
参考:
https://baike.baidu.com/item/nat/320024
https://zhidao.baidu.com/question/113756183.html
https://www.zhihu.com/question/31332694/answer/470426521
领取专属 10元无门槛券
私享最新 技术干货