Wie können iptables-Regeln hinzugefügt werden, nachdem Docker beim Start seine eigenen Regeln festgelegt hat?

Wie können iptables-Regeln hinzugefügt werden, nachdem Docker beim Start seine eigenen Regeln festgelegt hat?

Ich möchte Verbindungen zu laufenden Docker-Containern beschränken. Ich habe einen Satz iptablesRegeln, die dies effektiv tun. Der Regelsatz hängt jedoch davon ab, dass ich vor der DOCKERKette meine eigene Regelkette anwende.

Im Grunde möchte ich dieses Ergebnis

Chain FORWARD (policy DROP)
target     prot opt source               destination
PRE_DOCKER  all  --  0.0.0.0/0            0.0.0.0/0            /* Insert before Docker's filtering to apply our own */
DOCKER     all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0

Chain PRE_DOCKER (policy DROP)
target     prot opt source               destination
//My own rules go here targeting the DOCKER chain

Ich habe Probleme, diese Regeln beim Systemstart festzulegen. Ich habe eine systemdDatei mit dem Inhalt

[Unit]
Description=Restore iptables firewall rules
Before=iptables-store.service
Requires=docker.service
After=docker.service
Conflicts=shutdown.target

[Service]
Type=oneshot
ExecStart=/sbin/iptables-restore --noflush /var/lib/iptables/rules-save

[Install]
WantedBy=basic.target

Aber beim Start erhalte ich den Fehler

iptables-restore v1.4.21: Couldn't load target `DOCKER':No such file or directory

was meiner Meinung nach bedeutet, dass der Docker-Dienst seine Regeln noch nicht erstellt hat.

Wie strukturiere ich meine Unit-Dateien oder meine Regeln richtig, iptablesdamit ich die gewünschte Ausgabe erhalte?

Der Vollständigkeit halber sind hier die Inhalte, /var/lib/iptables/rules-savedie ich eingerichtet habe.

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
:PRE_DOCKER - [0:0]

-I FORWARD -o docker0 -j PRE_DOCKER -m comment --comment "Insert before Docker's filtering to apply our own"
-A PRE_DOCKER ! -i eth0 -o docker0 -j DOCKER -m comment --comment "Anything coming from something other than the public interface send to DOCKER chain"
-A PRE_DOCKER -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -m comment --comment "Allow connections from established connections"
-A PRE_DOCKER -j DROP -m comment --comment "Drop anything else"

-A INPUT ! -i eth0 -j ACCEPT -m comment --comment "Accept anything coming from something other than the public interface"
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -m comment --comment "Allow connections from established connections"
COMMIT

Antwort1

Ich konnte das wirklich nicht herausfinden. Ich vermute, es gibt ein Zeitproblem, wenn docker.service die iptables DOCKER-Kette erstellt, im Vergleich zu dem Zeitpunkt, an dem systemd sie als abgeschlossen oder gestartet betrachtet.

Ich bin also auf ein Polling-Verfahren zurückgegriffen, welches prüft, ob die Kette vorhanden ist und erst dann versucht, die Regeln wiederherzustellen.

while ! iptables -n --list DOCKER >/dev/null 2>&1
do
    sleep 1;
done

/sbin/iptables-restore --noflush /var/lib/iptables/rules-save

verwandte Informationen