我有一些很棒的服务器,但利用率很低,我很想设置大约 20 个 VM 服务器,但我的 ISP 不会再给我任何地址。我目前有 5 个,虽然他们一直说会这样做,但没有人跟进,而且已经来回大约 6 个月了。如果可能的话,我需要找到一种简单的方法来解决这个问题。
我了解 Nginx 和 HAProxy,但我还没有实现它,因为它看起来比实际要复杂得多。我不想只转发 1 个或 2 个端口,而是基于传入的主机名请求转发所有端口。当我或其他人设置项目时,我不想让他们怀疑问题出在端口转发还是服务器的 iptables 中。
几个月来,我断断续续地关注这个项目,尝试使用 F5、PfSense 和 OpnSense 的所有功能。在我看来,这个要求似乎并不奇怪,鉴于虚拟服务器的突出地位,似乎必须在防火墙/网关级别有一个简单的解决方案来将流量拆分到一堆本地 IP 地址。在每种情况下,解决方案似乎要么记录不全,要么范围仅限于一次一个端口。
我在这里遗漏了什么?
答案1
您可以拥有任意数量的内部 IP,因此我建议虚拟机都使用内部网络中的 IP,例如 192.168.XX 或 10.XXX,然后将有限的外部 IP 放在网关设备(通常是防火墙)上。在该防火墙上,您可以设置 NAT 以将公共地址转发到私有地址。这当然是您的情况的一个问题,因为您没有足够的公共地址来进行直接的 1 对 1 转换。您有几个选择:
1)PAT——端口地址转换
这对于您可以控制两端的服务有效。例如 SSH/RDP。您配置 IP A 端口 22 以连接到 VM1,然后配置其他端口以连接到其余 VM。端口 2222 连接到 VM2,2223 连接到 VM3 等。对于管理来说,这没问题。这不适用于标准端口上的传入公共连接(例如 HTTP。对于这些,您需要选项 2)
2)反向代理
您在上面提到了 HAProxy 和 NGINX。这两者都可以配置为执行反向代理。您在其上设置一个具有公共 IP 的 VM,并将所有 DNS 指向该 IP。然后配置代理以根据某些条件将请求转发到正确的目标服务器(在您的请求中,您提到使用传入主机名)。
以下是这些守护进程的说明(以及 apache 的奖励):
- https://www.nginx.com/resources/admin-guide/reverse-proxy/
- https://seanmcgary.com/posts/haproxy---route-by-domain-name
- https://www.digitalocean.com/community/tutorials/how-to-use-apache-http-server-as-reverse-proxy-using-mod_proxy-extension
标准防火墙无法满足您的要求的原因是它们仅在第 3 层运行,并且不了解所请求的主机名或 URL。