如何在CentOS7上为DockerSwarm配置Linux防火墙

来自菜鸟教程
跳转至:导航、​搜索

介绍

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 也可用。 虽然本教程涵盖了这两种方法,但每种方法都提供相同的结果,因此您可以选择您最熟悉的一种。

先决条件

在继续阅读本文之前,您应该:

注意: 您会注意到命令(以及本文中的所有命令)没有以 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 所需的网络端口。 您使用的方法只是个人喜好问题,因为它们都具有同等能力。