东海县网站建设,vue.js做个人网站,长沙建网站企业,商业网址目录1、基础知识1.1、什么是NAT#xff1f;1.2、为什么会有NAT#xff1f;1.3、NAT有什么优缺点#xff1f;2、NAT的实现方式2.1、静态NAT2.2、NAPT3、NAT的主要类型3.1、完全锥型NAT#xff08;Full Cone NAT#xff0c;后面简称FC#xff09;3.2、受限锥型NAT#xff…
目录1、基础知识1.1、什么是NAT1.2、为什么会有NAT1.3、NAT有什么优缺点2、NAT的实现方式2.1、静态NAT2.2、NAPT3、NAT的主要类型3.1、完全锥型NATFull Cone NAT后面简称FC3.2、受限锥型NATRestricted Cone NAT3.3、端口受限型NATPort Restricted Cone NAT3.4、对称型NATSymmetric NAT3.5、小结6、NAT路由类型判断7、STUN协议介绍7.1、STUN基本介绍7.2、STUN的检测过程7.3、STUN协议的判断过程1、基础知识
1.1、什么是NAT
NATNetwork Address Translation网络地址转换也叫做网络掩蔽或者IP掩蔽。NAT是一种网络地址翻译技术主要是将内部的私有IP地址private IP转换成可以在公网使用的公网IPpublic IP。
1.2、为什么会有NAT
时光回到上个世纪80年代当时的人们在设计网络地址的时候觉得再怎么样也不会有超过32bits位长即2的32次幂台终端设备连入互联网再加上增加ip的长度即使是从4字节增到6字节对当时设备的计算、存储、传输成本也是相当巨大的。后来逐渐发现IP地址不够用了然后就NAT就诞生了虽然ipv6也是解决办法但始终普及不开来而且未来到底ipv6够不够用仍是未知。
因此NAT技术能够兴起的原因还是因为在我们国家公网IP地址太少了不够用所以才会采取这种地址转换的策略。可见NAT的本质就是让一群机器公用同一个IP这样就暂时解决了IP短缺的问题。
1.3、NAT有什么优缺点
优势其实上面已经刚刚讨论过了根据定义比较容易看出NAT可以同时让多个计算机同时联网并隐藏其内网IP因此也增加了内网的网络安全性此外NAT对来自外部的数据查看其NAT映射记录对没有相应记录的数据包进行拒绝提高了网络安全性。
那么NAT与此同时也带来一些弊端首先是NAT设备会对数据包进行编辑修改这样就降低了发送数据的效率此外各种协议的应用各有不同有的协议是无法通过NAT的不能通过NAT的协议还是蛮多的这就需要通过穿透技术来解决。我们后面会重点讨论穿透技术。
简单的背景了解过后下面介绍下NAT实现的主要方式以及NAT都有哪些类型。
2、NAT的实现方式
2.1、静态NAT
也就是静态地址转换。是指一个公网IP对应一个私有IP是一对一的转换同时注意这里只进行了IP转换而没有进行端口的转换。
举个栗子
2.2、NAPT
端口多路复用技术。与静态NAT的差别是NAPT不但要转换IP地址还要进行传输层的端口转换。具体的表现形式就是对外只有一个公网IP通过端口来区别不同私有IP主机的数据。
再举个栗子 通过上面NAT实现方式的介绍我们其实不难看出现实环境中NAPT的应用显然是更广泛的。因此下面就重点介绍下NAPT的主要类型有哪些。
3、NAT的主要类型
对于NAPT我们主要分为两大类锥型NAT和对称型NAT。其中锥型NAT又分完全锥型受限锥型和端口受限锥型。
概括的说对称型NAT是一个请求对应一个端口锥型NAT非对称NAT是多个请求外部发向内部对应一个端口只要源IP端口不变无论发往的目的IP是否相同在NAT上都映射为同一个端口形象的看起来就像锥子一样。
下面分别介绍这四种类型及其差异。
3.1、完全锥型NATFull Cone NAT后面简称FC
特点IP和端口都不受限。
表现形式将来自内部同一个IP地址同一个端口号IP_IN_A : PORT_IN_A的主机监听/请求映射到公网IP某个端口IP_OUT_B : PORT_OUT_B的监听。任意外部IP地址与端口对其自己公网的IP这个映射后的端口访问IP_OUT_B : PORT_OUT_B都将重新定位到内部这个主机IP_IN_A : PORT_IN_A。该技术中基于C/S架构的应用可以在任何一端发起连接。是不是很绕啊。再简单一点的说就是只要客户端由内到外建立一个映射NatIP:NatPort - A1之后其他IP的主机B或端口A2都可以使用这个洞给客户端发送数据。见下图图片来自网络。
3.2、受限锥型NATRestricted Cone NAT
特点IP受限端口不受限。
表现形式与完全锥形NAT不同的是在公网映射端口后并不允许所有IP进行对于该端口的访问要想通信必需内部主机对某个外部IP主机发起过连接然后这个外部IP主机就可以与该内部主机通信了但端口不做限制。举个栗子。当客户端由内到外建立映射(NatIP:NatPort – A1)A机器可以使用他的其他端口P2主动连接客户端但B机器则不被允许。因为IP受限啦但是端口随便。见下图绿色是允许通信红色是禁止通信。
3.3、端口受限型NATPort Restricted Cone NAT
特点IP和端口都受限。
表现形式该技术与受限锥形NAT相比更为严格。除具有受限锥形NAT特性对于回复主机的端口也有要求。也就是说只有当内部主机曾经发送过报文给外部主机假设其IP地址为A且端口为P1之后外部主机才能以公网IPORT中的信息作为目标地址和目标端口向内部主机发送UDP报文同时其请求报文的IP必须是A端口必须为P1使用IP地址为A端口为P2或者IP地址为B端口为P1都将通信失败。例子见下图。这一要求进一步强化了对外部报文请求来源的限制从而较Restrictd Cone更具安全性。
3.4、对称型NATSymmetric NAT
特点对每个外部主机或端口的会话都会映射为不同的端口洞。
表现形式只有来自同一内部IPORT、且针对同一目标IPORT的请求才被NAT转换至同一个公网外部IPORT否则的话NAT将为之分配一个新的外部公网IPORT。并且只有曾经收到过内部主机请求的外部主机才能向内部主机发送数据包。内部主机用同一IP与同一端口与外部多IP通信。客户端想和服务器AIP_AORT_A建立连接是通过NAT映射为NatIP:NatPortA来进行的。而客户端和服务器BIP_BORT_B建立连接是通过NAT映射为NatIP:NatPortB来进行的。即同一个客户端和不同的目标IP:PORT通信经过NAT映射后的公网IP:PORT是不同的。此时如果B想要和客户端通信也只能通过NatIP:NatPortB也就是紫色的洞洞来进行而不能通过NatIP:NatPortA也就是黄色的洞洞。
3.5、小结
以上就是NAPT的四种NAT类型。可以看出从类型1至类型4NAT的限制是越来越大的。
6、NAT路由类型判断
根据上面的介绍我们可以了解到在实际的网络情况中各个设备所处的网络环境是不同的。那么如果这些设备想要进行通信首先判断出设备所处的网络类型就是非常重要的一步。
举个例子来说对于IM中的实时音视频功能和VoIP软件对位于不同NAT内部的主机通信需要靠服务器来转发完成这样就会增加服务器的负担。为了解决这种问题要尽量使位于不同NAT内部的主机建立直接通信其中最重要的一点就是要判断出NAT的类型然后才能根据NAT的类型设计出直接通信方案。不然的话两个都在NAT的终端怎么通信呢我们不知道对方的内网IP即使把消息发到对方的网关然后呢网关怎么知道这条消息给谁而且谁允许网关这么做了
为了解决这个问题也就是处于内网的主机之间能够穿越它们之间的NAT建立直接通信已经提出了许多方法STUNSession Traversal Utilities for NATNAT会话穿越应用程序技术就是其中比较重要的一种解决方法并得到了广泛的应用。在这个部分我们将重点介绍下STUN技术的原理。PS除此之外还有UPNP技术ALG应用层网关识别技术SBC会话边界控制ICE交互式连接建立TURN中继NAT穿越技术等等本文不一一做介绍。
7、STUN协议介绍
7.1、STUN基本介绍
STUN是一种网络协议它允许位于NAT或多重NAT后的客户端找出自己的公网地址查出自己位于哪种类型的NAT之后以及NAT为某一个本地端口所绑定的Internet端端口。这些信息被用来在两个同时处于NAT路由器之后的主机之间建立UDP通信。该协议由RFC 5389定义。
STUN由三部分组成
STUN客户端 STUN服务器端 NAT路由器。
STUN服务端部署在一台有着两个公网IP的服务器上大概的结构参考下图。STUN客户端通过向服务器端发送不同的消息类型根据服务器端不同的响应来做出相应的判断一旦客户端得知了Internet端的UDP端口通信就可以开始了。
7.2、STUN的检测过程
STUN协议定义了三类测试过程来检测NAT类型
Test1STUN Client通过端口{IP-C1:Port-C1}向STUN Server{IP-S1:Port-S1}发送一个Binding Request没有设置任何属性。STUN Server收到该请求后通过端口{IP-S1:Port-S1}把它所看到的STUN Client的IP和端口{IP-M1,Port-M1}作为Binding Response的内容回送给STUN Client。 Test1#2STUN Client通过端口{IP-C1:Port-C1}向STUN Server{IP-S2:Port-S2}发送一个Binding Request没有设置任何属性。STUN Server收到该请求后通过端口{IP-S2:Port-S2}把它所看到的STUN Client的IP和端口{IP-M1#2,Port-M1#2}作为Binding Response的内容回送给STUN Client。 Test2STUN Client通过端口{IP-C1:Port-C1}向STUN Server{IP-S1:Port-S1}发送一个Binding Request设置了Change IP和Change Port属性。STUN Server收到该请求后通过端口{IP-S2:Port-S2}把它所看到的STUN Client的IP和端口{IP-M2,Port-M2}作为Binding Response的内容回送给STUN Client。 Test3STUN Client通过端口{IP-C1:Port-C1}向STUN Server{IP-S1:Port-S1}发送一个Binding Request设置了Change Port属性。STUN Server收到该请求后通过端口{IP-S1:Port-S2}把它所看到的STUN Client的IP和端口{IP-M3,Port-M3}作为Binding Response的内容回送给STUN Client。
STUN协议的输出是
1公网IP和Port 2防火墙是否设置 3客户端是否在NAT之后及所处的NAT的类型。
因此我们进而整理出通过STUN协议我们可以检测的类型一共有以下七种
A公开的互联网IP主机拥有公网IP并且没有防火墙可自由与外部通信 B完全锥形NAT C受限制锥形NAT D端口受限制形NAT E对称型UDP防火墙主机出口处没有NAT设备,但有防火墙,且防火墙规则如下从主机UDP端口A发出的数据包保持源地址但只有从之前该主机发出包的目的IP/PORT发出到该主机端口A的包才能通过防火墙 F对称型NAT G防火墙限制UDP通信。
7.3、STUN协议的判断过程
输入和输出准备好后附上一张维基百科的流程图就可以描述STUN协议的判断过程了。 STEP1检测客户端是否有能力进行UDP通信以及客户端是否位于NAT后 – Test1 客户端建立UDP socket然后用这个socket向服务器的IP-1Port-1发送数据包要求服务器返回客户端的IP和Port客户端发送请求后立即开始接受数据包。重复几次。 a如果每次都超时收不到服务器的响应则说明客户端无法进行UDP通信可能是G防火墙阻止UDP通信 b如果能收到回应则把服务器返回的客户端的IP:PORT同Local IP: Local Port比较
如果完全相同则客户端不在NAT后这样的客户端是A具有公网IP可以直接监听UDP端口接收数据进行通信或者E。否则客户端在NAT后要做进一步的NAT类型检测继续。
STEP2检测客户端防火墙类型 – Test2 STUN客户端向STUN服务器发送请求要求服务器从其他IP和PORT向客户端回复包 a收不到服务器从其他IP地址的回复认为包前被前置防火墙阻断网络类型为E b收到则认为客户端处在一个开放的网络上网络类型为A。
STEP3检测客户端NAT是否是FULL CONE NAT – Test2 客户端建立UDP socket然后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器用另一对(IP-2,Port-2)响应客户端的请求往回发一个数据包客户端发送请求后立即开始接受数据包。 重复这个过程若干次。 a如果每次都超时无法接受到服务器的回应则说明客户端的NAT不是一个Full Cone NAT具体类型有待下一步检测继续 b如果能够接受到服务器从(IP-2,Port-2)返回的应答UDP包则说明客户端是一个Full Cone NAT这样的客户端能够进行UDP-P2P通信。
STEP4检测客户端NAT是否是SYMMETRIC NAT – Test1#2 客户端建立UDP socket然后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器返回客户端的IP和Port, 客户端发送请求后立即开始接受数据包。 重复这个过程直到收到回应一定能够收到因为第一步保证了这个客户端可以进行UDP通信。 用同样的方法用一个socket向服务器的(IP-2,Port-2)发送数据包要求服务器返回客户端的IP和Port。 比较上面两个过程从服务器返回的客户端(IP,Port),如果两个过程返回的(IP,Port)有一对不同则说明客户端为Symmetric NAT这样的客户端无法进行UDP-P2P通信检测停止因为对称型NAT每次连接端口都不一样所以无法知道对称NAT的客户端下一次会用什么端口。否则是Restricted Cone NAT是否为Port Restricted Cone NAT有待检测继续。
STEP5检测客户端NAT是Restricted Cone 还是 Port Restricted Cone – Test3 客户端建立UDP socket然后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器用IP-1和一个不同于Port-1的端口发送一个UDP 数据包响应客户端, 客户端发送请求后立即开始接受数据包。重复这个过程若干次。如果每次都超时无法接受到服务器的回应则说明客户端是一个Port Restricted Cone NAT如果能够收到服务器的响应则说明客户端是一个Restricted Cone NAT。以上两种NAT都可以进行UDP-P2P通信。
通过以上过程至此就可以分析和判断出客户端是否处于NAT之后以及NAT的类型及其公网IP以及判断客户端是否具备P2P通信的能力了。