LXC和端口重叠

我在Google上进行了大量search,并浏览了我能在Server Fault上find的内容,但找不到任何解决方法。

我有一个运行LXC容器的服务器(现在两个,都是Ubuntu)。 LXCnetworking桥接(10.0.3.0/24),DHCP服务器为10.0.3.1,我使用该networking的两个IP:10.0.3.2(容器1 [CN1])和10.0.3.3 (容器2 [CN2])。

我在Apache上设置了Apache,并且在DNS上为我的公有IP(web1 – > CN1和web2 – > CN2)设置了一个子域名。 子域名可以正确parsing,但这里是问题出现的地方。

根据我在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(政策接受)  
目标人select源目的地  
 DNAT tcp  - 在任何地方tcp dpt:http到:10.0.3.2:801
 DNAT tcp  - 在任何地方tcp dpt:http到:10.0.3.3:802

连锁input(政策接受)
目标人select源目的地

链式输出(策略ACCEPT)
目标人select源目的地

连锁POSTROUTING(政策接受)
目标人select源目的地
 MASQUERADE全部 -  10.0.3.0/24任何地方 

默认表

  root @ SKYNet:〜#iptables -L
连锁input(政策接受)
目标人select源目的地

连锁FORWARD(政策接受)
目标人select源目的地

链式输出(策略ACCEPT)
目标人select源目的地 

我了解iptables的逻辑和路由到一点,但我认为iptables基本上会试图将数据包引导到端口801,如果它不匹配VHOST它会拒绝它,iptables将进入下一个一个(在这种情况下是802)。

iptables正在做它的工作。 如果你的目标是相同的端口, iptables不知道什么是HTTP,只有第一个规则匹配后来发生的任何事情。

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

你需要一个代理来做到这一点。 IPtables将会redirect符合这个规则的数据包 – 它不会检查它是否到达任何地方,或者是否有任何ICMP端口不可用。 即使这样做,这仍然行不通 – 你不会得到IPtables将会知道的任何失败,因为唯一的失败将是第七层。 实际的TCP握手(即iptables关心的那一点)将在发生的时间内成功完成。