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


17

这是关于NAT和DNS 的规范问题

我目前正在尝试使用DMZ建立一个网络,该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防火墙的配置中看到了“端口转发”功能,但似乎无法实现我想要的功能。


3
我编辑了您的问题,以删除对特定技术的引用。这个问题仍然问同样的基本问题,但以技术中立的方式。同样,我的答案也适用于您的原始问题,但是如果其他具有不同防火墙和服务主机情况的人来此寻找答案,也适用。
埃文·安德森

Answers:


18

您在思考信息如何在TCP / IP协议堆栈的各层之间(尤其是在DNS和应用程序层协议之间)流动的过程中陷入了混乱。

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

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

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

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

针对这种情况的通用解决方案是拥有更多的公共IP地址。由于IPv4地址越来越稀缺,因此也可能会出现问题。

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

在应用程序层中执行这种解决方法意味着每个应用程序层协议都将需要其自己的“修补程序”(然后所有服务器和客户端软件都必须实现该“修补程序”)。这是一个很高的要求。

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

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


1
解决方法,而不是“修复”。:)
迈克尔·汉普顿

@MichaelHampton-我听到了!>微笑<
Evan Anderson

@EvanAnderson感谢您的回答。我想我搞砸了,因为我曾经使用过ForeFront,这样的任务对我来说感觉很正常。您是否知道在应用程序层上具有此功能的任何Linux防火墙发行版?我已经看过Shorewall了,但是我不确定它是否能够做到这一点,因为它基于iptables,正如您提到的那样,它位于ip层。
Atrotygma

5

您的“端口转发”功能可以让您将发往: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)使用TCP端口25; 因此,您可以使用相同的公用IP地址将HTTP流量转发到Web服务器,将SMTP流量转发到邮件服务器;这就是“端口转发”的意思。任何体面的防火墙都可以做到这一点。

但是,如果偶然两个服务器都需要能够接受相同类型的通信,例如,如果您的邮件服务器还托管网络邮件服务,那么您就麻烦了,因为您可以转发特定的端口(80和/或443)仅到单个服务器;为了根据客户端用于请求的名称来区分Web流量,您需要某种比TCP / IP更高级别的操作,例如反向代理。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.