传统 IP 网络地址转换(传统 NAT)

发布时间:2021-08-13 12:22:11 作者:小编阅读:0

[导读]:前言 本文档中描述的 NAT 操作扩展了 RFC 1631 中引入的地址转换,并进入了一种新型网络地址和 TCP/UDP 端口转换。此外,本文档更正了 RFC 1631 中发布的校验和调整算法,并尝试详细讨论 NAT 操作...

前言

本文档中描述的 NAT 操作扩展了 RFC 1631 中引入的地址转换,并进入了一种新型网络地址和 TCP/UDP 端口转换。此外,本文档更正了 RFC 1631 中发布的校验和调整算法,并尝试详细讨论 NAT 操作和限制。

梗概

基本网络地址转换或基本 NAT(Basic Network Address Translation) 是一种将 IP 地址从一个组映射到另一个组的方法,对最终用户透明。网络地址端口转换或 NAPT(Network Address Port Translation) 是一种将许多网络地址及其 TCP/UDP(Transmission Control Protocol,传输控制协议/ User Datagram Protocol,用户数据报协议)端口转换为单个网络地址及其 TCP/UDP 端口的方法。这两个操作一起称为传统 NAT,它提供了一种机制,可将具有私有地址的网络连接到具有全球唯一注册地址的外部网络。

1、 简介

当一个网络的内部 IP 地址由于隐私原因或因为它们在外网不可达而不能在网络外使用时,就需要进行 IP 地址转换。

本地域外的网络拓扑可以通过多种方式改变。客户可能会更换供应商,公司骨干可能会重组,或者供应商可能会合并或分拆。每当外部拓扑随时间变化时,本地域内节点的地址分配也必须更改以反映外部变化。通过将更改集中到单个地址转换路由器,可以对域内的用户隐藏此类更改。

基本地址转换将(在许多情况下,除非在 [NAT-TERM] 和本文档的第 6 节中说明)允许专用网络中的主机透明地访问外部网络并允许从外部访问选择性本地主机。网络设置主要供内部使用,同时也可以满足需要偶尔外部访问的需求。

许多小型办公室、家庭办公室 (Small Office, Home Office,SOHO) 用户和远程办公员工在他们的办公室中有多个网络节点,运行 TCP/UDP 应用程序,但他们的服务提供商为其远程访问路由器分配了一个 IP 地址以访问远程网络。这个不断增加的远程访问用户社区将受益于 NAPT,这将允许本地网络中的多个节点使用分配给其路由器的单个 IP 地址同时访问远程网络。

使用转换的方法存在限制。与会话相关的所有请求和响应必须通过同一 NAT 路由器进行路由。确定这一点的一种方法是让 NAT 基于对边缘区域而言唯一的边界路由器,其中所有 IP 数据包要么源自该域,要么发往该域。还有其他方法可以通过多个 NAT 设备来确保这一点。例如,一个私有域可能有两个不同的出口点到不同的提供者,来自私有网络中主机的会话流可以遍历任何具有外部主机最佳度量的 NAT 设备。当其中一个 NAT 路由器出现故障时,另一个路由器可以为所有连接转发流量。然而,这种方法有一个警告,在切换到新的 NAT 路由器时,重新路由的流可能会失败。克服这个潜在问题的一种方法是路由器共享相同的 NAT 配置并交换状态信息以确保彼此的故障安全备份。

地址转换是独立于应用程序的,通常伴随着应用程序特定网关 (application specific gateways,ALG) 来执行有效负载监控和更改。FTP 是 NAT 设备上最流行的 ALG。需要 ALG 干预的应用程序不得对其有效载荷进行加密,因为这样做会大幅限制 ALG,除非 ALG 具有解密有效载荷的密钥。

这种解决方案的缺点是去掉了IP地址的端到端重要性,并用网络中增加的状态来弥补它。因此,IPSec 保证的端到端 IP 网络级安全不是到带有 NAT 设备路由的终端主机。但是,这种方法的优点是无需更改主机或路由器即可安装。

可以在 [NAT-TERM] 中找到整个文档中使用的诸如“地址域”、“透明路由”、“TU 端口”、“ALG”等术语的定义。

2、 传统NAT概述

