有关使用网络地址转换器的一些问题
简介
网络地址转换器 (NAT) 允许专用网络上的计算机访问 Internet 资源,而不会被其他计算机从 Internet 上直接对其进行访问。NAT 支持在专用网络上重复使用 IPv4 专用地址空间 (10.0.0.0/8、172.16.0.0/12、192.168.0.0/16),减轻了每个需要访问 Internet 资源的节点都需要一个 IPv4 公用地址的压力。虽然这是使用 NAT 的一个显著优势,但是实现这种能力并不是没有代价的。
最初,Internet 是针对全局唯一的地址空间而设计的。所有连接到 Internet 的接口都拥有一个基于该接口所连接的子网的唯一地址。不管子网在直接连接到 Internet 的专用网络上如何进行分组,总可以通过全局唯一地址对相应的接口进行访问。
同时使用 NAT 和专用地址空间违反了全局唯一地址空间的原则。每个经过 NAT 处理的网络都重复使用专用地址空间。这表示连接到不同网络的多个接口可以拥有相同的地址。虽然无法从 Internet 上看到这些拥有专用地址的网络,,但是它们相互间可能是可见的,而且将多个专用网络组合成单个网络会造成地址冲突(具有相同地址前缀或不明确路由表项的多个子网)。
例如,公司 A 对其内部网络使用 10.0.0.0/8 专用地址空间。公司 B 也使用了 10.0.0.0/8 专用地址空间。当公司 A 和公司 B 合并时,他们之间发生地址冲突的几率会很高。合并后的公司必须对部分已组合的网络进行重新编号,这是一个既费钱又费时的过程。虽然对大多数基于主机的 IP 节点使用动态主机配置协议 (DHCP) 会有所帮助,但是必须手动对静态配置的节点(比如:服务器)进行重新配置,并且必须重新设计路由基础结构。
NAT 操作
如 Windows 2000 网络地址转换器 (NAT) (于 2001 年 3 月发布的 Cable Guy 文章)所介绍的,NAT 的基本操作如下:
• |
对于传出的数据包,NAT 将专用源地址更改为公用源地址,并将源传输控制协议 (TCP) 或用户数据报协议 (UDP) 端口号更改为一个特定于 NAT 的值。对于传入的数据包,NAT 将目标公用地址更改为初始专用地址,并将目标 TCP 或 UDP 端口号更改为其原始值。 |
NAT 上的转换表可使公用和专用地址与 TCP/UDP 端口号间的映射变得更容易。NAT 会丢弃所有不是传输到 NAT 所指派地址(与转换表中的项不匹配)的传入流量。
当位于 NAT 后方的计算机——连接到被 NAT 从 Internet 隔离的子网——对 Internet 上的节点发起通信,NAT 会自动创建适当的转换表项,以便将相应流量转发到发起通信的计算机上。浏览 Web 的 Internet 客户端就是一个例子。客户端计算机所发起的域名系统 (DNS) 超文本传输协议 (HTTP) 流量会自动创建转换表项,有效地允许该客户端计算机访问 Internet 资源,而不必建立到 Internet 的直接连接。因此,经过 NAT 处理的客户端计算机通常可以访问服务器计算机(可在 Internet 上直接对其进行访问),同时不会遇到任何问题。
为了可以从 Internet 访问位于 NAT 之后的服务器计算机,必须通过静态转换表项配置 NAT。具体示例,请参见 访问网络地址转换器 (NAT) 后方的服务时的配置 (于 2003 年 5 月发布的 Cable Guy 文章)
NAT 与安全
由于 NAT 会抛弃所有与转换表项不相匹配的流量,因此被认为是一种安全设备。但是,NAT 并不能替代防火墙。通常,NAT 上会打开两组 TCP 和 UDP 端口:
• |
一组是与已转换的流量(由转换表指定)相对应的端口。其中包括由位于 NAT 之后的客户端打开的动态端口,以及针对位于 NAT 之后的服务器配置的静态端口。 |
• |
另一组是与在 NAT 上运行的应用程序和服务相对应的端口。 |
位于 NAT 之后的服务器的静态端口以及在 NAT 上运行的应用程序和服务的端口使得 NAT 易受攻击。动态端口并不易受攻击,因为攻击者很难预测这类端口将在何时打开。如果 NAT 是一台计算机,而不是一台专用设备(比如:Internet 网关设备),那么此计算机易受攻击。
所以,建议结合防火墙使用 NAT,而且专用网络客户端还应使用基于主机的防火墙来防止恶意软件在专用网络上进行扩散传播。
有关在 NAT 后方使用服务器的一些问题
如本文前面所介绍的,经过 NAT 处理的客户端计算机在访问与 Internet 连接的服务器计算机时,一般不会遇到问题。然而,在下列情况中,当服务器位于 NAT 之后时,就会发生一些问题:
• |
多方应用程序 |
• |
对等应用程序 |
• |
IPSec NAT-T |
多方应用程序
多方应用程序是多台计算机同意通过一台中央服务器为实现特定目的而进行相互通信的应用程序。例如:协同计算应用程序或多方网络游戏。当中央服务器以及部分客户端位于 NAT 之后时,使用专用地址会产生一些配置问题。
例如,有一台协同计算服务器和一些客户端位于相同的 NAT 之后,而又有一些客户端位于 Internet 上。因为在 NAT 之后使用了专用地址空间,又由于服务器位于 NAT 后方,所以必须配置以下项目:
• |
将 NAT 的公用地址和服务器应用程序的端口号映射到服务器的专用地址和服务器应用程序的端口号的静态转换表项。 |
• |
为了让与 Internet 连接的客户端使用自己的 DNS 名称访问服务器,必须对 Internet DNS 添加条目,以便可以将服务器名称解析为 NAT 的公用地址(例如:collabsrv.example.com)。 |
• |
为了让与 Internet 连接的专用客户端使用自己的 DNS 名称访问服务器,必须对专用网络 DNS 添加条目,以便可以将服务器名称解析为服务器的专用地址。 |
如果从客户端计算机发起连接时使用服务器的实际公用或专用地址,那么就不需要 DNS 配置。然而,对于最终用户来说,使用 IPv4 地址连接服务器并不方便,而且必须确保告知 Internet 客户端使用公用地址,并告知位于 NAT 之后的客户端使用专用地址。
即便有了整个配置,位于 NAT 之后的客户端以及与 Internet 连接的客户端在服务器的 IPv4 地址上也无法达成一致。如果协同计算应用程序基于配置、同步或安全目的,必须对服务器使用一个常见的 IPv4 地址,那么仍然会发生通信问题。
对等应用程序
NAT 的另外一个问题是对对等应用程序的影响。在对等通信模型中,对等方既可以充当客户端,也可以充当服务器,并可以通过相互间直接发送数据包进行通信。如果有一方位于 NAT 之后,那么就有两个地址与之相关联:专用地址和公用地址。让我们来看一个简单的配置,NAT 会在其中给对等应用程序带来问题。下图显示了一个在其边缘拥有 NAT 的专用网络。
对于运行于所有对等方的对等应用程序,对等方 1 可以对对等方 2(可直接在其子网上进行访问)和对等方 3 发起会话。但是,对等方 1 无法将对等方 2 的公用地址通知给对等方 3,因为对等方 1 不知道该地址。另外,如果不通过静态转换表项手动配置 NAT 来对对等方 1 或对等方 2 的专用地址和端口转换入站连接请求数据包,对等方 3 就无法对对等方 1 或对等方 2 发起会话。即使通过静态转换表项,对等方 3 也无法对对等方 1 和对等方 2 发起会话,因为这两台主机使用了相同的 IPv4 公用地址和应用程序端口号。
更糟的是,Internet 对等方常常位于两个不同的 NAT 之后。例如,在上图中,对等方 3 也位于 NAT 之后。为了确保对等应用程序在任何采用 NAT 的配置中都可以正常工作,必须修改对等应用程序,使其支持 NAT,从而给应用程序带来额外的复杂性。
IPSec NAT-T
Internet 协议安全 (IPSec) NAT 穿越 (NAT-T) 允许位于 NAT 之后的 IPSec 对等方检测 NAT 是否存在,协商 IPSec 安全关联 (SA),并发送受封装式安全措施负载 (ESP) 保护的数据,即便受 IPSec 保护的 IPv4 数据包中的地址发生了变化。有关 IPSec NAT-T 工作原理的详细信息,请参见 IPSec NAT 穿越概述 (于 2002 年 8 月发布的 Cable Guy 文章)。
Microsoft Windows Server 2003 和 Windows XP Service Pack 2 (SP2) 支持 IPSec NAT-T,而且 Windows XP Service Pack 1 和 Windows 2000 也可以支持 IPSec NAT-T,但必须首先下载一个 免费软件 . 然而,由于 IPSec 和 NAT 的行为,在默认情况下,Windows XP SP2 不再支持对位于 NAT 之后的服务器建立 IPSec NAT-T SA 以避免已知的安全风险。下图展示了一个配置例子。
为了确保服务器 1 在 NAT 后方可供 IPSec 流量访问,必须通过将 Internet 密钥交换 (IKE)(使用 UDP 端口 500)和 IPSec NAT-T(使用 UDP 端口 4500)流量映射到服务器 1 的静态转换项来配置 NAT。
在此配置中,会发生以下情况:
1. |
位于 Internet 上的客户端 1 使用 IPSec NAT-T 与服务器 1 建立双向 SA。由于手动配置了静态转换表项,因此 NAT 会在服务器 1 和客户端 1 间转发 IKE 和 IPSec NAT-T 流量。 |
2. |
客户端 2 使用 IPSec NAT-T 与客户端 1 建立双向 SA。当客户端 2 对客户端 1 发起通信时,NAT 会创建一组动态转换表项,允许在客户端 2 和客户端 1 之间交换 IKE 和 IPSec NAT-T 流量。 |
3. |
如果 NAT 删除了客户端 2 所创建的动态转换表项,并发生了一个情况导致客户端 1 重新与客户端 2 建立 SA,那么就会发生下列情况: 客户端 1 将 IKE 流量发送给 NAT 的公用 IP 地址和 UDP 端口 500。由于该流量将 IKE 流量的静态转换表项与服务器 1 相匹配,NAT 将把 IKE 流量转发到服务器 1,而不是客户端 2。因为客户端 1 正在重新建立 SA,所以它将开始进行 IPSec 主模式协商,并会结束与服务器 1 建立 SA,而不是客户端 2。已知的安全风险是客户端 1 会与无企图的对等方建立双向 SA。 |
虽然这是一种少有的情况,但是运行带有 SP2 的 Windows XP 的计算机的默认行为是避免对位于 NAT 后方的服务器建立任何基于 IPSec NAT-T 的 SA,从而确保永远不会发生这类情况。
如要改变运行带有 SP2 的 Windows XP 的计算机的 IPSec NAT-T 行为,必须创建并设置 AssumeUDPEncapsulationContextOnSendRule 注册表值。但是,这么做之前,应该先咨询一下网络管理员或安全工作人员。
如要添加并配置 AssumeUDPEncapsulationContextOnSendRule 注册表值,请执行以下步骤:
1. |
在 Windows XP 桌面上,单击“ 开始 ”,单击“ 运行 ”,键入“ regedit.exe ”,然后单击“ 确定 ”。 |
||||||
2. |
在“注册表编辑”的控制台树中,打开下列注册表项:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\IPSEC |
||||||
3. |
在“ 编辑 ”菜单上,单击“ 添加值 ,然后添加下列值: 值名:AssumeUDPEncapsulationContextOnSendRule 数据类型:REG_DWORD 数据值:0、1 或 2
|
注意: AssumeUDPEncapsulationContextOnSendRule 名称区分大小写。 |
必须重新启动带有 SP2 的 Windows XP 以便使该设置生效。
将 AssumeUDPEncapsulationContextOnSendRule 设为 1 或 2 使运行带有 SP2 的 Windows XP 的计算机可以连接到位于 NAT 之后的服务器,包括运行 Windows Server 2003 的虚拟专用网络 (VPN) 服务器。
总结
NAT 只是延长 IPv4 公用地址空间使用寿命的权宜之计,而不是该问题的长久解决之道。在对客户端计算机重复使用专用地址空间方面,NAT 能够发挥其最大的作用。多数服务器计算机仍然需要明确的公用地址。对等通信中的对等方可以被放置在 NAT 之后,但是在一般应用中(当有多个对等方位于单个 NAT 之后或被多个 NAT 隔离开来时),必须修改对等应用程序,使之支持 NAT。服务器可以置于 NAT 之后;但是,必须通过静态转换表项手动配置 NAT,以便对服务器的专用地址和端口转换入站连接请求数据包。对于 IPSec NAT-T,此静态转换表项会在特定的配置中导致一些意外的结果。
更多信息
有关 NAT 和 Windows 的更多信息,请咨询以下资源:
• |
对位于网络地址转换器 (NAT) 后方的服务进行访问配置 (于 2003 年 5 月发布的 Cable Guy 文章) |
• |
IPSec NAT 穿越概述 (于 2002 年 8 月发布的 Cable Guy 文章) |
• | |
• |