反向代理Linux容器

我试图在我的Ubuntu 14.04主机上设置一个反向代理,这样我就可以运行多个网站,每个网站都在自己的LXC容器(一天泊坞站,但一次一步)。 在这个例子中,网站/主机名是:

ubuntu1.mydomain.com ubuntu2.mydomain.com 

容器是使用名称ubuntu1和ubuntu2创build的。

当我尝试设置iptables转发到这些主机名使用以下命令:

 sudo iptables -t nat -A PREROUTING -d ubuntu1.mydomain.com -j DNAT --to-destination 10.0.3.xxx 

(10.0.3.xxx是lxc网桥10.0.3.1上的容器的IP地址)我得到以下错误:

 iptables v1.4.21: host/network `ubuntu1.mydomain.com' not found 

有没有办法解决这个问题?

你的方法是有缺陷的。 configurationiptables时,您不想使用域名。

您的防火墙没有概念客户已经解决到哪个域到您的主机系统。 它看到的只是IP地址和端口号。

如果要通过公共IP访问容器,则需要select外部接口上可用的不同IP

 iptables -t nat -A PREROUTING -d <public-ip-for-ubuntu1> -j DNAT --to-destination 10.0.3.xxx 

如果没有为您的容器指定IP,实际上没有办法做到这一点。

如果您不能添加这样的地址,您可以使用将特定端口映射到容器中的其他端口的解决方法,例如

 iptables -t nat -A PREROUTING -p tcp --dport 10022 -j DNAT --to-destination 10.0.3.xxx:22 

通过端口10022使容器的SSH服务可用。

我不是在声明,iptables是健全的,为此目的。
正如Felix提到的,iptables是一个防火墙。
这不是一个IP路由组件。
有几种方法可以在Linux上build立虚拟networking。
最简单的方法是通过configuration虚拟IPS,例如

  ifconfig eth0:1 192.168.0.10 up (notice the eth0:1 which is setting up a virtual device for eth0)<br /> 

(这是非持久性,将在重新启动后消失)或dnsmasq。
由于这正是你正在做的(为你的linux容器设置一个虚拟networking),
你应该坚持相应的文件。 反向代理再次是一个完全不同的话题,因为这可以很容易地使用您的DNS区域文件和Apache HTTP服务器,可以将不同的域名映射到不同的IP或端口,例如正确的DNS条目

 <VirtualHost *:80> ServerAdmin [email protected] ServerName ubuntu1.mydomain.com #this is the mapping configuring your server to be the one ProxyPreserveHost On ProxyRequests Off <Proxy *> Order deny,allow Allow from all </Proxy> ProxyPass / http://10.0.3.10:9006/ ProxyPassReverse http://10.0.3.10:9006/ / 

但代理只是当然你需要使用linux容器。

对于HTTP和HTTPS,这将工作得到一个容器从互联网可达:

sudo iptables -t nat -I PREROUTING -p tcp -d –dport 443 -j DNAT –to:443
sudo iptables -t nat -I PREROUTING -p tcp -d –dport 80 -j DNAT –to:80
sudo iptables -A FORWARD -p tcp -d –dport 443 -j ACCEPT
sudo iptables -A FORWARD -p tcp -d –dport 80 -j ACCEPT

可能不是一个适合大量Web服务器/容器的解决scheme