LXC 和端口重叠

LXC 和端口重叠

我在 Google 上进行了大量搜索,并浏览了有关 Server Fault 的相关信息,但仍未找到任何解决方案。

我有一台运行 LXC 容器的服务器(目前有 2 个,都是 Ubuntu)。LXC 网络是桥接的(10.0.3.0/24),其 DHCP 服务器位于 10.0.3.1,我使用该网络的两个 IP:10.0.3.2(容器 1 [CN1])和 10.0.3.3(容器 2 [CN2])。

我在两个服务器上都安装了 Apache,并在 DNS 上为我的一个网站设置了一个指向我的公共 IP 的子域名(web1 -> CN1 和 web2 -> CN2)。子域名解析正确,但问题就出在这里。

根据我在 iptables 中首先设置了哪条规则,可以确定哪个容器会受到网页的影响。因此,如果我的外部端口 80 首先受到 CN1 的影响,那么就会显示该 index.html 文件,如果首先为 CN2 设置了 80,那么就会显示该 index.html 文件。

我想做的是将 Apache 服务器设置为监听不同的端口,因此我将 CN1 设置为监听 801,将 CN2 设置为监听 802,然后我设置 iptables 将外部端口 80 路由到这两个端口,但仍然出现同样的问题。

我的最终目标是让 web1 和 web2 显示各自的 index.html 文件,而无需指定特定的外部端口(即:ip:81->CN1 和 ip:82->CN2)。我能想到的唯一其他方法是在主机上设置代理(即:nginx)并让其根据请求的(子)域代理请求,但如果可能的话,我宁愿不这样做。

iptables 规则:

NAT 表

root@SKYNet:~# iptables -t nat -L  
链 PREROUTING(策略接受)  
目标 保护 优化 源 目标  
DNAT tcp -- 任何地方 tcp dpt:http 到:10.0.3.2:801
DNAT tcp -- 任何地方 tcp dpt:http 到:10.0.3.3:802

链输入(策略接受)
目标 保护 优化 源 目标

链输出(策略接受)
目标 保护 优化 源 目标

链 POSTROUTING(策略接受)
目标 保护 优化 源 目标
MASQUERADE 全部 -- 10.0.3.0/24 任何地方

默认表

root@SKYNet:~# iptables -L
链输入(策略接受)
目标 保护 优化 源 目标

链转发(策略接受)
目标 保护 优化 源 目标

链输出(策略接受)
目标 保护 优化 源 目标

我确实理解 iptables 的逻辑并将其路由到一个点,但我认为 iptables 基本上会尝试将数据包引导到端口 801,如果它与 VHost 不匹配,它会拒绝它并且 iptables 将转到下一个(在本例中为 802)。

答案1

iptables正在执行其工作。iptables如果您的目标是相同的端口,则不知道什么是 HTTP,只有第一条规则会匹配之后请求发生的任何情况。

实现你需要的唯一方法是设置一个反向代理它将获取所有 HTTP 请求并根据主机名将它们重定向到正确的 HTTP 服务器。

答案2

您需要一个代理才能执行此操作。IPtables 只会重定向符合此规则的数据包 - 它不会检查数据包是否到达任何地方,或者是否返回任何 ICMP 端口不可达信息。即使这样做了,这仍然行不通 - 您不会收到任何 IPtables 知道的故障,因为唯一的故障将是第 7 层故障。实际的 TCP 握手(这是 iptables 关心的位)将在发生这种情况时成功完成。

相关内容