反向代理 Linux 容器

反向代理 Linux 容器

我正在尝试在我的 ubuntu 14.04 主机上设置反向代理,以便我可以运行多个网站,每个网站都在自己的 LXC 容器中(一天使用 docker,但一步一步来)。在此示例中,站点/主机名是:

ubuntu1.mydomain.com
ubuntu2.mydomain.com

容器创建时的名称为 ubuntu1 和 ubuntu2。

当我尝试使用以下命令设置 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

有办法解决这个问题吗?

答案1

你的方法有缺陷。配置时你不想使用域名iptables

防火墙不知道客户端解析了哪个域以到达您的主机系统。它所看到的只是 IP 地址和端口号。

如果要使容器可通过公共 IP 访问,则需要选择一个在外部接口上可用的不同 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

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

答案2

我并不认同 iptables 适用于此目的的说法。
正如 Felix 所说,iptables 是一种防火墙。
它不是 ip 路由组件。
在 Linux 上设置虚拟网络有几种方法。
最简单的方法是通过配置虚拟 ip,例如

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

(非持久性,重启后将消失)或dnsmasq。
由于这正是您正在做的事情(为您的 Linux 容器设置虚拟网络),
因此您应该遵循相应的文档。反向代理又是一个完全不同的主题,因为可以使用 DNS 区域文件和 Apache HTTP Server 中的正确 DNS 条目轻松完成此操作,它可以将不同的域名映射到不同的 IP 或端口,例如

<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 容器时才需要代理。

答案3

对于 HTTP 和 HTTPS,这将有助于从互联网获取可访问的容器:

sudo iptables -t nat -I PREROUTING -p tcp -d <host-ip> --dport 443 -j DNAT --to <lxc-ip>:443  
sudo iptables -t nat -I PREROUTING -p tcp -d <host-ip> --dport 80 -j DNAT --to <lxc-ip>:80  
sudo iptables -A FORWARD -p tcp -d <lxc-ip> --dport 443 -j ACCEPT  
sudo iptables -A FORWARD -p tcp -d <lxc-ip> --dport 80 -j ACCEPT  

但对于许多网络服务器/容器来说,这可能不是一个合适的解决方案。

相关内容