介绍

Docker Swarm是Docker的一个特性,它使得在规模上运行Docker主机和容器变得很容易,Docker Swarm或Docker Cluster由一个或多个充当管理器节点的停靠主机和任意数量的工作节点组成,设置这样一个系统需要对Linux防火墙进行仔细的操作。
Docker Swarm正常运行所需的网络端口包括:
用于安全Docker客户端通信的TCP端口2376 ,此端口是Docker机器工作所必需的,TCP端口2377,此端口用于Docker Swarm或集群的节点之间的通信,它只需要在管理器节点上打开,TCP和UDP端口7946用于节点(容器网络发现)之间的通信,覆盖网络流量(容器进入网络)的UDP端口4789
注意:除了这些端口,端口22 (用于SSH通信)和需要在集群上运行的特定服务的其他端口都必须打开。
在本文中,你将使用FirewallD和IPTables在CentOS上配置linux防火墙,FirewallD是CentOS上的默认防火墙应用程序,但是,IPTables也可用,本教程涵盖两种方法,每个方法都提供相同的结果,因此你可以选择最熟悉的方法。

前提条件

在继续本文之前,你应该:
设置组成集群的主机,包括至少一个swarm管理器和一个swarm worker,
注意:你将注意到命令(以及本文中的所有命令)没有前缀为sudo ,这是因为假设你在使用Docker Machine设置服务器后,使用docker-machine ssh命令登录到服务器。

方法1使用FirewallD打开docker Swarm端口

FirewallD是CentOS 7上的默认防火墙应用程序,但在新的CentOS服务器上,它默认是禁用的,所以启用它,并添加Docker Swarm所需的网络端口。
开始之前,请验证其状态:

  1. systemctl status firewalld

它不应该运行,所以启动它:

  1. systemctl start firewalld

然后启用它,使其在开机时启动:

  1. systemctl enable firewalld

在将成为集群管理器的node上,使用以下命令打开必要的端口:

  1. firewall-cmd --add-port=2376/tcp --permanent
  2. firewall-cmd --add-port=2377/tcp --permanent
  3. firewall-cmd --add-port=7946/tcp --permanent
  4. firewall-cmd --add-port=7946/udp --permanent
  5. firewall-cmd --add-port=4789/udp --permanent

注意:如果出错并需要删除条目,请键入: firewall-cmd --remove-port=port-number/tcp -permanent
然后,重新加载防火墙:

  1. firewall-cmd --reload

然后重新启动Docker 。

  1. systemctl restart docker

然后在将充当Swarm worker 的每个节点上,执行以下命令:

  1. firewall-cmd --add-port=2376/tcp --permanent
  2. firewall-cmd --add-port=7946/tcp --permanent
  3. firewall-cmd --add-port=7946/udp --permanent
  4. firewall-cmd --add-port=4789/udp --permanent

然后,重新加载防火墙:

  1. firewall-cmd --reload

然后重新启动Docker 。

  1. systemctl restart docker

你已成功使用防火墙来打开Docker Swarm所必需的端口。
注意:如果要测试集群中需要外部网络访问的应用程序,请确保打开必要的端口,例如,如果要测试需要在端口80上访问的Web应用程序,请在集群中的所有节点(manager和worker)上使用以下命令添加授予该端口访问权限的规则:

  1. firewall-cmd --add-port=80/tcp --permanent

进行此更改时,请记住重新加载防火墙。

方法2使用IPTables打开docker Swarm端口

要在Linux发行版上使用IPTables,你必须首先卸载其他防火墙实用程序,要从防火墙切换到IPTables,首先停止防火墙:

  1. systemctl stop firewalld

禁用它

  1. systemctl disable firewalld

然后安装iptables-services软件包,该软件包管理IPTables规则的自动加载:

  1. yum install iptables-services

下一步,启动IPTables :

  1. systemctl start iptables

然后启用它,以便它在引导时自动启动:

  1. systemctl enable iptables

开始向输入链添加Docker Swarm特定规则之前,先来看一下规则链中的缺省规则:

  1. iptables -L INPUT --line-numbers

输出应该与下面的完全相同:

  1. OutputChain INPUT (policy ACCEPT)
  2. num target prot opt source destination
  3. 1 ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
  4. 2 ACCEPT icmp -- anywhere anywhere
  5. 3 ACCEPT all -- anywhere anywhere
  6. 4 ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
  7. 5 REJECT all -- anywhere anywhere reject-with icmp-host-prohibited

默认情况下,默认规则为服务器提供状态保护,拒绝所有输入流量,但是,已建立的所有输入流量除外,允许使用SSH通信,要让Docker Swarm正常工作,你添加的规则需要添加到该规则之上,这意味着需要插入新规则,而不是附加到INPUT链。
现在你已经知道了该做什么,可以使用iptables工具添加所需的规则,在节点上执行的第一组命令应该作为Swarm manager执行。

  1. iptables -I INPUT 5 -p tcp --dport 2376 -j ACCEPT
  2. iptables -I INPUT 6 -p tcp --dport 2377 -j ACCEPT
  3. iptables -I INPUT 7 -p tcp --dport 7946 -j ACCEPT
  4. iptables -I INPUT 8 -p udp --dport 7946 -j ACCEPT
  5. iptables -I INPUT 9 -p udp --dport 4789 -j ACCEPT

要将当前运行时规则保存到文件,以便在重新启动后保持它们,请键入:

  1. /usr/libexec/iptables/iptables.init save

现在,这些规则被保存到/etc/sysconfig目录中名为iptables的文件中,如果使用iptables -L --line-numbers查看规则,则会看到所有规则都已插入到捕获所有拒绝规则上:

  1. OutputChain INPUT (policy ACCEPT)
  2. num target prot opt source destination
  3. 1 ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
  4. 2 ACCEPT icmp -- anywhere anywhere
  5. 3 ACCEPT all -- anywhere anywhere
  6. 4 ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
  7. 5 ACCEPT tcp -- anywhere anywhere tcp dpt:2376
  8. 6 ACCEPT tcp -- anywhere anywhere tcp dpt:7946
  9. 7 ACCEPT udp -- anywhere anywhere udp dpt:7946
  10. 8 ACCEPT udp -- anywhere anywhere udp dpt:4789
  11. 9 ACCEPT tcp -- anywhere anywhere tcp dpt:http
  12. 10 REJECT all -- anywhere anywhere reject-with icmp-host-prohibited

然后重新启动Docker 。

  1. Outputsystemctl restart docker

在将作为Swarm worker的节点上,执行以下命令:

  1. iptables -I INPUT 5 -p tcp --dport 2376 -j ACCEPT
  2. iptables -I INPUT 6 -p tcp --dport 7946 -j ACCEPT
  3. iptables -I INPUT 7 -p udp --dport 7946 -j ACCEPT
  4. iptables -I INPUT 8 -p udp --dport 4789 -j ACCEPT

将规则保存到磁盘:

  1. /usr/libexec/iptables/iptables.init save

然后重新启动Docker :

  1. systemctl restart docker

这就是使用IPTables打开Docker Swarm必需端口所需的全部,
例如,如果要测试需要在端口80上访问的Web应用程序,请在集群中的所有节点(管理器和工作器)上使用以下命令添加一个授予该端口访问权限的规则:

  1. iptables -I INPUT rule-number -p tcp --dport 80 -j ACCEPT

结束语

防火墙和IPTables是Linux世界中最流行的两种防火墙管理应用程序,你刚刚了解了如何使用这些工具打开设置Docker Swarm所需的网络端口。你使用的方法只是个人喜好问题,因为它们具有同等的能力。