NAT 系列:认识 NAT

一文概览 NAT

NAT(Network Address Translation,网络地址转换)在计算机网络中是一种在 IP 数据包通过路由器或防火墙时重写来源 IP 地址或目的 IP 地址的技术。这种技术被普遍使用在有多台主机但只通过一个公有 IP 地址访问互联网的私有网络中。

NAT 从大类上都可以分为两类:静态 NAT动态 NAT

静态 NAT 是管理员手动创建和维护映射,通常与 NAT 的入站类型相关联。

动态 NAT 是路由器根据需要自动创建和维护映射,通常与 NAT 的出站类型相关联。

每个 TCP/IP 数据包都包含一个 源 IP 地址源端口目的 IP 地址目的端口。所有类型的 NAT 都会使用这些值创建 NAT 映射。

例如,一个 IP 为 192.168.0.1 的内部客户机使用端口 56876,经过 NAT 转变后 IP 变为 3.3.3.3(翻译后的源 IP)和端口 56876(源端口)连接到 IP 2.2.2.2(目的 IP 地址)的 80 端口(目的端口)。NAT 使用原始内部 IP 和端口、翻译后 IP 和端口这 4 个值创建一个映射。当数据包从网站返回到路由器时,使用与该映射相关值,NAT 将数据包转发到内部客户端。

https://fastly.jsdelivr.net/gh/techkoala/techkoala.github.io@master/images/Network/NAT/Full_Cone_NAT.png
全锥型 NAT

全锥型 NAT 是静态 NAT,也是唯一一种永久开放端口的 NAT,允许从 任何外部主机 进行入站连接。全锥型 NAT 将一个公共 IP 地址和端口映射到 LAN IP 和端口。任何外部主机都可以通过映射的 NAT IP 和端口向 LAN IP 发送数据。但是,如果它试图通过不同的端口发送数据,就会失败。这种类型的 NAT 也被称为端口转发。这是受限制最少的 NAT 类型,唯一的要求是连接在一个特定的端口(客户端打开的端口)。

例如,我的电脑有一个网站在 80 端口上运行,我创建了一个一对一的规则,将路由器的 WAN IP 1.1.1.1 映射到 192.168.0.1,端口 80 映射到 80 端口。凡是在 80 端口向 1.1.1.1 发送数据的外部主机都会被 NAT 转发到 192.168.0.1 80 端口。

注意: 端口号不必相同;我可以在 56456 端口上运行我的网站,但创建 NAT 映射,将 80 端口转发到 56456 端口。这样,外部客户端就会认为我的网站在 80 端口上,而在任何其他端口上的连接尝试都会被丢弃。

https://fastly.jsdelivr.net/gh/techkoala/techkoala.github.io@master/images/Network/NAT/Restricted_Cone_NAT.png
受限锥形 NAT

受限锥体 NAT动态 NAT,它的工作方式与全锥型 NAT 相同,但会对进站的 IP 地址施加额外的限制。根据限制,唯一的要求是数据包必须从映射的端口进入,并且来自内部客户端已发送数据包的 IP 地址。亦即需要内部主机首先发起连接的外部主机,才能被接受入站。

例如,我的电脑与一个网站 (56.45.34.78) 进行外向连接,源 IP192.168.0.1,源端口为 56723NAT 使用源端口 56723 创建一个(动态)映射到我的电脑。使用目的端口 56723(这是出站 NAT 的源端口)到达的源 IP56.45.34.78网站 IP)的数据包将被接受,接着网站返回数据至我的 PC。任何其他 IP 即使使用正确的 56723 端口进行连接尝试将被丢弃。同样,即使正确的 IP 使用 56723 以外的目的端口进行的连接尝试也将被丢弃。

https://fastly.jsdelivr.net/gh/techkoala/techkoala.github.io@master/images/Network/NAT/Port_Restricted_Cone_NAT.png
端口受限锥型 NAT

端口受限锥型 NAT动态 NAT,它的作用与受限锥形 NAT 完全相同,但同时对端口进行限制。受限锥形 NAT 接受来自外部主机任何源端口的连接,而端口受限锥型 NAT 则进一步要求外部主机的源端口是固定的。

