问题:
我计划在单个 centos 主机服务器上设置多个虚拟化 centos、rhel 或 ubuntu 来宾计算机(最有可能使用 KVM)。每个来宾 VM 都运行一个 Web 应用程序实例 + 一些其他服务/协议,并且每个来宾 VM 都需要可以从主机外部在任何开放端口上进行访问,就好像它们都是一个单独的 DNS 盒子一样。
我(显然)在网络技术/配置方面很弱,所以我只是想找到这个问题的第一个边缘,即。我需要研究的主要方法才能在此基础上立足。如果愿意的话,网络配置“伪代码”。 :)
例子:
假设我拥有域名 foo.com。
我有一台物理 CentOS 机器,DNS 为 guest.foo.com。
在这台物理主机上,我运行了三个虚拟机。我希望来宾虚拟机可以通过 1.guests.foo.com、2.guests.foo.com 和 3.guests.foo.com 进行访问。来宾虚拟机运行 centos、rhel 和 ubuntu 发行版。
每个虚拟机都需要响应任何(本地开放的)端口,不仅仅是http流量,还包括ssh连接和git:协议操作。
我从哪里开始,最优雅的方法是什么?大致而言,主人和客人各自至少需要进行哪些设置才能使其正常工作?
笔记:
当我了解更多信息时,我将更新问题文本+评论。
答案1
让多个系统为一个 IP 地址上的同一端口提供服务的唯一方法是应用程序协议提供额外信息来帮助服务器识别请求最初针对的主机名。否则,服务器在 TCP/IP 层所能推断出的只是目标 IP 地址和端口,这对于所有 DNS 名称来说都是相同的。
大多数协议不支持您想要的。 HTTP 是一个例外,因为 HTTP/1.1 包含Host:
告诉服务器客户端正在查找哪个主机名的标头。在 HTTP 中,这被称为基于名称的虚拟主机。然而,SSL 再次打破了这一点,因此有一个更新的扩展名为服务器名称指示这也为 SSL 带来了这种支持。Host:
如今,所有系统都可以提供标头,但 SNI 仍然没有在所有地方得到完全支持。
该git
协议不提供主机名。然而,git 是新的智能HTTPTransport 是一种通过 HTTP 运行的好方法git
,它允许您做您想做的事情。
无论您使用 HTTP 做什么,实际的设置方法是在您的主 IP 地址上运行代理服务器,该服务器使用基于名称的虚拟主机将请求定向到正确的计算机。
对于 SSH,除了使用不同的端口之外,确实没有太多选择。您可以制作自己的“反弹主机”,其工作方式类似于代理服务器,但手动除外:用户首先连接到您的主 IP 地址,它提供了一个迷你 shell,允许他们进一步连接ssh
到其他主机(使用 LAN IP 地址) )。不过,您将很难使其与 SFTP 或其他自动连接等非交互式协议无缝协作。另一种方法可能是创建一个 SSH 服务器,它使用用户名中的信息来决定自动连接到哪个主机:例如,该命令可以连接到您的单个 IP 地址,然后修改后的 SSH 服务器会提取用户名并创建一个新的连接到.我不知道有任何现有软件可以帮助您做到这一点;它可能需要被写下来。ssh [email protected]
username@machine1
当然,如果您使用 IPv6,您可以为每台计算机提供一百万个自己的公共地址,并且您将不需要任何这些技巧。