关于NAT穿越的那些事儿

1.为啥需要NAT穿越

将一台网关设备设为内部网络和外部网络的分界线,在这台网关设备上一般会设置NAT和防火墙功能。实现内外连接的方式,一般是内部主机发起连接,和外部服务器或者主机进行连接,如果是部署在公网上的服务器当然没有问题,但是如果涉及到同样部署在NAT设备内部的主机该如何实现主机互联?这样的应用有很多,比如当下流行的P2P对等网络以及Voip语音通信网络。

2.上述问题涉及到几个关键点:

  • 假设有A和B两台主机都部署在NAT设备之后,简称NAT-A和NAT-B,如果此时A打算同B通信,该如何获取B的通信地址?且B如果在内网中只有一个本地私有地址不能在公网路由该如何处置?
  • 即使A获得了B的公网通信地址(通过中间服务器),那么又如何穿越网关中的防火墙设备?因为防火墙设备一般只会允许之前已经建立的通信状态中外部地址通过。

3. 解决方式:

  • 关于第一个问题,可以使用一个公网中的服务器来实现A与B的经过转化的NAT公有IP地址和端口的相互传递。这种方法可以实现的是完全锥形(Full cone)NAT的方式,这种方式的成功与否也要取决于防火墙的限制,如果防火墙只允许已经建立过通信的主机地址才能通信这种方法就不适用。除了完全锥形NAT方式,对于IP受限制NAT和端口受限制NAT的实现需要通过相关的应用来实现,即通过双方同时使用对方的公有地址进行打孔,同时在两边的NAT-A和NAT-B上建立NAT表项,实现A与B通信。
    • 实现中间服务器的方式就是STUN。
  • 除了以上两种方式,还有一种限制是在NAT进行转换的时候,会根据与不同的通信目的地址使用不同的端口且限制必须是之前建立过的外部通信地址才能建立连接,即对称型(Symmetric)NAT,此时,A如果向B发送通信信息,经过NAT-A转换后的地址和端口已经不是B收到的服务器给的A的通信地址和端口了,同样的A->B的包中的B的目的地址也不是B经过NAT-B转化后的地址了。此时A->B的数据包的目的地址是B与服务器通信时的公网地址和端口,而此包会被防火墙拦截,因为不是同一个通信对端发送的信息不被接受。那么此时该怎么办呢?有以下两种方法:
    • 可以通过预测打孔,即在一定范围内猜测对方可能的NAT转换后的地址,不过不能保证成功率。
    • 经过中间服务器转发,即TURN方式。

4. 术语解释:

- 完全锥形方式:即外部的通信端只要将信息发送到内网通信端保存在NAT设备中的外网地址和端口即可。
- 限制锥形方式:要求外部通信地址的IP地址或者IP和port地址必须与防火墙中建立的通信表象中外部通信端地址一致才可以与内部的通信端通信。
- 对称型NAT指NAT转换的一种方式,根据不同的目的地址和端口分配不同的源NAT地址和端口。

你可能感兴趣的:(网络通信,通信)