WebRTC NAT穿越原理

2021-01-12 14:57:16 浏览数 (1)

在真实的网路环境中,NAT随处可见,NAT出现的两个目的:

  • 1. 解决IPv4地址不足的问题,在IPv6在短期内无法替代IPv4的情况下,为了解决IPv4不足的问题,引入了NAT解决方案,NAT让多个主机公用一个公网IP地址,内网主机访问公网资源的时候,NAT会对内网主机的地址和访问的公网地址进行映射处理,这样大大缓解了IPv4地址 不足的情况;
  • 2. 解决安全问题,NAT可以有效的隐藏主机的地址,将来自公网的访问全部挡在NAT处理,达到防护内网主机的目的。

NAT虽然带来了不少的好处,但是也增加了端对端直接通信的难度,NAT使得端对端的通信方式在某些场景下只能通过中转服务器进行交互。

NAT的种类

处于对安全的需求,NAT可以分为4种类型:完全锥型、IP限制锥形、端口限制锥形、对称型。

1. 完全锥型

上图中内网主机X,A、B、C是公网主机。

完全锥型NAT的特点是,当host主机通过NAT对公网中的主机B进行访问的时候,首先会在NAT上打洞,所有知道这个洞的公网主机都可以通过这个NAT上的洞,与主机X进行通信。

“打洞”的本质是NAT建立一个内网主机地址和其访问的公网地址的映射关系,以便在公网主机通过NAT的地址回传数据的时候,NAT可以将回传资源数据正确的发送到内网中对应的主机上,这种NAT打洞的方式建立的NAT地址映射表中包含4个关键的数据:

代码语言:javascript复制
{ ‍ ‍   
  内网IP
  内网端口号
  映射的公网IP              
  映射的公网端口号
}

上面的数据可以理解为NAT打的洞的数据标示,所有从公网发送到这个洞的数据,NAT都会中转到内网的主机X上。

上图中,内网主机host在NAT上打洞成功之后,外网主机A、C从主机B处获得内网主机host的公网IP之后,就可以通过NAT向主机host发送数据了。

2. IP限制锥型NAT

相比完全锥型,IP限制锥型的安全要求更严格,它的特点是host在NAT上打洞之后,NAT会对公网中通过该“洞”向内网主机X发送数据的IP进行限制,只有host访问的外网主机才能够穿越NAT。

这种类型的NAT的地址映射表中包含5个数据:

代码语言:javascript复制
{
    内网IP
    内网端口号
    映射的公网IP
    映射的公网端口号
    被访问的外网IP地址
}

在上图中,内网host主机访问B主机,那么只有B主机发送分数据才能够穿越NAT向内网主机host发送数据,其他的外网主机A、C即使从主机B处获取到host主机的公网IP也无法穿越NAT。

3. 端口限制锥型

端口限制锥型相比IP限制锥型的安全限制更为严格,端口限制锥型不但对IP地址进行了限制,而且对NAT穿越的公网主机的端口也做了限制,这种类型的NAT地址映射关系包括6个数据:

代码语言:javascript复制
{
  内网IP
  内网端口号
  映射的公网IP
  映射的公网端口号
  被访问的外网主机的IP地址
  被访问的外网主机的端口号
}

上图中,内网主机host通过打洞访问公网主机B的p1端口,只有公网主机B的p1端口发送回来的数据才允许穿越NAT,其他来源的数据包都会被丢弃。

4. 对称型NAT

对成型NAT是所有NAT类型中最为严格的一种类型。对称型NAT和端口限制型NAT一样,只允许访问的IP和端口号进行穿越,但是对称型NAT与端口型NAT最大的不同在于,当内网主机host访问公网主机A的时候,会重新打洞,而不会使用之前的访问主机B时使用的洞。也就是对称型NAT的每个链接都会使用不同的端口、甚至更换IP,而端口限制型NAT的多个链接使用同一个IP和端口。

上面这4种NAT会给P2P的穿越带来很多麻烦,尤其是对称型NAT遇到对称型NAT、对称型NAT遇到端口型NAT的时候,双方基本无法完成NAT穿越。

0 人点赞