如何将 FQDN 转发至虚拟机?

如何将 FQDN 转发至虚拟机?

是否可以将 2 个域名指向在 Ubuntu Server 下运行的两个不同虚拟机?我的困境是我只有 1 个面向公众的 IP 地址。

以下是我想要实现的目标的图表:

                /---FQDN1--->VM1
External IP ----
                \---FQDN2--->VM2

我意识到这可能存在一些缺陷,例如让应用程序绑定到不同的端口以避免冲突。

阅读网上资料后,这可能可以通过 iptables、bind 和/或 squid 代理实现。

答案1

首先,不可能根据客户端访问的域将 IP 或传输层的端口转发到不同的内部机器。因此,您要做的事情必须在网络堆栈的更高级别上完成。但您可能已经读过这篇文章,因为您问的是代理。

沿着网络堆栈向上一层,你会发现各种不同的协议。有些协议很容易根据主机名进行代理,有些则不可能。我只知道四种协议可以通过这种方式进行代理。从最简单到最难,它们是:

  • HTTP
  • HTTPS
  • DNS
  • 邮件传输协议

标准 HTTP 代理可以为您处理 HTTP 协议。它适用于任何发送主机标头的客户端。此标头在 HTTP/1.0 中是可选的,在 HTTP/1.1 中是必需的。到目前为止,HTTP/1.1 已有十多年的历史,您可以预期现在几乎所有客户端都支持它。

HTTPS 有点棘手。它只适用于支持 SNI 的客户端。我认为您会发现大多数客户端都支持它,但您可能会发现仍有相当一部分客户端不支持 SNI。您可以将所有不支持 SNI 的客户端转发到一台特定的服务器,这样至少有一个域可以为没有 SNI 的客户端工作。

我的建议是为每个服务器分配一个公共 IPv6 地址。这样,支持 IPv6 的客户端就不会遇到代理的缺点,并且您可以使用从代理到实际服务器的 IPv6 连接。这也意味着代理实际上可以使用 DNS 查找来查找服务器的地址,这可能会简化事情。

我有实施的这样的代理支持 http 和 https,所以我知道这是可行的。但我认为对于您的设置,现成的代理可能是更好的选择。我认为 squid 可以做到。另一方面,我认为 iptables 和 bind 不会对您有太大帮助。

答案2

最简单的方法是使用反向代理,将您的请求代理到虚拟机。(我只是假设我们在这里谈论的是 HTTP)

相关内容