一、NAT和NAPT的概念
- NAT(Network Address Translation,网络地址转换):NAT是将IP数据报头中的IP地址转换为另一个IP地址的过程。使用少量的公网IP地址代表较多的私网IP地址的方式,仅支持地址转换,不支持端口映射
- NAPT(网络地址端口转换):支持端口的映射并允许多台主机共享一个公用IP地址,这样就可以支持同时多个位于NAT后面的机器和外部进行交互了。支持端口转换的NAT又可以分为两类:源地址转换(SNAT)和目的地址转换NAT(DNAT),下面说的NAT都是指NAPT。
二、NAT转换IP过程
- 发报文过程:NAT设备查看报头内容,发现该报文是发往外网的,将其源IP地址字段的私网地址192.168.1.3转换成一个可在Internet上选路的公网地址20.1.1.1,并将该报文发送给外网服务器,同时在NAT设备的网络地址转换表中记录这一映射。
- 收报文过程:外网服务器给内网用户发送的应答报文(其初始目的IP地址为20.1.1.1)到达NAT设备后,NAT设备再次查看报头内容,然后查找当前网络地址转换表的记录,用内网私有地址192.168.1.3替换初始的目的IP地址。
三、NAPT带来的问题
NAT在缓解IPv4地址资源的紧张的同时,也带来了不少问题:
- NAT使IP会话的保持时效变短。
- NAT在实现上将多个内部主机发出的连接复用到一个IP上,这就使依赖IP进行主机跟踪的机制都失效了
- NAT工作机制依赖于修改IP包头的信息,这会妨碍一些安全协议的工作
- NAT限制了使用一些高层协议(FTP、Quake、SIP)的Peer两端的P2P通信
对于问题1,其主要原因是,NAT设备建立的内网IP、端口到外网IP、端口的映射的表项是有一个保活期的。如果在一个超时时间内,该映射上没有实际数据的传输,那么NAT会过期并回收这个映射表项给其他通信链路用(IP和端口资源有限,通信的链路是无限)。为了避免这种通信链路提前被NAT中断的情况,很多应用层协议在设计的时候就考虑了一个连接保活的机制,即在一段时间没有数据需要发送时,主动发送一个NAT能感知到而又没有实际数据的保活消息,这么做的主要目的就是重置NAT的会话定时器。
对于问题2,其主要原因是,对于NAT后面的N多主机,在外部看来都是同一个主机(NAT设备),于是来之同一个IP的数据包一定是来之同一个主机的前提判断就会不准确了,这样一下基于这个前提的机制(例如:TCP的TIME_WAIT的回收和重用)都会有问题。
对于问题3,其主要原因是,NAT篡改了IP地址、传输层端口号和校验和。
对于问题4,其主要原因是,一般情况下,NAT是不允许外部的Peer节点主动连接或发送数据包给NAT后面的主机的(这里的主动指的是,在一段时间内,首先发送数据包的一方为主动方)。NAT表现出这样的行为,主要基于下面的几点考虑:
[1] 出于安全考虑,避免来自网络外部的攻击,隐藏并保护网络内部的计算机
[2] 位于NAT后面的很多主机,对于主动进来的数据包,NAT一般不知道该路由给内部的哪个主机(NAT设备上没有相关转发表项)。
完整的P2P通信解决方案包括下面两个步骤:
[1] 首先在Server的协助下,通信两端Peer尝试相互连接,如果两端Peer在尝试互联不成功后,那么就将失败结果反馈给Server转入步骤[2]
[2] 这个步骤比较简单粗暴了,就是relay(服务器中转),简单的来讲就是Peer1将要发给Peer2的数据发给Server,然后由Server帮忙转发给Peer2,同样对于Peer2来说也一样。
四、P2P通信穿越NAT的技术、方法
目前常见的P2P通信穿越NAT的技术、方法主要有:
a. 应用层网关b. 中间件技术c. 打洞技术(Hole Punching)d. Relay(服务器中转)技术
1. 应用层网关(ALG)
原理:利用带有ALG功能的NAT对特定应用层协议的支持和理解,在一个NAT网关检测到新的连接请求时,需要判断是否为已知的应用类型,这通常是基于连接的传输层端口信息来识别的。在识别为已知应用时,再调用相应功能对报文的深层内容进行检查,当发现任何形式表达的IP地址和端口时,将会把这些信息同步转换,并且为这个新连接创建一个附加的转换表项。这样,当报文到达公网侧的目的主机时,应用层协议中携带的信息就是NAT网关提供的地址和端口。例如:下图,对于使用主动模式的FTP协议(PORT方式),就需要AGL的支持了。
由于FTP协议通信需要两个TCP连接,一个是命令链路,用来在FTP客户端与服务器之间传递命令;另一个是数据链路,用来上传或下载数据。如上图,位于NAT后面的FTP client(192.168.1.2)首先发起一个TCP连接(命令链路)连上外网FTP Server(8.8.8.1),然后发送PORT报文(192.168.1.2,1084)说自己在1084端口接收数据,然后进过ALG处理PORT报文变成(8.8.8.1,12487),同NAT建立其一条(192.168.1.2,1084 <—>8.8.8.1,12487)映射。这样FTP Server发往(8.8.8.1,12487)的数据就会被转到(192.168.1.2,1084),从而实现数据传输(如果没经过ALG处理,那么FTP Server直接连接192.168.1.2,1084是无法连接上的)。
2. 中间件技术:是一种通过开发通用方法解决NAT穿越问题的努力。与前者不同之处是,AGL技术中NAT网关是这一解决方案的唯一参与者,而中间件技术中客户端会参与网关公网映射信息的维护。UPnP就是这样一种方法,UPnP中文全称为通用即插即用,是一个通用的网络终端与网关的通信协议,具备信息发布和管理控制的能力。
原理:NAT只要理解客户端的请求并按照要求去分配响应的映射转换表,不需要自己去分析客户端的应用层数据。网关映射请求可以为客户动态添加映射表项。此时,NAT不再需要理解应用层携带的信息,只转换IP地址和端口信息。而客户端通过控制消息或信令发到公网侧的信息中,直接携带公网映射的IP地址和端口,接收端可以按照此信息建立数据连接。NAT网关在收到数据或连接请求时,按照UPnP建立的表项只转换地址和端口信息,不关心内容,再将数据转发到内网。
限制:这种方案需要网关、内部主机和应用程序都支持UPnP技术,且组网允许内部主机和NAT网关之间可以直接交换UPnP信令才能实施。
3. 打洞技术(Hole Punching)
Hole Punching技术是工作在运输层的技术,可以屏蔽上层应用层的差异,并且不需要NAT网关特定的支持,因此其通用性比较强,应用性也比较广。
原理:打洞技术的原理比较简单,就是NAT内网的节点需要在NAT上建立自己的一条转发映射关系(这就是所谓的在NAT上打下一个洞),然后外网的节点就通过这个”洞”来进行通信。为描述方便,我们将一对IP地址和端口信息的组合称之为一个Endpoint,打洞原理可以简化为下面三个过程:
[1] 首先位于NAT后的Peer1节点需要向外发送数据包,以便让NAT建立起内网Endpoint1(IP1、PORT1)和外网Endpoint2(IP2、PORT2)的映射关系;
[2] 然后通过某种方式将映射后的外网Endpoint2通知给对端节点Peer2;
[3] 最后Peer2往收到的外网Endpoint2发送数据包,然后该数据包就会被NAT转发给内网的Peer1
NAT是怎么回事
浅析 P2P 穿越 NAT 的原理、技术、方法 (上)
视频聊天功能如何穿透NAT