简介
随着越来越多的家庭和小型企业添置计算机,它们会 发现网络是一种非常强大的计算机资源共享工 具。Internet 连接是网络上较为珍贵的资源之一,有可 能进行共享。为共享 Internet 连接,同时利用价格便 宜、管理简单的家庭或小型办公室网络,需要部署 Internet 网关。Internet 网关通常将 NAT(网络地址转 换)作为将多个主机连接到 Internet 以共享单个公共 IP 地址的途径。但不幸的是,该解决方案却会破坏多 种网络应用程序。我们将在本文中对此加以说明。
NAT Traversal 依赖于提供 UpnP(通用即插即用)支持的 NAT 设备,其定义由 UPnP 论坛的 Internet Gateway Device Working Committee 给出。有关 UPnP 的信息, 可见 UPnP Web 站点。特别详细的资料位于 UPnP 站点中仅限成员访问的部分 内。
支持 UPnP 和 NAT Traversal 是 Internet 网关设备中比较重要的功能,需要加以确 认。对于购买或租用服务提供商 Internet 网关设备的用户,我们强烈建议只考虑使 用那些为 NAT Traversal 提供 UPnP 支持的设备,这是因为该功能对于满足用户、 降低支持费用及使用更有创新性的服务和应用程序而言至关重要。
对于网关设备制造商而言,向 Internet 网关设备添加对 NAT Traversal 的 UPnP 支持 并不复杂,费用不高,也不用花大量的时间。通过使用 UPnP(其基础已经是 Internet 标准和协议),Internet 网关设备制造商就可以解决 NAT Traversal 问题,并 将优点延伸给大多数经过该设备的应用程序。这同许多应用程序开发人员或网关 设备制造商不得不为解决上述问题而提供一次性解决方案形成鲜明的对比。本文 并非旨在为希望在 Internet 网关设备中实施 NAT Traversal 的硬件制造商提供详细 的指南。有关此信息,请参阅 UPnP 论坛 Web 站点。
了解 Windows 体系结构、网络和 UPnP 对于充分理解本文会有所帮助,但并非必 须如此。
什么是 NAT?
“网络地址转换”(NAT) 是一种 Internet Engineering Task Force (IETF) 标准,用于允 许专用网络上的多台 PC 机(使用专用地址范围,例如 10.0.x.x、192.168.x.x、172.x.x.x)共享单个、可全局路由的 IPv4 地址。经常部署 NAT 的一个主要原因就是 IPv4 地址日渐紧缺。Windows XP 和 Windows Me 中 的“Internet 连接共享”及许多 Internet 网关设备都使用 NAT,尤其是在通过 DSL 或电缆调制解调器连接宽带网的情况下。
常规 NAT 操作
NAT 设备后面的客户端通常通过 DHCP(动态主机配置协议)分配到专用的 IP 地 址,或者由管理员进行静态配置。在该专用网络的外面进行通讯时,通常会发生 下列事情。
客户机上
当应用程序想同服务器通讯时,它将打开与源 IP 地址、源端口、目标 IP 地址、 目标端口及网络协议相关联的套接字。这样可以识别通讯所需的两个端点。当应 用程序利用该套接字传输信息时,客户机的专用 IP 地址(源 IP 地址)和端口(源 端口)将被插入数据包的源字段中。数据包的目标字段将包含服务器的 IP 地址 (远程主机 - 目标 IP 地址)和端口。由于该数据包的目的地是该专用网络之外的 某个位置,因此客户机将把该数据包转发给默认的网关。这种情况下的默认网关 就是 NAT 设备。
NAT 设备上的输出数据包
NAT 设备将截获该输出数据包,然后利用目标 IP 地址(服务器)、目标端 口、NAT 设备的外部 IP 地址、外部端口、网络协议及客户机的内部 IP 地址和端 口来创建端口映射。
NAT 设备将维护这些映射组成的表,并将该端口的映射存储在表中。外部 IP 地 址和端口就是该数据通讯用于取代内部客户机 IP 地址和端口的公共 IP 地址和端 口。
NAT 设备随即将来自客户机专用内部 IP 地址和端口的数据包的源字段转换为 NAT 设备的公共 IP 地址和端口,从而对这些数据包进行转换。
然后,数据包将通过外部网络进行发送,并最终到达目标服务器。
图 2:输出数据包转换的示例。
服务器上
当服务器接收到数据包时,它认为自己是在和一台具有可全局路由 IP 地址的计算 机进行通讯。它会利用自己源字段中的 IP 地址和端口将响应数据包定向给 NAT 设备的外部 IP 地址和端口。
NAT 设备上的输入数据包
NAT 从服务器那接收到这些数据包,然后将数据包与其端口映射表进行比较。如 果 NAT 发现某个端口映射的远程主机 IP 地址、远程端口、外部端口及网络协议 与输入数据包的源 IP 地址、源端口、目标端口和网络协议匹配,NAT 就会进行 反向转换。NAT 将把数据包目标字段中的外部 IP 地址和外部端口替换为客户机 的专用 IP 地址和内部端口。
手动配置该映射的过程通常比较复杂,要求较有经验的用户才能正确进行映射的 配置。因此,除非是联系自己宽带 Internet 服务提供商、PC 制造商、零售商或 Internet 网关制造商的客户服务中心以尝试找到问题的根源及解决方案,否则许多 一般用户或小型企业用户将无法使用所需的应用程序或服务。上述情况还会造成 映射的不严格:许多外部客户机都可以使用该映射来连接服务器。
嵌入地址或端口
有些网络应用程序假定客户机所分配的 IP 地址和端口将始终可进行全局路由,并 可直接在 Internet 上使用。许多情况下,它们属于 IETF 保留地址范围内的专用 IP 地址。应用程序会在发送给服务器的数据包的负载中包含该专用 IP 地址或端口。 服务器可以将该嵌入地址用作联系客户机时所用的地址。
如果服务器试图用嵌入 IP 地址和端口进行回复,而非 NAT 提供的映射地址和端 口,系统就会丢弃该数据包。这是因为嵌入 IP 地址是无法路由的。如果网络应用 程序能找到 NAT 设备并检索到所要使用的外部 IP 地址和外部端口映射,应用程 序就可以在数据包中嵌入正确的信息。
使用分散套接字的应用程序
还有一些网络应用程序使用端口 X 上的套接字向服务器或对等计算机发送通讯信 息,然后等待将服务器的通讯信息接收到端口 Y 的独立监听套接字上。NAT 将监 视输出通讯并为端口 X 创建端口映射,但并不对寻址到端口 Y 的返回数据包进行 端口映射。寻址到端口 Y 的输入数据包将被丢弃。
需要端口可用
有些网络协议假定始终有可全局路由的已知端口可用。当多个客户机共享 IP 地址 时,每次将只有一个客户机能使用已知的端口。例如,每次只有一个 Web 服务能 使用本地网络上的端口 80。如果不是这样,NAT 设备将无法确定外部请求所适用 的客户机。即使在配置端口映射的用户的帮助下,如果从本地网络的外部能找到 多个客户机,也必须采取某些特殊的措施。
NAT Traversal 操作
NAT Traversal 依赖于作为通用即插即用 (UPnP) 论坛规范组成部分的 Discovery and Control 协议。UPnP 论坛有一个工作委员会主要负责定义 Internet 网关设备的控制 协议并定义这些设备的服务。
支持 Internet 网关设备控制协议基本元素的 Internet 网关设备可向局域网上的控制 点声明自己的存在并发布 XML 描述文档。利用这些 XML 描述文档,控制点就能 了解用于确定 Internet 网关是否支持 NAT、获取 NAT 的外部 IP 地址及创建端口映 射时需要调用的 UPnP 操作。
Windows 中的 NAT Traversal API 对直接使用 UPnP 的要求进行了提炼,可提供用 于检测、管理和配置 NAT 设备的接口。
NAT Traversal API
当网络应用程序需要检测是否存在 NAT 设备并调整该设备的行为时,该应用程序 可以使用 Windows 中提供的 NAT Traversal API(完整记录在 Platform SDK 中)来实 现下列功能:
利用这些功能,应用程序可以解决许多因 NAT 而导致的问题。注意:Windows NAT Traversal API 目前仅在有限的时间内支持端口映射,否则将称为静态端口映 射。
Windows XP 中的 NAT Traversal API
默认情况下,Windows XP 中将安装 NAT Traversal API。这些 API 也可安装在运行 Windows Me 和 Windows 98 的计算机中,方法是使用 Windows XP CD 上一个名 为“网络安装向导”的工具。为提供附加 XML 分析程序支持,NAT Traversal API 还要求安装 Internet Explorer 6.0。
Windows 2000 中当前不支持 NAT Traversal。
Internet 网关中支持 NAT Traversal
Internet 网关对 NAT Traversal 的支持是通过支持“通用即插即用论坛”Internet Gateway Working Committee 所定义的 Internet 网关设备 (IGD) 规范而实现的。网关 制造商还应注意到:Windows 中的 NAT Traversal API 对 IGD 进行下列假定:
IGD 每次仅声明一个外部接口。尽管在技术上允许 Internet 网关设备声明多个外部接口,但 NAT Traversal API 却只使用第一个。
IGD 支持允许任何远程 IP 地址将数据包发送给内部客户机的端口映射。
IGD 支持具有广播地址(列为客户机)的端口映射
IGD 支持 NAT 外部端口数与客户机内部端口数不同。
IGD 将声明版本号 1。
静态端口映射(或称持续时间设置为无限的端口映射)将无限期存在。即使是重新启动系统、更改 IP 地 址或是服务器上存在客户机,都无法去除静态端口映射。
本文写作的过程中,几个业界领先的制造商已经宣布在 2001 年提供支持这些 UPnP 方法且能与 Windows NAT Traversal API 协同使用的 Internet 网关设备。这对 于行业和用户都是非常重要的一步。
如果应用程序是一种网络服务(例如 Web 服务器),并在生存期内要求使用已知 端口,它的安装程序就可以使用 NAT Traversal API 来配置一个静态端口映射。假 定其它应用程序、网络管理员、网络拓扑结构都维持原状,而清除机制也保持映 射不变,则外部客户机就能在服务生存期内连接该服务。应用程序的卸载服务将 负责删除该映射。如果出现崩溃,即使服务已不存在,静态端口映射也仍将存 在。如果外部 IP 地址发生变化,则静态端口映射将自动获取更改的内容。