使用单个公共 IP 地址在 NAT 后面公开多个服务器

使用单个公共 IP 地址在 NAT 后面公开多个服务器

这是一个典型问题关于 NAT 和 DNS

我目前正在尝试建立一个带有 DMZ 的网络,其中包含一个 Web 服务器和一个电子邮件服务器,并通过网络地址转换 (NAT) 防火墙将其与 Internet 隔开。

我已经安装了具有以下接口的 NAT 防火墙:

WAN - x.x.x.x (redacted public IP address)
DMZ - 192.168.124.5/24
LAN - 192.168.123.5/24

在我的 DMZ 上,我有两台主机:

Web server - 192.168.124.30
E-mail server - 192.168.124.32

我知道我需要为example.com域配置 DNS 来解析这两个地址example.com以及mail.example.com我的公共 IP 地址。

我希望我的 NAT 防火墙将所有传入请求转发到example.com192.168.124.30 上的 Web 服务器,并将所有传入请求转发到mail.example.com192.168.124.32 上的电子邮件服务器。我看到 NAT 防火墙配置中有“端口转发”功能,但似乎无法实现我想要的功能。

答案1

您对信息如何在 TCP/IP 协议栈的各层之间(具体来说是在 DNS 和应用层协议之间)流动的思考变得混乱。

您有一个公网 IP 地址。您的 DNS 当然可以将两个 IP 地址解析mail.example.comexample.com同一个公网 IP 地址。

一般而言,包含对您的公共 IP 地址的请求的 IP 数据报(将由防火墙的外部接口接收)不包含远程客户端尝试访问的主机的名称。您的防火墙无法神奇地“知道”远程客户端解析了哪个主机名,因为两个主机名都解析为同一个 IP 地址。IP 层不知道应用层使用的主机名。

TCP 和 UDP 协议使用端口号区分主机提供的特定服务。就您的示例而言,可以使用 NAT 防火墙的端口转发(也称为端口地址转换或 PAT)功能将传入请求发送到 TCP 端口 80 (HTTP) 到 Web 服务器,同时将入站 TCP 端口 25 (SMTP) 发送到您的电子邮件服务器。

但是,如果您计划在两台机器上托管相同的服务,那么这种策略就会出现问题。假设您要在 Web 服务器上托管一个安全网站(供客户访问),并在电子邮件服务器上托管一个安全网站(供网络邮件)。从 NAT 防火墙的公共 IP 地址到 TCP 端口 443(HTTPS)的请求只能路由到一台服务器或另一台服务器。

解决这种情况的通用方法是拥有更多公共 IP 地址。由于 IPv4 地址越来越稀缺,这也可能带来问题。

我们最终解决了公共 IP 地址稀缺的问题一些应用层的协议。例如,HTTP/1.1Host:专门添加了标头,以允许 Web 服务器在同一个公共 IP 地址上托管多个网站。TLS 添加了服务器名称指示(SNI)扩展允许根据远程客户端输入的主机名选择适当的证书。

在应用层中执行此类变通方法意味着每个应用层协议都需要自己的“修复”(然后所有服务器和客户端软件都必须实施该“修复”)。这是一项艰巨的任务。

无需修改应用层协议,某些协议就可以通过能够“路由”请求的软件在多个主机之间轻松“复用”。这可能超出了简单 NAT 防火墙的能力,因为需要在应用层检查数据包。使用像 nginx 这样的反向代理就是这种“多路复用”的一个很好的例子(或Forefront TMG 或 ISA Server 上的 Web 发布规则在 Microsoft 环境中)用于 HTTP 协议。理论上任何协议可以通过反向代理进行多路复用,但协议越深奥,就越有可能谈论编写自定义代码。

当您需要通过一个公共 IP 地址上的两个不同主机提供相同的服务时,您始终可以选择将其中一个主机移至非标准端口。但是,这将要求客户端了解非标准端口。对于 HTTP(S),这会导致 URL 带有符号http://example.com:XXX(其中XXX是非标准端口号)。这是否会在您的情况下造成问题只有您才能决定。(我的经验表明,几乎没有最终用户能够处理:XXX他们必须手动输入的任何 URL 中的端口符号。)

答案2

您的“端口转发”功能可能会让您将发往 :80 和 :443 的流量发送到 192.168.124.30,并将其余端口(或仅您的电子邮件服务器配置为使用的端口)发送到 192.168.124.32。如果出于某种原因,您需要将这两个端口之一用于电子邮件服务器以及 Web 服务器,那么您就有麻烦了。要使此方法有效,任何对您的电子邮件服务器的 Web 访问都必须在另一个(很可能是非标准)端口上进行。您可能还会设置 Web 服务器以将任何显示“ ”的内容重定向到其他端口,以便那些不知道如何附加端口号和/或指定安全连接的用户mail.example.com使用。(您https://mail.example.com:other_port只使用安全的网络连接来连接邮件服务器,对吗?

这是在传输层而不是应用层,这意味着它不必依赖深度数据包检查。相反,它可以在 TCP 报头中查找端口的易于找到的位置。

答案3

如果您的“传入请求”是不同的,即 Web 服务器的 Web 流量 (HTTP) 和邮件服务器的邮件流量 (SMTP),则确实可以做到这一点:HTTP 使用 TCP 端口 80(HTTPS 使用 443),而 SMTP 使用 TCP 端口 25;因此,从同一个公共 IP 地址,您可以将 HTTP 流量转发到您的 Web 服务器,将 SMTP 流量转发到您的邮件服务器;这就是“端口转发”的含义。任何像样的防火墙都可以做到这一点。

但是,如果碰巧这两台服务器需要能够接受相同类型的流量,例如您的邮件服务器还托管网络邮件服务,那么您就会遇到麻烦,因为您只能将特定端口(80 和/或 443)转发到单个服务器;为了根据客户端用于请求的名称分离网络流量,您需要在比 TCP/IP 更高级别运行的东西,例如反向代理。

相关内容