您当前的位置:首页 > 电脑百科 > 网络技术 > 网络技术

穿越NAT的迷雾:深入理解NAT和NAT穿透,STUN、TURN、ICE的关系

时间:2021-03-24 16:40:20  来源:  作者:

NAT是什么?

NAT是Net Address Translation的缩写,即网络地址转换

NAT部署在网络出口的位置,位于内网跟公网之间,是连接内网主机和公网的桥梁,双向流量都必须经过NAT,装有NAT软件的路由器叫NAT路由器,NAT路由器拥有公网IP。

穿越NAT的迷雾:深入理解NAT和NAT穿透,STUN、TURN、ICE的关系

 

你的家庭和办公网络环境大多是经过NAT路由中转的方式联网。这也意味着你在家PC通过WIFI联网,你在PC上通过命令行(ifconfig)查看到的IP地址(内网),跟通过baidu查看到的IP地址(公网),不一样,这也能证明你的PC处于NAT后面。

NAT解决什么问题?

NAT主要用来解决IPv4地址不够用的问题。

IPv4用32位表示网络地址,最大能表示2的32次方(2^32=40亿)个IP地址,但随着各种联网设备的快速增长,IPv4地址不够用了,IPv6又远水不解近渴,怎么办?NAT技术应运而生。

NAT是怎么工作的?

内网地址:RFC1918规定了三个保留地址段落:

10.0.0.0-10.255.255.255;

172.16.0.0-172.31.255.255;


192.168.0.0-192.168.255.255。

这三个范围分别处于A、B、C类的地址段,不向特定的用户分配,被IANA作为私有地址保留。这些地址可以在任何组织或企业内部使用,和其他Internet地址的区别就是,仅能在内部使用,不能作为全球路由地址。

NAT后面的内网主机使用内网地址,也叫本地地址,是主机上内网上的标识。内网主机要跟公网通信,必须经过NAT中转,NAT会自动为经过的网络包做内外网地址转换(这也是NAT的含义),公网地址是主机在互联网上的标识

NAT原理:内网主机向外网主机发送的网络包,在经过NAT时,IP和PORT会被替换为NAT为该主机分配的外网IP/PORT,也就是该内网主机在NAT上的出口IP/PORT,外网主机收到该网络包后,会视该网络包是从NAT发送的;外网主机只能通过NAT为该内网主机分配的外网IP/PORT,向它发送网络包,内网主机的本地地址对外界不可见,网络包在经过NAT的时候,会被NAT做外网IP/PORT到内网IP/PORT的转换。

可见,NAT维护内网主机内网地址和在NAT上为它分配的外网地址之间的映射关系,需要维护一张关联表。NAT在两个传输方向上做两次地址转化,出方向做源(Src)信息替换,入方向做目的(Dst)信息替换,内外网地址转换是在NAT上自动完成的。NAT网关的存在对通信双方是透明的。

那NAT是如何缓解IPv4地址枯竭问题的呢?答案是端口多路复用,通过PAT(Port Address Translation),让NAT背后的多台内网主机共享一个外网IP,最大限度节省外网IP资源。

NAT背后的多台内网主机是如何实现共享一个外网IP的呢?它是通过修改外出数据包的源IP和端口。

假设内网主机H1和H2位于NAT之后,H1通过本地地址10.0.0.1:port1给公网主机X发送数据包,在经过NAT的时候,该数据包的IP:PORT被修改为NAT的外网地址1.2.3.4:2222。

H2通过本地地址10.0.0.2:port2向公网主机X发送数据包,在经过NAT的时候,该数据包的ip:port被修改为NAT的外网1.2.3.4:3333。

穿越NAT的迷雾:深入理解NAT和NAT穿透,STUN、TURN、ICE的关系

 

虽然H1和H2的IP都被映射到了相同的NAT外网IP(1.2.3.4),但NAT为它们分配了不同的端口(2222和3333),所以可以通过端口区分H1和H2。之后公网主机X向内网主机H1发送网络包的时候,只需要把1.2.3.4:2222作为目标地址:端口,就可以由NAT自动完成转换,正确转交到H1主机。

这便是基于端口复用的NAT方式(NPAT)的工作原理。通过将内网不同连接(主机到NAT)映射到同一公网IP的不同端口,从而实现公网IP的复用和解复用,这种一对多的方式也叫做端口转换PAT或IP伪装。

NAT的限制和约束

NAT把网络分为公网和内网,内网主机可以给外网主机直接发送网络包,而外网主机却不能主动给内网主机发送网络包,也就是说网络通信必须由内网侧主动发起,公网主机不能主动访问内网主机,这是NAT带来的限制和约束。

内网主机主动给外网主机发送过网络包之后,外网主机才有可能给内网主机发送网络包。

NAT的类型

NAT的实现方式分静态转换动态转换端口多路复用三种,但目前用的最多的还是端口多路复用,是最典型的一种应用模式。

