ryandaniels.iptables_docker
Ansible-Rolle: iptables für Docker (und Docker Swarm)
Fügen Sie Firewall-Regeln zum Server über iptables hinzu, für Docker und Docker Swarm. Dies schützt tatsächlich Ihre Docker-Container!
Diese Ansible-Rolle existiert, weil firewalld und Docker (und Docker Swarm) nicht gut zusammenarbeiten.
Problem, das gelöst wird: Wenn Sie einen Container in Docker mit einem "veröffentlichten" Port starten, haben Sie keine Kontrolle, und der Port wird über die Firewall Ihres Servers freigegeben. Selbst wenn Sie iptables oder eine andere Firewall auf Ihrem Server verwenden. Docker öffnet diesen "veröffentlichten" Port für alle und umgeht Ihre Firewall.
Fallszenario für diese Lösung: Erlauben Sie vertrauenswürdigen IPs den Zugriff auf Docker-Container (und Docker Swarm-Container) sowie auf andere offene OS-Ports. Mit einer Option, bestimmte Ports öffentlich freizugeben (Docker/Docker Swarm und OS). Die vertrauenswürdigen IPs könnten sich nicht im selben Netzwerk-IP-Bereich oder sogar im gleichen Netzwerk-Subnetz befinden.
Dies sollte einfach sein. Docker mit einer Firewall sichern. Aber leider ist es das nicht. Ich habe versucht, dies so einfach wie möglich zu halten.
Es könnten unbekannte Probleme damit auftreten... verwenden Sie es auf eigenes Risiko!
Siehe auch: https://ryandaniels.ca/blog/secure-docker-with-iptables-firewall-and-ansible/
Und über die Nutzung der INPUT-Kette durch Docker: https://ryandaniels.ca/blog/docker-iptables-input-chain/
Aktuell getestet und funktioniert auf:
- CentOS/RHEL 7
- Ubuntu 18.04
- Ubuntu 20.04
Merkmale
- Funktioniert mit Docker und Docker Swarm (auch bekannt als Docker SwarmKit).
- Standardmäßig sicher. Nach der Konfiguration können nur Docker-IPs auf alle Container und alle anderen OS-Prozesse mit offenen Ports auf dem Server zugreifen.
- So einfach wie möglich. Je weniger iptables-Regeln, desto schneller wird die Leistung (theoretisch zumindest).
- Automatisch. Keine manuelle Hinzufügung von Ports zur Firewall-Konfiguration (wenn Sie eine vertrauenswürdige IP-Liste verwenden).
- Fügen Sie "vertrauenswürdige" IPs hinzu, die mit allen Docker-Containern und allen anderen OS-Prozessen kommunizieren dürfen, die offene Ports auf dem Server haben.
- Öffnen Sie angegebene Docker-Container-Ports oder die OS-Ports des Servers für die Öffentlichkeit (alle) über die Firewall, wie SSH.
- Schnittstellen können ebenfalls angegeben werden. Standardmäßig werden alle Schnittstellen gefiltert. Sie könnten spezifische Netzwerkschnittstellen filtern und alle anderen Schnittstellen (nur eine nicht vertrauenswürdige Schnittstelle angeben).
- Alles erfolgt im "Offline"-Modus. Daher sollten keine Probleme mit Docker auftreten, wenn die iptables-Regeln aktiviert sind.
- Sie müssen kein Experte für iptables sein, um dies zu verwenden.
- Funktioniert auch mit der undocumented-Nutzung von iptables und verschlüsselten Overlay-Netzwerken von Docker Swarm. (iptables-Regeln werden an die INPUT-Kette angehängt).
Diese Lösung verwendet iptables
als Firewall und ipset
, um iptables eine Liste von IPs zu ermöglichen, die erlaubt sind. ipset
ermöglicht es Ihnen auch, einen nicht kontinuierlichen Bereich von IPs zu verwenden.
iptables-Ketten, die verwendet werden, und wie:
INPUT, nicht geleert. Regel wird oben eingefügt, um in eine benutzerdefinierte Kette für OS-bezogene Regeln zu springen.
DOCKER-USER, geleert. Alle Docker (und Docker Swarm)-bezogenen Regeln sind hier, um zu verhindern, dass Container standardmäßig für alle freigegeben werden. Standardmäßig sind nur die Docker-Server-IPs erlaubt. Andere IPs und Container-Ports können vom Benutzer hinzugefügt werden.
FILTERS, geleert. Benutzerdefinierte Kette für die Prozesse des Servers (die nicht Docker sind). Standardmäßig sind nur die Docker-Server-IPs erlaubt. Andere IPs und Container-Ports können vom Benutzer hinzugefügt werden.
iptables-Handbuch: http://ipset.netfilter.org/iptables.man.html
Warnungen
Schließen Sie sich nicht von Ihrem Server aus. Dies ändert Ihre Firewall. Haben Sie immer einen anderen Weg, um hineinzukommen, z. B. eine "Konsole".
Hinweis zu IPs: Dies gilt nur für IPv4. IPv6 wurde nicht getestet. Es ist sicherer, IPv6 auf Ihren Servern zu deaktivieren.
Weitere Sicherheitsüberlegungen:
Wenn Sie Docker nicht im Swarm verwenden, sollten Sie in Betracht ziehen, einen Port an eine interne IP für zusätzliche Sicherheit zu binden.
Wenn Sie Swarm verwenden, sollten Sie in Betracht ziehen, spezifische IPs für die Docker Swarm-Kommunikation zu verwenden.
Zum Beispiel: docker swarm init --advertise-addr 192.168.100.100 --listen-addr=192.168.100.100 --data-path-addr=192.168.100.100
Wichtiger Hinweis: Docker und firewalld kommen nicht gut miteinander aus. Diese Ansible-Rolle enthält eine Überprüfung, die diese Rolle fehlschlagen lässt, wenn der Dienst firewalld läuft oder aktiviert ist.
Für weitere Informationen zu firewalld und Docker:
https://success.docker.com/article/why-am-i-having-network-problems-after-firewalld-is-restarted
https://www.tripwire.com/state-of-security/devops/psa-beware-exposing-ports-docker/
https://docs.docker.com/network/iptables/
SELinux-Bug:
Derzeit gibt es einen Bug mit SELinux, der verhindert, dass die iptables-Regeln in die Datei iptables.save gespeichert werden.
Auswirkungen: Das Speichern der iptables-Regeln ein zweites Mal schlägt stillschweigend fehl.
Ein Workaround wurde hinzugefügt, sodass SELinux chmod erlaubt, mit der iptables.save-Datei zu interagieren.
Alternativ könnten Sie auch SELinux deaktivieren, aber das wird nicht empfohlen.
Bugbericht: https://bugs.centos.org/view.php?id=12648
Siehe unten für weitere Details über die manuelle Durchführung des Workarounds.
WARNUNG:
Stellen Sie sicher, dass Sie zuerst in einer Nicht-Produktionsumgebung testen, ich kann keine Garantien geben und übernehme keine Verantwortung.
Seien Sie vorsichtig, dies wird iptables-Regeln im OS entfernen und hinzufügen. Verwenden Sie es mit Vorsicht.
Vorhandene iptables-Regeln könnten entfernt werden! Bestätigen Sie, was Sie eingerichtet haben, bevor Sie dies ausführen.
Es könnten unbekannte Probleme damit auftreten... verwenden Sie es auf eigenes Risiko!
Getestete Docker-Versionen
Docker Engine - Community Edition Version:
- 19.03.8
- 19.03.9
- 19.03.12
Getestet im normalen Docker-Modus und mit einem 3-Knoten-Docker-Swarm-Cluster.
Getestete Distributionen
- CentOS: 7.7, 7.8
- Ubuntu 18.04
- Ubuntu 20.04
Abhängigkeiten
- iptables & iptables-services
Getestet mit v1.4.21 (Neueste verfügbare Version in CentOS 7)
- ipset & ipset-service
Getestet mit v7.1 (Neueste verfügbare Version in CentOS 7)
Standard-Einstellungen
- Debug aktivieren
debug_enabled_default: false
- Proxy (Benötigt beim Installieren erforderlicher Pakete, wenn hinter einem Proxy)
proxy_env: []
- Rolle standardmäßig deaktiviert. Ändern Sie auf true in group_vars oder Playbook usw.
iptables_docker_managed: false
- Überprüfen, ob der (Docker-)Dienst läuft oder aktiviert ist, und die Rolle fehlschlagen lassen
iptables_docker_check_problem_service_managed: true
- Dienste zur Überprüfung und Fehlschlagen der Rolle
iptables_docker_check_problem_service:
- docker.service
- Konfiguration aus Variablen anzeigen
iptables_docker_show_config: true
- iptables-Service starten
iptables_docker_start: true
- iptables-Paket installieren
iptables_docker_managed_pkg: true
iptables_docker_packages:
- iptables
- iptables-services
- ipset
- ipset-service
- policycoreutils-python # erforderlich für semodule
- Zwingen Sie das Kopieren der ipset-Datei, um das Update des ipset auszulösen
iptables_docker_copy_ipset_force: false
- Zwingen Sie das Kopieren der iptables-Datei, um das Update des iptables auszulösen
iptables_docker_copy_iptables_force: false
- Speicherort der gespeicherten iptables-Konfiguration
iptables_docker_iptables_config_save: /etc/sysconfig/iptables
- Speicherort der gespeicherten ipset-Konfiguration
iptables_docker_ipset_config_dir: /etc/sysconfig/ipset.d
Maximale Elemente von ipset (IPs in der Erlauben-Liste)
Wenn nach der ersten Erstellung geändert, muss manuell gelöscht und neu erstellt werden. 64k IPs sollten ausreichend sein.
iptables_docker_ipset_maxelem: 65536
Benutzereinstellungen
Überschreiben der Docker-Server-IPs (Optional)
Optional die Docker-Server-IPs angeben. Wenn nicht gesetzt, werden die IPs aus der Gruppe docker_hosts im Ansible-Inventar ermittelt.
# iptables_docker_server_ip_allow_set:
# - 192.168.100.100
# - 192.168.100.101
# - 192.168.100.102
- IPs, die mit allen freigegebenen Ports aller Docker-Container und aller freigegebenen Ports der OS-Prozesse arbeiten dürfen.
# iptables_docker_ip_allow_set: []
iptables_docker_ip_allow_set:
- 192.168.100.1
- 192.168.101.0/24
- 192.168.102.0/24
Netzwerkadapter, die für die OS-Regeln eingeschränkt werden sollen
Nur aufgelistete Adapter werden blockiert. Andere werden durchgelassen. Standardmäßig werden alle blockiert (mit '+').
Wenn Sie nur eine bestimmte Netzwerkschnittstelle einschränken möchten, verwenden Sie den genauen Namen.
Wenn Sie alle Schnittstellen des gleichen Typs einschränken möchten, verwenden Sie "interface+", um jede Schnittstelle zu erfassen, da + das Platzhalterzeichen für iptables ist.
Zum Beispiel, um die ethX-Schnittstellen einzuschränken, verwenden Sie "eth+". "eth+" ist ein Platzhalter für alles, was mit eth beginnt.
VERWENDEN SIE NICHT "*". Dies ist kein Platzhalter und stimmt mit nichts überein!
Je weniger hier, desto besser. Sicherer, alle ('+') zu blockieren, aber wenn nicht möglich, fügen Sie zuerst Netzwerkadapter mit hohem Datenverkehr hinzu.
lokal (lo) ist hier nicht erforderlich.
iptables_docker_external_network_adapter:
- "+" # Platzhalter für alles
# - "eth+"
# - "enp0s+"
# - "wlp1s+"
OS-TCP-Ports, die für die Öffentlichkeit geöffnet sind
Ports, zu denen jeder eine Verbindung herstellen kann (öffentliche Zugänglichkeit). Ports hier erlauben allen TCP-Verkehr zu diesen Ports auf der iptables-Ebene.
Nur für Ports des OS, nicht für Docker-Container.
iptables_docker_global_ports_allow_tcp:
- 22 # SSH
OS-UDP-Ports, die für die Öffentlichkeit geöffnet sind
Ports, zu denen jeder eine Verbindung herstellen kann (öffentliche Zugänglichkeit). Ports hier erlauben allen UDP-Verkehr zu diesen Ports auf der iptables-Ebene.
Nur für Ports des OS, nicht für Docker-Container.
iptables_docker_global_ports_allow_udp: []
Netzwerkadapter, die für Docker-Regeln eingeschränkt werden sollen
Standardmäßig wird dasselbe Setup wie für den Netzwerkadapter des OS verwendet.
iptables_docker_swarm_network_adapter: "{{ iptables_docker_external_network_adapter }}"
# iptables_docker_swarm_network_adapter:
# - "+" # Platzhalter für alles
# # - "eth+"
Docker-TCP-Ports, die für die Öffentlichkeit geöffnet sind
Fügen Sie Docker-Container-TCP-Ports hinzu, die Sie für jeden öffnen möchten. Für Docker und Docker Swarm. Docker-Swarm-Ports sind hier nicht erforderlich.
iptables_docker_swarm_ports_allow_tcp: []
# iptables_docker_swarm_ports_allow_tcp:
# - 9000
Docker-UDP-Ports, die für die Öffentlichkeit geöffnet sind
Fügen Sie Docker-Container-UDP-Ports hinzu, die Sie für jeden öffnen möchten. Für Docker und Docker Swarm. Docker-Swarm-Ports sind hier nicht erforderlich.
iptables_docker_swarm_ports_allow_udp: []
- Docker-Brücken-Netzwerkname (docker0) und IP-Bereich (für DOCKER-USER iptables-Quellen erlauben)
iptables_docker_bridge_name: docker0
iptables_docker_bridge_ips: 172.17.0.0/16
- Docker Swarm-Brücken-Netzwerk-IP-Bereich (docker_gwbridge) (für DOCKER-USER iptables-Quellen erlauben)
iptables_docker_swarm_bridge_name: docker_gwbridge
iptables_docker_swarm_bridge_ips: 172.18.0.0/16
Beispiel-Konfigurationsdatei (inventories/dev-env/group_vars/all.yml)
Aus dem folgenden Beispiel:
IPs werden der vertrauenswürdigen Liste hinzugefügt:
192.168.100.1
192.168.101.0/24
Alle Netzwerkschnittstellen werden eingeschränkt, da das Platzhalterzeichen '+' für den iptables_docker_external_network_adapter verwendet wird.
Port 22 wird öffentlich geöffnet.
---
iptables_docker_ip_allow_set:
- 192.168.100.1
- 192.168.101.0/24
iptables_docker_external_network_adapter:
- "+" # Platzhalter für alles
iptables_docker_global_ports_allow_tcp:
- 22 # SSH
Beispiel-Inventardatei
[docker_hosts]
centoslead1 ansible_host=192.168.100.100
centoswork1 ansible_host=192.168.100.101
centoswork2 ansible_host=192.168.100.102
Beispiel-Playbook iptables_docker.yml
---
- hosts: '{{ inventory }}'
become: yes
vars:
# Verwenden Sie diese Rolle
iptables_docker_managed: true
roles:
- ryandaniels.iptables_docker
Nutzung
Stellen Sie vor dem Ausführen sicher, dass Sie überprüfen, ob Sie bereits iptables verwenden! Nichts sollte überschrieben/entfernt werden, es sei denn, Sie verwenden die gleichen iptables-Ketten wie diese.
Standardmäßig werden keine Aufgaben ausgeführt, es sei denn, Sie setzen iptables_docker_managed=true
. Dies ist absichtlich so, um Unfälle bei Personen zu verhindern, die das Handbuch nicht gelesen haben.
ansible-playbook iptables_docker.yml --extra-vars "inventory=centos7 iptables_docker_managed=true" -i hosts-dev
Überspringen Sie die Installation von Paketen (wenn bereits bekannt - beschleunigt die Aufgabe)
ansible-playbook iptables_docker.yml --extra-vars "inventory=centos7 iptables_docker_managed=true" -i hosts --skip-tags=iptables_docker_pkg_install
Zeigen Sie ausführlichere Ausgaben an (Debug-Informationen)
ansible-playbook iptables_docker.yml --extra-vars "inventory=centos7 iptables_docker_managed=true debug_enabled_default=true" -i hosts-dev
Starten Sie den iptables-Dienst nicht oder fügen Sie Regeln für iptables hinzu
ansible-playbook iptables_docker.yml --extra-vars "inventory=centos7 iptables_docker_managed=true iptables_docker_start=false" -i hosts-dev
Zwingen Sie ipset und iptables zur Aktualisierung
ansible-playbook iptables_docker.yml --extra-vars "inventory=centos7 iptables_docker_managed=true iptables_docker_copy_ipset_force=true iptables_docker_copy_iptables_force=true" -i hosts-dev
Zeigen Sie nur die Konfiguration (aus Variablen) an
ansible-playbook iptables_docker.yml --extra-vars "inventory=centos7 iptables_docker_managed=true iptables_docker_show_config=true" -i hosts --tags "iptables_docker_show_config"
Hinweis zur Größenbeschränkung von ipset
Wichtig: Beachten Sie die Größe der "Anzahl der Einträge". Wenn diese Zahl nah an der maxelem-Größe (65536) liegt, müssen Sie das ipset "ip_allow" löschen und mit einer größeren maximalen Größe neu erstellen.
64K sollten für jeden ausreichend sein.
Die Datei befindet sich in: templates/ip_allow.set.j2
create -exist ip_allow hash:ip family inet hashsize 1024 maxelem 65536
Überprüfen Sie die Größe der ipset-Liste:
ipset list | grep "Number of entries"
Wichtige Ausgabe:
Number of entries: 3
SELinux-Manueller Workaround für iptables und chmod
Bug-Daten: https://bugs.centos.org/view.php?id=12648
Das Problem tritt auf, wenn iptables ein zweites Mal gespeichert wird, da SELinux dies blockiert, weil chmod ein Problem mit der Datei iptables.save hat.
Verwenden Sie Folgendes als Workaround, um chmod zu ermöglichen, die iptables.save-Datei zu ändern, falls Sie die Ansible-Rolle nicht verwenden.
Um dies zu reproduzieren, starten Sie den iptables-Dienst neu, nachdem Sie konfiguriert haben, dass die iptables-Konfiguration nach dem Neustart/Stoppen gespeichert wird.
yum install audit policycoreutils policycoreutils-python
ausearch -m AVC,USER_AVC,SELINUX_ERR,USER_SELINUX_ERR -i|tail -55
ausearch -c 'chmod' --raw | audit2allow -M iptables_save_chmod
#oder grep "iptables.save" /var/log/audit/audit.log|tail | audit2allow -M iptables_save_chmod
semodule -i iptables_save_chmod.pp
iptables-Befehlsreferenz
Weitere Befehle finden Sie in der iptables-Dokumentation: http://ipset.netfilter.org/iptables.man.html
Aktive iptables auflisten:
iptables -nvL --line-numbers
Nützliche Befehle für CentOS/RHEL:
cat /etc/sysconfig/ipset.d/ip_allow.set
systemctl restart ipset
ipset list | head
iptables -F DOCKER-USER
iptables -F FILTERS
iptables-restore -n < ansible_iptables_docker-iptables
grep -v "^#" ansible_iptables_docker-iptables
iptables -S INPUT
iptables -S DOCKER-USER
iptables -S FILTERS
Nützliche Befehle für Ubuntu:
vi /etc/iptables/ipsets
#Manuell 'flush' vor 'add' hinzufügen, wenn IPs manuell entfernt werden.
/usr/sbin/netfilter-persistent reload
cat /etc/iptables/ipsets
cat /etc/iptables/rules.v4
Manuelle Befehle (CentOS/RHEL)
Überprüfen Sie, welche iptables-Regeln Sie bereits haben. Notieren Sie sich dies, falls sie verloren gehen!
iptables -nvL --line-numbers
Installieren Sie die erforderlichen Pakete:
yum install iptables iptables-services ipset ipset-service
Wenn Sie SELinux verwenden, installieren Sie auch:
yum install policycoreutils-python
Konfigurieren Sie ipset mit Ihren Server-IP-Adressen und anderen vertrauenswürdigen IPs:
mkdir -p /etc/sysconfig/ipset.d
cat > /etc/sysconfig/ipset.d/ip_allow.set << 'EOF'
create -exist ip_allow hash:ip family inet hashsize 1024 maxelem 65536
add ip_allow 192.168.1.123
add ip_allow 192.168.101.0/24
add ip_allow 192.168.102.0/24
EOF
Starten und aktivieren Sie den ipset-Dienst:
systemctl status ipset
systemctl start ipset
systemctl enable ipset
Überprüfen Sie, was ipset in seiner geladenen Konfiguration hat:
ipset list | head
Die hinzuzufügenden iptables-Regeln (standardmäßig ist Port 22 für alle geöffnet):
cat > ansible_iptables_docker-iptables << 'EOF'
*filter
:DOCKER-USER - [0:0]
:FILTERS - [0:0]
#Kann INPUT nicht leeren. Wiped out docker swarm encrypted overlay rules
#-F INPUT
#Verwenden Sie ansible oder führen Sie einmal manuell aus, um hinzuzufügen -I INPUT -j FILTERS
#-I INPUT -j FILTERS
-A DOCKER-USER -m state --state RELATED,ESTABLISHED -j RETURN
-A DOCKER-USER -i docker_gwbridge -j RETURN
-A DOCKER-USER -s 172.18.0.0/16 -j RETURN
-A DOCKER-USER -i docker0 -j RETURN
-A DOCKER-USER -s 172.17.0.0/16 -j RETURN
#Unten Docker-Ports öffnen, wenn auskommentiert
#-A DOCKER-USER -p tcp -m tcp -m multiport --dports 8000,8001 -j RETURN
#-A DOCKER-USER -p udp -m udp -m multiport --dports 9000,9001 -j RETURN
-A DOCKER-USER -m set ! --match-set ip_allow src -j DROP
-A DOCKER-USER -j RETURN
-F FILTERS
#Weil Docker Swarm encrypted overlay network nur Regeln zur INPUT-Kette hinzufügt. Muss leider ganz oben sein
-A FILTERS -p udp -m policy --dir in --pol ipsec -m udp --dport 4789 -m set --match-set ip_allow src -j RETURN
-A FILTERS -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FILTERS -p icmp -j ACCEPT
-A FILTERS -i lo -j ACCEPT
#Unten OS-Ports öffnen, wenn auskommentiert
-A FILTERS -p tcp -m state --state NEW -m tcp -m multiport --dports 22 -j ACCEPT
#-A FILTERS -p udp -m udp -m multiport --dports 53,123 -j ACCEPT
-A FILTERS -m set ! --match-set ip_allow src -j DROP
-A FILTERS -j RETURN
COMMIT
EOF
Verwenden Sie iptables-restore, um die obigen Regeln in iptables einzufügen. Das sehr wichtige Flag ist -n. Damit wird sichergestellt, dass wir die iptables-Regeln nicht leeren, wenn wir bereits Regeln in Docker (oder Docker Swarm) haben.
iptables-restore -n < ansible_iptables_docker-iptables
Fügen Sie als Nächstes eine Regel zur INPUT-Kette hinzu, damit wir die neuen Regeln in FILTERS verwenden können. Es muss ganz oben stehen und muss nur einmal hinzugefügt werden:
iptables -I INPUT 1 -j FILTERS
Speichern Sie die iptables-Regeln:
/usr/libexec/iptables/iptables.init save
Starten und aktivieren Sie den iptables-Dienst:
systemctl status iptables
systemctl start iptables
systemctl enable iptables
Wenn Sie die iptables-Regeln anpassen möchten, um zu erlauben, dass weitere Ports für alle geöffnet werden, fügen Sie einfach den Port zur entsprechenden Regel in der iptables-Datei (tcp oder udp) hinzu und führen Sie die oben genannten Befehle erneut aus:
iptables-restore -n < ansible_iptables_docker-iptables
/usr/libexec/iptables/iptables.init save
Vergessen Sie nicht die Warnungen oben! Besonders die bezüglich SELinux.
Manuelle Befehle (Ubuntu 20.04)
Überprüfen Sie, welche iptables-Regeln Sie bereits haben. Notieren Sie sich dies, falls sie verloren gehen!
Ubuntu 18.04 ist fast gleich. Außer dass das Paket ipset-persistent
in Ubuntu 18.04 nicht existiert. Daher dieses Paket weglassen und die Dateien von files/ubuntu/iptables-persistent*/plugins/*-ipset
nach /usr/share/netfilter-persistent/plugins.d/
kopieren.
iptables -nvL --line-numbers
Installieren Sie die erforderlichen Pakete:
apt install iptables iptables-persistent netfilter-persistent ipset ipset-persistent
Konfigurieren Sie ipset mit Ihren Server-IP-Adressen und anderen vertrauenswürdigen IPs:
mkdir -p /etc/iptables
cat > /etc/iptables/ipsets << 'EOF'
create -exist ip_allow hash:ip family inet hashsize 1024 maxelem 65536
flush
add ip_allow 192.168.1.123
add ip_allow 192.168.101.0/24
add ip_allow 192.168.102.0/24
EOF
Laden Sie ipset neu:
/usr/sbin/netfilter-persistent reload
Überprüfen Sie, was ipset in seiner geladenen Konfiguration hat:
ipset list | head
Die hinzuzufügenden iptables-Regeln (standardmäßig ist Port 22 für alle geöffnet):
Verwenden Sie denselben Befehl wie oben für CentOS/RHEL.
Verwenden Sie iptables-restore, um die oben genannten Regeln in iptables hinzuzufügen. Das sehr wichtige Flag ist -n. Damit wird sichergestellt, dass wir die iptables-Regeln nicht leeren, wenn wir bereits Regeln in Docker (oder Docker Swarm) haben.
iptables-restore -n < ansible_iptables_docker-iptables
Fügen Sie als Nächstes eine Regel zur INPUT-Kette hinzu, damit wir die neuen Regeln in FILTERS verwenden können. Es muss ganz oben stehen und muss nur einmal hinzugefügt werden:
iptables -I INPUT 1 -j FILTERS
Speichern Sie die iptables-Regeln:
/usr/sbin/netfilter-persistent save
Starten und aktivieren Sie den iptables-Dienst:
systemctl status netfilter-persistent
systemctl start netfilter-persistent
systemctl enable netfilter-persistent
Wenn Sie die iptables-Regeln anpassen möchten, um weitere Ports zuzulassen, die für alle geöffnet werden, fügen Sie einfach den Port zur entsprechenden Regel in der iptables-Datei (tcp oder udp) hinzu und führen Sie die oben genannten Befehle erneut aus:
iptables-restore -n < ansible_iptables_docker-iptables
/usr/sbin/netfilter-persistent save
Vergessen Sie nicht die Warnungen oben!
TODO
- Überprüfen Sie auf firewalld und lassen Sie die Rolle fehlschlagen, wenn sie aktiv ist oder aktiviert wird
- Problem mit dem Speichern von iptables-Regeln für Docker? Sollte in Ordnung sein.
- iptables_docker_ip_allow_set kann nicht leer sein. Wenn ja, macht das keinen Sinn, da nichts blockiert wird!
- Überprüfen Sie in den Netzwerkadaptern auf * und Fehler
- Fügen Sie automatisch eine Liste der Docker-IPs in die erlaubte Liste hinzu (verwendet IPs aus der Inventargruppe docker_hosts)
- Ändern Sie automatisch die vertrauenswürdigen IPs des Docker-Servers, sodass sie überschrieben werden können
- Bestätigen Sie, dass "when" und "tags" korrekt sind
- Ubuntu? Ubuntu hat keine iptables-services oder ipset-service. Hat iptables-persistent und ipset-? Keine UFW-Unterstützung
- ipv6?? Dies gilt nur für ipv4
- Testen Sie, ob TCP-, UDP-Docker-Container- und OS-Ports funktionieren
- Testen Sie, ob der Datenverkehr von Docker-Containern funktioniert
- Hinzufügen eines Tests? Molecule? Nur einen einzelnen Knoten im Swarm-Modus? Wie kann man testen, ob die Verbindung von einer "nicht vertrauenswürdigen" IP nicht funktioniert?
Autor
Ryan Daniels
Manage iptables configuration to secure Docker (including Docker Swarm).
ansible-galaxy install ryandaniels.iptables_docker