Mein Ziel ist es, den Zugriff auf Docker-Container auf einige wenige öffentliche IP-Adressen zu beschränken. Gibt es einen einfachen, wiederholbaren Prozess, um mein Ziel zu erreichen? Wenn ich nur die Grundlagen von iptables verstehe, während ich die Standardoptionen von Docker verwende, finde ich es sehr schwierig.
Ich möchte einen Container ausführen, ihn für das öffentliche Internet sichtbar machen, aber nur Verbindungen von ausgewählten Hosts zulassen. Ich würde erwarten, eine Standard-INPUT-Richtlinie von REJECT festzulegen und dann nur Verbindungen von meinen Hosts zuzulassen. Aber Dockers NAT-Regeln und -Ketten stören und meine INPUT-Regeln werden ignoriert.
Kann jemand ein Beispiel dafür liefern, wie ich mein Ziel erreichen kann, wenn ich die folgenden Annahmen mache?
- Host öffentliche IP 80.80.80.80 auf eth0
- Host private IP 192.168.1.10 auf eth1
docker run -d -p 3306:3306 mysql
- Alle Verbindungen zu Host / Container 3306 mit Ausnahme der Hosts 4.4.4.4 und 8.8.8.8 blockieren
Ich bin froh, den Container nur an die lokale IP-Adresse zu binden, benötige aber Anweisungen zum Einrichten der iptables-Weiterleitungsregeln, die den Docker-Prozess und den Neustart des Hosts überstehen.
Vielen Dank!
--ctdir
? Ich benutze-m conntrack --ctstate NEW --ctorigdstport 3306 --ctdir ORIGINAL
DOCKER-USER
den folgenden Eintrag enthält: Dieser-A DOCKER-USER -j RETURN
wird vor dem oben genannten ausgeführt, wenn Sie ihn verwenden-A
. Eine Lösung besteht darin, Regeln in umgekehrter Reihenfolge am Kopf einzufügen-I
.FILTERS
Kette ein und-I
fügen Sie neue Regeln ein (wie Sie gesagt haben), um-I INPUT -j FILTERS
-I DOCKER-USER -i eth0 -j FILTERS
-I
, um auf Nummer sicher zu gehen.Mit Docker v.17.06 gibt es eine neue iptables-Kette namens DOCKER-USER. Dieser ist für Ihre benutzerdefinierten Regeln bestimmt: https://docs.docker.com/network/iptables/
Anders als die Kette DOCKER wird sie beim Bauen / Starten von Containern nicht zurückgesetzt. Sie können diese Zeilen also zu Ihrer iptables-Konfiguration / Ihrem iptables-Skript hinzufügen, um den Server bereitzustellen, noch bevor Sie docker installieren und die Container starten:
Jetzt ist der Port für MySQL für den externen Zugriff gesperrt (eth0), obwohl Docker den Port für die Welt öffnet. (Diese Regeln setzen voraus, dass Ihre externe Schnittstelle eth0 ist.)
Irgendwann müssen Sie iptables bereinigen und den Docker-Dienst zuerst neu starten, wenn Sie es zu sehr vermasselt haben und versucht haben, den Port wie ich zu sperren.
quelle
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION
diesem Grund werden die benutzerdefinierten Anweisungen vor der DOCKER-Kette ausgeführt.--dport
innerhalb von DOCKER-USER die interne IP- Adresse des Containerdienstes und nicht der exponierte Port übereinstimmen muss . Diese stimmen oft überein, aber nicht immer, und dies kann leicht zu Konflikten mit anderen Diensten führen. Daher behaupte ich immer noch, dass diese DOCKER-USER-Lösung nur halbherzig ist.UPDATE : Diese Lösung ist zwar gültig im Jahr 2015, aber nicht mehr der richtige Weg, dies zu tun.
Die Antwort scheint in der Dokumentation von Docker unter https://docs.docker.com/articles/networking/#the-world zu stehen
Am Ende habe ich Folgendes getan:
Ich habe die Optionen
--iptables
oder nicht--icc
angerührt.quelle
iptables -vnL DOCKER
sind die Zielports alle Ports im Container. Wenn ich das richtig verstehe, bedeutet dies, dass die obigen Regeln nur den Port3306
innerhalb des Containers betreffen. Wenn Sie sich also in-p 12345:3306
Ihrem Container befinden, ist Ihre Regel immer noch diejenige, die zum Sperren des Zugriffs erforderlich ist (dh--dport 12345
nicht funktioniert). , weil die ACCEPT-Regeln der DOCKER-Kette Post-NAT sind.--iptables=false
, da dies die schlechteste Wahl von allen zu sein scheint.UPDATE: Während diese Antwort noch gültig ist, ist die Antwort von @SystemParadox
DOCKER-USER
in Kombination mit--ctorigdstport
besser.Hier ist eine Lösung, die zwischen Neustarts gut erhalten bleibt und es Ihnen ermöglicht, den exponierten Port und nicht den internen Port zu beeinflussen.
iptables -t mangle -N DOCKER-mysql iptables -t mangle -A DOCKER-mysql -s 22.33.44.144/32 -j RETURN iptables -t mangle -A DOCKER-mysql -s 22.33.44.233/32 -j RETURN iptables -t mangle -A DOCKER-mysql -j DROP iptables -t mangle -A PREROUTING -i eth0 -p tcp -m tcp --dport 3306 -j DOCKER-mysql
Ich habe ein Docker-Image erstellt, das diese Methode verwendet, um die iptables automatisch für Sie zu verwalten, entweder mithilfe von Umgebungsvariablen oder dynamisch mit etcd (oder beiden):
https://hub.docker.com/r/colinmollenhour/confd-firewall/
quelle