So konfigurieren Sie die Linux-Firewall für Docker Swarm unter CentOS 7

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:

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.