我在 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 关心的位)将在发生这种情况时成功完成。