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

时间:2024-04-06 09:37:59

今天我们来看一下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穿越的基本原理。

下面我们再来看一看组合

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

哪些是可以穿越成功,哪些是不成的,这里有一张表 ,那通过上表我就可以 知道哪些是可以通过P2P打洞成功的,哪些是完全不能打通的,当我们检测到一端是端口受限锥型一端是对称型或者两端都是对称型,那肯定是不可以打通的,肯定是不可以的。

以上就是NAT穿越的基本原理。