
Ich möchte Verbindungen zu laufenden Docker-Containern beschränken. Ich habe einen Satz iptables
Regeln, die dies effektiv tun. Der Regelsatz hängt jedoch davon ab, dass ich vor der DOCKER
Kette 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 systemd
Datei 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, iptables
damit ich die gewünschte Ausgabe erhalte?
Der Vollständigkeit halber sind hier die Inhalte, /var/lib/iptables/rules-save
die 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