目录
思考
-
问题
1、NAT的概念和功能
2、NAPT的分类和转换
3、NAT的顺序
4、NAT主要分配的上网配置有哪些 -
答案
1、
Network Address Translation,实现的功能就是网络地址的转换,将私有地址转换为公有地址来访问外网,缓解了IP地址枯竭的问题;同时,nat能保证内网的安全;
综上,当我们讨论IPv6的普及是否能完全取代NAT时,不仅要考虑地址的数量问题,还得考虑安全性的问题,这也是IPv6原生自带IPsec的动机;
2、
- 锥形和对称型,其中锥形又分为完全锥形、受限锥形、端口受限锥形; 完全锥形外网可以不受限的直接通过Inside Global来实现对于Inside Local的访问;
- 受限锥形需要内部访问过外部生成转换表之后,对应的外部IP才可以通过Inside Global来实现对于Inside Local的访问;
- 端口受限型更加的严格,需要内部访问过外部生成转换表之后,对应的外部IP+端口号才可以通过Inside Global来实现对于Inside Local的访问;
- 对称型和锥形的区别在于,在相同的Inside Local访问不同的外部IP+port时,锥形使用的是相同的Inside Global,而对称型使用的是不同的Inside Global;
- 其他的方面对称型和端口受限锥型是一样的;
3、
- 内部到外部:检查输入访问列表->策略路由->路由->NAT->检查输出访问列表
- 外部到内部:检查输入访问列表->NAT->策略路由->路由->检查输出访问列表
4、
- IP、掩码、网关、DNS
1 NAT的基本知识
1.1 NAT的重要性
上网三要素
o DNS
o 默认路由
o NAT
1.2 使用NAT的设备位置
多配置于边界网关路由器。
注:交换机一般不支持NAT,一方面交换机不会布置在边界区域,一方面交换机偏向于硬件处理报文,而nat需要软件功能比较强大的设备才能运行,因为nat需要CPU来进行地址的转换。
1.3 常见转换前地址
地址类型 | 地址块 | 范围 |
---|---|---|
私网地址 | 10.0.0.0/8 | 10.0.0.0 - 10.255.255.255 |
CG-NAT | 100. 64.0.0/10 | 100.64.0.0 - 100.127.255.255 |
私网地址 | 172.16.0.0/12 | 172.16.0.0 - 172.31.255.255 |
私网地址 | 192.168.0.0/16 | 192.168.0.0 -192.168.255.255 |
- CG-NAT使用场景
注:CG-NAT的IP使用场景
- 情况一:
如家用光猫的出口IP地址
- 情况二:
某次项目配置的出口IP就是CG-NAT
- 说明:
CG-NAT使用在类似于我们家用路由器的wan口上作为内网IP经过nat后转换成的“假公有ip”使用,到运营商设备还要进行一次NAT才可以转换为真正的公有IP,也就是说需要进行两次的NAT(打开路由器管理平台可以查看路由器的wan口所设置的IP地址,百度搜索IP可以查看我们真正的公网IP地址)。值得注意的是此时的路由器WAN使用的ip就是经过上游运营商设备DHCP后分配到的IP。也就是说我们家用路由器此时既作为DHCP客户端又作为DHCP的客户端。
- CG-NAT的使用缺陷
无法远程访问我们的电脑,具体看下面举例
举例:其中R18为我们本地PC,本地PC经过两次的NAT最终以12.12.12.1的源IP地址访问外网;而我们R21想要通过nat反向访问192.168.1.1,所以有了下面的讨论
首先得明确一点:我们在路由器上配置的NAT多数是动态的NAT,图中也就是R19和R20配置的动态的NAT;如果需要远程访问的话,需要单独在路由器上面配置静态的NAT来实现外部对内部的直接的NAT转换,而这种的静态NAT我们只能在自己的路由器上面配置(不可能跑到运营商的服务器上面配置吧);则我们可以通过直接访问第一次NAT的出口IP来实现NAT转换,但是很多情况下第一次NAT的出口IP地址并不是公网IP地址,是私网IP地址或者没有宣告在公网的IP地址,这种情况下沿途的设备根本不知道怎么去往这个IP地址,自然也无法实现远程的地址转换;
1.4 NAT的术语
四种地址 | 释义 |
---|---|
Inside Local | 内部主机在内网的地址 |
Inside Global | 内部主机在外网的地址 |
Outside Local | 外部主机在内网的地址 |
Outside Global | 外部主机在外网的地址 |
1.5 NAT的分类
基础NAT和NAPT的区别,从名称就可以看出区别,一个是网络地址转换,一个是网络地址端口转化;
前者是指基于地址进行转换,后者是基于套接字(也就是IP+端口=特定应用)进行转换
注:NAT中存在端口号,这个端口号大多是抓取了应用层的端口号用来标识报文,当然这个也是建立在发送的报文是应用层及其以上的报文,如果是网络层的报文,则是抓取网络层中的相关字段当做nat的端口号使用,比如icmp则是抓取如下图的字段当做nat的端口号使用,毕竟每个协议都会有为了区分相同协议的不同报文而设置的字段,而且作为request报文的回复报文response报文的相应字段和前者相同。
- 动态NAT
建立地址之间的临时映射关系,过一段时间没有用就会删除映射关系。
注:PAT也是属于动态NAT的一种,所以安全性还是可以保证的。动态NAT在内网设备访问外网,然后转换表中记录表项之后,外网设备可以在表项老化之前主动访问内网设备,不过注意这是建立在外网设备访问内网设备时发送的报文是符合转换表表项的前提下;但是这个前提很难满足,因为要想符合这个前提需要外网主动访问内网发送的报文的端口号和转换表项中一致,但是端口号一致的情况大多只会出现在request报文的相应的response报文这个情况,而外网主动访问内网大多数都是发送request的报文。综上所述,动态nat还是很安全的。
- 静态NAT
o 建立地址之间的永久映射关系
o 对外提供服务
注:服务器的防火墙侧多是使用静态的NAT,因为外网设备随时都要主动访问他。
注:以下形状分类针对的是同一应用不同请求的不同处理方式
- 完全锥形
在一个设备上同一应用不同请求经过nat映射之后转换为相同端口的公网(本来一个端口就是对应一个应用),且外界也可直接通过此公网nat后访问内网。【本质上就是静态NAT,外界可以直接nat后访问内部】 也就是说该模式外网设备只需要匹配Inside Local内的地址加上端口号,对于外网设备来说就是目的地址加上端口号。
Pro | In Lo | In Gl | Out Lo | Out Gl |
---|---|---|---|---|
- | 10.0.0.2:1234 | 156.0.23.17:14001 | - | - |
- 受限制锥形
由内向外访问之后创建转换表项,类似动态NAT;
在一个设备上同一应用不同请求经过nat映射之后转换为相同端口的公网(本来一个端口就是对应一个应用)
,外部也可以逆NAPT访问内部的应用,但是源IP需要是Out的IP地址,目的IP和端口需要时Inside Global的IP和端口才可以正确进行转换;
Pro | In Lo | In Gl | Out Lo | Out Gl |
---|---|---|---|---|
- | 10.0.0.2:1234 | 156.0.23.17:14001 | 157.1.22.23 | 157.1.22.23 |
- 端口受限制锥形
由内向外访问之后创建转换表项,类似动态NAT;
在一个设备上同一应用不同请求经过nat映射之后转换为相同端口的公网(本来一个端口就是对应一个应用)
,外部也可以逆NAPT访问内部的应用,但是源IP和端口需要是Out的IP地址和端口,目的IP和端口需要时Inside Global的IP和端口才可以正确进行转换;
Pro | In Lo | In Gl | Out Lo | Out Gl |
---|---|---|---|---|
- | 10.0.0.2:1234 | 156.0.23.17:14001 | 157.1.22.23:10201 | 157.1.22.23:10201 |
- | 10.0.0.2:1234 | 156.0.23.17:14001 | 158.1.22.23:1021 | 158.1.22.23:1021 |
- 对称形
和端口受限型NAPT的区别在于在端口受限NAPT的基础上,访问不同的外网IP和端口时候使用的Inside Global 的IP+端口不是一个,每次访问不同的外网IP和端口都会使用一个不同的Inside Global的IP+端口地址(一般是端口不一样);
Pro | In Lo | In Gl | Out Lo | Out Gl |
---|---|---|---|---|
- | 10.0.0.2:1234 | 156.0.23.17:14001 | 157.1.22.23:10201 | 157.1.22.23:10201 |
- | 10.0.0.2:1234 | 156.0.23.17:14002 | 158.1.22.23:1021 | 158.1.22.23:1021 |
2 P2P
2.1 概念
- P2P,Peer-to-Peer,点对点即对等网络;
- 一个终端设备既作为“客户端”又作为“服务器”;
- 典型的例子如迅雷,本地终端既作为“客户端”请求迅雷服务器资源,又作为“服务器”被其他的迅雷使用者即“客户端”请求资源;
- 常见的P2P流量:联机游戏、视频…
2.2 P2P优势
a、对于传统的C/S架构来说,有以下的缺陷
- 1、服务器成为业务扩展的瓶颈
客户端流量的增加都会增加服务器侧的负担,所以需要对服务器以及带宽进行升级; - 2、容易导致单点故障
服务器侧故障会导致整个网络服务的瘫痪;
b、对于P2P架构,有以下优势
-
1、业务拓展方便
P2P架构弱化了服务器的作用,在某些P2P模式甚至直接去掉了服务器这个角色;所以,服务器成为瓶颈的情况一般不会再业务拓展的情况下发生; -
2、减少单点故障概率
这个优势针对的是分布式P2P和混合式P2P;注意,集中式的P2P由于架构和C/S类似,所以还是存在相同的单点故障的风险;
2.3 P2P类型
P2P类型:集中式、分布式、混合式
- 集中式
- 概念
由中央服务器和客户端组成,中央服务器存储了所有客户端的基本信息(包括端口号,公网IP地址,拥有的资源…),然后在客户端A想中心服务器请求对应资源时,返回拥有相同资源的客户端B的基本信息给客户端A,然后A和B建立连接直接获取对应的数据;- 缺陷和优势
缺陷:由于和C/S架构高度一致,所以还是存在单点故障的问题;
优势:集中的部署的常见优势,如客户端信息便于管理,维护效率高,查询效率高- 架构
- 分布式
- 概念
该模式完全舍弃了 中央服务器 的角色,只存在客户端;客户端之间查询资源信息基于广播;- 缺陷和优势
缺陷:大量无用广播占用带宽,同时查询效率较低,以及不可控;
优势:分布式部署,避免了单点故障- 架构
- 混合式
- 概念
该模式和集中式的区别在于中央服务器不止一台,存在多台冗余且客户信息共享;这种设计思想也是普遍的解决集中式单点故障的方案;- 缺陷和优势
缺陷:多台中央服务器,造价比较高,配置较复杂;
优势:减少单点故障的概率,同时又便于管理用户信息,用户查询效率也较高;- 架构
2.3 过程分析
说明:迅雷使用的是“混合式”的P2P模式,我们下面的拓扑为了方便描述只画了一台中央服务器,在现网中由多台服务器构成;
-
1 两个PC和迅雷服务器已经建立连接,则防火墙会产生NAT转换表,而服务器侧会保存客户端的公网套接字
-
2 PC A请求迅雷服务器下载资源,迅雷服务器返回PC B公网套接字并告知PC A去找PC B下载资源
-
3 迅雷服务器告知PC B相应的PC的外网套接字,且命令PC B由内到外打洞来实现PC A的外网到内网的穿透(我们这里默认防火墙的NAT模式为端口受限NAT)
-
4 PC A穿透访问PC B获取对应资源(PC A内部转外部不再写入步骤)
-
总结
- 综上,可以发现这种P2P模式比较依赖于“锥形”NAT,而对于“对称型”NAT则并不适用;
- 对称型和锥形的区别就在于对于相同的“Inside Local”套接字在访问不同外网时转换出的“Inside Global”套接字不一样(而锥形一样),这就会导致PC-B打的洞并不适用于PC-A(因为和服务器告知PC-A信息不一致),自然也无法实现P2P;
- 你可能会说,PC-B打洞方式应该就是发包给PC-A的公网套接字吧,那PC-A不应该也会知晓新的公网PC-B的套接字吗?很显然是不知晓的,因为PC-A没有打洞,所以PC-B的打洞数据包只会停留在PC-A外侧防火墙进不去PC-A的,所以PC-A并不知晓;
- 这种模式不仅用于迅雷下载,很多联网游戏也使用了这种模式来加快游戏资源的获取,所以家用路由器打游戏请务必不要调成对称型,虽然安全,但是可能会影响游戏的加载速度;
3 STUN技术
3.1 作用
STUN技术用于侦测本地NAT的类型;这一过程会发送UDP请求给服务器,而服务器回复的UDP报文中会包含本地NAT经过转换后的公网套接字信息,这一信息后续有助于本地终端判断NAT的类型;
3.2 角色介绍
Client:套接字记为C1
Server:两个套接字 S1=IP1+PORT1 和 S2=IP2+PORT2
3.3 过程介绍
- 1 C1发送UDP请求给S1
- 收到S1的回复则到下一步
- 没有收到S1的回复,排除非技术性故障,则是防火墙拦截了回复报文
- 2 C1发送UDP请求给S1,并且请求用S2回复
- 收到回复则说明是“完全锥形NAT”
- 没收到回复则到下一步
- 3 C1发送UDP请求给S2
- 收到回复,且和S1收到回复内信息相同则说明是“锥形NAT”
- 收到回复,但是和S1收到回复信息不相同则说明是“对称型NAT”
- 4 C1发送UDP请求给S1,并且要求用IP1+其他端口套接字回复
- 收到回复,则说明是“受限锥形NAT”
- 没收到回复,则说明是“端口受限NAT”
3 NAT(ALG)实际应用场景
补充:NAT是能够识别并且更改网络层IP以及传输层的端口号,但是不能识别且修改传输层之上的数据包的内容,所以我们需要用到ALG这种可以进行识别修改传输层之上数据内容的一类机制。
3.1 使用场景一——DNS+WEB
- 内网用户Host通过域名访问Web服务器
NAT设备存在ALG功能
- 1、先将域名发送给DNS服务器
- 2、DNS服务器将NAT出口IP作为返回的Web解析后的IP给内网用户
- 3、在NAT设备处,经过ALG将DNS应用层中的外网IP解析成内网的Web服务器的IP
- 4、Host直接和内网Web服务器建立TCP连接
NAT设备不存在ALG设备
- 1、由于外网有搭建DNS服务器,所以外网客户Host 2可以成功访问Web服务器
- 2、NAT设备由于不存在ALG功能,所以我们需要使用其他的办法来帮助内网Host访问内网的Web服务器
- 3、我们可以在内网搭建DNS服务器,然后通过DHCP的方式给内网用户Host分配内网的DNS的IP地址
- 4、用户向内网DNS直接请求解析Web的IP地址,返回的直接是内网的Web的IP地址
- 5、然后内网Host直接和内网的Web建立TCP连接
- 外网用户Host 2通过域名访问Web服务器
- 先将域名发送给DNS服务器
- DNS服务器将NAT出口IP作为返回的Web解析后的IP给外网用户
- Host 2直接去访问NAT设备的出口IP
- 由于NAT出口设备存在静态NAT的配置,所以直接穿透访问内网的Web服务器实现TCP连接的建立
- 内网用户Host通过公网IP访问Web服务器
NAT设备支持对于访问本地接口IP情况下的NAT
NAT设备不支持对于访问本地接口IP情况下的NAT
暂时没更新
3.2 使用场景二——FTP
注:FTP传输会建立两条的连接,一条是控制连接,一条是数据传输连接;控制连接建立过程一样而建立数据传输连接有两种模式,主动模式和被动模式,主动被动是基于服务器而言。
知识点补充:防火墙多架设于服务器以及客户端设备的外侧,可以起到nat,过滤以及决策等作用,由于执行NAT所以其外侧多配置公网地址,且防火墙一般不会限制出口流量,像FTP这个案例就不会限制出口的端口号(除非特殊情况,比如通过DHCP获取的IP需要做准出)。
1、主动模式(PORT)
注:下文中的N和N+1并非是连续的关系,都是随机的
PORT中文称为主动模式
工作的原理:
- 步骤一
FTP客户端使用随机端口N(N>1024)连接到FTP服务器的21端口,发送用户名和密码登录; - 步骤二:
登录成功后要list列表或者读取数据时,客户端发送 PORT命令到FTP服务器,告诉服务器客户端采用主动模式并开放客户端自身的N+1端口;FTP服务器收到PORT主动模式命令以及其自己开放的端口号后,通过服务器的20端口和客户端开放的端口N+1连接,发送数据。
2、被动模式(PASV)
PASV是Passive的缩写,中文称为被动模式
工作原理:
- 步骤一
FTP客户端使用随机端口N(N>1024)连接到FTP服务器的21端口,发送用户名和密码登录; - 步骤二:
登录成功后要list列表或者读取数据时,发送PASV命令到FTP服务器, 服务器在本地随机开放一个端口P(P>1024以上),然后把开放的端口告诉客户端, 客户端再用N+1端口连接到服务器开放的P端口进行数据传输。
3、两者区别&为什么现网使用被动模式?
o 对于防火墙的端口准入准出配置而言
被动模式的服务器侧的防火墙需要开放一个范围内的端口,以准备后续的P端口的使用,所幸的是这个端口的范围可以人为设置,从而减轻了开放大规模的端口导致的安全问题。
o 对于防火墙的NAT配置而言——区别大大的有
注:拿客户端侧的防火墙来举例
- 对于被动模式,是客户端主动连接的服务器端,可以直接通过客户端侧防火墙NAT转换之后访问,而且一般windows防火墙不会限制出口流量。
- 对于主动模式,是服务器主动连接的客户端,流量可能会被客户端侧防火墙拦截,而且在主动模式下客户端发送的PORT报文里面的active ip以及active port字段可能对于服务器端不可达(因为是内网IP)。
o 对于现网而言
- 对于客户端侧的网络设备不能有太高的配置要求和技术要求。而如果使用主动模式的话,对于客户端侧的网络设备就需要支持ALG机制,这对于客户端的配置就有要求;且客户端侧防火墙,比如PC的防火墙会禁止外部的流量访问内部的设备,所以客户端侧防火墙还要进行配置才可以使的主动模式报文可以进入内网,这对客户端又有技术要求。很显然这不符合预期。
- FTP服务器的数量较客户端设备肯定是来的少的,很显然,在服务器侧集中式部署ALG机制比在客户端侧分布式部署ALG机制来说更加的便于管控且更加的合理。
4 NAT转换顺序
精简版:
内部到外部 | 外部到内部 |
---|---|
检查输入访问列表 | 检查输入访问列表 |
策略路由 | NAT外部到内部 |
路由 | 策略路由 |
NAT内部到外部 | 路由 |
检查输出访问列表 | 检查输出访问列表 |