我正在尝试在我的 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
有没有办法解决这个问题?
你的方法有缺陷。您不想在配置时使用域名
iptables
。您的防火墙不知道客户端已解析哪个域以访问您的主机系统。它所看到的只是 IP 地址和端口号。
如果您想通过公共 IP 访问容器,您需要选择一个在外部接口上可用的不同 IP,并且只需
如果没有为您的容器指定 IP,实际上是无法做到这一点的。
如果您无法添加此类地址,您可以使用将特定端口映射到容器中的其他端口的解决方法,例如
通过 port 使容器的 SSH 服务可用
10022
。为此,我不同意 iptables 是合理的说法。
正如 Felix 所说,iptables 是一个防火墙。
它不是一个 ip - 路由组件。
有几种方法可以在 linux 上设置虚拟网络。
最简单的方法是通过配置虚拟 ip,例如
(这是非持久性的,将在重新启动后消失)或dnsmasq。
由于这正是您正在做的事情(为您的 linux 容器设置虚拟网络),
因此您应该遵守相应的文档。反向代理再次是一个完全不同的主题,因为这可以通过您的 dns 区域文件和 Apache HTTP 服务器中的正确 dns 条目轻松完成,它可以将不同的域名映射到不同的 ip 或端口,例如
但是当然,只有在您想使用 linux 容器时才需要代理。
对于 HTTP 和 HTTPS,这将有助于从 Internet 获取可访问的容器:
不过,对于许多 Web 服务器/容器来说,这可能不是一个合适的解决方案。