NAT
NAT(Network Address Translation,网络地址转换),主要用户将内网中(ip+端口)二元组在网关上映射成成合法的公网(ip+端口)二元组。
此时其它主机就可以通过映射成的公网地址和内网的主机通信了。
NAT 作用
- 为了解决IPv4地址不足的问题,内网可以很多台主机,在内网中有自己的ip地址,但映射到外网可能只有少部分地址,通过端口号区分每一台主机,这就减少了公网ip地址的使用。
- 安全原因,对于内部的主机没有外网的ip地址,则外部的主机很难攻击到内网的主机。
NAT分类
- 完全锥型NAT(Full Cone NAT)
- 地址限制锥型(Address Restricted Cone NAT)
- 端口限制锥型(Port Restricted Cone NAT)
- 对称型NAT(Symmetric NAT)
完全锥型
内网中某台主机,经过NAT映射,形成了外网的(IP+port)。此时,所有外网的主机只要知道了该外网的(IP+port)就可以向这个地址发送数据,无限制,安全性低。
地址限制锥型
针对完全锥型的安全性低下问题,有了一个对IP进行限制的NAT类型。
当内网中发送消息出去时,会记录目标主机的IP地址,当有数据包接受到时,来源必须是原来发送数据的目标地址,才能放行,否则直接丢掉。
端口限制锥型
在地址限制的前提下,对端口进行了限制,发送数据时,除了记录目标IP外,还要记录目标端口号。
当接受到的数据包的源IP和源端口和之前的目标主机的信息一致时,才能放行。
对称型NAT
经过NAT转换的时候,内网主机出内网时,会形成多个(ip+port)的二元组。
这就更加严格了。
NAT类型检测
前提:需要准备一个公网服务器且绑定了两个公网(i1, i2)
,并且该服务器监听了UDP(i1, p1)
和(i2, p2)
- 客户端发送一个UDP
(i3,p3)
请求到服务端(i1,p1)
,等待服务端发送同样的ip地址和端口
的响应 - 如果接收不到数据,则表示UDP是不通的,没意义了,结束
- 收到以后,可以拿到客户端出口的公网IP和端口
(i4, p4)
- 如果
(i4, p4) == (i3, p3)
则表示客户端不在nat后 - 接下来再发送一个UDP
(i3,p3)
请求到服务器(i1,p1)
,让服务器通过(i2,p2)
返回数据报 - 如果能收到,则肯定为完全的公网地址 结束
- 如果不能收到,则说明在对称防火墙之后 结束
- 承接
3
,如果(i4, p4) != (i3, p3)
则说明客户端是在NAT之后,接着开始判断类型 - 发送UDP
(i3,p3)
请求到服务端(i1,p1)
,接着服务端使用(i2,p2)
返回一个报文 - 如果客户端能接受到报文,则说明客户端是完全锥型 结束
- 否则继续判断,客户端向服务端的
(i2,p2)
发送UDP报文,然后接收到报文,拿到客户端出口的公网IP和端口(i5,p5)
- 如果
(i5,p5) != (i4,p4)
则说明客户端是对称型 结束 - 如果一致,则肯定是限制型的,但需要继续区分
IP限制
还是端口限制
- 客户端继续向服务端
(i1, p1)
发送报文,但服务端回复的时候使用(i1,p2)
这样相同的IP不同端口 - 如果不能接受到,则是端口限制型 结束
- 如果能收到,则是IP限制型 结束
NAT穿越
步骤
A,B进行穿越
- A,B向STUN服务发送消息
- 此时STUN可以获取到双方的公网IP和port以及nat类型,然后就可以进行公网IP+port交换了
- 交换完以后,就可以根据NAT类型进行穿越
- 如果有一方是完全锥型,那么另外一方可直接和完全锥型一方的公网(IP+port)通信即可
- 如果有一方是IP受限型,此时另一方必须请求IP受限方,让自己映射的公网IP地址在受限所在的网关上,这样就可以实现p2p了。
- 端口受限型和IP受限型相似,但不能和对称型打通