“NAT 穿越”是这样一组功能:它允许网络应用程序能明确自己位于 NAT 设备的后面,获得外部 IP 地址,并将端口映射配置为将 NAT 外部端口的数据包转发给应用程序所用的内部端口,而所有这些都是自动完成的,因此用户不必手动配置端口映射或其他类似的方面。
相对与目前所用的、面向特定应用程序的其他方法而言,这对于解决由 NAT 引起的连接问题确实是一种更为全面的解决方案。目前使用的那些专门解决方案有的要求用户具有一定的技术知识,有的要求应用程序开发人员或 Internet 网关提供商进行专门的开发工作,也有的则对二者都要求。
虽然 NAT 穿越可以解决一些 NAT 问题,但它不是万能药,不能解决所有问题。尽管如此,在提高用户满意度、减少用户支持呼叫的次数和支持新的、具有创造性的服务和应用程序方面,这种自动化的 NAT 穿越代表了非常重要的一步,尤其对于家庭网络环境而言。
NAT 穿越应视为一种在需要时使用的处理机制,而非在所有情况下都发挥作用。在 IPv6 中,每个客户机都具有可全局路由的 IP 地址,因此已不再需要 NAT 及 NAT 穿越。就 IPv6 能在多长时间得到普遍部署这一问题,有各种不同的预测。在业界,包括 Microsoft,已投入巨资推进 IPv6,但在现在及未来的几年内,本文后面所述的 NAT 穿越解决方案对于希望解决 NAT 问题的一般用户和小型企业用户而言却意义非凡。
NAT 穿越操作
“NAT 穿越”依赖于作为通用即插即用 (UPnP) 论坛规范组成部分的发现和控制协议。UPnP 论坛有一个工作委员会主要负责定义 Internet 网关设备的控制协议并定义这些设备的服务。
支持 Internet 网关设备控制协议基本元素的 Internet 网关设备可向局域网上的控制点声明自己的存在并发布 XML 描述文档。利用这些 XML 描述文档,控制点就能了解用于确定 Internet 网关是否支持 NAT、获取 NAT 的外部 IP 地址及创建端口映射时需要调用的 UPnP 操作。
Windows 中的“NAT 穿越 API”对直接使用 UPnP 的要求进行了提炼,可提供用于检测、管理和配置 NAT 设备的接口。
NAT 穿越 API
当网络应用程序需要检测是否存在 NAT 设备并调整该设备的行为时,该应用程序可以使用 Windows 中提供的“NAT 穿越 API”(完整记录在 Platform SDK 中) 来实现下列功能:
. |
判断 NAT 是否存在 |
. |
获取 NAT 的外部 IP 地址。 |
. |
获取特定外部端口的静态端口映射信息 (如果已映射)。 |
. |
添加静态端口映射 (除非已分配外部端口)。 |
. |
启用或禁用特定的端口映射而不删除 |
. |
编辑静态端口映射的界面友好描述 |
. |
删除静态端口映射 |
. |
获取局域网静态端口映射的列表。 |
利用这些功能,应用程序可以解决许多因 NAT 而导致的问题。请注意:Windows NAT 穿越 API 目前仅在有限的时间内支持端口映射,否则将称为静态端口映射。
Windows XP 中的 NAT 穿越 API
默认情况下,Windows XP 中将安装 NAT 穿越 API。这些 API 也可安装在运行 Windows Me 和 Windows 98 的计算机中,方法是使用 Windows XP CD 上一个名为“网络安装向导”的工具。为提供附加 XML 解析器支持,“NAT 穿越 API”还要求安装 Internet Explorer 6.0。
Windows 2000 目前不支持“NAT 穿越”。
Internet 网关中支持 NAT 穿越
Internet 网关对 NAT 穿越的支持是通过支持 “通用即插即用论坛” 所定义的 Internet 网关设备 (IGD) 规范而实现的。网关制造商还应注意到:Windows 中的 NAT 穿越 API 对 IGD 进行下列假定:
. |
IGD 每次仅声明一个外部接口。尽管在技术上允许 Internet 网关设备声明多个外部接口,但“NAT 穿越 API”却只使用第一个。 |
. |
IGD 支持允许任何远程 IP 地址将数据包发送给内部客户机的端口映射。 |
. |
IGD 支持具有广播地址 (列为客户机) 的端口映射 |
. |
IGD 支持 NAT 外部端口数与客户机内部端口数不同。 |
. |
IGD 将声明版本号 1。 |
. |
静态端口映射 (或称持续时间设置为无限的端口映射) 将无限期存在。即使是重新启动系统、更改 IP 地址或是服务器上存在客户机,都无法去除静态端口映射。 |
本文写作的过程中,几个业界领先的制造商已经宣布在 2001 年提供支持这些 UPnP 方法并且能与 Windows NAT 穿越 API 协同使用的 Internet 网关设备。对于业界和用户而言,这都是向前迈进的有意义的一步。
随着越来越多的 Internet 网关设备提供商认识到使用 UPnP 解决上述问题所具有的优势,随着更多一般用户和小型企业用户开始意识到与 NAT 有关的问题及这些支持 UPnP 的 NAT 穿越解决方案的强大功能,为 NAT 穿越提供 UPnP 支持有望成为此类设备的必备功能或入市前提。
Internet 网关制造商应加入 UPnP 论坛,了解如何使自己的 Internet 网关设备符合 UPnP 标准。
应说明的是:Windows XP 上的“Internet 连接共享”支持 UPnP IGD 标准 0.9 版。预计版本 1.0 将与版本 0.9 兼容。
应用程序怎样使用 NAT 穿越
应用程序使用“NAT 穿越”的方式与多个因素有关,包括端口映射期望的生存期及端口是否用于多个客户机或服务。应用程序应清除自己创建的所有静态端口映射,以避免出现孤立映射及端口被其他应用程序占尽的情况。
如果应用程序是一种网络服务 (例如 Web 服务器),并在生存期内要求使用已知端口,它的安装程序就可以使用 “NAT 穿越 API” 来配置一个静态端口映射。假定其他应用程序、网络管理员、网络拓扑结构都维持原状,而清除机制也保持映射不变,则外部客户机就能在服务生存期内连接该服务。应用程序卸载服务负责删除这个映射。如果出现崩溃,即使服务已不存在,静态端口映射也仍将存在。如果外部 IP 地址发生变化,则静态端口映射将自动获取更改的内容。
如果应用程序并不始终运行,或者对网络维护其静态端口映射的信任度降低,它就可以在每次启动时保留某个已知端口,并在每次关闭时恢复资源。这一点可通过运行某个并行脚本来实现。作为添加和删除端口映射的替代方案,可以让应用程序根据需要启用和禁用映射。应用程序还可以始终保留静态端口映射,且只在每次启用时刷新映射。
同样,如果外部 IP 地址发生变化,则静态端口映射将自动获取更改的内容。
如果专用网络上不同客户机的多个应用程序使用同一内部端口号,应用程序就会要求进行修改,以支持多个客户机的运行。只有单个客户机能使用外部端口映射的内部端口号。此处建议让第一个客户机使用。其他客户机应请求内部端口数不同于外部端口数的非对称端口映射。
有一种特殊的情况:多个客户机可监听同一外部端口,而唯一的目的是被远程主机发现。输入数据包可以转换为使用内部客户机 IP 地址的广播地址,而非特定的客户机地址。监听该端口的客户机可通过启动自己与远程主机之间的连接而予以回复。建议不要普遍使用这种方案,因为到该地址的输入数据包将被网络上的所有客户机接收,并会反过来对它们造成影响。
如果服务需要短期监听某个随机端口,它应在应用程序中请求一个静态端口映射,而非使用脚本。服务结束时,应予以清除 (删除映射)。应用程序应保留一份自己特有端口映射的记录。这样,如果应用程序在崩溃时没有关闭映射,就可以在下一次启动时检索出清除端口映射所需的必要信息。
如果应用程序离开网络时没有清除其端口映射,则该映射就会保留下来,而清除任务就落在用户的身上。目前 Windows 中尚没有清除机制,这是因为很难判断应用程序不再使用映射的时间。
NAT 穿越的局限
尽管“NAT 穿越”可以解决与通过 NAT 设备进行连接时有关的多种问题,但还有“NAT 穿越”无法解决的问题及由其引起的问题。这些问题包括:
结论 NAT 是得到 IETF 认可的解决方案,针对的是 IPv4 名称空间耗用问题。使用 NAT 的 Internet 网关经常用于家庭和小型企业。之所以使用它们,是因为它们价格便宜,易于管理,无需用户安装特殊的软件。 使用 NAT 的不足在于会破坏许多聊天、多人游戏和对等应用程序。这是因为它们的网络协议对网络体系结构所做的假定已不成立。 “NAT 穿越”为应用程序提供了一条查找 NAT 设备、发现可全局路由的共享 IP 地址并配置静态端口映射以解决某些连接问题的途径。NAT 穿越解决方案无法解决与 NAT 有关的所有问题,但可以缓解部分问题。 本文的主要结论是:
在 IPv6 最终消除 NAT 之前,某些形式的 NAT 穿越仍会继续存在。 |
文章来源于领测软件测试网 https://www.ltesting.net/