Einführung
Docker Swarm ist eine Funktion von Docker, mit der Docker-Hosts und -Container auf einfache Weise skaliert werden können. Ein Docker-Schwarm oder Docker-Cluster besteht aus einem oder mehreren Docker-Hosts, die als Manager-Knoten fungieren, und einer beliebigen Anzahl von Worker-Knoten. Das Einrichten eines solchen Systems erfordert eine sorgfältige Manipulation der Linux-Firewall.
Die Netzwerkanschlüsse, die ein Docker-Schwarm benötigt, um ordnungsgemäß zu funktionieren, sind:
-
TCP-Port
+ 2376 +
für sichere Docker-Client-Kommunikation. Dieser Port ist erforderlich, damit Docker Machine funktioniert. Docker Machine wird zum Orchestrieren von Docker-Hosts verwendet. -
TCP-Port
+ 2377 +
. Dieser Port wird für die Kommunikation zwischen den Knoten eines Docker-Schwarms oder -Clusters verwendet. Es muss nur auf Manager-Knoten geöffnet werden. -
TCP- und UDP-Port
+ 7946 +
für die Kommunikation zwischen Knoten (Container Network Discovery). -
UDP-Port
+ 4789 +
für Overlay-Netzwerkverkehr (Container Ingress Networking).
In diesem Artikel konfigurieren Sie die Linux-Firewall unter CentOS 7 mit FirewallD und IPTables. FirewallD ist die Standard-Firewall-Anwendung unter CentOS 7, IPTables ist jedoch auch verfügbar. Während dieses Tutorial beide Methoden behandelt, liefert jede das gleiche Ergebnis, sodass Sie diejenige auswählen können, mit der Sie am besten vertraut sind.
Voraussetzungen
Bevor Sie mit diesem Artikel fortfahren, sollten Sie:
-
Richten Sie die Hosts ein, aus denen Ihr Cluster besteht, einschließlich mindestens eines Schwarmmanagers und eines Schwarmarbeiters. Sie können dem Tutorial How To Provision folgen und Verwalten von Remote-Docker-Hosts mit Docker Machine unter CentOS 7), um diese einzurichten.
Methode 1 - Öffnen Sie Docker Swarm-Ports mit FirewallD
FirewallD ist die Standard-Firewall-Anwendung unter CentOS 7, auf einem neuen CentOS 7-Server ist sie jedoch standardmäßig deaktiviert. Aktivieren Sie es und fügen Sie die Netzwerkports hinzu, die Docker Swarm benötigt, um zu funktionieren.
Bevor Sie beginnen, überprüfen Sie den Status:
systemctl status firewalld
Es sollte nicht laufen, also starte es:
systemctl start firewalld
Aktivieren Sie es dann, damit es beim Booten startet:
systemctl enable firewalld
Verwenden Sie auf dem Knoten, der ein Swarm-Manager sein wird, die folgenden Befehle, um die erforderlichen Ports zu öffnen:
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
Laden Sie anschließend die Firewall neu:
firewall-cmd --reload
Starten Sie dann Docker neu.
systemctl restart docker
Führen Sie dann auf jedem Knoten, der als Schwarmarbeiter fungiert, die folgenden Befehle aus:
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
Laden Sie anschließend die Firewall neu:
firewall-cmd --reload
Starten Sie dann Docker neu.
systemctl restart docker
Sie haben FirewallD erfolgreich verwendet, um die erforderlichen Ports für Docker Swarm zu öffnen.
Methode 2 - Öffnen Sie Docker-Schwarmports mit IPTables
Um IPTables auf einer Linux-Distribution verwenden zu können, müssen Sie zunächst alle anderen Firewall-Dienstprogramme deinstallieren. Beenden Sie FirewallD, um von FirewallD zu IPTables zu wechseln:
systemctl stop firewalld
Dann deaktivieren Sie es
systemctl disable firewalld
Installieren Sie dann das Paket "+ iptables-services", das das automatische Laden der IPTables-Regeln verwaltet:
yum install iptables-services
Starten Sie als Nächstes IPTables:
systemctl start iptables
Aktivieren Sie es dann, damit es beim Booten automatisch startet:
systemctl enable iptables
Bevor Sie der INPUT-Kette Docker Swarm-spezifische Regeln hinzufügen, werfen wir einen Blick auf die Standardregeln in dieser Kette:
iptables -L INPUT --line-numbers
Die Ausgabe sollte genau so aussehen:
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
Zusammengenommen bieten die Standardregeln einen statusbezogenen Schutz für den Server und lehnen den gesamten Eingabeverkehr ab, mit Ausnahme derjenigen, die bereits eingerichtet wurden. SSH-Verkehr ist zulässig. Beachten Sie die oben hervorgehobene Regel 5, da es sich um eine allgemeine Ablehnungsregel handelt. Damit Ihr Docker-Schwarm ordnungsgemäß funktioniert, müssen die von Ihnen hinzugefügten Regeln über dieser Regel hinzugefügt werden. Das bedeutet, dass die neuen Regeln eingefügt werden müssen, anstatt an die INPUT-Kette angehängt zu werden.
Nachdem Sie nun wissen, was zu tun ist, können Sie die benötigten Regeln mit dem Dienstprogramm + iptables +
hinzufügen. Dieser erste Befehlssatz sollte auf den Knoten ausgeführt werden, die als Schwarmmanager dienen.
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
Diese Regeln sind Laufzeitregeln und gehen verloren, wenn das System neu gestartet wird. Geben Sie Folgendes ein, um die aktuellen Laufzeitregeln in einer Datei zu speichern, damit sie nach einem Neustart bestehen bleiben:
/usr/libexec/iptables/iptables.init save
Die Regeln werden nun in einer Datei mit dem Namen "+ iptables " im Verzeichnis " / etc / sysconfig " gespeichert. Wenn Sie die Regeln mit " iptables -L --line-numbers +" anzeigen, werden Sie feststellen, dass alle Regeln über der "catch-all reject" -Regel eingefügt wurden:
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
Starten Sie dann Docker neu.
Outputsystemctl restart docker
Führen Sie auf den Knoten, die als Schwarmarbeiter fungieren, die folgenden Befehle aus:
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
Speichern Sie die Regeln auf der Festplatte:
/usr/libexec/iptables/iptables.init save
Starten Sie dann Docker neu:
systemctl restart docker
Das ist alles, was Sie brauchen, um die erforderlichen Ports für Docker Swarm mithilfe von IPTables zu öffnen. Weitere Informationen zur Funktionsweise dieser Regeln finden Sie im Tutorial Wie die IPTables-Firewall funktioniert.
Fazit
FirewallD und IPTables sind zwei der beliebtesten Firewall-Verwaltungsanwendungen in der Linux-Welt. Sie müssen nur lesen, wie Sie diese verwenden, um die Netzwerkports zu öffnen, die zum Einrichten von Docker Swarm erforderlich sind. Die Methode, die Sie verwenden, ist nur eine Frage Ihrer persönlichen Präferenz, da sie alle gleichermaßen in der Lage sind.