介绍
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 流量)以及在集群上运行特定服务所需的任何其他端口都必须打开。
在本文中,您将了解如何使用所有 Linux 发行版上提供的不同防火墙管理应用程序在 Ubuntu 16.04 上配置 Linux 防火墙。 这些防火墙管理应用程序是 FirewallD、IPTables Tools 和 UFW,即简单防火墙。 UFW 是 Ubuntu 发行版(包括 Ubuntu 16.04)上的默认防火墙应用程序。 虽然本教程涵盖了三种方法,但每种方法都提供相同的结果,因此您可以选择最熟悉的一种。
先决条件
在继续阅读本文之前,您应该:
- 设置组成集群的主机,包括至少一个 swarm manager 和一个 swarm worker。 您可以按照教程 How To Provision and Manage Remote Docker Hosts with Docker Machine on Ubuntu 16.04 进行设置。
注意: 您会注意到命令(以及本文中的所有命令)没有以 sudo
为前缀。 这是因为假设您在使用 Docker Machine 配置后使用 docker-machine ssh
命令登录到服务器。
方法 1 — 使用 UFW 打开 Docker Swarm 端口
如果您只是设置了 Docker 主机,则已经安装了 UFW。 您只需要启用和配置它。 按照 本指南 了解有关在 Ubuntu 16.04 上使用 UFW 的更多信息。
在将充当 Swarm 管理器的节点上执行以下命令:
ufw allow 22/tcp ufw allow 2376/tcp ufw allow 2377/tcp ufw allow 7946/tcp ufw allow 7946/udp ufw allow 4789/udp
之后,重新加载 UFW:
ufw reload
如果未启用 UFW,请使用以下命令执行此操作:
ufw enable
这可能不是必需的,但只要您对防火墙进行更改并重新启动防火墙,重新启动 Docker 守护程序永远不会有什么坏处:
systemctl restart docker
然后在将作为工作程序运行的每个节点上,执行以下命令:
ufw allow 22/tcp ufw allow 2376/tcp ufw allow 7946/tcp ufw allow 7946/udp ufw allow 4789/udp
之后,重新加载 UFW:
ufw reload
如果未启用 UFW,请启用它:
ufw enable
然后重启 Docker 守护进程:
systemctl restart docker
这就是使用 UFW 为 Docker Swarm 打开必要端口所需要做的一切。
方法 2 — 使用 FirewallD 打开 Docker Swarm 端口
FirewallD 是 Fedora、CentOS 和其他基于它们的 Linux 发行版上的默认防火墙应用程序。 但 FirewallD 也可用于其他 Linux 发行版,包括 Ubuntu 16.04。
如果您选择使用 FirewallD 而不是 UFW,请先卸载 UFW:
apt-get purge ufw
然后安装 FirewallD:
apt-get install firewalld
验证它是否正在运行:
systemctl status firewalld
如果它没有运行,请启动它:
systemctl start firewalld
然后启用它,使其在启动时启动:
systemctl enable firewalld
在将成为 Swarm 管理器的节点上,使用以下命令打开必要的端口:
firewall-cmd --add-port=22/tcp --permanent 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=22/tcp --permanent 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 打开了必要的端口。
方法 3 — 使用 IPTables 打开 Docker Swarm 端口
要在任何 Linux 发行版上使用 IPtables,您必须首先卸载任何其他防火墙实用程序。 如果您从 FirewallD 或 UFW 切换,请先卸载它们。
然后安装 iptables-persistent
包,它管理 IPtables 规则的自动加载:
apt-get install iptables-persistent
接下来,使用此命令刷新任何现有规则:
netfilter-persistent flush
现在您可以使用 iptables
实用程序添加规则。 这第一组命令应该在将作为 Swarm 管理器的节点上执行。
iptables -A INPUT -p tcp --dport 22 -j ACCEPT iptables -A INPUT -p tcp --dport 2376 -j ACCEPT iptables -A INPUT -p tcp --dport 2377 -j ACCEPT iptables -A INPUT -p tcp --dport 7946 -j ACCEPT iptables -A INPUT -p udp --dport 7946 -j ACCEPT iptables -A INPUT -p udp --dport 4789 -j ACCEPT
输入所有命令后,将规则保存到磁盘:
netfilter-persistent save
然后重启 Docker。
sudo systemctl restart docker
在将充当 Swarm 工作人员的节点上,执行以下命令:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT iptables -A INPUT -p tcp --dport 2376 -j ACCEPT iptables -A INPUT -p tcp --dport 7946 -j ACCEPT iptables -A INPUT -p udp --dport 7946 -j ACCEPT iptables -A INPUT -p udp --dport 4789 -j ACCEPT
将这些新规则保存到磁盘:
netfilter-persistent save
然后重启 Docker:
sudo systemctl restart docker
这就是使用 IPTables 为 Docker Swarm 打开必要端口所需的全部内容。 您可以在教程 Iptables 防火墙的工作原理 中了解有关这些规则如何工作的更多信息。
如果您希望在使用此方法后切换到 FirewallD 或 UFW,正确的方法是先停止防火墙:
sudo netfilter-persistent stop
然后刷新规则:
sudo netfilter-persistent flush
最后,将现在为空的表保存到磁盘:
sudo netfilter-persistent save
然后您可以切换到 UFW 或 FirewallD。
结论
FirewallD、IPTables Tools 和 UFW 是 Linux 世界中的三个防火墙管理应用程序。 您刚刚学习了如何使用它们打开设置 Docker Swarm 所需的网络端口。 您使用哪种方法只是个人喜好问题,因为它们都具有同等能力。