内网穿透,也即 NAT 穿透,进行 NAT 穿透是为了使具有某一个特定源 IP 地址和源端口号的数据包不被 NAT 设备屏蔽而正确路由到内网主机。下面就相互通信的主机在网络中与 NAT 设备的相对位置介绍内网穿透方法。
工作原理
在整个音频共享模块中,UDP内网穿透技术是实现多个不同内网节点之间的UDP音频流互相转发的技术重点。音频对讲过程可分解为音频压缩、发送的输出过程和音频接收、解压、播放的输入过程。而多人音频对讲的过程实际上就是多个节点的系统中,两两节点之间的音频流收发过程。在这里无法直接处理的环节是每个参与音频对讲的节点作为服务器端接收其他节点发送过来的音频流数据的输入过程,因为大部分参与者都没有自己的公网IP,这样的内网节点直接在本地启动一个接收音频流的服务器线程,不在同一内网之内的其他节点无法直接连接到这个服务器。虽然可以通过在每个局域网和公网之间的路由器上添加端口映射将内网服务端口呈现在公网上,但这样做涉及到要修改每个节点对应的路由器配的置以及权限等问题,不是理想可用的实现方法。使用UDP内网穿透技术,可以使一个普通的内网节点在需要时将自己的服务器端口自动的呈现在公网上,并且能够让系统内其他节点正确获取这个音频接收服务器的地址,以便其他节点能够将自己的音频流发送到这个音频接收端口。
内网穿透可以理解为一个专用信道,这个信道是由内网机器(Client)发起向外网服务器(Server)的连接,目的是使处于外网的客户端可以通过外网服务器访问到内网的服务。
工作方式
网络地址转换(Network Address Translation,NAT)机制的问题在于,NAT设备自动屏蔽了非内网主机主动发起的连接,也就是说,从外网发往内网的数据包将被NAT设备丢弃,这使得位于不同NAT设备之后的主机之间无法直接交换信息。这一方面保护了内网主机免于来自外部网络的攻击,另一方面也为P2P通信带来了一定困难。Internet上的NAT设备大多是地址限制圆锥形NAT或端口限制圆锥形 NAT,外部主机要与内网主机相互通信,必须由内网主机主动发起连接,使 NAT设备产生一个映射条目,这就有必要研究一下内网穿透技术。
通信双方一台位于 NAT 之后
一台主机有一个公网 IP,另一台主机有一个内网 IP。如图1所示,Client A 位于 NAT 之后,并拥有[IP 地址:端口]对[10.0.0.1:1234],Client B位于 NAT 之前,并拥有[IP 地址:端口]对[138.76.29.7:1234],NAT 拥有公网 IP 155.99.25.11。由于 Client B 有一个公网 IP,Client A 可以直接通过 TCP 连接到[138.76.29.7:1234],然而,如果 Client B 向 Client A 发起主动连接,则不会成功。此时,需要一个公有的服务器辅助进行内网穿透。Client A 和 Client B 向服务器发起登陆请求,并保持一个 TCP 或 UDP 连接,服务器记录其 IP 地址和端口号,这里服务器对 Client A 是记录其经过 NAT 映射之后的 IP 和端口号。当 Client B 想连接 Client A 时,首先向服务器提出请求,服务器在收到请求后向 Client A 发出打洞命令,并将 Client B 的[IP 地址:端口]对发给 Client A,Client A 根据接收到的 IP地址和端口号向 Client B 发起 TCP 连接或发送 UDP 数据包。接下来 Client A 和Client B 之间便可以建立数据传输通道。
通信双方主机均位于NAT设备之后
两台主机都处于内网中,如图2所示。服务器记录的[IP 地址:端口]对是 Client A 和 Client B 经过 NAT 映射之后的IP 地址和端口号,此时,Client A 和 Client B 之间任意方向的连接请求都会被对方的 NAT 设备屏蔽。Client A 首先向服务器提出连接请求,服务器将 Client A 的 IP地址和端口号对[155.99.25.11:51200]发给 Client B,并向 Client B 发出打洞命令;Client B 收到服务器的打洞命令后首先向[155.99.25.11:51200]发送一定数目的 UDP探测包或 TCP 连接请求,在 NAT B 上打一个方向为[155.99.25.11:51200]的洞,Client B 随后向服务器报告打洞完成;服务器在收到 Client B 的报告后将 Client B 的公网IP 地址和端口号对[110.10.33.10:5000],此时由于 NAT B 上已经留下了对应于[155.99.25.11:51200]方向的洞,Client A 向[110.10.33.10:5000]发出的数据包或连接请求将不会被丢弃。
穿透方法
传统的NAT技术是通过将专用的网络地址(如企业内部网Internet)转换为公用地址(如互联网Internet),从而对外隐藏了内部管理的IP地址。这样,通过在内部使用非注册的IP地址,并将它们转换为一小部分外部注册的IP地址,从而减少了IP地址注册的费用以及节省了越来越缺乏的地址空间。同时,这也隐藏了内部网络结构,从而降低了内部网络受到攻击的风险。
NAT穿透的原理
图3表示了NAT技术的穿透过程。NAT设备(或软件)维护一个状态表,用来把内部网络的私有IP地址映射到外部网络的合法IP地址上去。每个包头中的IP地址和端口信息在NAT设备(或软件)中都被修改并翻译成一正确的IP地址发往下一级。当一个内网主机通过NAT打开一个“外出”的TCP或UDP会话时,NAPT分配给这个会话一个公网IP和端口,用来接收外网的响应的数据包,并经过转换通知内部网的主机。这样,NAPT在[私有IP:私有端口]和[公网IP:公网端口]之间建立了一个端口绑定。
实现流程
巧妙地利用NAT原理实现NAT内网穿透技术,就可以使内网服务器接收到外网数据包。内网穿透流程如下:
(1) 两个需要通过内网穿透进行通讯的内网客户端,分别将自己的外网收发接口注册给一个具有公网ip的中转服务器,如图4所示。
(2) 中转服务器将两个客户端注册的收发接口分别告知给对端,如图5所示。
(3) 一个内网客户端使自己的接收端口作为源地址,向对端的发送端口发送一个udp数据包,这个数据包称为打洞包。发送过这个打洞包后,可以在这个内网的出口路由器上产生一条NAT记录,令后续从对端发送端口发来的数据包都不被丢弃, 而是转发给相应的内网客户端的指定端口,如图6所示。
(4) 发送过打洞包后,对端发送至本端路由器指定接收端口的数据包,就会根据NAT记录转发至本端的内网服务器接收端口,从而实现了内网服务器接收外网数据包的功能,如图7所示。
(5) 另一个内网服务器同样执行上述步骤 (3) 、 (4), 即可实现两端内网服务器相互收发音频数据包的功能。
应用场景
内网穿透技术在很多场景下都有着广泛的应用。下面介绍其中的一些常见的应用场景。
1.远程办公
随着互联网的发展,越来越多的人选择在家里工作,但是在家里工作时,常常需要访问公司内部网络中的资源,比如说文件服务器、邮件服务器等。这时,内网穿透技术就可以帮助在家里访问公司内部网络中的资源,从而实现远程办公。
2.云服务器访问
在云计算时代,很多应用都运行在云服务器上。但是,在某些情况下,需要从本地访问云服务器上的应用。这时,内网穿透技术就可以帮助在本地访问云服务器上的应用,从而提高应用的可访问性。
3.IoT设备访问
在物联网时代,越来越多的设备都连接到了互联网上,比如说智能家居设备、智能车辆等。但是,在某些情况下,需要从外部网络访问这些设备。这时,内网穿透技术就可以协助在外部网络访问这些设备,从而提高设备的可访问性。
4.游戏服务端访问
在游戏开发中,游戏服务端通常都运行在内部网络中,但是,玩家需要从外部网络访问游戏服务端。这时,内网穿透技术就可以帮助在外部网络访问游戏服务端,从而提高游戏的可访问性。