本文档中介绍的地址转换操作称为“传统 NAT”。本文档中不会探讨 NAT 的其他变体。在大多数情况下,传统 NAT 将允许私有网络中的主机透明地访问外部网络中的主机。在传统的 NAT 中,会话是单向的,从专用网络出站。使用预选主机的静态地址映射,可以在例外情况下允许相反方向的会话。基本 NAT 和 NAPT 是传统 NAT 的两种变体,因为基本 NAT 中的转换仅限于 IP 地址,而 NAPT 中的转换扩展为包括 IP 地址和传输标识符(例如 TCP/UDP 端口或 ICMP 查询 ID)。

除非另有说明,本文档中的地址转换或 NAT 均属于传统 NAT,即基本 NAT 和 NAPT。只有如下图 1 中描述的末节边界路由器可以配置为执行地址转换。

传统 IP 网络地址转换(传统 NAT)

图 1:传统 NAT 配置

2.1、 基本NAT概述

基本 NAT 的操作如下。通过将一组私有地址动态映射到一组全局有效的网络地址,可以使具有一组私有网络地址的边缘区域能够与外部网络通信。如果本地节点的数量小于或等于全局集合中的地址,则保证每个本地地址都有一个全局地址来映射。否则,允许同时访问外部网络的节点受到全局集合中地址数量的限制。单个本地地址可以静态映射到特定的全局地址,以确保对外部的访问有保障,或者允许从外部主机通过固定的公共地址访问本地主机。可以使用相同的地址映射从本地节点发起多个同时会话。

边缘区域内的地址是该域的本地地址,在域外无效。因此,边缘区域内的地址可以被任何其他边缘区域重用。例如,许多边缘区域可以使用单个 A 类地址。在边缘区域和主干之间的每个出口点,都安装了 NAT。如果有多个出口点,那么每个 NAT 具有相同的转换表就非常重要。

例如,在图 2 的示例中,边缘区域 A 和 B 在内部都使用 A 类私有地址块 10.0.0.0/8 [RFC 1918]。边缘区域 A 的 NAT 被分配了 C 类地址块 198.76.29.0/24,边缘区域 B 的 NAT 被分配了 C 类地址块 198.76.28.0/24。C 类地址是全球唯一的,其他 NAT 设备无法使用它们。

传统 IP 网络地址转换(传统 NAT)

图 2:基本 NAT 操作

当边缘区域 A 主机 10.33.96.5 希望向边缘区域 B 主机 10.81.13.22 发送数据包时,它使用全局唯一地址 198.76.28.4 作为目的地,并将数据包发送到其主路由器。边缘区域路由器有一个静态路由,用于网络 198.76.0.0,因此数据包被转发到 WAN 链路。但是,在转发数据包之前,NAT 会将 IP 报文头的源地址 10.33.96.5 转换为全球唯一的 198.76.29.7。同样,返回路径上的 IP 数据包也经过类似的地址转换。

请注意,这不需要更改主机或路由器。例如,对于边缘区域 A 主机而言,198.76.28.4 是边缘区域 B 中主机使用的地址。在大多数情况下,地址转换对终端主机是透明的。当然,这只是一个简单的例子。有许多问题需要探索。

2.2、 NAPT概述

比如说,一个组织有一个私有 IP 网络和一个到服务提供商的 WAN 链路。专用网络的末节路由器在 WAN 链路上分配了一个全局有效地址,组织中的其余节点具有仅具有本地意义的 IP 地址。在这种情况下,可以允许专用网络上的节点在 NAPT 的帮助下使用单个注册的 IP 地址同时访问外部网络。NAPT 将允许将类型(本地 IP 地址、本地 TU 端口号)的元组映射到类型(注册的 IP 地址、分配的 TU 端口号)的元组。

此模型适合大多数小型办公室家庭办公室 (SOHO) 组使用单个服务提供商分配的 IP 地址访问外部网络的要求。通过为注册 IP 地址的每个服务 TU 端口静态映射本地节点,可以扩展此模型以允许入站访问。

在下面图 3 的示例中,边缘区域 A 在内部使用 A 类地址块 10.0.0.0/8。服务提供商为末节路由器的 WAN 接口分配了一个 IP 地址 138.76.28.4。

