Docker: Richtige Methode, um den Zugriff auf bestimmte IP-Adressen zu beschränken

7

Ich habe einen Docker-Container, der Port 3306 dem Internet zugänglich macht. Ich möchte den Zugriff auf bestimmte öffentliche IP-Adressen beschränken. Als Beispiel verwenden wir 1.2.3.4.

Als zusätzliche Bedingung möchte ich, dass die Regeln den Neustart des Docker-Dämons und den Neustart des Servers überleben. Auf diese Weise kann ich iptables-persistent( iptables-save/ iptables-restore) verwenden, um die Regeln beim Neustart des Servers wiederherzustellen, ohne dass der dockerdStart den Server stört.

Ich habe folgendes versucht:

  1. Ändern der FORWARDKette:

    iptables -I FORWARD -p tcp --dport 3306 -j REJECT
    iptables -I FORWARD -p tcp --dport 3306 -s 1.2.3.4 -j ACCEPT
    

    Dies funktioniert, wenn Sie nach dem Starten des Docker-Dämons fertig sind. Beim Neustart des Dämons fügt Docker am oberen Rand der Kette zusätzliche Regeln ein, und meine benutzerdefinierten Regeln werden ignoriert.

  2. Ändern der DOCKERKette:

    iptables -N DOCKER # if chain does not yet exist
    iptables -I DOCKER -p tcp --dport 3306 -j REJECT
    iptables -I DOCKER -p tcp --dport 3306 -s 1.2.3.4 -j ACCEPT
    

    Dies funktioniert bis dockerdzum Neustart. Es sieht so aus, als würde dockerddie DOCKERKette beim Neustart gelöscht, und alle benutzerdefinierten Regeln sind weg.

  3. Verwenden Sie --iptables=false. Während dies im Prinzip funktioniert, bricht diese Lösung die Standard-Docker-Weiterleitungsfunktionen und erfordert das manuelle Einrichten der Weiterleitungsregeln.

Ich wäre überrascht, wenn es keinen richtigen Weg gibt, dies zu tun. Irgendwelche Ideen?

PS: Ich habe etwas gelesen, ohne Erfolg (z. B. Schritte zum Einschränken externer Verbindungen zum Docker-Container mit iptables ? , Docker - Von außen zugängliche Ports - Regeln für iptables werden ignoriert , aber diese Fragen scheinen das Problem des Neustarts nicht zu lösen. )

Peter Thomassen
quelle

Antworten:

1

Dockersd kann mit der Option ausgeführt werden:

--iptables = false

Wenn es nicht manuell ausgeführt, sondern als Dienst verwendet wird, reicht es aus, die folgende Zeile in der Konfigurationsdatei /etc/docker/daemon.json hinzuzufügen oder zu ändern :

"iptables": false,

Eine ausführlichere Dokumentation finden Sie hier

SteDf
quelle
1
Während dies im Prinzip funktioniert, muss ich die gesamte Weiterleitung manuell erledigen. Ich suche nach einer Lösung, bei der Docker die Weiterleitungsregeln wie gewohnt verwaltet, aber zusätzlich benutzerdefinierte Regeln zulässig sind.
Peter Thomassen