我试图在我的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