使用 NAT 和防火墙

网络连接的客户端和服务器通常不具有用于进行通信的直接和开放的路径。 数据包在终结点计算机和网络中的中间计算机上进行筛选、路由、分析和转换。 网络地址转换 (NAT) 和防火墙是可以参与网络通信的中间应用程序的常见示例。

Windows Communication Foundation (WCF) 传输协议和消息交换模式 (MEP) 对于 NAT 和防火墙的存在反应不同。 本主题介绍 NAT 和防火墙在常见网络拓扑中是如何工作的。 本主题提供了有关 WCF 传输协议和 MEP 的特定组合的建议,有助于使应用程序更好地适应网络中的 NAT 和防火墙。

NAT 如何影响通信

创建 NAT 的目的是使数台计算机能够共享单个外部 IP 地址。 端口重新映射 NAT 将连接的内部 IP 地址和端口映射到具有新端口号的外部 IP 地址。 新端口号使 NAT 可以将返回通信与原始通信相互关联。 很多家庭用户现在拥有只能以专用方式路由的 IP 地址,并且依赖于 NAT 来提供数据包的全局路由。

NAT 不提供安全边界。 但是,常见 NAT 配置能够防止内部计算机被直接寻址。 这不仅可以防止内部计算机参与一些不需要的连接,而且增加了编写必须将数据异步发回客户端的服务器应用程序的难度。 NAT 将地址重新写入数据包,以便制造连接源于 NAT 计算机的假象。 这导致服务器在试图打开通往客户端的反向连接时失败。 如果服务器使用觉察到的客户端地址,则会因为该客户端地址无法公开路由而失败。 如果服务器使用 NAT 地址,则会因为没有应用程序正在该计算机上侦听而无法连接。

某些 NAT 支持配置转发规则,以使外部计算机可以连接到特定的内部计算机。 对于不同的 NAT,有关配置转发规则的说明也各异;而且,对于大多数应用程序来说,要求最终用户更改其 NAT 配置都不是值得推荐的做法。 很多最终用户无法或者不希望针对特定应用程序更改他们的 NAT 配置。

防火墙如何影响通信

“防火墙”是一个软件或硬件设备,它对经过的通信应用规则,以决定是允许通过还是拒绝通过。 可以配置防火墙以检查传入和/或传出的通信流。 防火墙在网络边缘或终结点宿主上为网络提供了安全边界。 企业用户传统上将其服务器放在防火墙后面,以防止恶意攻击。 自从在 Windows XP 中引入了个人防火墙以来,位于防火墙后面的家庭用户的数量也已经大大增加。 这样,很可能连接的一端或两端具有检查数据包的防火墙。

防火墙在其复杂性以及检查数据包的能力方面差异极大。 简单防火墙基于数据包中的源和目标地址以及端口应用规则。 智能防火墙还可以检查数据包的内容以便做出决定。 这些防火墙具有很多不同配置,并且通常用于专用应用程序。

家庭用户防火墙的常见配置是禁止传入连接,除非以前与该计算机之间建立过传出连接。 企业用户防火墙的常见配置是在所有端口上禁止传入连接,除非该连接来自专门标识的组。 这方面的一个示例是这样一个防火墙,它在除端口 80 和 443 以外的所有端口上禁止连接,以便提供 HTTP 和 HTTPS 服务。 家庭和企业用户都存在托管防火墙,它允许计算机上受信任的用户或进程更改防火墙配置。 对于没有用于控制网络使用的公司策略的家庭用户而言,托管防火墙更为常见。

使用 Teredo

Teredo 是一种 IPv6 过渡技术,可用来对位于 NAT 后面的计算机进行直接寻址。 Teredo 依靠使用可以公开和全局路由的服务器来公布潜在的连接。 Teredo 服务器为应用程序客户端和服务器提供了一个公用的接头地点,以便它们可以交换连接信息。 然后,这些计算机请求一个临时 Teredo 地址,并且通过现有网络对数据包进行隧道路由。 WCF 中的 Teredo 支持要求在操作系统中启用 IPv6 和 Teredo 支持。 Windows XP 和更高版本的操作系统支持 Teredo。 默认情况下,Windows Vista 和更高版本的操作系统支持 IPv6,只要求用户启用 Teredo。 Windows XP SP2 和 Windows Server 2003 要求用户同时启用 IPv6 和 Teredo。 有关更多信息,请参阅 Teredo 概述

选择传输协议和消息交换模式