例如,我的电脑在 80 端口(目标端口)上向网站 IP 217.87.69.8 建立了一个外向连接。NAT 将我的源 IP 192.168.0.1 映射到 WAN IP 1.1.1.1 和源端口 56723。当网站发回数据包时,它的源 IP 必须是 217.87.69.8,目的端口是 56723(就像一个受限锥型 NAT),但除此之外,还要求源端口必须是 80。如果这三者中的任何一个不一样,端口受限锥型 NAT 就会放弃连接。

https://fastly.jsdelivr.net/gh/techkoala/techkoala.github.io@master/images/Network/NAT/Symmetric_NAT.png
对称型 NAT

对称型 NAT动态 NAT,它限制的方式与端口受限锥型 NAT 完全相同,但处理 NAT 转换的方式不同。目前讨论的所有类型的 NATNAT 连接时都 不会改变源端口

例如,当客户端使用 IP 192.168.0.1 和源端口 56723 访问互联网时,NAT 将源 IP 改变为 56.35.67.35,但保持端口号不变,这被称为端口保留。

对称型 NAT 会将端口改为 随机生成的新端口,甚至是同一客户端到不同目的地的连接也会发生。亦即为每个连接创建唯一的映射

例如,在端口受限锥型 NAT 的例子上进行扩展,我的 PC 向网站 IP 217.87.69.856.76.87.98 建立两个出站连接。我的电脑使用源 IP 192.168.0.1 和源端口 56723 进行两个连接。到目前为止,在所有类型的 NAT 上,这两个连接都会被 NAT 化,只改变源 IP 地址而保持源端口不变。然而这次,对称型 NAT 没有将源端口保留为 56723,而是将其中一个连接的源端口改为 45765,另一个连接的源端口改为 53132(随机)。这就为每个连接创建了唯一的映射,来自这些目的地的流量必须通过各自的端口进入。所以 217.87.69.8 必须将数据包发送到目的端口 4576556.76.87.98 必须将数据包发送到端口 53132,此外还需要遵循端口受限锥型 NAT 的要求。

  1. NAT 在一定程度上缓解了 IPv4 地址短缺的问题,让更多的设备(间接)接入了互联网。

  2. NAT 全双工连接支持的缺少在一些情况下可以看作是一个有好处的特征而不是一个限制。在一定程度上,NAT 依赖于本地网络上的一台机器来初始化和路由器另一边的主机的任何连接,它可以阻止外部网络上的主机的恶意活动。这样就可以阻止网络蠕虫病毒来提高本地系统的可靠性,阻挡恶意浏览来提高本地系统的私密性。很多具有 NAT 功能的防火墙都是使用这种功能来提供核心保护的。另外,它也为 UDP 的跨局域网的传输提供了方便。

  1. 在一个具有 NAT 功能的路由器下的主机并没有获得真正的 IP 地址,并且不能参与一些因特网协议,一些需要初始化从外部网络创建的 TCP 连接和无状态协议(比如 UDP)无法实现。除非 NAT 路由器管理者预先设置了规则,否则送来的数据包将不能到达正确的目的地址。

  2. 端对端连接是被 IAB 委员会(Internet Architecture Board)支持的核心因特网协议之一,因此有些人据此认为 NAT 是对公用因特网的一个破坏。一些因特网服务提供商(ISP)只向他们的客户提供本地 IP 地址,所以他们必须通过 NAT 来访问 ISP 网络以外的服务,并且这些公司能不能算的上真正的提供了因特网服务的话题也被谈起。

  3. NAT 使得 IP 协议从面向无连接变成立面向连接。NAT 必须维护专用 IP 地址与公用 IP 地址以及端口号的映射关系。在 TCP/IP 协议体系中,如果一个路由器出现故障,不会影响到 TCP 协议的执行。因为只要几秒收不到应答,发送进程就会进入超时重传处理。而当存在 NAT 时,最初设计的 TCP/IP 协议过程将发生变化,Internet 可能变得非常脆弱。

  4. NAT 违反了基本的网络分层结构模型的设计原则。因为在传统的网络分层结构模型中,第 N 层是不能修改第 N+1 层的报头内容的。NAT 破坏了这种各层独立的原则。

  5. NAT 同时存在对高层协议和安全性的影响问题。RFCNAT 存在的问题进行了讨论。NAT 的反对者认为这种临时性的缓解 IP 地址短缺的方案推迟了 IPv6 迁移的进程,而并没有解决深层次的问题,他们认为是不可取的。