天天看点

WebRTC网络基础 九、第二节 NAT打洞原理

今天我们来看一下NAT穿越的原理

NAT一共有四种类型,分别是完全锥型NAT (Full Cone NAT)、地址限制锥型NAT(Address  Restricted Cone NAT)、端口限制锥型NAT (Port Restricted Cone NAT)、对称型NAT (Symmetric NAT),对NAT穿越来说,其实每一种穿越都不一样,下面我就来看一下每一种不同类型,如何进行NAT穿越。

完全锥型NAT

WebRTC网络基础 九、第二节 NAT打洞原理

完全锥型是非常简单的 ,左边是内网的主机,它有自己的内网IP地址和端口 ,通过防火墙之后,它形成一个外网的IP地址,那么外网的三台主机要想与内网的主机进行通信的时候,首先要由内网的主机向外发送一个请求,请求外网中的其中一台主机,这样会形成的结果就是它会在NAT服务上打 一个洞,这样会形成一个外网的IP地址和端口,那么形成了外网的IP地址和端口之后,其他的主机只要获得了这个IP地址和端口它都可以向它发送数据。并且可以顺利的通过防火墙发送给内网的主机。这样就可以进行通讯了,这是完全锥型,也是最好穿越的一种 NAT类型。但是安全性就差很多。

地址限制锥型NAT

WebRTC网络基础 九、第二节 NAT打洞原理

它的安全性好一些,它会在防火墙上形成一个五元组,就是内网主机的IP地址和端口和映射后的公网IP地址和端口以及我要请求的这个主机IP地址,他们首先有一个公共的步骤,第一步就是要先由内网的主机向外网发送一个请求,在这个防火墙上或者NAT服务上形成一个映射表,那形成之后外网的主机就可以和内网的主机进行通讯了。

如图所示,它首先向P的主机发送请求,那么P就可以通过不同的端口向内网的主机发送消息它都是可以接受到的,但是对于其他主机来说,由于IP地址的限制,它返回来的时候,一看IP地址不对,就会被拦掉。只有P的主机是可以通过的,而且它的各个主机都可以跟它进行通讯。这就是地址限制型,这个地址限制型的打通,首先就是这个内网主机无论跟哪个主机进行打通,首先它都要发送 一个请求,发送请求之后就形成了所谓的映射表在我们的网关上。其他主机就可以给它通讯了。这是地址限制型NAT。

端口限制锥型NAT

WebRTC网络基础 九、第二节 NAT打洞原理

端口限制型就更加严格一些了,不光是对IP地址,还要对端口做限制,那所以在这个防火墙上就形成了六元组,不光有内网的IP地址和端口以及映射后的公网的IP地址和端口,还有你请求的主机的IP地址和端口,那么在在这种情况下P这台主机,它发送消息的时候,如果请求的是P这台主机的这个q这个端口的服务,只有它这个服务才能返来,其他的端口(如:r端口)发送数据就不行了。

那如果内网的主机没有向S这个主机发送请求的话,S主机发送信息到内网的主机是肯定不通的;但是如果内网的主机给M这台主机的n端口已经发送了请求,那么M主机的n端口也是可以打通这个数据防火墙然后与这个内网主机进行通讯的。这就是端口限制锥型NAT。

对称型NAT

WebRTC网络基础 九、第二节 NAT打洞原理

对称限制型就更加严格了,以前的类型是在防火墙上形成映射后的公网的IP地址是保持不变的,大家要找还是能找到它的,虽然不 通,但是对于 这个对称型它就不一样了,它就发生了变化,不光是形成了这个一个IP地址和端口,而且还会形成多个,对于每一台主机都会形成一个不同的IP地址和端口对,所以这个 时候当内网主机给Pq发送请求的时候,Pq可以回来信息,其他的都回不来。但是给M主机 n端口发送数据的时候,又形成一个C和d,这个M,n在发数据的时候不会像A,b发送数据,必须向C,d发送数据 才可以过来,这样才能进行互通,这个就是对称型的NAT穿越。这个就是对称型的NAT穿越。

下面我们在来看看NAT穿越的基本步骤

NAT穿越原理

C1,C2向STUN发消息

交换公网IP及端口

我们要进行穿越其实是两台主机直接进行穿越,也就是C1,C2之间进行穿越。C1和C2之间进行穿越首先C2要知道C1的地址,C1要知道C2的地址,那就要通过STUN服务发送消息,STUN收到他们的消息之后就会拿到它们对应的公网的IP和端口;所以这个时候要进行信息交换,就是将C1的公网IP和端口交给C2,将C2的公网IP和端口交给C1;交换完这些信息之后,我们就要按照类型进行打通,如果是完全锥型的,他们就直接可以进行通讯了,已经具有公网的IP和端口了。

对于完全锥型,只要我在防火墙上建立一个映射,那任何一台主机,如果我们把STUN当作一台主机的话,那C2就可以通过C1和STUN之间的这个公网的映射然后去发送数据。

对于IP地址限制锥型,STUN 不能用这个IP地址给这个C1发消息,那因为C1是知道C2的公网IP和端口,所以首先C1向C2发送一个请求 ,C2在利用C1形成的这个IP地址和端口给它返回数据,这样他们也是可以互通的。

对于端口限制型其实也一样的,都可以通过这种方式。

C1->C2,C2->C1,甚至是端口猜测

那么对于对称型NAT就比较麻烦了,对于对称型NAT来说,由于是IP地址和端口的变化 ,那更多的是端口的随机性和增长,就是说线性增长的变化,所以并不能直接进行互通,那怎么才能通呢?其实也是有办法的,就是通过端口猜测的方式,就是通过几次的探测,然后找到它端口分配的规律,它是线性增长的,比如每次增1,或者每次增2等,还是一个 随机的,随机数是在 一定范围的,不可能所有端口都随机,在这些随机的端口范围内,实际它每一个都做一次尝试,那么这个时候就有可能打通,那么这种打通的概率就低很多。

这个就是整个NAT穿越的基本原理。

下面我们再来看一看组合