选择传输协议和 MEP 的过程分为三步:

  1. 分析终结点计算机的可寻址性。 企业服务器通常具有直接可寻址性,而最终用户通常让 NAT 阻止他们的可寻址性。 如果两个终结点都位于 NAT 后面(例如,最终用户之间的对等方案),那么可能需要使用像 Teredo 这样的技术来提供可寻址性。

  2. 分析终结点计算机的协议和端口限制。 企业服务器通常位于阻止很多端口的强大防火墙后面。 但是,通常开放端口 80 以允许 HTTP 通信,开放端口 443 以允许 HTTPS 通信。 最终用户不太可能具有端口限制,但可能位于只允许传出连接的防火墙后面。 一些防火墙允许由终结点上的应用程序进行管理,以便有选择地开放连接。

  3. 计算网络的可寻址性和端口限制所允许的传输协议和 MEP。

客户端-服务器应用程序的一种常见拓扑是让位于 NAT 后面且没有 Teredo 的客户端位于仅出站防火墙的后面,让可直接寻址的服务器位于强大防火墙后面。 在此方案中,使用双工 MEP 的 TCP 传输协议和使用请求-答复 MEP 的 HTTP 传输协议都能正常工作。 对等应用程序的一种常见拓扑是让两个终结点都位于 NAT 和防火墙的后面。 在此方案以及网络拓扑未知的其他方案中,请考虑下面的建议:

  • 不要使用双向传输协议。 双向传输协议会打开更多连接,从而降低成功连接的可能性。

  • 支持在发起连接上建立反向通道。 使用反向通道(例如,在双工 TCP 中)会打开较少的连接,从而提高成功连接的可能性。

  • 采用可访问的服务来注册终结点或中继通信。 使用可全局访问的连接服务(例如,Teredo 服务器)可以在网络拓扑具有限制性或未知时大大提高成功连接的可能性。

下表分析了 WCF 中的单向、请求-答复和双工 MEP,以及标准 TCP、使用 Teredo 的 TCP、标准和双向 HTTP 传输协议。

可寻址性 服务器直达 使用 NAT 遍历的服务器直达 服务器 NAT 使用 NAT 遍历的服务器 NAT
客户端直达 任何传输协议和 MEP 任何传输协议和 MEP 不支持。 不支持。
使用 NAT 遍历的客户端直达 任何传输协议和 MEP。 任何传输协议和 MEP。 不支持。 使用 Teredo 的 TCP 和任何 MEP。 Windows Vista 具有计算机范围的配置选项以支持使用 Teredo 的 HTTP。
客户端 NAT 任何非双向传输协议和 MEP。 双工 MEP 需要 TCP 传输协议。 任何非双向传输协议和 MEP。 双工 MEP 需要 TCP 传输协议。 不支持。 不支持。
使用 NAT 遍历的客户端 NAT 任何非双向传输协议和 MEP。 双工 MEP 需要 TCP 传输协议。 除双向 HTTP 以外的所有传输协议和任何 MEP。 双工 MEP 需要 TCP 传输协议。 双向 TCP 传输协议需要 Teredo。 Windows Vista 具有计算机范围的配置选项以支持使用 Teredo 的 HTTP。 不支持。 使用 Teredo 的 TCP 和任何 MEP。 Windows Vista 具有计算机范围的配置选项以支持使用 Teredo 的 HTTP。
防火墙限制 服务器开放 使用托管防火墙的服务器 使用仅 HTTP 防火墙的服务器 使用仅出站防火墙的服务器
客户端开放 任何传输协议和 MEP。 任何传输协议和 MEP。 任何 HTTP 传输协议和 MEP。 不支持。
使用托管防火墙的客户端 任何非双向传输协议和 MEP。 双工 MEP 需要 TCP 传输协议。 任何非双向传输协议和 MEP。 双工 MEP 需要 TCP 传输协议。 任何 HTTP 传输协议和 MEP。 不支持。
使用仅 HTTP 防火墙的客户端 任何 HTTP 传输协议和 MEP。 任何 HTTP 传输协议和 MEP。 任何 HTTP 传输协议和 MEP。 不支持。
使用仅出站防火墙的客户端 任何非双向传输协议和 MEP。 双工 MEP 需要 TCP 传输协议。 任何非双向传输协议和 MEP。 双工 MEP 需要 TCP 传输协议。 任何 HTTP 传输协议和任何非双工 MEP。 不支持。