![运行 Docker 时如何配置 iptables](https://linux22.com/image/656923/%E8%BF%90%E8%A1%8C%20Docker%20%E6%97%B6%E5%A6%82%E4%BD%95%E9%85%8D%E7%BD%AE%20iptables.png)
我遇到了一个棘手的情况,我在 docker 主机上设置了许多容器,运行不同的应用程序,如邮件服务器、数据库、redis 和某些使用其他容器作为依赖项的 html 应用程序。所有容器都已使用带有 hostport:containerport 的 -p 标志进行设置,端口未绑定到主机,可以在互联网上监听。
在设置依赖应用程序时,我使用主机的 docker 桥接 IP(而非公网 IP)进行链接。例如:piwik 容器使用 172.17.42.1:port IP 连接到 mysql 数据库容器,该 IP 是用于容器网络的 docker 桥接的默认 IP。然后我使用 nginx(在主机上)在 localhost(127.0.0.1:port)上设置基于 dns 的代理,以路由到容器内运行的应用程序。最初在设置系统时,我考虑 DROP 除需要打开的端口(80、443 等)之外的所有流量,然后 ACCEPT lo 接口就可以了。但是 docker 接口使用 FORWARD 链路由到 docker0 桥接。该前向链使用单独的规则转发到容器 IP:PORT
我想要的是使用来自 sub.domin.com 的应用程序,但不能从 IP:PORT 或 domain:PORT 访问。现在我刷新了所有 iptables
iptables -F
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
iptables -P INPUT DROP
iptables -A FORWARD -i docker0 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o docker0 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dports 22,53,80,443,25,465,587,993,995 -j ACCEPT
iptables -A INPUT -p udp -m multiport --dports 53 -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -p tcp -m multiport --sports 22,53,80,443,25,465,587,993,995 -j ACCEPT
iptables -A OUTPUT -p tcp -m multiport --sports 53 -j ACCEPT
在 iptables 实施后,nginx 无法路由(sub.domain.com),并给出 nginx 504 错误(确认 DNS 正在解析正确的 IP)。应用程序可以通过 IP:PORT 访问,所有端口(包括容器应用程序的端口)都向互联网开放,就像之前一样。所以我重新启动服务器以重置为默认值。我注意到 iptables 记录一开始并不存在,但在我们启动容器时开始出现。我真的很困惑如何隐藏来自互联网的端口,这样 nginx 代理路由仍然有效。容器的 IP 地址是可访问的。