查看原文
其他

IPV4地址枯竭的背后,深度解析NAT协议的利与弊

点击上方 "程序员小乐"关注, 星标或置顶一起成长

每天凌晨00点00分, 第一时间与你相约

每日英文

There are moments in life when you miss someone so much that you just want to pick them from your dreams and hug them for real.

生命中总有些时刻,你是如此想念某人,恨不得能把他们从你的幻想里抓出来,结结实实的抱一个。


每日掏心

人生有太多的遇见,擦肩而过是一种遇见,刻骨铭心是一种遇见。有很多时候,看见的,看不见了;记住的,遗忘了。


来自:科技荟萃 | 责编:乐乐

链接:t.cn/AieG2TmF

程序员小乐(ID:study_tech)第 707 次推文   图片来自网络


往日回顾:Java 如何更优雅的处理空值?



   正文   


2019年11月26日,负责英国、欧洲、中东和部分中亚地区互联网资源分配的欧洲网络协调中心(RIPE NCC)正式宣布:共计43亿个IPV4地址已经全部分配完毕!



关于IPV4地址枯竭的问题,人们对此并不感到意外。因为互联网一开始只是设计给美国军方使用的,可能当时谁也没有想到互联网发展的速度会如此之快。早在二十世纪初,IPv4地址稀缺的问题便已初现端倪,对此人们也早早的做好了准备措施——第六代网际协议IPV6。但是在二者的过渡工作尚未完成之前,IPV4地址的匮乏和爆炸式增长的入网需求矛盾日益加深。该怎么解决这个问题呢?


什么是NAT协议?


NAT(Network Address Translator),网络地址翻译器,也称网络地址转换协议,NAT协议可以将一个由私有IP构成的局域网中所有的计算机,通过一台具有公网IP和NAT功能的设备来访问公网公网资源。因为局域网中的设备可以通过很少的公有IP(甚至一个)就能实现网上冲浪,很大程度上节约了地址资源,所以在实际场景中,NAT被应用的极其广泛。豪不夸张的说,哪里有网络,哪里就有NAT的身影。



私网是无法直接访问公网的,这是因为用户的私网地址会被公网的网关直接过滤掉,就算能通过公网网关,其响应包也无法返回正确的源地址。所以在内网的数据包进入公网之前,必须先将其转换成公有IP。NAT所提供的的就是一种“私到公”的过渡技术。除了翻译IP地址外,NAT同时还兼具着TCP/UDP端口的翻译功能,这也是NAT为什么常常被配置在网关计算机上的原因。那么,NAT协议究竟是如何实现公私地址转换的呢?


NAT协议的工作原理


简单来说,用户发出一个请求后,NAT设备会检查该数据包,当它发现这是一个请求外网的数据包时,会进而检查是否存在映射关系,对源IP地址和端口进行翻译(修改),同时在映射表中添加新建的IP和端口的映射条目,然后再把修改的数据包转发出去。如下方逻辑图所示,左边部分是内网用户通过NAT访问公网的过程,右半部分是公网返回内网的过程(刚好是左边的逆过程)。



需要注意的是,在此过程中,发起连接请求的内网计算机对NAT设备的“翻译”过程是一无所知的,并不知道自己的目的地址已经发生了改变。

NAT解决了IP地址枯竭的燃眉之急,因为随着接入Internet的计算机数量的指数型怎张,IP地址资源也就显得捉襟见肘。以中国为例,除了中国教育和科研计算机网等少数组织外,普通用户想要申请整段的C类地址简直难如登天!即使是哪些拥有着上百台计算机的大型局域网用户,能够申请到的IP地址也不过数十个而已。显然,如此少的IP地址是根本无法满足现在的网络状况的。


NAT技术的弊端


尽管在表面上看,NAT似乎真的没有缺点,除了节约公网IP资源外,它还可以保护我们内部网络的安全。但是,完美无缺的事物是不存在的。在享受了NAT所带来的便利后,NAT技术的缺陷也逐渐引起了人们的重视。



