原文 https://datatracker.ietf.org/doc/html/rfc2663 IP Network Address Translator (NAT) Terminology and Considerations IP 网络地址转换器 (NAT) 术语和注意事项
本文档背后的动机是明确与网络地址转换器结合使用的术语。术语“网络地址转换器”在不同的上下文中有不同的含义。本文档的目的是定义各种类型的 NAT 并标准化所用术语的含义。
网络地址转换是一种将 IP 地址从一个领域映射到另一个领域的方法,旨在为主机提供透明路由。传统上,NAT 设备用于将具有私有未注册地址的隔离地址域连接到具有全局唯一注册地址的外部域。本文档试图描述 NAT 设备的操作和相关的一般注意事项,并定义用于识别各种类型的 NAT 的术语。
当一个网络的内部 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 头部中的地址。
此处定义了 NAT 上下文中最常用的术语以供参考。
地址域是一个网络域,其中网络地址被唯一分配给实体,以便数据报可以路由到它们。网络域内使用的路由协议负责查找到给定网络地址的实体的路由。请注意,本文档仅限于描述 IPv4 环境中的 NAT,不涉及 NAT 在其他类型环境中的使用。 (例如 IPv6 环境)
整个文档中使用术语“透明路由”来标识 NAT 设备提供的路由功能。这与传统路由器设备提供的路由功能的不同之处在于传统路由器在单个地址域内路由数据包。
透明路由是指在不同的地址域之间路由数据报,方法是修改 IP 报头中的地址内容,使其在数据报路由到的地址域中有效。 3.2 节详细描述了透明路由。
连接或会话流不同于数据包流。会话流指示参考网络接口发起会话的方向。数据包流是数据包相对于网络接口行进的方向。以出站 telnet 会话为例。 telnet 会话由入站和出站方向的数据包流组成。出站 telnet 数据包携带终端按键,入站 telnet 数据包携带来自 telnet 服务器的屏幕显示。
出于本文档中讨论的目的,会话被定义为作为翻译单元进行管理的一组流量。 TCP/UDP 会话由(源 IP 地址、源 TCP/UDP 端口、目标 IP 地址、目标 TCP/UDP 端口)的元组唯一标识。 ICMP 查询会话由(源 IP 地址、ICMP 查询 ID、目标 IP 地址)的元组标识。所有其他会话的特征在于(源 IP 地址、目标 IP 地址、IP 协议)的元组。
NAT 执行的地址转换是基于会话的,包括对属于该会话的传入和传出数据包的转换。会话方向由该会话的第一个数据包的方向标识(参见第 2.5 节)。
请注意,不能保证由 NAT 确定的会话概念与应用程序的会话概念一致。应用程序可能会将一组会话(如 NAT 所见)视为单个会话,甚至可能不会将其与对等方的通信视为会话。并非所有应用程序都能保证跨领域工作,即使使用 ALG(在第 2.9 节中定义)航路也是如此。
对于本文档的提醒,我们将与 IP 地址关联的 TCP/UDP 端口简称为“TU 端口”。
对于大多数 TCP/IP 主机,侦听传入连接的服务器使用 TU 端口范围 0-1023。尝试发起连接的客户端通常选择 1024-65535 范围内的源 TU 端口。然而,这个约定并不普遍,也并不总是被遵守。一些客户端站使用 0-1023 范围内的源 TU 端口号发起连接,并且有服务器侦听 1024-65535 范围内的 TU 端口号。
可以在 RFC 1700 [Ref 2] 中找到分配的 TU 端口服务列表。
每个 TCP 会话的第一个数据包尝试建立会话并包含连接启动信息。 TCP 会话的第一个数据包可以通过 TCP 标志中 SYN 位的存在和 ACK 位的不存在来识别。除第一个数据包外,所有 TCP 数据包都必须设置 ACK 位。
但是,没有确定性的方式来识别基于 UDP 的会话或任何非 TCP 会话的开始。一种启发式方法是假设具有迄今为止不存在的会话参数(如第 2.3 节中所定义)的第一个数据包构成新会话的开始。
当 FIN 被会话的两半确认或当任一半收到 TCP 标志字段中带有 RST 位的段时,检测到 TCP 会话的结束。但是,由于 NAT 设备不可能知道它看到的数据包是否真的会传送到目的地(它们可能会在 NAT 设备和目的地之间被丢弃),因此 NAT 设备无法安全地假设包含 FIN 或SYN 将是会话的最后一个数据包(即,可能会有重传)。因此,可以假定会话仅在此检测之后的 4 分钟时间段后才终止。 RFC 793 [Ref 7] 中描述了对这种延长等待时间的需求,它建议 TIME-WAIT 持续时间为 2 * MSL(最大段寿命)或 4 分钟。
请注意,TCP 连接也有可能在 NAT 设备不知道该事件的情况下终止(例如,在一个或两个对等方重新启动的情况下)。因此,NAT 设备上的垃圾收集是必要的,以清除有关不再存在的 TCP 会话的未使用状态。但是,在一般情况下,无法区分长时间空闲的连接和不再存在的连接。对于基于 UDP 的会话,没有单一的方法可以确定会话何时结束,因为基于 UDP 的协议是特定于应用程序的。
许多启发式方法用于终止会话。您可以假设 24 小时内未使用的 TCP 会话和几分钟内未使用的非 TCP 会话将终止。通常这种假设是有效的,但有时却无效。这些空闲期会话超时因应用程序而异,对于同一应用程序的不同会话也有很大差异。因此,会话超时必须是可配置的。即使如此,也不能保证能找到满意的值。此外,如第 2.3 节所述,不能保证 NAT 对会话终止的看法与应用程序的看法一致。
处理会话终止的另一种方法是为条目添加时间戳并尽可能长时间地保留它们,并在必要时退出最长的空闲会话。
全球或公共网络是一个地址领域,具有由互联网号码分配机构 (IANA) 或等效地址注册机构分配的唯一网络地址。在 NAT 讨论期间,此网络也称为外部网络。
私有网络是独立于外部网络地址的地址域。私有网络也可以称为本地网络。 NAT 路由器促进了私有域和外部域中主机之间的透明路由。
RFC 1918 [Ref 1] 对私有网络的地址空间分配提出了建议。 Internet Assigned Numbers Authority (IANA) 拥有三个 IP 地址空间块,即 10/8、172.16/12 和 192.168/16,为私有 Internet 留出。在 CIDR 之前的表示法中,第一个块只是一个单一的 A 类网络编号,而第二个块是一组 16 个连续的 B 类网络,第三个块是一组 256 个连续的 C 类网络。
决定在上述地址空间中使用 IP 地址的组织无需与 IANA 或任何其他互联网注册管理机构(如 APNIC、RIPE 和 ARIN)协调即可这样做。因此,地址空间可以同时由许多独立组织私下使用。但是,如果这些独立组织后来决定要相互通信或与公共 Internet 通信,则它们要