介绍
Docker Swarm 是 Docker 的一项功能,可以轻松地大规模运行 Docker 主机和容器。 Docker Swarm 或 Docker 集群由一个或多个 Dockerized 主机组成,这些主机充当 manager 节点,以及任意数量的 worker 节点。 设置这样的系统需要仔细操作 Linux 防火墙。
Docker Swarm 正常运行所需的网络端口是:
- TCP 端口
2376
用于安全的 Docker 客户端通信。 Docker Machine 需要此端口才能工作。 Docker Machine 用于编排 Docker 主机。 - TCP 端口
2377
。 此端口用于 Docker Swarm 或集群的节点之间的通信。 它只需要在管理节点上打开。 - TCP 和 UDP 端口
7946
用于节点之间的通信(容器网络发现)。 - UDP 端口
4789
用于覆盖网络流量(容器入口网络)。
注意: 除了这些端口之外,端口 22
(用于 SSH 流量)以及在集群上运行特定服务所需的任何其他端口都必须打开。
在本文中,您将使用 FirewallD 和 IPTables 在 CentOS 7 上配置 Linux 防火墙。 FirewallD 是 CentOS 7 上的默认防火墙应用程序,但 IPTables 也可用。 虽然本教程涵盖了这两种方法,但每种方法都提供相同的结果,因此您可以选择您最熟悉的一种。
先决条件
在继续阅读本文之前,您应该:
- 设置组成集群的主机,包括至少一个 swarm manager 和一个 swarm worker。 您可以按照教程 How To Provision and Manage Remote Docker Hosts with Docker Machine on CentOS 7) 进行设置。
注意: 您会注意到命令(以及本文中的所有命令)没有以 sudo
为前缀。 这是因为假设您在使用 Docker Machine 配置后使用 docker-machine ssh
命令登录到服务器。
方法 1 — 使用 FirewallD 打开 Docker Swarm 端口
FirewallD 是 CentOS 7 上的默认防火墙应用程序,但在新的 CentOS 7 服务器上,它是开箱即禁用的。 因此,让我们启用它并添加 Docker Swarm 运行所需的网络端口。
在开始之前,请验证其状态:
systemctl status firewalld
它不应该运行,所以启动它:
systemctl start firewalld
然后启用它,使其在启动时启动:
systemctl enable firewalld
在将成为 Swarm 管理器的节点上,使用以下命令打开必要的端口:
firewall-cmd --add-port=2376/tcp --permanent firewall-cmd --add-port=2377/tcp --permanent firewall-cmd --add-port=7946/tcp --permanent firewall-cmd --add-port=7946/udp --permanent firewall-cmd --add-port=4789/udp --permanent
注意:如果输入有误需要删除,输入:firewall-cmd --remove-port=port-number/tcp —permanent
。
之后,重新加载防火墙:
firewall-cmd --reload
然后重启 Docker。
systemctl restart docker
然后在每个将充当 Swarm 工作者的节点上,执行以下命令:
firewall-cmd --add-port=2376/tcp --permanent firewall-cmd --add-port=7946/tcp --permanent firewall-cmd --add-port=7946/udp --permanent firewall-cmd --add-port=4789/udp --permanent
之后,重新加载防火墙:
firewall-cmd --reload
然后重启 Docker。
systemctl restart docker
您已成功使用 FirewallD 为 Docker Swarm 打开了必要的端口。
注意:如果您要在集群上测试需要外部网络访问的应用程序,请务必打开必要的端口。 例如,如果您要测试一个需要访问端口 80 的 Web 应用程序,请在集群中的所有节点(管理器和工作器)上使用以下命令添加一个授予对该端口访问权限的规则:
firewall-cmd --add-port=80/tcp --permanent
进行此更改时,请记住重新加载防火墙。
方法 2 — 使用 IPTables 打开 Docker Swarm 端口
要在任何 Linux 发行版上使用 IPTables,您必须首先卸载任何其他防火墙实用程序。 要从 FirewallD 切换到 IPTables,首先停止 FirewallD:
systemctl stop firewalld
然后禁用它
systemctl disable firewalld
然后安装 iptables-services
包,它管理 IPTables 规则的自动加载:
yum install iptables-services
接下来,启动 IPTables:
systemctl start iptables
然后启用它,使其在启动时自动启动:
systemctl enable iptables
在开始将 Docker Swarm 特定规则添加到 INPUT 链之前,让我们看一下该链中的默认规则:
iptables -L INPUT --line-numbers
输出应如下所示:
OutputChain INPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED 2 ACCEPT icmp -- anywhere anywhere 3 ACCEPT all -- anywhere anywhere 4 ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh 5 REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
总之,默认规则为服务器提供状态保护,拒绝所有输入流量,除了已经建立的流量。 允许 SSH 流量进入。 注意上面突出显示的第 5 条规则,因为它是一个包罗万象的拒绝规则。 为了让您的 Docker Swarm 正常运行,您添加的规则需要在 上方 这条规则上添加。 这意味着需要插入新规则,而不是附加到 INPUT 链。
现在您知道该做什么了,您可以使用 iptables
实用程序添加您需要的规则。 这第一组命令应该在将作为 Swarm 管理器的节点上执行。
iptables -I INPUT 5 -p tcp --dport 2376 -j ACCEPT iptables -I INPUT 6 -p tcp --dport 2377 -j ACCEPT iptables -I INPUT 7 -p tcp --dport 7946 -j ACCEPT iptables -I INPUT 8 -p udp --dport 7946 -j ACCEPT iptables -I INPUT 9 -p udp --dport 4789 -j ACCEPT
这些规则是运行时规则,如果系统重新启动,这些规则将丢失。 要将当前运行时规则保存到文件中以便它们在重新启动后仍然存在,请键入:
/usr/libexec/iptables/iptables.init save
规则现在保存到 /etc/sysconfig
目录中名为 iptables
的文件中。 如果您使用 iptables -L --line-numbers
查看规则,您会看到所有规则都已插入到 catch-all 拒绝规则之上:
OutputChain INPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED 2 ACCEPT icmp -- anywhere anywhere 3 ACCEPT all -- anywhere anywhere 4 ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh 5 ACCEPT tcp -- anywhere anywhere tcp dpt:2376 6 ACCEPT tcp -- anywhere anywhere tcp dpt:7946 7 ACCEPT udp -- anywhere anywhere udp dpt:7946 8 ACCEPT udp -- anywhere anywhere udp dpt:4789 9 ACCEPT tcp -- anywhere anywhere tcp dpt:http 10 REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
然后重启 Docker。
Outputsystemctl restart docker
在将充当 Swarm 工作人员的节点上,执行以下命令:
iptables -I INPUT 5 -p tcp --dport 2376 -j ACCEPT iptables -I INPUT 6 -p tcp --dport 7946 -j ACCEPT iptables -I INPUT 7 -p udp --dport 7946 -j ACCEPT iptables -I INPUT 8 -p udp --dport 4789 -j ACCEPT
将规则保存到磁盘:
/usr/libexec/iptables/iptables.init save
然后重启 Docker:
systemctl restart docker
这就是使用 IPTables 为 Docker Swarm 打开必要端口所需的全部内容。 您可以在教程 IPTables 防火墙的工作原理 中了解有关这些规则如何工作的更多信息。
注意:如果您要在集群上测试需要外部网络访问的应用程序,请务必打开必要的端口。 例如,如果您要测试一个需要访问端口 80 的 Web 应用程序,请在集群中的所有节点(管理器和工作器)上使用以下命令添加一个授予对该端口访问权限的规则:
iptables -I INPUT rule-number -p tcp --dport 80 -j ACCEPT
请务必将规则插入到包罗万象的拒绝规则之上。
结论
FirewallD 和 IPTables 是 Linux 世界中两个最流行的防火墙管理应用程序。 您刚刚阅读了如何使用这些来打开设置 Docker Swarm 所需的网络端口。 您使用的方法只是个人喜好问题,因为它们都具有同等能力。