穿越NAT的迷雾:深入理解NAT和NAT穿透,STUN、TURN、ICE的关系

 

首先,从大的层面上,端口复用型NAT(Net Address Port Translation)可以分为对称型NAT和非对称型NAT。

  1. 对称型NAT(Symmetric NAT),内网某主机向公网的不同网络地址(或端口)发送2个不同的网络包,对称型NAT会为这2个不同的网络包产生2个不同出口端口号。换言之,NAT网关会把内部主机“地址端口对”和外部主机“地址端口对”完全相同的报文看作一个连接,在NAT网关上创建一个公网“地址端口对”作为出口地址,只有收到报文的外部主机从对应的端口对发送回应的报文,才能被转换。对称型NAT无法打洞,只能通过TURN Server转发。
  2. 非对称型NAT(也叫锥型NAT),内网某主机向外网主机发送网络包,NAT会为该内网主机生成一个公网(出口)IP:PORT,之后,不管该内网主机会通过该出口IP:PORT跟外网所有(如果可以)主机通信,而不会被映射到其他端口(出口IP显然也不会变)。

锥型NAT细分:

  1. Full Cone NAT(全锥型NAT):只要内网某主机给外网地址主动发送过一个网络包(NAT会为之生成公网出口IP:PORT),外网任何主机都可以通过该内网主机在NAT上的出口IP:PORT,向该内网主机发送网络包,也就是对外网主机IP和PORT都不设限,这是最宽松的类型。
  2. Restricted Cone NAT(IP受限型NAT):如果内网某主机,给外网某IP发送过一个网络包,则外网可以通过该IP向该内网主机发送网络包,注意,只要以该IP作为网络包src ip就行,其他IP作为src不行,不限制端口号。
  3. 举个例子,内网主机10.0.0.1给外网1.2.3.4:2222主动发过网络包,外网主机可以通过1.2.3.4:3333(作为src)向内网主机10.0.0.1发送网络包,端口号不限,但不能通过其他ip向内网主机发送网络包。
  4. Port Restricted Cone NAT(Port受限型NAT):跟IP受限类似,但是它更严格,既限制IP,又限制端口号。内网主机给外网主机10.0.0.1:2222发送过网络包,外网只能以10.0.0.1:2222为src,向内网主机发送网络包。

NAT类型检测

NAT隔离内外网,外网不能主动访问内网,但P2P项目,需要位于NAT后的主机(Peer)建立连接,所以需要检测NAT类型,再判断Peer之间能否直接建立连接,以及怎么建立连接。

检测NAT类型主要是利用上述NAT特点,通过测试连通性和比对端口号来实现目的,所以要搞清楚类型检测,必须对照NAT类型定义来看。

另外,重复一下:NAT后的主机给外网发网络包,网络包在经过NAT的时候,NAT会为该主机分配出口IP:PORT,NAT会用该公网(出口)IP:PORT替换网络包的SRC,这样,接收端收到包之后,查阅包的src信息,会得到NAT出口IP:PORT,如同该包是直接从NAT发送过来的一样。

NAT类型检测的前提条件:需要有一台位于公网的服务器(server),且该server拥有2个公网IP地址,并在ip1:port1和ip2:port2做监听

注意:检测步骤中的server通过ip:port向client回包,是指server回包的时候,会把ip:port设置为rsp包的src ip和src port。

检测的步骤:

【步骤1】判断client是否位于NAT后面

很简单,位于NAT后面的主机跟公网通信要做内外网地址转换,两个IP不一样。所以,可以通过以下操作完成:

  1. client向server ip1:port1发送一个req UDP包。
  2. server收到udp包之后,从IP头部取出src IP,从UDP头部取出src PORT,作为rsp UDP的payload,发送给client。
  3. client收到rsp UDP,取出payload里的IP和PORT,跟自己的IP对比,如果相同,则client位于公网,拥有公网IP,检测完成;否则,client位于NAT背后。

 

【步骤2】判断是否全锥型Full Cone NAT

client向server ip1:port1发送一个req UDP包,请求server通过ip2:port2(以ip2:port2作为rsp UDP的src)向client回UDP包。

根据全锥型NAT的定义,如果client收到了rsp UDP,那说明NAT对外网发包IP都不限制,说明client是全锥型NAT。但全锥型NAT很少,大概率收不到rsp UDP包,如果收不到,则需要继续判断。

【步骤3】判断是否对称型 Symmetirc NAT

client向server ip2:port2发送一个req udp。server收到后,把收到的req udp的src ip和src port取出来,塞进rsp UDP的payload字段,通过ip2:port2(以ip2:port2作为rsp UDP的src)向client回UDP包。

收到的rsp UDP之后,取出payload中的ip和port,跟步骤1中的ip和port对比,如果不一样,则是对称型NAT。

因为根据前面的定义,对称型NAT,会为同一内网IP,根据不同的外网IP,分配不同的NAT出口PORT。

