NAT(2)RFC2663 NAT Terminology and Considerations
Author:Once Day Date:2024年12月2日
本文翻译自RFC2663 - IP Network Address Translator (NAT) Terminology and Considerations。
这篇文章总结了NAT转换的基本概念,非常值得参考。
文章目录
1. 概述
1.1 本备忘录的状态
本备忘录为互联网社区提供信息。它不指定任何类型的互联网标准。本备忘录的分发不受限制。
1.2 前言
本文档的目的是澄清与网络地址转换器一起使用的术语。术语“网络地址转换器”在不同上下文中的含义不同。本文档的目的是定义各种 NAT 并标准化所用术语的含义。
列出的作者是本文档的编辑,其内容归功于工作组成员的贡献。文档中的大部分内容“IP 网络地址转换器 (NAT)”几乎按原样提取,以构成本文档的初始基础。
编辑们要感谢作者 Pyda Srisuresh 和 Kjeld Egevang 的贡献。编辑们要感谢 Praveen Akkiraju 在描述 NAT 部署场景方面所做的贡献。编辑们还要感谢 IESG 成员 Scott Bradner、Vern Paxson 和 Thomas Narten 对文档的详细审查以及对文本的澄清。
1.3 引言
网络地址转换是一种将 IP 地址从一个域映射到另一个域的方法,旨在为主机提供透明路由。传统上,NAT 设备用于将具有私有未注册地址的隔离地址域连接到具有全局唯一注册地址的外部域。本文档试图描述 NAT 设备的操作和一般相关注意事项,并定义用于识别各种 NAT 类型的术语。
1.4 简介和概述
当网络的内部 IP 地址无法在网络外部使用时,就会需要进行 IP 地址转换,因为它们在外部使用无效,或者内部寻址必须对外部网络保密。
地址转换允许(在许多情况下,第 8 和 9 节中提到的情况除外)专用网络中的主机透明地与外部网络上的目的地进行通信,反之亦然。
NAT 有多种类型,与之匹配的术语也很多。本文档试图定义所使用的术语并识别各种类型的 NAT。本文档还试图描述适用于一般 NAT 设备的其他注意事项。
但请注意,本文档并非旨在描述单个 NAT 变体的操作或 NAT 设备的适用性。
NAT 设备试图为试图从不同地址域进行通信的终端主机提供透明的路由解决方案。这是通过在路由中修改终端节点地址并维护这些更新的状态来实现的,这样与会话相关的数据报就可以路由到任一领域的正确终端节点。此解决方案仅在应用程序不使用 IP 地址作为协议本身的一部分时才有效。例如,使用 DNS 名称而不是地址来识别端点使应用程序更少地依赖 NAT 选择的实际地址,并避免在 NAT 更改 IP 地址时也需要转换有效负载内容。
NAT 功能本身无法透明地支持所有应用程序,因此通常必须与应用程序级网关 (ALG) 共存。希望部署基于 NAT 的解决方案的人需要首先确定他们的应用程序要求,并评估为其环境提供应用程序透明度所需的 NAT 扩展(即 ALG)。
在实践中,旨在保留 IP 数据包的端点地址的 IPsec 技术对于大多数应用程序来说都不适用于路由中的 NAT。 AH 和 ESP 等技术可保护 IP 报头的内容(包括源地址和目标地址)不被修改。然而,NAT 的基本作用是更改数据包 IP 报头中的地址。
2. 使用的术语和概念
2.1 地址领域或领域
地址域(Address realm)是一个网络域,其中网络地址被唯一地分配给实体,以便可以将数据报路由到这些实体。网络域中使用的路由协议负责根据实体的网络地址查找路由。请注意,本文档仅限于描述 IPv4 环境中的 NAT,并不涉及在其他类型的环境中使用 NAT。(例如 IPv6 环境)
2.2 透明路由
整个文档中使用术语“透明路由(transparent routing)”来标识 NAT 设备提供的路由功能。这与传统路由器设备提供的路由功能不同,因为传统路由器在单个地址域内路由数据包。
透明路由是指在不同的地址域之间路由数据报,方法是修改 IP 标头中的地址内容,使其在数据报路由到的地址域中有效。
2.3 会话流(Session flow)与数据包流(Packet flow)
连接或会话流不同于数据包流。会话流指示会话相对于网络接口发起的方向。数据包流是数据包相对于网络接口传输的方向。以出站 telnet 会话为例。telnet 会话由入站和出站方向的数据包流组成。出站 telnet 数据包携带终端击键,而入站 telnet 数据包携带来自 telnet 服务器的屏幕显示。
为了便于本文档讨论,会话定义为作为转换单元进行管理的一组流量。
TCP/UDP 会话由 (源 IP 地址、源 TCP/UDP 端口、目标 IP 地址、目标 TCP/UDP 端口) 的四元组唯一标识。ICMP 查询会话由 (源 IP 地址、ICMP 查询 ID、目标 IP 地址) 的三元组标识。所有其他会话都由 (源 IP 地址、目标 IP 地址、IP 协议) 的三元组表征。
NAT 执行的地址转换是基于会话的,包括转换属于该会话的传入和传出数据包。会话方向由该会话的第一个数据包的方向标识。请注意,无法保证 NAT 确定的会话概念与应用程序的会话概念一致。应用程序可能会将一组会话(由 NAT 视为)视为单个会话,甚至可能不会将其与对等方的通信视为会话。并非所有应用程序都能保证跨领域(Address realm)工作,即使使用 ALG。
2.4 TU 端口、服务器端口、客户端端口
为便于本文档的提醒,我们将与 IP 地址关联的 TCP/UDP 端口简称为“TU 端口”。
对于大多数 TCP/IP 主机,服务器使用 0-1023 范围的 TU 端口来监听传入连接。尝试发起连接的客户端通常会选择 1024-65535 范围内的源 TU 端口。但是,这种惯例并不通用,也并非总是遵循。一些客户端站使用 0-1023 范围内的源 TU 端口号发起连接,并且有服务器监听 1024-65535 范围内的 TU 端口号。
可在 RFC 1700 [参考文献 2] 中找到已分配 TU 端口服务的列表。
2.5 TCP、UDP 和其他会话的开始
每个 TCP 会话的第一个数据包都会尝试建立会话,并包含连接启动信息。TCP 会话的第一个数据包可以通过 TCP 标志中 SYN 位的存在和 ACK 位的缺失来识别。除第一个数据包外,所有 TCP 数据包都必须设置 ACK 位。
但是,没有确定的方法可以识别基于 UDP 的会话或任何非 TCP 会话的开始。一种启发式方法是假设第一个数据包具有迄今为止不存在的会话参数构成新会话的开始。
2.6 TCP、UDP 和其他会话结束
当会话双方都确认 FIN 或当任一方收到 TCP 标志字段中带有 RST 位的段时,即可检测到 TCP 会话的结束。但是,由于 NAT 设备不可能知道它看到的数据包是否真的会传送到目的地(它们可能会在 NAT 设备和目的地之间丢失),因此 NAT 设备无法安全地假设包含 FIN 或 SYN 的段将是会话的最后一个数据包(即可能会重新传输)。因此,只有在检测到此情况后 4 分钟内,才能假设会话已终止。RFC 793 [参考文献 7] 中描述了延长等待期的必要性,它建议 TIME-WAIT 持续时间为 2 * MSL(最大段生存期)或 4 分钟。
请注意,TCP 连接也有可能在 NAT 设备未察觉的情况下终止(例如,当一个或两个对等方重新启动时)。因此,NAT 设备上需要进行垃圾收集,以清除不再存在的 TCP 会话的未使用状态。但是,一般情况下无法区分长时间空闲的连接和不再存在的连接。对于基于 UDP 的会话,没有单一的方法可以确定会话何时结束,因为基于 UDP 的协议是特定于应用程序的。许多启发式方法可用于终止会话。您可以假设 24 小时未使用的 TCP 会话和几分钟未使用的非 TCP 会话将被终止。通常这种假设有效,但有时无效。这些空闲期会话超时在应用程序之间以及同一应用程序的不同会话之间差异很大。因此,会话超时必须是可配置的。即使如此,也不能保证一定能找到令人满意的值。此外,如第 2.3 节所述,不能保证 NAT 对会话终止的看法与应用程序的看法一致。
处理会话终止的另一种方法是给条目加上时间戳,并尽可能长时间地保留它们,并在必要时退出最长的空闲会话。
2.7 公共/全球/外部网络
全球或公共网络是一个地址域,具有由互联网号码分配机构 (IANA) 或同等地址注册机构分配的唯一网络地址。在 NAT 讨论期间,此网络也称为外部网络。
2.8 私人/本地网络
私有网络是独立于外部网络地址的地址域。私有网络也可以交替称为本地网络。NAT 路由器可实现私有域和外部域中主机之间的透明路由。
RFC 1918提出了有关私有网络地址空间分配的建议。互联网号码分配机构 (IANA) 为私有互联网预留了三个 IP 地址空间块,即 10/8、172.16/12 和 192.168/16。在 CIDR 之前的表示法中,第一个块只是一个 A 类网络号,而第二个块是一组 16 个连续的 B 类网络,第三个块是一组 256 个连续的 C 类网络。
决定使用上述地址空间中的 IP 地址的组织无需与 IANA 或任何其他互联网注册机构(如 APNIC、RIPE 和 ARIN)协调即可使用。因此,地址空间可同时由许多独立组织私下使用。但是,如果这些独立组织后来决定希望相互通信或与公共互联网通信,则它们必须重新编号其网络或在其边界路由器上启用 NAT。
2.9 应用层网关 (ALG)
并非所有应用程序都易于通过 NAT 设备进行转换;尤其是那些在有效载荷中包含 IP 地址和 TCP/UDP 端口的应用程序。应用程序级网关 (ALG) 是特定于应用程序的转换代理,允许一个地址域中的主机上的应用程序透明地连接到不同域中的主机上运行的对应应用程序。ALG 可以与 NAT 交互以设置状态、使用 NAT 状态信息、修改特定于应用程序的有效载荷以及执行使应用程序跨不同地址域运行所需的任何其他操作。
ALG 可能并不总是利用 NAT 状态信息。在某些情况下,它们可能会收集应用程序有效载荷并简单地通知 NAT 添加其他状态信息。ALG 类似于代理,因为 ALG 和代理都促进了客户端和服务器之间的特定于应用程序的通信。代理使用特殊协议与代理客户端通信并将客户端数据中继到服务器,反之亦然。与代理不同,ALG 不使用特殊协议与应用程序客户端进行通信,并且不需要对应用程序客户端进行更改。
3. NAT是什么
网络地址转换是一种将 IP 地址从一个地址域映射到另一个地址域的方法,为终端主机提供透明的路由。地址转换有很多种,适用于不同的应用程序。但是,所有类型的 NAT 设备都应具有以下共同特征。
- 透明地址分配。
- 通过地址转换进行透明路由(这里的路由是指转发数据包,而不是交换路由信息)。
- ICMP 错误数据包负载转换。
下图展示了在存根域边界路由器上启用 NAT 的场景,该路由器通过服务提供商提供的区域路由器连接到互联网。
\ | / . /
+---------------+ WAN . +-----------------+/
|Regional Router|----------------------|Stub Router w/NAT|---
+---------------+ . +-----------------+\
. | \
. | LAN
. ---------------
Stub border
Figure 1: A typical NAT operation scenario
3.1 透明地址分配
NAT 将私有网络中的地址与全局网络中的地址绑定在一起,反之亦然,以便为在地址域之间传输的数据报提供透明路由。在某些情况下,绑定可能会扩展到传输层标识符(例如 TCP/UDP 端口)。地址绑定是在会话开始时完成的。以下小节描述了两种类型的地址分配。
静态地址分配(Static Address assignment):
在静态地址分配的情况下,在 NAT 操作的整个生命周期内,主机的私有网络地址和外部网络地址之间存在一对一的地址映射。静态地址分配可确保 NAT 不必通过会话流来管理地址。
动态地址分配(Dynamic Address assignment):
在这种情况下,外部地址将分配给私有网络主机或反之亦然,具体取决于使用要求和由 NAT 启发式确定的会话流。当使用地址绑定的最后一个会话终止时,NAT 将释放该绑定,以便全局地址可以回收以供以后使用。地址分配的确切性质特定于各个 NAT 实现。
3.2 透明路由
NAT 路由器位于两个地址域之间的边界,并转换 IP 标头中的地址,以便当数据包离开一个域并进入另一个域时,可以正确路由。由于 NAT 设备与多个地址域有连接,因此它们必须小心不要将有关网络的信息(例如,通过路由协议)从一个地址域错误地传播到另一个地址域,这种通告将被视为不可接受。
地址转换分为以下三个阶段。这些阶段共同导致通过 NAT 设备的会话的状态的创建、维护和终止。
3.3 地址绑定
地址绑定是将本地节点 IP 地址与外部地址关联或将外部地址关联起来以进行转换的阶段。地址绑定在静态地址分配中是固定的,在会话启动时在动态地址分配中是动态的。一旦两个地址之间的绑定到位,所有来自或到达此主机的后续会话都将使用相同的绑定进行基于会话的数据包转换。
如果尚未存在这样的地址绑定,则在开始新会话时进行新的地址绑定。一旦本地地址绑定到外部地址,所有来自同一本地地址或指向同一本地地址的后续会话都将使用相同的绑定。
每个新会话的开始都将导致创建一个状态,以促进与会话相关的数据报的转换。
基于单个地址绑定,可以有多个同时来自同一主机的会话。
3.4 地址查找和翻译
一旦为会话建立了状态,属于该会话的所有数据包都将接受地址查找(在某些情况下,也接受传输标识符查找)和转换。
数据报的地址或传输标识符转换将导致数据报从原始地址域转发到目标地址域,并且网络地址得到适当更新。
3.5 地址解除绑定
地址解除绑定是指私有地址不再与全局地址相关联以进行转换的阶段。当 NAT 认为使用地址绑定的最后一个会话已终止时,它将执行地址解除绑定。请参阅第 2.6 节,了解一些处理会话终止的启发式方法。
3.6 ICMP错误数据包转换
所有 ICMP 错误消息(重定向消息类型除外)在通过 NAT 时都需要进行修改。需要 NAT 修改的 ICMP 错误消息类型包括目标不可达、源抑制、超时和参数问题。NAT 不应尝试修改重定向消息类型。
对 ICMP 错误消息的更改将包括对嵌入 ICMP 错误消息有效负载中的原始 IP 数据包(或其部分)的更改。为了使 NAT 对终端主机完全透明,必须修改嵌入 ICMP 数据包有效负载中的 IP 报头的 IP 地址,必须相应地修改相同 IP 报头的校验和字段,以及随附的传输报头。还必须修改 ICMP 报头校验和以反映对有效负载中的 IP 和传输报头所做的更改。
此外,还必须修改正常的 IP 报头。
4. 各种 NAT
存在许多适用于不同应用的地址转换变体。以下小节中列出的 NAT 类型绝不是详尽无遗的,但它们确实捕捉到了大量存在的显著差异。
下图将用作说明 NAT 类型的基本模型。地址为 Addr-A 的 Host-A 位于私有域中,由网络 N-Pri 表示。N-Pri 通过 NAT 路由器与外部网络隔离。地址为 Addr-X 的 Host-X 位于外部域中,由网络 N-Ext 表示。具有两个接口的 NAT 路由器,每个接口都连接到其中一个域,在两个域之间提供透明路由。外部域的接口分配有地址 Addr-Nx,私有域的接口分配有地址 Addr-Np。进一步地,可以理解的是,地址Addr-A和Addr-Np对应于N-Pri网络,而地址Addr-X和Addr-Nx对应于N-Ext网络。
________________
( )
( External ) +--+
( Address Realm )-- |__|
( (N-Ext) ) /____\
(________________) Host-X
| (Addr-X)
|(Addr-Nx)
+--------------+
| |
| NAT router |
| |
+--------------+
|(Addr-Np)
|
----------------
( )
+--+ ( Private )
|__|------( Address Realm )
/____\ ( (N-pri) )
Host-A (________________)
(Addr-A)
Figure 2: A base model to illustrate NAT terms.
4.1 传统 NAT/出口 NAT
在大多数情况下,传统 NAT 允许私有网络内的主机透明地访问外部网络中的主机。
在传统 NAT 中,会话是单向的,从私有网络出站。这与双向 NAT 形成对比,双向 NAT 允许入站和出站方向的会话。有关双向 NAT 的详细说明,请参见第 4.2 节。
以下是传统 NAT 支持的领域的属性的描述。外部网络中主机的 IP 地址在外部和私有网络中都是唯一的和有效的。但是,私有网络中主机的地址仅在私有网络中是唯一的,在外部网络中可能无效。换句话说,NAT 不会将私有网络通告到外部领域。但是,外部领域的网络可以在私有网络内通告。私有网络中使用的地址不得与外部地址重叠。任何给定的地址必须是私有地址或外部地址;不能同时是两者。
图 2 中的传统 NAT 路由器允许 Host-A 发起到 Host-X 的会话,但不允许相反操作。此外,N-Ext 可从 N-Pri 内路由,而 N-Pri 可能无法从 N-Ext 路由。
传统 NAT 主要由使用私有地址并希望允许从其站点发出出站会话的站点使用。
传统 NAT 有两种变体,即基本 NAT 和 NAPT(网络地址端口转换)。这些将在以下小节中讨论。
4.1.1 Basic NAT(基本NAT)
使用基本 NAT,会留出一个外部地址块,用于在私有域中的主机发起到外部域的会话时转换它们的地址。对于从私有网络传出的数据包,将转换源 IP 地址和相关字段,例如 IP、TCP、UDP 和 ICMP 报头校验和。对于入站数据包,将转换目标 IP 地址和上面列出的校验和。
图 2 中的基本 NAT 路由器可以配置为将 N-Pri 转换为从外部网络 N-Ext 中选择的一个外部地址块,例如 Addr-i 到 Addr-n。
4.1.2 网络地址端口转换 (NAPT)
NAPT 通过转换传输标识符(例如 TCP 和 UDP 端口号、ICMP 查询标识符)将转换的概念进一步扩展。这允许将多个私有主机的传输标识符多路复用到单个外部地址的传输标识符中。NAPT 允许一组主机共享一个外部地址。请注意,NAPT 可以与基本 NAT 结合使用,以便将外部地址池与端口转换结合使用。
对于从私有网络传出的数据包,NAPT 将转换源 IP 地址、源传输标识符和相关字段,例如 IP、TCP、UDP 和 ICMP 报头校验和。传输标识符可以是 TCP/UDP 端口或 ICMP 查询 ID 之一。对于入站数据包,将转换目标 IP 地址、目标传输标识符以及 IP 和传输报头校验和。
图 2 中的 NAPT 路由器可以配置为将源自 N-Pri 的会话转换为单个外部地址,例如 Addr-i。
通常,NAPT 路由器的外部接口地址 Addr-Nx 被用作将 N-Pri 映射到的地址。
4.2 双向 NAT(Bi-directional NAT/Two-Way NAT)
使用双向 NAT,可以从公共网络和私有网络中的主机发起会话。私有网络地址在任一方向建立连接时,会以静态或动态方式绑定到全局唯一地址。私有网络和外部网络中的主机之间的名称空间(即其完全合格域名)被认为是端到端唯一的。外部域中的主机通过使用 DNS 进行地址解析来访问私有域主机。必须结合使用 DNS-ALG 和双向 NAT 来促进名称到地址的映射。具体而言,DNS-ALG 必须能够将 DNS 查询和响应中的私有域地址转换为其外部域地址绑定,反之亦然,因为 DNS 数据包在私有域和外部域之间传输。
概述的传统 NAT 路由器的地址空间要求也适用于此。
图 2 中的双向 NAT 路由器将允许主机 A 发起与主机 X 的会话,并允许主机 X 发起与主机 A 的会话。与传统 NAT 一样,N-Ext 可从 N-Pri 内路由,但 N-Pri 可能无法从 N-Ext 路由。
4.3 两次 NAT
两次 NAT 是 NAT 的一种变体,当数据报跨越地址域时,源地址和目标地址都会被 NAT 修改。这与传统 NAT 和双向 NAT 形成对比,在传统 NAT 和双向 NAT 中,只有一个地址(源地址或目标地址)被转换。请注意,没有“一次 NAT”这样的术语。
当私有域和外部域发生地址冲突时,需要使用两次 NAT。发生这种情况的最常见情况是,站点使用已分配给另一个组织的公共地址(错误地)对其内部节点进行编号。
或者,站点可能已从一个提供商更改为另一个提供商,但选择(在内部)保留第一个提供商为其分配的地址。该提供商随后可能会将这些地址重新分配给其他人。在这种情况下,关键问题是外部域中主机的地址可能已被分配与本地站点内主机相同的地址。如果该地址出现在数据包中,它将被转发到内部节点,而不是通过 NAT 设备转发到外部域。在数据包转换域时,两次 NAT 尝试通过转换 IP 数据包的源地址和目标地址来桥接这些域。
两次 NAT 的工作原理如下。当主机 A 希望发起与主机 X 的会话时,它会向主机 X 发出 DNS 查询。DNS-ALG 拦截 DNS 查询,并在返回给主机 A 的响应中,DNS-ALG 将主机 X 的地址替换为本地站点中可正确路由的地址(例如 Host-XPRIME)。然后,主机 A 发起与主机 XPRIME 的通信。当数据包穿过 NAT 设备时,源 IP 地址被转换(与传统 NAT 的情况一样),目标地址被转换为主机 X。来自主机 X 的返回数据包也会执行类似的转换。
以下是两次 NAT 支持的域的属性描述。外部网络中主机的网络地址在外部网络中是唯一的,但在私有网络中不是唯一的。同样,私有网络中主机的网络地址仅在私有网络中是唯一的。换句话说,私有网络中用于定位私有和公共网络中的主机的地址空间与公共网络中用于定位私有和公共网络中的主机的地址空间无关。两次 NAT 不允许将本地网络通告给外部网络,反之亦然。
图 2 中的两次 NAT 路由器允许 Host-A 发起与 Host-X 的会话,允许 Host-X 发起与 Host-A 的会话。
但是,N-Ext(或 N-Ext 的子集)无法从 N-Pri 内路由,N-Pri 也无法从 N-Ext 路由。
当私有网络中使用的地址空间与公共空间中使用的地址重叠时,通常使用两次 NAT。例如,假设一个私有站点使用 200.200.200.0/24 地址空间,而该地址空间已正式分配给公共互联网中的另一个站点。私有空间中的 Host_A (200.200.200.1) 试图连接到公共空间中的 Host_X (200.200.200.100)。为了使此连接正常工作,Host_X 的地址将映射到 Host_A 的不同地址,反之亦然。位于私有站点边界的两次 NAT 可以配置如下:
Private to Public : 200.200.200.0/24 -> 138.76.28.0/24
Public to Private : 200.200.200.0/24 -> 172.16.1.0/24
Datagram flow : Host_A(Private) -> Host_X(Public)
a) Within private network
DA: 172.16.1.100 SA: 200.200.200.1
b) After twice-NAT translation
DA: 200.200.200.100 SA: 138.76.28.1
Datagram flow Host_X (Public) -> Host_A (Private)
a) Within Public network
DA: 138.76.28.1 SA: 200.200.200.100
b) After twice-NAT translation, in private network
SA: 200.200.200.1 DA: 172.16.1.100
4.4 多宿主 NAT
使用 NAT 存在局限性。例如,与会话有关的请求和响应必须通过相同的 NAT 路由器进行路由,因为 NAT 路由器会维护通过它建立的会话的状态信息。因此,通常建议在存根域独有的边界路由器上运行 NAT 路由器,其中所有 IP 数据包要么源自该域,要么发往该域。但是,这样的配置会使 NAT 路由器成为单点故障。
为了使专用网络确保即使其中一个 NAT 链接发生故障也能保持与外部网络的连接,通常希望将专用网络多宿主到相同或多个服务提供商,并与专用域建立多个连接,无论是来自相同还是不同的 NAT 盒。
例如,专用网络可以链接到两个不同的提供商,来自专用主机的会话可以流经具有最佳目标度量的 NAT 路由器。当其中一个 NAT 路由器发生故障时,另一个可以路由所有连接的流量。
多个 NAT 盒或同一 NAT 盒上的多个链路共享相同的 NAT 配置,可以相互提供故障安全备份。
在这种情况下,备份 NAT 设备需要交换状态信息,以便当主 NAT 发生故障时,备份 NAT 可以透明地承担会话负载。当配置基于静态映射时,NAT 备份变得更简单。
5. 领域特定 IP (RSIP)
“特定领域 IP”(RSIP) 用于描述私有领域中领域感知主机的功能,该主机采用特定领域的 IP 地址与私有或外部领域的主机进行通信。
“特定领域 IP 客户端”(RSIP 客户端) 是私有网络中的主机,当连接到外部领域的主机以进行端到端通信时,它会采用该领域的地址。在这种设置中,两端主机生成的数据包将基于外部领域中端到端唯一的地址,不需要通过中间过程进行转换。
“特定领域 IP 服务器”(RSIP 服务器) 是驻留在私有领域和外部领域的节点,可以方便在私有领域内路由外部领域数据包。这些数据包可能由 RSIP 客户端发起,也可能定向到 RSIP 客户端。RSIP 服务器也可能是将外部域地址分配给 RSIP 客户端的同一节点。
RSIP 有两种变体,即域特定地址 IP (RSA-IP) 和域特定地址和端口 IP (RSAP-IP)。以下小节将讨论这些变体。
5.1 Realm Specific Address IP (RSA-IP)
域特定地址 IP (RSA-IP) 客户端在连接到外部领域的主机时,会采用来自外部地址空间的 IP 地址。一旦 RSA-IP 客户端采用外部地址,私有或外部域中的其他主机都不能采用相同的地址,直到 RSA-IP 客户端释放该地址。
以下讨论了私有领域内端到端 RSA-IP 数据包可能采用的路由替代方案。一种方法是将数据包通过隧道传输到目的地。外部报头可以像往常一样由 NAT 转换,而不会影响内部报头中使用的地址。另一种方法是在 RSA-IP 客户端和跨越两个地址领域的边界路由器之间建立双向隧道。往返于客户端的数据包将被隧道传输,但数据包将在边界路由器和远程目的地之间正常转发。请注意,从客户端到边界路由器的隧道可能不是必需的。您可能能够直接转发数据包。只要您的内部网络不根据源地址(在本例中为外部地址)过滤数据包,这种方法就应该有效。
例如,上图 2 中的 Host-A 可以假设来自外部域的地址 Addr-k,并充当 RSA-IP-Client,以允许 Addr-k 和 Addr-X 之间的端到端会话。私有域内端到端数据包的遍历可以说明如下:
第一种方法,使用 NAT 路由器路由来转换:
Host-A NAT router Host-X
------ ----------- ------
<Outer IP header, with
src=Addr-A, Dest=Addr-X>,
embedding
<End-to-end packet, with
src=Addr-k, Dest=Addr-X>
----------------------------->
<Outer IP header, with
src=Addr-k, Dest=Addr-X>,
embedding
<End-to-end packet, with
src=Addr-k, Dest=Addr-X>
--------------------------->
.
.
.
<Outer IP header, with
src=Addr-X, Dest=Addr-k>,
embedding
<End-to-end packet, with
src=Addr-X, Dest=Addr-k>
<---------------------------------
<Outer IP header, with
src=Addr-X, Dest=Addr-A>,
embedding <End-to-end packet,
with src=Addr-X, Dest=Addr-k>
<--------------------------------------
第二种方法,使用私有领域内的隧道:
Host-A NAT router Host-X
------ ----------- ------
<Outer IP header, with
src=Addr-A, Dest=Addr-Np>,
embedding
<End-to-end packet, with
src=Addr-k, Dest=Addr-X>
----------------------------->
<End-to-end packet, with
src=Addr-k, Dest=Addr-X>
------------------------------->
.
.
.
<End-to-end packet, with
src=Addr-X, Dest=Addr-k>
<--------------------------------
<Outer IP header, with
src=Addr-Np, Dest=Addr-A>,
embedding <End-to-end packet,
with src=Addr-X, Dest=Addr-k>
<----------------------------------
可能还有其他方法可以采用。
RSA-IP 客户端具有以下特征。RSA-IP 客户端执行的一组操作可称为“RSA-IP”。
-
了解其对等节点所属的领域。
-
在与该领域中的主机通信时,假定来自外部领域的地址。此类地址可以静态分配,也可以从能够分配来自外部领域的地址的节点动态获取(通过尚未定义的协议)。RSA-IP 服务器可以是协调外部领域地址分配的节点。
-
使用适合RSA-IP-Server 的方法将数据包路由到外部主机。在所有情况下,RSA-IP-Client 可能需要充当隧道端点,能够封装
端到端数据包,同时在返回路径中转发和解封装。
“特定于域的地址 IP 服务器”(RSA-IP 服务器) 是驻留在私有域和外部域上的节点,它有助于将特定于私有域内 RSA-IP 客户端的外部域数据包路由到私有域内。RSA-IP 服务器可能具有以下特征。
-
可以配置为将外部域的地址静态或动态地分配给 RSA-IP 客户端。
-
必须是驻留在私有域和外部地址域上的路由器。
-
必须能够提供一种在私有域内路由外部域数据包的机制。在上述两种方法中,第一种方法要求 RSA-IP 服务器是 NAT 路由器,为外部标头提供透明路由。这种方法要求外部对等体是隧道端点。
使用第二种方法,RSA-IP 服务器可以是任何路由器(包括 NAT 路由器),它可以是 RSA-IP 客户端的隧道端点。它会将端到端数据包从 RSA-IP-Clients 解隧道并转发到外部主机。在返回路径上,它会根据端到端数据包的目标地址定位 RSA-IP-Client 隧道,并将数据包封装在隧道中以转发到 RSA-IP-Client。
RSA-IP-Clients 可以使用任何 IPsec 技术,即使用嵌入式数据包上的 AH 和 ESP 标头进行传输或隧道模式身份验证和机密性。任何隧道技术都可以适用于 RSA-IP-Client 和 RSA-IP-Server 之间或 RSA-IP-Client 和外部主机之间的封装。例如,IPsec 隧道模式封装是一种有效的封装类型,可确保嵌入式端到端数据包的 IPsec 身份验证和机密性。
5.2 领域特定地址和端口 IP (RSAP-IP)
领域特定地址和端口 IP (RSAP-IP) 是 RSIP 的一种变体,其中多个私有主机使用单个外部地址,在传输标识符(即 TCP/UDP 端口号和 ICMP 查询 ID)上进行多路复用。
“RSAP-IP-Client” 的定义可能类似于 RSA-IP-Client,但不同的是,RSAP-IP-Client 在连接到外部域中的主机以进行端到端通信时,会假设一个 (外部地址,传输标识符) 元组。因此,RSAP-IP-Client 与外部节点的通信可能仅限于 TCP、UDP 和 ICMP
会话。
“RSAP-IP-Server” 类似于 RSA-IP-Server,因为它有助于在私有域内路由特定于 RSAP-IP 客户端的外部域数据包。通常,RSAP-IP-Server 也是将传输元组分配给 RSAP-IP-Client 的服务器。
当外部封装基于 TCP/UDP 并在 RSAP-IP-Client 和外部对等端之间寻址时,NAPT 路由器路由可以充当 RSAP-IP-Server。此方法要求外部对等端是基于 TCP/UDP 的隧道的端点。使用这种方法,RSAP-IP-Clients 可以使用任何 IPsec 技术,即使用嵌入数据包上的 AH
和 ESP 标头进行传输或隧道模式身份验证和保密性。但请注意,IPsec 隧道模式不是一种有效的封装类型,因为 NAPT 路由器无法为 AH 和 ESP 协议提供路由透明度。
或者,数据包可以在 RSAP-IP-Client 和RSAP-IP-Server 之间进行隧道传输,这样 RSAP-IP-Server 就可以解除 RSAP-IP-Clients 出站数据包的隧道传输并转发到外部主机。在返回路径上,RSAP-IP-Server 将根据(目标地址、传输标识符)的三元组定位 RSAP-IP-Client 隧道,并将原始数据包封装在隧道内以转发到 RSAP-IP-Client。使用这种方法,RSAP-IP-Client 和 RSAP-IP-Server 之间采用的隧道技术不受限制。但是,在端到端数据包上应用基于 IPsec 的安全性存在局限性。可以实现基于传输模式的身份验证和完整性。但是,无法允许机密性,因为 RSAP-IP 服务器必须能够检查目标传输标识符,以便识别要将入站数据包转发到的 RSAP-IP 隧道。因此,只有受 AH 和 ESP 身份验证保护的传输模式 TCP、UDP 和 ICMP 数据包才能使用此方法遍历 RSAP-IP 服务器。
例如,假设上图 2 中的主机 A 从 NAPT 路由器获取一个 (Addr-Nx、TCP 端口 T-Nx) 元组,以充当 RSAP-IP 客户端,以启动与主机 X 的端到端 TCP 会话。私有领域内端到端数据包的遍历可以说明如下。在第一种方法中,来自 Host-A 的传出数据包的外层使用 (私有地址 Addr-A,源端口 T-Na) 作为源元组与 Host-X 进行通信。NAPT 路由器在路由中将此元组转换为 (Addr-Nx,端口 T-Nxa)。此转换与嵌入数据包中使用的 RSAP-IP-Client 元组参数无关。
第一种方法,使用 NAPT 路由器进行转换:
Host-A NAPT router Host-X
------ ----------- ------
<Outer TCP/UDP packet, with
src=Addr-A, Src Port=T-Na,
Dest=Addr-X>,
embedding
<End-to-end packet, with
src=Addr-Nx, Src Port=T-Nx, Dest=Addr-X>
----------------------------->
<Outer TCP/UDP packet, with
src=Addr-Nx, Src Port=T-Nxa,
Dest=Addr-X>,
embedding
<End-to-end packet, with
src=Addr-Nx, Src Port=T-Nx, Dest=Addr-X>
--------------------------------------->
.
.
.
<Outer TCP/UDP packet with
src=Addr-X, Dest=Addr-Nx,
Dest Port=T-Nxa>,
embedding
<End-to-end packet, with
src=Addr-X, Dest=Addr-Nx,
Dest Port=T-Nx>
<----------------------------------
<Outer TCP/UDP packet, with
src=Addr-X, Dest=Addr-A,
Dest Port=T-Na>,
embedding
<End-to-end packet, with
src=Addr-X, Dest=Addr-Nx,
Dest Port=T-Nx>
<-----------------------------------
第二种方法,使用私有领域内的隧道:
Host-A NAPT router Host-X
------ ----------- ------
<Outer IP header, with
src=Addr-A, Dest=Addr-Np>,
embedding
<End-to-end packet, with
src=Addr-Nx, Src Port=T-Nx,
Dest=Addr-X>
----------------------------->
<End-to-end packet, with
src=Addr-Nx, Src Port=T-Nx,
Dest=Addr-X>
-------------------------------->
.
.
.
<End-to-end packet, with
src=Addr-X, Dest=Addr-Nx,
Dest Port=T-Nx>
<----------------------------------
<Outer IP header, with
src=Addr-Np, Dest=Addr-A>,
embedding
<End-to-end packet, with
src=Addr-X, Dest=Addr-Nx,
Dest Port=T-Nx>
<----------------------------------
6. 专用网络和隧道
让我们考虑一下您的私有网络通过隧道连接到外部世界的情况。在这种情况下,隧道封装的流量可能包含或不包含转换的数据包,具体取决于隧道桥接的地址域的特征。
以下小节讨论了隧道用于(a)地址转换结合使用和(b)不进行地址转换的两种情况。
6.1 隧道转换数据包
上一节讨论的所有地址转换变体都适用于直接连接的链路以及隧道和虚拟专用网络 (VPN)。
例如,通过 VPN 连接到业务合作伙伴的专用网络可以采用传统 NAT 与合作伙伴进行通信。同样,如果合作伙伴的地址空间与专用网络重叠,也可以采用两次 NAT。隧道的一端或两端都可以有 NAT 设备。在所有情况下,都可以出于安全目的对跨 VPN 的流量进行加密。这里的安全性仅指跨 VPN 流量的安全性。端到端安全性需要信任专用网络内的 NAT 设备。
6.2 骨干分区私有网络
在许多情况下,私有网络(例如企业网络)分布在不同位置,并使用公共主干网在这些位置之间进行通信。在这种情况下,进行地址转换是不可取的,因为大量主机可能希望通过主干网进行通信,因此需要大量的地址表,而且会有更多的应用程序依赖于配置的地址,而不是使用名称服务器。我们将这种私有网络称为主干分区私有网络。
主干分区存根的行为应类似于非分区存根。也就是说,所有分区中的路由器都应维护到所有分区的本地地址空间的路由。当然,(公共)主干网不维护到任何本地地址的路由。因此,边界路由器必须使用封装通过主干网建立隧道(使用 VPN)。为此,每个 NAT 盒都将留出一个全局地址用于隧道。
当存根分区 X 中的 NAT 盒 x 希望将数据包传送到存根分区 Y 时,它会将数据包封装在 IP 报头中,并将目标地址设置为已为封装保留的 NAT 盒 y 的全局地址。当 NAT 盒 y 收到具有该目标地址的数据包时,它会解封装 IP 报头并在内部路由数据包。请注意,此过程中没有地址转换;仅通过外部网络隧道主干传输私有网络数据包。
7. NAT 运行特点
NAT 设备不了解应用程序,因为转换仅限于 IP/TCP/UDP/ICMP 标头和 ICMP 错误消息。NAT 设备不会更改数据包的有效负载,因为有效负载往往是特定于应用程序的。
NAT 设备(不包括 ALG)不会检查或修改传输有效负载。因此,NAT 设备在许多情况下对应用程序是透明的。但是,有两个领域 NAT 设备经常会造成困难:1) 当应用程序有效负载包含 IP 地址时,以及 2) 当需要端到端安全性时。
请注意,这不是一个完整的列表。
不使用或依赖 IP 地址的应用层安全技术将在存在 NAT(例如 TLS、SSL 和 ssh)的情况下正常工作。相反,传输层技术(例如 IPSec 传输模式或 TCP MD5 签名选项 RFC 2385)则不会。
在 IPSec 传输模式下,AH 和 ESP 都具有覆盖整个有效负载的完整性检查。当有效负载为 TCP 或 UDP 时,完整性检查将覆盖 TCP/UDP 校验和。当 NAT 设备修改地址时,校验和对于新地址不再有效。通常,NAT 也会更新校验和,但在使用 AH 和 ESP 时,这无效。因此,接收方将丢弃数据包,因为它未通过 IPSec 完整性检查(如果 NAT 设备更新校验和),或者因为校验和无效(如果 NAT 设备保持校验和不变)。
请注意,只要嵌入的数据包内容不受外部 IP 标头转换的影响,IPsec 隧道模式 ESP 就是允许的。虽然此技术在传统 NAT 部署中不起作用(即主机不知道存在 NAT),但该技术适用于领域特定 IP,如第 5.0 节所述。
还要注意,对于 ICMP 等数据包,允许基于端到端 ESP 的传输模式身份验证和机密性,这些数据包的 IP 有效负载内容不受外部 IP 报头转换的影响。
NAT 设备还打破了公钥分发基础设施(如安全 DNS RFC 2535和带有签名公钥的 X.509 证书)的基本假设。对于安全 DNS,每个 DNS RRset 都使用区域内的密钥进行签名。此外,通过遵循一直延伸到 DNS 根的信任链来验证特定密钥的真实性。当 DNS-ALG 修改地址时(例如,在 Twice-NAT 的情况下),签名验证失败。值得注意的是,IKE(会话密钥协商协议)是基于 UDP 的会话层协议,不受基于网络的 IPsec 安全性的保护。IKE 中只有一部分单个有效载荷受到保护。因此,只要 IKE 有效载荷不包含特定于一个领域而不包含另一个领域的地址和/或传输 ID,IKE 会话就可以跨 NAT 进行。鉴于 IKE 用于设置 IPSec 关联,并且目前尚无已知的方法使 IPSec 通过 NAT 功能工作,因此利用 IKE 通过 NAT 盒是未来的工作项目。
最流行的互联网应用程序之一“FTP”无法与所述 NAT 定义配合使用。以下小节专门介绍如何在 NAT 设备上支持 FTP。FTP ALG 是大多数 NAT 实现不可或缺的一部分。一些供应商可能会选择包含其他 ALG 以自定义支持 NAT 设备上的其他应用程序。
7.1 FTP support
FTP 控制会话有效负载中的“PORT”命令和“PASV”响应标识了它所支持的数据会话必须使用的 IP 地址和 TCP 端口。PORT 命令和 PASV 响应的参数是 ASCII 格式的 IP 地址和 TCP 端口。FTP ALG 需要监控和更新 FTP 控制会话有效负载,以便有效负载中包含的信息与终端节点相关。ALG 还必须使用适当的数据会话元组和会话方向更新 NAT,以便 NAT 可以为 FTP 数据会话设置状态信息。
由于地址和 TCP 端口采用 ASCII 编码,因此这可能会导致数据包大小发生变化。例如,10,18,177,42,64,87 是 18 个 ASCII 字符,而 193,45,228,137,64,87 是 20 个 ASCII 字符。如果新大小与之前的大小相同,则只有 TCP 校验和需要根据数据变化进行调整。如果新大小小于或大于之前的大小,则还必须更改 TCP 序列号以反映 FTP 控制数据部分的长度变化。 ALG 可以使用特殊表来更正 TCP 序列号和确认号。 需要对连接的所有未来数据包执行序列号和确认更正。
8. NAT 限制
8.1 具有 IP 地址内容的应用程序
并非所有应用程序都易于通过 NAT 设备进行地址转换。尤其是那些在有效载荷中携带 IP 地址(和 TU 端口,如果是 NAPT)的应用程序。必须使用应用程序级网关或 ALG 对与此类应用程序有关的数据包执行转换。ALG 可以选择利用 NAT 分配的地址(和 TU 端口)并执行特定于应用程序的转换。NAT 功能和 ALG 的组合不会提供 IPsec 保证的端到端安全性。
但是,可以使用 NAT 路由器作为隧道端点来实现隧道模式 IPsec。SNMP 就是这样一种在有效载荷中带有地址内容的应用程序。NAT 路由器不会转换 SNMP 有效载荷内的 IP 地址。SNMP 特定的 ALG 驻留在 NAT 路由器上以执行专用网络专有的 SNMP MIB 转换的情况并不少见。
8.2 具有相互依赖的控制和数据会话的应用程序
NAT 设备假设每个会话都是独立的。会话特征(如会话方向、源和目标 IP 地址、会话协议以及源和目标传输级别标识符)在每个新会话开始时独立确定。
但是,有些应用程序(如 H.323)使用一个或多个控制会话在其控制会话有效负载中设置后续会话的特征。此类应用程序需要使用特定于应用程序的 ALG,以便在必要时解释和转换有效负载。有效负载解释将有助于 NAT 为后续数据会话做好准备。
8.3 调试注意事项
NAT 增加了错误寻址的可能性。例如,相同的本地地址可能在不同时间绑定到不同的全局地址,反之亦然。因此,任何纯粹基于全局地址和 TU 端口的流量研究都可能令人困惑,并可能误解结果。
如果主机以某种方式滥用互联网(例如试图攻击另一台机器,甚至发送大量垃圾邮件等),则更难查明问题的根源,因为主机的 IP 地址隐藏在 NAT 路由器中。
8.4 碎片化的 FTP 控制数据包的转换
当数据包包含“PORT”命令或对“PASV”命令的响应时,对分段的 FTP 控制数据包进行转换非常棘手。
显然,这是一种病态情况。NAT 路由器需要先将片段组装在一起,然后在转发之前进行转换。
另一种情况是,当包含“PORT”命令或对“PASV”的响应的数据包的每个字符都以单独的数据报发送时,不会进行分段。在这种情况下,NAT 只需让数据包通过,而无需转换 TCP 有效负载。当然,如果需要更改有效负载,应用程序将失败。在某些情况下,应用程序仍然可以工作,其中有效负载内容在两个领域中都有效,而无需在途中进行修改。
例如,只要 FTP 控制会话使用 PASV 命令来建立数据会话,来自私有主机的 FTP 在穿越传统 NAT 或双向 NAT 设备时仍然可以工作。原因是 FTP 服务器在 PASV 响应(以多个未分段的数据包发送)中指定的地址和端口号对私有主机有效。NAT 设备将简单地将随后的数据会话(也源自私有主机)视为独立的 TCP 会话。
8.5 计算密集型
即使借助巧妙的校验和调整算法,NAT 仍然是计算密集型的,因为每个数据包都要经过 NAT 查找和修改。因此,路由器转发吞吐量可能会大大降低。但是,只要 NAT 设备的处理能力超过线路处理速率,这应该不是问题。
8.6 安全注意事项
许多人将传统的 NAT 路由器视为单向(会话)流量过滤器,限制从外部主机到其计算机的会话。此外,当 NAT 路由器中的地址分配是动态完成时,攻击者更难指向 NAT 域中的任何特定主机。NAT 路由器可以与防火墙一起使用来过滤不需要的流量。
如果 NAT 设备和 ALG 不在受信任的边界内,那就是一个主要的安全问题,因为 ALG 可以窥探最终用户流量负载。
会话级负载可以端到端加密,只要负载不包含仅在其中一个领域有效的 IP 地址和/或传输标识符。除了 RSIP 之外,当前 IPsec 技术保证的端到端 IP 网络级安全性无法通过中间的 NAT 设备实现。其中一个端点必须是 NAT 盒。有关为什么无法通过沿路由的 NAT 设备保证端到端 IPsec 安全性的讨论,请参阅第 7.0 节。
NAT 功能、ALG 和防火墙的组合将为私有网络域提供透明的工作环境。
除了 RSIP 之外,私有网络内的终端主机无法实现 IPsec 保证的端到端网络安全(有关 RSIP 操作,请参阅第 5.0 节)。在所有其他情况下,如果您想要使用端到端 IPsec,则路径中不能有 NAT 设备。如果我们假设 NAT 设备是可信边界的一部分,则可以使用 NAT 路由器(或 NAT、ALG 和防火墙的组合)作为隧道端点来实现隧道模式 IPsec。
NAT 设备与 ALG 结合使用时,可以确保注入 Internet 的数据报在报头或有效负载中没有私有地址。不满足这些要求的应用程序可能会被防火墙过滤器丢弃。因此,NAT、ALG 和防火墙功能共存以在私有网络边界提供安全性的情况并不少见。 NAT 网关可用作隧道端点,以跨外部网络域提供安全的 VPN 数据包传输。
以下是与 NAT路由器相关的一些其他安全注意事项。
(1)UDP 会话本质上是不安全的。对数据报的响应可能来自与发送方使用的目标地址不同的地址。因此,传入的 UDP 数据包可能仅部分匹配传统 NAT 路由器的出站会话(数据包的目标地址和 UDP 端口号匹配,但源地址和端口号可能不匹配)。在这种情况下,NAT 设备允许部分匹配的入站数据包可能会危及安全。
此 UDP 安全问题也是防火墙所固有的。传统的 NAT 实现不按会话跟踪数据报,而是将使用相同地址绑定的多个 UDP 会话的状态集中到单个统一会话中,这可能会进一步危及安全。这是因为,数据包匹配的粒度将进一步限制为仅入站 UDP 数据包的目标地址。
(2)多播会话(基于 UDP)是传统 NAT 路由器的另一个安全弱点。防火墙再次面临与 NAT 路由器相同的安全困境。假设私有网络上的主机发起了多播会话。私有主机发送的数据报可能会触发来自多个外部主机的反向响应。使用单一状态跟踪多播会话的传统 NAT 实现无法确定传入的 UDP 数据包是对现有多播会话的响应还是由攻击者发起的新 UDP 会话的开始。
(3)NAT 设备可能成为攻击目标。由于 NAT 设备是 Internet 主机,因此它们可能成为多种不同攻击的目标,例如 SYN 洪水和 ping 洪水攻击。NAT 设备应采用与基于 Internet 的服务器相同的保护技术。