22.4.2017 Linux Docker Firewall

Wer schlau ist, setzt natürlich für seine Server eine Firewall ein, egal ob Linux oder Windows. Unter Linux nutzen eigentlich alle iptables, bzw. ufw für eine einfacherer Syntax.

Problem

Wenn man Docker-Container mit Portfreigaben erstellt, greift Docker im Hintergrund auf iptables zu, um diese Portfreigaben zu öffnen. Dabei übergeht ìptables die vordefinierten Regeln von ufw und öffnet den Port. Das ist nicht nur unschön, sondern auch gefährlich, zum Beispiel, wenn sich hinter dem Port ein Datenbank-Server verbirgt.

Lösung

Es gibt jedoch eine einfache Lösung für das Problem mit Docker und ufw. Man deaktiviert iptables für Docker. Dazu legt man eine Datei /etc/docker/daemon.json an und schreibt folgende Zeilen hinein:

{
    "iptables": false
}

Nach einem Neustart des Docker-Dienstes sollten die Ports geschlossen sein. Jetzt müssen natürlich alle Portfreigaben mit ufw geöffnet werden, die erreichbar sein sollen. Auch kann es sein, dass das interne Netz von Docker in die Regeln mit aufgenommen werden muss, weil auch dieses vorher über iptables geregelt wurde.

Nachtrag

Leider habe ich vergessen zu erwähnen, dass auch noch 2 Anpassungen für ufw gemacht werden müssen:

1. Default-Policy von ufw

In der Datei /etc/default/ufw muss eine Zeile angepasst werden.

DEFAULT_FORWARD_POLICY="ACCEPT"

2. NAT-Brücke für das Docker-Subnetz

Die NAT-Brücke definiert man am besten in der /etc/ufw/after.rules-Datei. Dazu muss sich vorher der Subnetzbereich von Docker angeschaut werden. Das kann man am besten mit ifconfig machen. Dort wird einem der Docker-Netzadapter und der IP-Adressbereich angezeigt. Standardmäßig ist der Netzadapter docker0 und das Subnetz hat den Bereich 172.17.0.0/16.

Dann kann am Ende der Datei /etc/ufw/after.rules folgendes eingefügt werden:

*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING ! -o docker0 -s 172.17.0.0/16 -j MASQUERADE
COMMIT

Nach einem Neustart von ufw (systemctl restart ufw) können auch die Docker-Container mit dem Internet und dem Docker-Host kommunizieren.

Nach oben