如果一样,那么肯定是锥型NAT,步骤2已经测试了全锥型,那剩下的就只有ip受限锥型和port受限锥型两种NAT类型需要继续判断了。

【步骤4】判断是受限锥型Restricted Cone还是PORT受限锥型

client向server ip2:port2发送一个req udp,要求server用ip2、且不同于port2的端口向client回rsp udp。就是用ip2+不同于port2的其他port作为udp的src向client回包。

如果client能收到rsp udp,那说明只要ip相同,哪怕port不相同,NAT也放行,所以NAT是IP受限型;如果没收到,那就是PORT受限型,说明只能通过port2回包。

至此,所有的NAT类型便都检测出来了,是不是很简单?

对称型NAT不能直接建立P2P连接,只能通过中转服务器relay包。



Tags:NAT穿透   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
NAT是什么?NAT是Net Address Translation的缩写,即网络地址转换。NAT部署在网络出口的位置,位于内网跟公网之间,是连接内网主机和公网的桥梁,双向流量都必须经过NAT,装有NAT软件的...【详细内容】
2021-03-24  Tags: NAT穿透  点击:(253)  评论:(0)  加入收藏
导语最近介入测试P2P的相关逻辑,因此对NAT穿透原理做了一定程度的了解(当然也没有很深入)。。写本文的目的就是,用自己的语言描述了这个过程,同时也在描述过程中加入了一些自己的...【详细内容】
2020-03-28  Tags: NAT穿透  点击:(55)  评论:(0)  加入收藏
▌简易百科推荐
写一个shell获取本机ip地址、网关地址以及dns信息。经常会遇到取本机ip、网关、dns地址,windows一个命令ipconfig /all全部获取到,但linux系统却并非如此。linux系统都自带ifc...【详细内容】
2021-12-27  K佬食古    Tags:shell   点击:(1)  评论:(0)  加入收藏
步骤1、配置 /etc/sysconfig/network-scripts/ifcfg-eth0 里的文件。it动力的CentOS下的ifcfg-eth0的配置详情:[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifc...【详细内容】
2021-12-24  忆梦如风    Tags:网卡   点击:(9)  评论:(0)  加入收藏
1、查找当前目录下所有以.tar结尾的文件然后移动到指定目录find . -name “*.tar” -execmv {}./backup/ ;注解:find –name 主要用于查找某个文件名字,-exec 、xargs可...【详细内容】
2021-12-17  郭主任    Tags:运维   点击:(18)  评论:(0)  加入收藏
对于经常上网的朋友来说,除了手机购物上网,pc端玩网页游戏还是很多小伙伴首选的,但是有时候明明宽带链接上了,打开浏览器却出现上不了网的现象,下面小编要来跟大家说说电脑有网络...【详细内容】
2021-12-16  小白系统    Tags:网页无法打开   点击:(28)  评论:(0)  加入收藏
在访问像github、gitlab这样的外国网站时,很有可能会出现页面加载不出来或找不到页面的错误。这时候有的朋友就会以为是网络的问题,于是把Wifi断掉连上自己手机的热点,结果却还...【详细内容】
2021-12-15  启施技术IT狼叔    Tags:外网   点击:(14)  评论:(0)  加入收藏
网络地址来源:获取公网IP地址 https://ipip.yy.com/get_ip_info.phphttp://pv.sohu.com/cityjson?ie=utf-8http://www.ip168.com/json.do?view=myipaddress...【详细内容】
2021-12-15  韦廷华12    Tags:外网ip   点击:(14)  评论:(0)  加入收藏
准备好软件IPOP、用ENSP模拟一下华为交换机 启动交换机 <Huawei>sysEnter system view, return user view with Ctrl+Z.[Huawei]sysname FTPClient[FTPClient]interface vla...【详细内容】
2021-12-15  思源Edward    Tags:交换机   点击:(22)  评论:(0)  加入收藏
我们经常用到netstat命令查看主机连接状况,包括连接ip、端口、状态等,今天就练习下shell分析netsat结果。描述假设netstat命令运行的结果我们存储在nowcoder.txt里,格式如下:Pro...【详细内容】
2021-12-14  K佬食古    Tags:netstat   点击:(19)  评论:(0)  加入收藏
什么是滑动窗口?窗口是操作系统开辟的一块缓存空间,发送方在收到接收方ACK应答之前,必须在缓冲区保留已发送的数据,如果按期收到确认应答,数据就可以从缓冲区移除。什么是滑动窗...【详细内容】
2021-12-14  DifferentJava    Tags:TCP   点击:(28)  评论:(0)  加入收藏
概述日常管理华为路由设备过程中,难为会忘记设备登录密码,那么该如何重置设备登录密码吗?本期文章将全面向各位小伙伴总结分享。重置华为设备登录密码思路先行 采用console登录...【详细内容】
2021-12-10  onme0    Tags:   点击:(26)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条