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

Über das Projekt

Manage iptables configuration to secure Docker (including Docker Swarm).

Installieren
ansible-galaxy install ryandaniels.iptables_docker
Lizenz
mit
Downloads
2.7k
Besitzer
Ansible all the things