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

Atr*_*gma 17 networking domain-name-system firewall 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
Run Code Online (Sandbox Code Playgroud)

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

Web server - 192.168.124.30
E-mail server - 192.168.124.32
Run Code Online (Sandbox Code Playgroud)

我知道我需要为example.com域配置 DNS来解析example.com和解析mail.example.com公共 IP 地址。

我希望我的 NAT 防火墙将所有传入请求转发到example.com位于 192.168.124.30 的 Web 服务器,并将所有传入请求转发到mail.example.com位于 192.168.124.32 的电子邮件服务器。我在 NAT 防火墙的配置中看到了“端口转发”功能,但似乎无法实现我正在寻找的功能。

Eva*_*son 19

您在思考信息如何在 TCP/IP 协议栈的层之间流动——特别是在 DNS 和应用层协议之间时,会变得一头雾水。

您有一个公共 IP 地址。您的DNS肯定能同时解决mail.example.com,并example.com以相同的公网IP地址。

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

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

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

这种情况的通用解决方案是拥有更多的公共 IP 地址。因为 IPv4 地址变得稀缺,这也可能是个问题。

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

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

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

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


Mon*_*der 5

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

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