如何在CentOS 7上为Docker Swarm配置Linux防火墙

介绍

Docker SwarmDocker的一项功能,可以轻松地大规模运行Docker主机和容器。 Docker Swarm或Docker集群由一个或多个用作 管理器节点的Docker化主机和任意数量的 工作节点组成。设置这样的系统需要仔细操纵Linux防火墙。 Docker Swarm正常工作所需的网络端口有:
  • TCP端口2376用于安全的Docker客户端通信。此端口是Docker Machine工作所必需的。 Docker机器用于编排Docker主机。
  • TCP端口2377 。此端口用于Docker群集或群集的节点之间的通信。它只需要在管理器节点上打开。
  • TCP和UDP端口7946用于节点之间的通信(容器网络发现)。
  • UDP端口4789用于覆盖网络流量(容器入口网络)。
注意:除了这些端口,端口22 (用于SSH流量)和特定服务在群集上运行所需的任何其他端口必须打开。 在本文中,您将使用FirewallD和IPTables在CentOS 7上配置Linux防火墙。 FirewallD是CentOS 7上的默认防火墙应用程序,但IPTables也可用。虽然本教程涵盖这两种方法,每个方法都提供相同的结果,所以你可以选择一个你最熟悉的。

先决条件

在继续阅读本文之前,您应该: 注意:您会注意到命令(和本文中的所有命令)不带sudo前缀。这是因为它假定您使用docker docker-machine ssh命令登录服务器,然后使用Docker Machine供应它。

方法1 - 使用FirewallD打开Docker群端口

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
这是所有需要为Docker Swarm使用IPTables打开必要的端口。您可以在教程中了解这些规则的工作 原理IPTables防火墙的工作原理注意 :如果您将在集群上测试需要外部网络访问的应用程序,请确保打开必要的端口。例如,如果您将测试需要在端口80上访问的Web应用程序,请在群集中的所有节点(管理器和工作器)上使用以下命令添加规则,以授予对该端口的访问权限:
iptables -I INPUT rule-number -p tcp --dport 80 -j ACCEPT
请务必在catchall reject规则上面插入规则。

结论

FirewallD和IPTables是Linux世界中最流行的防火墙管理应用程序之一。你只是读了如何使用这些打开设置Docker Swarm所需的网络端口。你使用的方法只是个人喜好的问题,因为他们都具有同等的能力。
赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