1.增加了网络的复杂性


从之前NAT的工作过程的描述中可以看出,内网主机和公网IP之间并没有建立真正的端对端连接!这就导致该过程无法参与高层网络的一些协议,比如说非常重要的传输层协议——TCP和UDP,体现在实际中,就是某些需要初始化后,从外部网络建立的链接服务会被非正常中断。你的网络可能会莫名其妙的断开,还检查不出原因。


这就对NAT路由器提出了更高的要求,否则送来的数据包有很大的可能根本无法找到正确的地址。但这又会导致另一个问题:NAT也会使安全协议变的更加复杂,网络整体结构变得脆弱


2.NAT违背了网络分层模型的设计原则


根据OSI七层网络结构中,明确规定:第N层不容许修改第N+1层的爆头内容,但NAT报文中却违背了这一原则。



NAT是一个网络层的协议,却再报头中增添了TCP/UDP首部。这就诞生了一个尴尬的局面:一个配有NAT协议的路由器,逻辑上却工作在传输层(路由器属于网络层设备)


除此之外,在传统的IP地址结构中,每个IP地址都对应一个网络连接,Internet的软件设计也是基于此前提之上,但使用NAT协议的网络中却可能存在多个主机使用相同的地址的情况。同时,因为NAT将IP协议从面向无连接变成了面向连接。路由器增加了一项新工作——维护专用IP地址与公用IP地址以及端口号的映射关系大大增加了路由器的工作负担。在原先的TCP/IP协议体系中,假设一个路由器出现了故障,只要几秒收不到应答,就会执行超时重传处理,重新发送,不会影响整体过程。如果存在NAT路由器,TCP/IP协议过程就会发生变动,Internet将有可能变得非常脆弱。


3.不能处理嵌入式IP地址或端口


由于NAT设备只能修改正常位于IP头部,它只能翻译那些正常位于IP首部中的地址信息和TCP/UDP首部中的端口信息。不能翻译那些嵌入到应用数据部分的IP地址或端口信息。但在实际中,嵌入式的IP地址或端口是很普遍的。同时,NAT在P2P网络模式中的表现也令人堪忧。



如果通信双方都是使用的公网IP,这不会造成什么问题,但如果那个嵌入式地址和端口是内网的,链接就不可能成功建立,这样就导致了NAT设备后的客户端网络应用程序出现连接故障。虽说可以通过NAT编辑器来在一定程度上缓和此类问题,比如WINDOW就针对TCP,FTP等协议做了制作了各自的编辑器,但应用协议实在是太多了,根本不可能面面俱到。即便是使用NAT穿越的手段,依旧解决不了那种NAT设备位于另一个NAT设备之后的情况。


综上所述,NAT虽然能解决IP地址不足的问题,还能够有效地避免来自网络外部的攻击,但终归不是长久之计。


深究NAT技术诞生的缘由,正是因为IP地址不足。而IPV6能提供海量的IP地址,正中问题下怀。当然了,也不是说NAT技术在IPV6普及后就没有存在的意义了。“不使用NAT上网无异于在网上裸奔”,即便是在今后的IPV6场景中,在没有更加完善的方案解决安全性等诸多问题前,NAT技术在网络结构中依旧拥有举足轻重的位置!

欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,学习能力的提升上有新的认识,欢迎转发分享给更多人。

欢迎各位读者加入程序员小乐技术群,在公众号后台回复“加群”或者“学习”即可。

猜你还想看


阿里、腾讯、百度、华为、京东最新面试题汇集

假如有人把支付宝存储服务器炸了(物理炸),大众在支付宝里的钱是不是就都没有了呢?

Java finally语句到底是在return之前还是之后执行?

Java 非阻塞 IO 和异步 IO,看了都说好!


关注「程序员小乐」,收看更多精彩内容
嘿,你在看吗?
视频 小程序 ,轻点两下取消赞 在看 ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存