传统 IP 网络地址转换(传统 NAT)

图 3:网络地址端口转换 (NAPT) 操作

当边缘区域 A 主机 10.0.0.10 向主机 138.76.29.7 发送 telnet 数据包时,它使用全局唯一地址 138.76.29.7 作为目的地,并将数据包发送到其主路由器。末节路由器有一个静态路由,用于子网 138.76.0.0/16,因此数据包被转发到 WAN 链路。但是,在转发数据包之前,NAPT 会将 IP 和 TCP 报文头中的源地址 10.0.0.10 和源 TCP 端口 3017 的元组转换为全局唯一的 138.76.28.4 和唯一分配的 TCP 端口(例如 1024)。返回路径上的数据包经过类似的地址和 TCP 端口转换,用于目标 IP 地址和目标 TCP 端口。再次注意,这不需要更改主机或路由器。转换是完全透明的。

在此设置中,只允许 TCP/UDP 会话并且必须源自本地网络。但是,有些服务(例如 DNS)需要入站访问。可能存在组织希望允许入站会话访问的其他服务。可以在边缘区域路由器上静态配置众所周知的 TU 端口服务 [RFC 1700],以将其定向到专用网络中的特定节点。

除了 TCP/UDP 会话之外,除了 REDIRECT 消息类型之外,ICMP 消息也可能被 NAPT 路由器监视。ICMP 查询类型报文的转换类似于TCP/UDP 报文,即ICMP 报文头中的标识符字段将唯一映射到注册IP 地址的查询标识符。ICMP 查询消息中的标识符字段由查询发送方设置,并在来自查询响应方的响应消息中原封不动地返回。因此,NAPT路由器将(本地IP地址,本地ICMP查询标识符)的元组映射到(注册的IP地址,分配的ICMP查询标识符)的元组,以唯一标识来自任何本地主机的所有类型的ICMP查询。对 ICMP 错误消息的修改将在后面的部分中讨论,因为这涉及对 ICMP 负载以及 IP 和 ICMP 报文头的修改。

在 NAPT 设置中,注册的 IP 地址与边缘区域路由器 WAN 接口的 IP 地址相同,路由器必须确保区分源自自身的 TCP、UDP 或 ICMP 查询会话与源自节点上的节点的会话。本地网络。假设所有入站会话(包括 TCP、UDP 和 ICMP 查询会话)都被定向到作为端节点的 NAT 路由器,除非目标服务端口静态映射到本地网络中的不同节点。

TCP、UDP 和 ICMP 查询类型以外的会话根本不允许来自本地节点,由 NAPT 路由器提供服务。

3、 会话的转换阶段

传统 NAT 的转换阶段与 [NAT-TERM] 中描述的相同。以下小节确定了特定于传统 NAT 的项目。

3.1、 地址绑定

使用基本 NAT,当从私有主机发起第一个传出会话时,私有地址会绑定到外部地址。在此之后,源自同一私有地址的所有其他传出会话将使用相同的地址绑定进行数据包转换。

在 NAPT 的情况下,其中许多私有地址映射到单个全局唯一地址,绑定将从(私有地址,私有 TU 端口)的元组到(分配的地址,分配的 TU 端口)的元组。与基本 NAT 一样,当第一个传出会话由私有主机上的(私有地址,私有 TU 端口)元组发起时,将确定此绑定。虽然不是常见的做法,但可以让私有主机上的应用程序建立多个并发会话,这些会话源自(私有地址、私有 TU 端口)的同一元组。在这种情况下,(私有地址,私有 TU 端口)的元组的单个绑定可用于转换与源自主机上相同元组的所有会话有关的数据包。

3.2、 地址查找和转换

在建立NAPT情况下的地址绑定或(地址,TU端口)元组绑定之后,可以为使用该绑定的每个连接保持软状态。属于同一会话的数据包将进行会话查找以进行转换。转换的确切性质将在后续部分讨论。

3.3.地址解绑

当基于地址或(地址,TU端口)元组绑定的最后一个会话终止时,绑定本身可能会终止。

4、 数据包转换

与 NAT 管理会话有关的数据包在任一方向进行转换。以下小节详细介绍了各个数据包转换问题。

