什么是 NAT 协议
我们的计算机要想访问互联网上的信息,就需要一个地址,而且这个地址是大家(其他主机)所认可的,是公共的,这个地址也叫做公有 IP 地址。
与之相对的,除了公有 IP 地址外,还有私有 IP 地址,私有 IP 地址就是我们在私有网络中使用的地址,比如局域网或者公司内部的网络。不知道你没有观察过自己家路由器所分配的 IP 地址,当你登上路由器的网关 192.168.1.1 时,在分配的网络下面一般会看到一些 IP 地址,都是 192.168.1.x ,这种地址就是私有 IP 地址。
这种问题远不用担心,因为我们有一个很靠谱的兄弟 --- NAT(Network Address Translator),当我们的计算机连接到 Internet 的同时,NAT 就会把我们的私有地址直接转换成互联网上的公有 IP 地址,那么下面我们就来了解一下这个协议和它的工作机制。
我们现在就可以给 NAT 协议下一个定义,即 NAT 协议是将在本地网络中使用的私有地址,在连接互联网的同时转换成为公共 IP 地址的技术。实际上,转换的不仅仅只有 IP 地址,还有 TCP 、UDP 端口号,不过这种协议叫做 NAPT 协议。通常情况下,我们所说的 NAT 其实指的就是 NAPT。
NAT 的工作机制
下面我们来聊一下 NAT 具体的工作机制,如下图所示。
图文并茂详解 NAT 协议
私有网络中的客户端 A (IP 192.168.1.6)想向公共网络中的服务器(IP 122.122.122.122)发送数据包,当这个数据包经过 NAT 路由器的时候,就会把它的私有 IP 192.168.1.6 转换为公有的 IP 12.34.56.78,然后这个数据包的源地址就变为 12.34.56.78 ,它经由 Internet 发送给 IP 为 122.122.122.122 的目标服务器。
NAT 路由器其实就是相当于在路由器上安装的 NAT 软件,装有 NAT 软件的路由器就叫做 NAT 路由器。
NAT 路由器不仅可以把私有 IP 转换为公有 IP ,还可以把公有 IP 转换为私有 IP ,这种转换是双向的。
图文并茂详解 NAT 协议
拿上图来说,意思就是服务器 122.122.122.122 发送一个数据包,这个数据包通过 Internet 发送给 NAT 路由器,NAT 路由器把它转换为目标地址是 192.168.1.6 的数据包,然后再发送给客户端 A。
这里有个问题,服务器是发送的数据包,是如何把目标地址的公有 IP 地址转换为私有 IP 地址的呢?
我们上面在引用中说到,NAT 路由器其实就是在路由器上装的 NAT 软件,所以 NAT 路由器它本身就是一台路由器设备,而路由器是有路由表的,路由表中记录一些源地址和目标地址项,数据包根据这些项来进行路由转发。
(我们可以使用 netstat -nr 来显示路由表的信息)
图文并茂详解 NAT 协议
所以,NAT 路由器内部有一张用来记录转换地址的表,也就是一件可以解释的事情了,所以 NAT 路由器在进行地址转换时,会按照其内部的映射关系来进行处理。
资料直通车:最新Linux内核源码资料文档+视频资料https://docs.qq.com/doc/DTmFTc29xUGdNSnZ2
内核学习地址:Linux内核源码/内存调优/文件系统/进程管理/设备驱动/网络协议栈https://ke.qq.com/course/4032547?flowToken=1040236
上面只是一台客户端进行 NAT 转换的情形,但是现实生活中我们私有网络中不可能只有一台客户端进行通信,所以当私有网络中所有的客户端都需要上网,进行 NAT 转换的时候,是不是 NAT 路由器会为每一个客户端生成一个 IP 地址呢?如果全世界范围内的私有网络都这么转换的话,那么公有 IP 地址的数量势必会承受非常大的压力。
针对这种情况,提出了使用 IP 地址和端口号一起转换的方式(NAPT),如下图所示。
图文并茂详解 NAT 协议
这个大致过程和上面 NAT 的转换模式相同,不一样的是,使用 NAPT 会把客户端 A 和客户端 B 的数据包源地址 192.168.1.6:80、192.168.1.7:80 转换为 12.34.56.78:80 和 12.34.56.78:90 ,然后再发送给目标服务器。在转换的过程中,NAT 路由器会生成转换表,通过转换表就可以正确地转换地址和端口的组合,使客户端 A 和客户端 B 与服务器之间进行通信。
转换表是在 NAT 路由器上自动生成的,当 TCP 开始建立连接的时候,就会生成对应的映射,断开连接时,会删除对应的映射。
什么是 NAT - PT
现在互联网情况是一部分 IPv4 的主机和 IPv6 的主机共存的情况,IPv6 作为 IPv4 的替代者,已经越来越多的主机选择升级到了 IPv6 协议,但是罗马不是一日建成的,也不可能全世界范围的计算机都在某几天停机进行升级,这是不现实的,而且很多服务是基于 IPv4 协议建立的,如果升级到 IPv6 不兼容的话,使用 IPv6 的优势也就无从谈起,所以为了解决这个问题,就产生了 NAT-PT 规范。
NAT-PT 是一种将 IPv6 首部转换为 IPv4 首部的一种技术,通过 NAT-PT ,IPv6 的主机能够和 IPv4 主机进行通信,同时某些 IPv4 的服务也能够让 IPv6 的主机使用。
注意这里的 IPv6 只能转换为 IPv4 ,不能反向转换,那么要实现双向通信,该如何做呢?
支持 NAT-PT 的路由器要 DNS-ALG 的支持来实现 IPv4 向 IPv6 的转换。
NAT-PT 机制定义了以下 3 种不同类型的操作:
静态 NAT - PT
静态 NAT - PT 模式主要是一对一映射的。IPv6 网络内的节点要访问的 IPv4 网络内都必须在 NAT-PT 设备中设置。每一个目的 IPv4 地址在 NAT-PT 设备中被映射为一个具有预定义 NAT-PT 前缀的 IPv6 地址。
动态 NAT - PT
动态模式也提供了一对一映射,只不过这种动态模式是有一个 IPv4 地址池的,池中的 IPv4 地址数量决定了并发IPv6 到 IPv4 转换的最大数目。
NAPT - PT
网络地址端口转换--协议转换模式提供多个有 NAT-PT 前缀的 IPv6 地址和一个源 IPv4 地址间的多对一动态映射。
NAT 的潜在问题
聊到现在,我们可以推断出,NAT(NAPT)其实最关键的也是路由器中的转换表,过度依赖转换表会造成下面这些问题
- NAT 无法从外部向内部服务器建立连接。
- 生成转换表存在一定的开销。
- NAT 路由一旦遇到异常情况需要重启,所有的 TCP 连接都会丢失。
- 即使做了灾备,TCP 连接还是会断开。
那么针对这些问题,该如何解决呢?
第一种是直接升级到 IPv6,因为在 IPv6 的环境中可用的 IP 地址的数量有了极大的扩展,现在看来,怎么造都没事儿。还有一种解决办法是一种叫做 NAT 穿越的技术。
NAT 的应用
NAT 主要可以实现以下几个功能:数据包伪装、负载均衡、端口转发和透明代理。
- 数据伪装:可以将内网数据包中的地址信息更改成统一的对外地址信息,不让内网主机直接暴露在因特网上,保证内网主机的安全。同时,该功能也常用来实现共享上网。例如,内网主机访问外网时,为了隐藏内网拓扑结构,使用全局地址替换私有地址。
- 负载均衡:目的地址转换 NAT 可以重定向一些服务器的连接到其他随机选定的服务器。
- 端口转发:当内网主机对外提供服务时,由于使用的是内部私有 IP 地址,外网无法直接访问。因此,需要在网关上进行端口转发,将特定服务的数据包转发给内网主机。
- 透明代理:例如自己架设的服务器空间不足,需要将某些链接指向存在另外一台服务器的空间;或者某台计算机上没有安装 IIS 服务,但是却想让网友访问该台计算机上的内容,这个时候利用 IIS 的 Web 站点重定向即可轻松的帮助我们搞定。
使用 NAT 的意义
NAT(NAPT)实际上是为了解决 IPv4 枯竭而开发的技术,不过,现在随着 IPv6 的开发,在 IPv6 中为了提高网络安全也在使用 NAT,在 IPv4 和 IPv6 的通信中经常使用 NAT-PT。然而在安全机制上 IPv4 也潜在着威胁,在配置和管理上也是一个挑战。如果要从根本上解决 IP 地址资源的问题,IPv6 才是最根本之路。