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