《图解TCP/IP》阅读笔记(第五章 5.6)—— NAT技术初探

5.6 NAT

上回书说到了DHCP,了解了为什么现在可以如此方便的连入网络,这次要讲的内容更加重要,便是此前提到过很多次的NAT技术。

NAT(Network Address Translator)适用于在本地网络中使用私有地址,在连接互联网时转换成全局IP地址的技术。除了转换IP地址,还有可以转换TCP、UDP端口号的NAPT(Network Address Ports Translator)技术,由此可以实现一个全局IP地址与多个主机的通信。

书中提到,我们平时提到的NAT,多半是NAPT。NAPT还有俩别名:IP伪装,或Multi NAT。

此前我们讲IPv4的时候提到过,满打满算,2的32次方,约43亿,而现在的网络设备数量早已超过这个大小。NAT技术诞生的原因,正是为了拯救IPv4地址池濒临枯竭的技术。其实,IPv6中为了提高网络的安全性,也有在用NAT。而在IPv4和IPv6相互通信时,常使用NAT-PT,该技术我们之后再讲。

说到这,大概的情况已经介绍完了。那么NAT技术如何工作呢?书中给出了一张图来解释,见下图。其实也不难理解,在左边的局域网中,IP为10.0.0.10的主机,想要与全局中163.221.120.9的主机发生通信,数据包经由NAT路由器的时候,该路由器会将源IP自动的更新为路由器连接全局网络的IP地址202.244.174.37。反之,如有包从全局网络中想要往私有局域网中发送呢?则与上述过程相反,目标地址经由NAT路由器的时候,从202.244.174.37转换为10.0.0.10

《图解TCP/IP》阅读笔记(第五章 5.6)—— NAT技术初探_第1张图片

和普通的路由器一样,NAT路由器中也有一张自动生成的用于转换地址的表。每每需要发生IP转换时,就会按照表的映射关系进行处理。

书中提到,如果私有局域网的多台机器都要和外部进行通信,仅仅转换IP地址,会担心全局IP地址是否不够用。我的理解是,结合此前分类的规则,即使有了NAT技术,全局的IP仍然有可能无法满足日益增长的设备数量的需求。这时候可以通过NAPT解决这个问题。见下图:

《图解TCP/IP》阅读笔记(第五章 5.6)—— NAT技术初探_第2张图片

此处涉及到端口号的概念,与下一章的传输层关联更甚。此处简要提一句,在使用TCP、UDP的通信过程中,只有当目标地址、源地址、目标端口、源端口以及协议类型都相同时,才被认作是同一个通信连接。此时使用的技术就是NAPT。

如上图所示,如果局域网内两台主句的端口号都是1025,那么转化后的IP都是一样的,没法区分到底是哪台机子发出来的。为解决这个问题,将10.0.0.11的端口号转换为1026就可以了。此时,NAT路由器中仍会有一张记录转换地址与端口号的表,通过正确的转换地址和端口的组合,令两台客户端A、B都可以同时与服务器发生通信。

书中多提了一句,例如在TCP通信时,建立TCP连接首次握手时的SYN包一经发出,就会生成NAPT的转化表,而后随着收到关闭连接时发出FIN包的确认应答后,从表中删除。

而UDP由于两端进行通信时,起止时间不一定保持一致。在这种情况下生成转换表则比较困难。

刚刚提到,IPv4和IPv6进行通信时,使用到的技术为NAT-PT(NAPT-PT)。目前,很多互联网服务还是基于IPv4,而有些主机却只有IPv6地址,如果这两者之间不能建立通信,这波更新就多少有些说不过去了。

那么NAT-PT(NAPT-PT)技术是用来做什么的呢?其实,这就是一种将IPv6首部转化为IPv4的首部的技术。更严格来说,NAT-PT用于翻译IP地址,而NAPT-PT则用于翻译IP首部与端口号的。具体的工作方式见下图:

《图解TCP/IP》阅读笔记(第五章 5.6)—— NAT技术初探_第3张图片

图中已点出,局域网内为IPv6,公网内则为IPv6,在内外网通信时,NAT-PT路由器将数据包的首部IP地址进行更换,就可以实现IPv4与IPv6之间的通信。

看到这里,无论各位读者如何觉得,我是觉得NAT技术简直太好用了。但实际上,每一种技术都会存在潜在的问题。NAT技术由于依赖于路由器内部构建的NAT转换表,就会存在以下几点的限制。

  • 无法从NAT的外部向内部服务器建立连接。(虽然可以指定端口号,允许向内部访问,但是数量却受限于全局IP地址的个数)
  • 转换表的生成与转换操作都会产生一定的开销。
  • 如果通信过程中NAT遇到异常需要重启时,所有已建立的TCP连接都将被重置。
  • 接上条,如果配置了额外的NAT路由做容灾备份,TCP连接还是会断开。

从上述几条主要看出,TCP受NAT影响较大。

书中提到,解决上述问题的方式有两种:

  • 改用IPv6,毕竟NAT技术就是为了缓解IPv4池不足的技术。如果IPv6的普及程度达到十分乐观的情况,所有公司或者家庭都可以配置一个全局IP地址,就没必要用NAT技术了。由于书籍出版年份至今已有多年,我查阅了相关资料,就中信网2022年1月29的消息,2021年底,我国的IPv6活跃用户数达到6.08亿,占网民总数的60.11%。就这个情况而言,且不论纯NAT技术还需不需要,NAT-PT仍是一定需要的。

  • 另一种方式就是NAT穿越。简而言之就是内侧的主机,先发送一个虚拟的网络包给外侧的主机,由于NAT路由器其实不知道这个虚拟包是什么,但是还是会读取包首内容,如果内容合理,构造出的转换表也就是合理的,还是可以实现NAT外侧的主机与内侧的主机之间的通信。

    其实这么说还是有些玄妙的感觉,其实就我查资料的感觉,穿越技术详细解释起来还是挺复杂的。目前我们知道有这么项技术,且这种方法和已有的IPv4环境的兼容性非常好。

讲到这里,还是要提一句,就是即使NAT友好的程序确实很方便,但是对于开发者而言却并不友好。随着NAT规范越来越复杂,应用的实现也变得更加耗时。如果在一个开发者未曾构象到的特殊网络环境中应用,或许就会出现无法正常工作、遇到状况难以诊断的问题等。

此前的几篇写完,也就是写完了。从这篇开始我计划对每一小节做个小总结,后续也会逐渐补上此前的几篇笔记的小结。

总结

本节所讲的技术为NAT(Network Address Translator)技术,主要用于私有局域网内IP与全局IP进行通信时所用。

主要分为以下几类:

  • 常规NAT技术:应用于纯IPv4环境下,解决IPv4池IP数量不足的窘境。

  • NAPT(NA Ports T):除了IP之外,多添了端口号的映射,用于传输层的TCP、UDP协议,缘由是应对全局IP不够用的情况下,私有局域网内的多台主机想要与同一个全局IP通信时,如何区分这些主机的情况。

  • NAT-PT:用于IPv4和IPv6进行通信时,具备NAT-PT的路由器会将IPv4和IPv6的包首IP地址进行替换,以实现相互通信的功能。

你可能感兴趣的:(网络,tcp/ip,网络,网络协议)