4.1、 IP、TCP、UDP 和 ICMP 报文头操作

在基本 NAT 模型中,必须修改每个数据包的 IP 头。此修改包括 IP 地址(出站数据包的源 IP 地址和入站数据包的目标 IP 地址)和 IP 校验和。

对于 TCP ([TCP]) 和 UDP ([UDP]) 会话,修改必须包括更新 TCP/UDP 报文头中的校验和。这是因为 TCP/UDP 校验和还包含一个伪报文头,其中包含源 IP 地址和目标 IP 地址。作为例外,不应修改校验和为 0 的 UDP 报文头。对于 ICMP 查询数据包 ([ICMP]),ICMP 报头中不需要进一步更改,因为 ICMP 报头中的校验和不包括 IP 地址。

在 NAPT 模型中,对 IP 头的修改与基本 NAT 的修改类似。对于 TCP/UDP 会话,必须扩展修改以包括 TCP/UDP 报文头中的 TU 端口(出站数据包的源 TU 端口和入站数据包的目标 TU 端口)的转换。ICMP Query 数据包中的ICMP 头也必须修改以替换查询ID 和ICMP 头校验和。私有主机查询 ID 必须在出站时转换为分配的 ID,而在入站时则正好相反。必须更正 ICMP 报文头校验和以考虑查询 ID 转换。

4.2、 校验和调整

NAT 修改是基于每个数据包的,并且可能是计算密集型的,因为除了简单的字段转换之外,它们还涉及一个或多个校验和修改。幸运的是,我们在下面有一个算法,它使对 IP、TCP、UDP 和 ICMP 报文头的校验和调整变得非常简单和高效。由于所有这些报文头都使用一个补码和,因此计算转换前地址和转换后地址之间的算术差异并将其添加到校验和就足够了。下面的算法仅适用于偶数偏移量(即,下面的 optr 必须与头开始的偶数偏移量)和偶数长度(即,下面的 olen 和 nlen 必须是偶数)。示例代码(C语言)如下。

void checksumadjust(unsigned char *chksum, unsigned char *optr, int olen, unsigned char *nptr, int nlen)

 

/* assuming: unsigned char is 8 bits, long is 32 bits.

- chksum points to the chksum in the packet

- optr points to the old data in the packet

- nptr points to the new data in the packet

*/

{

long x, old, new;

x=chksum[0]*256+chksum[1];

x=~x & 0xFFFF;

while (olen)

{

old=optr[0]*256+optr[1]; optr+=2;

x-=old & 0xffff;

if (x<=0) { x--; x&=0xffff; }

olen-=2;

}

while (nlen)

{

new=nptr[0]*256+nptr[1]; nptr+=2;

x+=new & 0xffff;

if (x & 0x10000) { x++; x&=0xffff; }

nlen-=2;

}

x=~x & 0xFFFF;

chksum[0]=x/256; chksum[1]=x & 0xff;

}

4.3、 ICMP 错误包修改

对 ICMP 错误消息 ([ICMP]) 的更改将包括对外层 IP 和 ICMP 报头的更改,以及对嵌入在 ICMP 错误消息有效负载中的数据包报头的更改。

为了使 NAT 对终端主机透明,必须修改嵌入在 ICMP-Error 消息有效载荷中的 IP 报文头的 IP 地址,必须修改嵌入的 IP 报文头的校验和字段,最后,必须修改 ICMP 报文头还必须修改校验和以反映对有效负载的更改。

在 NAPT 设置中,如果嵌入在 ICMP 中的 IP 消息恰好是 TCP、UDP 或 ICMP 查询数据包,您还需要修改 TCP/UDP 报文头中的相应 TU 端口号或 ICMP 查询中的查询标识符字段标题。

最后,还必须修改 ICMP 数据包的 IP 报文头。

4.4、 FTP 支持

最流行的应用程序之一,“FTP”([FTP]) 将需要 ALG 来监视控制会话有效负载以确定随后的数据会话参数。FTP ALG 是大多数 NAT 实现的组成部分。

