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

这是关于NAT和DNS的典型问题

我目前正试图build立一个DMZnetworking,其中包含一个networking服务器和一个通过networking地址转换(NAT)防火墙与Internet隔开的电子邮件服务器。

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

WAN - xxxx (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域configurationDNS来parsingexample.commail.example.com到我的公共IP地址。

我希望我的NAT防火墙将所有传入请求转发到example.com到192.168.124.30的web服务器,并将所有到mail.example.com请求mail.example.com到192.168.124.32的电子邮件服务器。 我在NAT防火墙的configuration中看到了一个“端口转发”function,但似乎无法实现我所寻找的function。

在思考如何在TCP / IP协议栈层之间传递信息时,你会感到混淆 – 特别是在DNS和应用层协议之间。

你有一个公共IP地址。 您的DNS可以将mail.example.comexample.comparsing为同一个公共IP地址。

一般情况下,包含对公用IP地址的请求(将由防火墙的外部接口接收)的IP数据报不包含远程客户端试图访问的主机的名称。 您的防火墙不能奇迹般地“知道”远程客户端parsing了哪个主机名,因为这两个主机名parsing为相同的IP地址。 IP层不知道在应用层使用的主机名。

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

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

这种情况的通用解决scheme是拥有更多的公共IP地址。 由于IPv4地址正在变得稀缺,这也可能是有问题的。

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

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

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

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

您的“端口转发”function可以让您将发往80:和443的stream量发送到192.168.124.30,其余端口(或只是您的电子邮件服务器configuration使用的端口)发送到192.168.124.32。 如果由于某种原因,您需要电子邮件服务器以及Web服务器的这两个端口中的任意一个,那么您遇到了麻烦。 为了使这个方法起作用,任何对你的电子邮件服务器的Web访问必须位于不同的(很可能是非标准的)端口上。 您可能还会设置Web服务器来redirect任何说“ mail.example.com ”使用https://mail.example.com : other_port ,而不知道如何附加端口号的用户和/或指定安全连接。 (你将只使用安全的networking连接到邮件服务器,对吧?)

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

如果您的“传入请求”是不同的东西,即Web服务器的Web通信(HTTP)和邮件服务器的邮件通信(SMTP),则确实可以这样做:HTTP使用TCP端口80(443代表HTTPS),而SMTP使用TCP端口25; 因此,从相同的公共IP地址,您可以转发HTTPstream量到您的Web服务器,SMTPstream量到您的邮件服务器; 这就是“端口转发”的意思。 任何体面的防火墙都能做到这一点。

但是,如果偶尔两台服务器需要能够接受相同types的stream量,那么如果您的邮件服务器还托pipe了一个networking邮件服务,那么您有麻烦了,因为您可以转发特定端口(80和/或443)只有一台服务器; 为了根据客户端请求的名称分离networkingstream量,您需要一些比TCP / IP更高级别的操作,例如反向代理。