FTP ALG 将需要一个特殊的表来更正 TCP 序列并使用源端口 FTP 或目标端口 FTP 确认数字。表条目应具有源地址、目标地址、源端口、目标端口、序列号的增量和时间戳。只有在看到 FTP PORT 命令或 PASV 响应时才会创建新条目。对于每个 FTP PORT 命令或 PASV 响应,序列号增量可能会增加或减少。序列号在出站时递增,确认号在入站时按此增量递减。

FTP 有效负载转换仅限于基本 NAT 的专用地址及其分配的外部地址(以 ASCII 加密为单个八位字节)。但是,对于 NAPT 设置,必须将转换扩展为包括地址八位字节之后的 TCP 端口八位字节(以 ASCII 格式)。

4.5、 DNS 支持

考虑到传统 NAT 中的会话主要从私有域出站,DNS ALG 可以避免与传统 NAT 结合使用,如下所示。私有域内部的 DNS 服务器维护内部主机和可能的一些外部主机的名称到 IP 地址的映射。外部 DNS 服务器仅维护外部主机的名称映射,而不维护任何内部主机的名称映射。如果专用网络没有内部 DNS 服务器,则所有 DNS 请求都可能被定向到外部 DNS 服务器以查找外部主机的地址映射。

4.6、 IP 选项处理

具有任何 IP 选项记录路由、严格源路由或松散源路由的 IP 数据报将涉及记录或使用中间路由器的 IP 地址。NAT 中间路由器可以选择不支持这些选项或在处理选项时保留未转换的地址。不转换地址的结果将是源路由上的私有地址端到端公开。这不应该危及数据包的遍历路径本身,因为每个路由器应该只查看下一跳路由器。

5、 其他问题

5.1、 本地和全局地址的分区

为了使 NAT 按照本文档中的描述运行,必须将 IP 地址空间划分为两部分:用于边缘区域内部的私有地址和全局唯一地址。任何给定的地址必须是私有地址或全局地址。没有重叠。

重叠的问题如下。假设边缘区域 A 中的主机希望向边缘区域 B 中的主机发送数据包,但是边缘区域 B 的全局地址与边缘区域 A 的私有地址重叠。在这种情况下,边缘区域 A 中的路由器将无法区分全局地址边缘区域 B 来自其自己的私有地址。

5.2、 私有地址空间推荐

[RFC 1918] 对专用网络的地址空间分配提出了建议。Internet Assigned Numbers Authority (IANA) 拥有三个 IP 地址空间块,即用于私有 Internet 的 10.0.0.0/8、172.16.0.0/12 和 192.168.0.0/16。在 CIDR 之前的表示法中,第一个块只不过是单个 A 类网络编号,而第二个块是一组 16 个连续的 B 类网络,第三个块是一组 256 个连续的 C 类网络。

决定在上述地址空间中使用 IP 地址的组织无需与 IANA 或互联网注册管理机构进行任何协调。因此,许多独立组织可以同时私下使用地址空间,并在其边界路由器上启用 NAT 操作。

5.3、 跨 NAT 路由

运行 NAT 的路由器不应将专用网络通告给主干。在边缘区域之外只能知道具有全局地址的网络。但是,NAT 从末节边界路由器接收到的全局信息可以在末节中以通常的方式进行通告。

通常,NAT 边缘区域路由器将配置静态路由以通过 WAN 链路将所有外部流量转发到服务提供商路由器,而服务提供商路由器将配置静态路由以转发 NAT 数据包(即,目标 IP 地址在NAT 管理的全局地址列表的范围)到 WAN 链路上的 NAT 路由器。

5.4、 从基本 NAT 切换到 NAPT

在基本 NAT 设置中,当私有网络节点的数量超过可用于映射的全局地址时(例如,一个 B 类私有网络映射到一个 C 类全局地址块),在最后一个全局节点之后,外部网络对某些本地节点的访问被突然切断,地址列表中的地址已用完。这是非常不方便的。通过选择允许基本 NAT 路由器切换到地址列表中最后一个全局地址的 NAPT 设置,可以安全地避免此类事件。这样做将确保专用网络上的主机能够持续、不间断地访问大多数应用程序的外部节点和服务。但是,请注意,如果过去使用基本 NAT 的某些应用程序由于切换到 NAPT 而突然中断,这可能会令人困惑。

6、 NAT 限制

[NAT-TERM] 涵盖了广义上所有类型的 NAT 的局限性。以下小节确定了特定于传统 NAT 的限制。

6.1、 隐私和安全

传统 NAT 可以被视为提供了一种隐私机制,因为会话是来自私有主机的单向会话,并且私有主机的实际地址对于外部主机是不可见的。

增强隐私的相同特性可能会使调试问题(包括安全违规)更加困难。如果私有网络中的主机以某种方式滥用 Internet(例如试图攻击另一台机器甚至发送大量垃圾邮件),则更难以跟踪实际问题来源,因为主机的 IP 地址隐藏在一个 NAT 路由器内。

6.2、 对 LAN 接口上 NAT 映射的全局地址的 ARP 响应

NAT 必须仅在边缘区域的边界路由器上启用。文档中提供的用于说明基本 NAT 和 NAPT 的示例维护了一条 WAN 链路,用于从 NAT 路由器连接到外部路由器(即服务提供商路由器)。但是,如果 WAN 链路将被 LAN 链路替换,并且如果用于 NAT 映射的部分或全部全局地址空间与 LAN 段属于同一 IP 子网,则 NAT 路由器将提供 ARP 支持属于同一子网的地址范围。在具有基本 NAT 设置的这种情况下,必须使用自己的 MAC 地址响应对 NAT 映射全局地址的 ARP 请求。如果 NAT 路由器没有响应这些请求,则网络中没有其他节点拥有这些地址的所有权,因此不会响应。

这种情况在 NAPT 设置中不太可能出现,除非 NAPT 映射中使用的单个地址不是 NAT 路由器的接口地址(例如,从基本 NAT 切换到 NAPT 的情况在上面的 5.4 中解释过)。

使用来自直接连接的子网的地址范围进行 NAT 地址映射将避免服务提供商路由器上的静态路由配置。

作者认为连接到服务提供商路由器的 LAN 链路不是很常见。但是,供应商可能有兴趣选择支持代理 ARP 以防万一。

6.3、 NAPT 设置中出站 TCP/UDP 分段数据包的转换

NAPT 设置中出站 TCP/UDP 片段(即源自私有主机的那些)的转换注定要失败。原因如下:只有第一个片段包含 TCP/UDP 报文头,这是将数据包关联到会话以进行转换所必需的。后续分片不包含 TCP/UDP 端口信息,只是携带第一个分片中指定的相同分片标识符。假设,两个私有主机向同一目标主机发送了碎片化的 TCP/UDP 数据包。而且,他们碰巧使用了相同的碎片标识符。当目标主机从同一分配的主机地址接收到两个不相关的数据报时,无法确定该数据报属于两个会话中的哪一个。因此,两个会话都将被破坏。

7、 当前的实现

业内有许多符合本文档中提供的 NAT 描述的商业实现。Linux 公域软件中包含了名称为“IP masquerade”的 NAT。FreeBSD 公共网络软件具有作为守护程序运行的 NAPT 实现。但是请注意,Linux 源代码受 GNU 许可保护,FreeBSD 软件受 UC Berkeley 许可保护。

Linux 和 FreeBSD 软件都是免费的,因此您可以为这些软件购买 CD-ROM,只需支付分发费用即可。它们也可以从许多带有最新补丁的 FTP 站点在线获得。

8、 安全注意事项

[NAT-TERM] 中描述的所有 NAT 变体的安全注意事项适用于传统 NAT。

以上就是传统 IP 网络地址转换(传统 NAT)的介绍。如果你还有其他问题,欢迎进行咨询探讨,希望微云网络的专业的解决方案,可以解决你目前遇到的问题。微云网络提供全球主机托管、服务器租用、mpls专线接入、SD-WAN组网等方面的专业服务,资源覆盖全球。欢迎咨询。

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:shawn.lee@vecloud.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

标题:传统 IP 网络地址转换(传统 NAT)

TAG标签:ip

地址:https://www.kd010.com/hyzs/223.html

上一篇:PON网络架构及数据传输方式
下一篇:SD-WAN,传统路由器可以扔了吗?

Vecloud云网络解决方案

点击获取方案

返回顶部