Dies ist das erste Mal, dass ich einen Ubuntu-Server (14.04 LTS) einrichte, und ich habe Probleme beim Konfigurieren der Firewall (UFW).
Ich brauche nur ssh
und http
, also mache ich das:
sudo ufw disable
sudo ufw reset
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw enable
sudo reboot
Ich kann jedoch weiterhin eine Verbindung zu Datenbanken über andere Ports dieses Computers herstellen . Irgendeine Idee, was ich falsch mache?
BEARBEITEN : Diese Datenbanken befinden sich in Docker-Containern. Könnte das zusammenhängen? Überschreibt es meine UFW-Konfiguration?
EDIT2 : Ausgabe vonsudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere
80/tcp ALLOW IN Anywhere
22/tcp (v6) ALLOW IN Anywhere (v6)
80/tcp (v6) ALLOW IN Anywhere (v6)
ufw status
8083
und8086
. Ich habe dieufw status verbose
Ausgabe in der Frage hinzugefügt . Vielen Dank.Antworten:
Das Problem war die Verwendung der
-p
Flagge auf Containern.Es stellt sich heraus, dass Docker Änderungen direkt an Ihrem Gerät vornimmt
iptables
, die nicht mit angezeigt werdenufw status
.Mögliche Lösungen sind:
Stoppen Sie die
-p
Flagge. Verwenden Sie stattdessen Docker-Verknüpfungen oder Docker-Netzwerke .Binden Sie die Behälter lokal, damit sie nicht außerhalb Ihrer Maschine liegen:
docker run -p 127.0.0.1:8080:8080 ...
Wenn Sie darauf bestehen, die
-p
Flagge zu verwenden, weisen Sie Docker an, Ihre nicht zu berühren,iptables
indem Sie sie deaktivieren/etc/docker/daemon.json
und neu starten:{ "iptables" : false }
Ich empfehle Option 1 oder 2. Beachten Sie, dass Option 3 Nebenwirkungen hat , z. B., dass Container keine Verbindung zum Internet herstellen können.
quelle
-p
so viel wie möglich zu vermeiden . Im Fall eines Reverse-Proxys ordne ich beispielsweise keinen Port für die Worker-Container zu und füge dann nginx in den eigenen Container mit-p 80:80
und a--link
für die anderen ein. Auf diese Weise können keine Portkonflikte auftreten, und der einzige Zugriffspunkt ist nginx./etc/default/docker
Ist eine Konfigurationsdatei, die von der Upstart-Konfiguration verwendet wird. Wenn Sie von "upstart" nach "systemd" gewechselt sind, wird diese Datei nicht verwendet.16.04 stellt neue Herausforderungen. Ich habe alle Schritte wie gezeigt Docker hinter dem UFW Firewall läuft ABER ich konnte nicht Docker und UFW zur Arbeit auf 16,04 bekommen. Mit anderen Worten, egal was ich getan habe, alle Docker-Ports wurden global dem Internet ausgesetzt. Bis ich dies gefunden habe: Wie man Docker 1.12+ so einstellt, dass IPTABLES / FirewallD NICHT gestört wird
Ich musste die Datei erstellen
/etc/docker/daemon.json
und Folgendes einfügen:Ich habe dann
sudo service docker stop
dannsudo service docker start
ENDLICH Docker ausgegeben, folgt einfach den entsprechenden Regeln in UFW.Zusätzliche Daten: Docker setzt UFW außer Kraft!
quelle
Wenn Sie das Init-System von systemd (Ubuntu 15.10 und höher) verwenden, bearbeiten Sie das
/etc/docker/daemon.json
(muss möglicherweise erstellt werden, wenn es nicht vorhanden ist), und stellen Sie sicher, dass deriptables
Schlüssel konfiguriert ist:BEARBEITEN : Dies kann dazu führen, dass Sie die Verbindung zum Internet aus Containern verlieren
Wenn Sie UFW aktiviert haben, stellen Sie sicher, dass Sie von Containern aus auf das Internet zugreifen können. wenn nicht - Sie definieren müssen ,
DEFAULT_FORWARD_POLICY
wieACCEPT
auf/etc/default/ufw
und gelten beschriebenen Trick hier: https://stackoverflow.com/a/17498195/507564quelle
Eine schnelle Problemumgehung besteht darin, Docker auszuführen und die Portzuordnung durchzuführen. Das kannst du immer tun
um zu verhindern, dass von außen auf Ihren Docker zugegriffen werden kann.
quelle
Verwendung
/etc/docker/daemon.json
mit Inhaltenhört sich vielleicht nach einer Lösung an , funktioniert aber nur bis zum nächsten Neustart . Danach stellen Sie möglicherweise fest, dass keiner Ihrer Container Zugriff auf das Internet hat, sodass Sie beispielsweise keine Website pingen können. Es kann unerwünschtes Verhalten sein.
Gleiches gilt für die Bindung eines Containers an eine bestimmte IP. Das möchten Sie vielleicht nicht. Die ultimative Option ist, einen Container zu erstellen und ihn hinter UFW zu haben, unabhängig davon, was passiert und wie Sie diesen Container erstellen. Es gibt also eine Lösung:
Nachdem Sie eine
/etc/docker/daemon.json
Datei erstellt haben, rufen Sie Folgendes auf:So richten Sie die Standardweiterleitungsrichtlinie in UFW zum Akzeptieren ein und verwenden Folgendes:
Wenn Sie docker-compose verwenden möchten, sollte der obige Befehl IP from durch IP von network docker-compose ersetzt werden, wenn Sie es mit ausführen
docker-compose up
.Ich habe das Problem und die Lösung in diesem Artikel ausführlicher beschrieben
Ich hoffe es hilft!
quelle
In meinem Fall habe ich iptables so geändert, dass nur von bestimmten IP-Adressen aus auf Docker zugegriffen werden kann.
Wie pro Esala Antwort :
Beispiel für Datensätze, die von Docker zu iptables hinzugefügt wurden
Routing zur 'DOCKER'-Kette:
Weiterleiten von Paketen von der 'DOCKER'-Kette zum Container:
Sie können iptables so ändern, dass der Zugriff auf die DOCKER-Kette nur von der angegebenen Quell-IP-Adresse aus möglich ist (z. B.
1.1.1.1
):Möglicherweise möchten Sie iptables-Regeln verwenden
iptables-save > /tmp/iptables.conf
undiptables-restore < /tmp/iptables.conf
sichern, bearbeiten und wiederherstellen.quelle
Verwenden Sie --network = host, wenn Sie den Container starten, damit Docker den Port einem isolierten Host-Netzwerk anstelle des Standard-Bridge-Netzwerks zuordnet. Ich sehe keine legalen Möglichkeiten, ein überbrücktes Netzwerk zu blockieren. Alternativ können Sie ein benutzerdefiniertes Netzwerk mit Isolation verwenden.
quelle
Melden Sie sich bei Ihrer Docker-Konsole an:
Und dann in Ihrer Docker-Konsole:
Fügen Sie Ihre UFW-Regeln hinzu und aktivieren Sie das UFW
So aktivieren Sie die Docker-Option "NET_ADMIN":
1. Stop Container:
Hafenarbeiter stoppen Sie Ihren Container; 2. Container-ID abrufen:
Hafenarbeiter inspizieren Ihren Container; 3.Modify hostconfig.json (Standard-Docker-Pfad: / var / lib / docker, Sie können Ihren ändern)
4.Suchen Sie nach "CapAdd" und ändern Sie null in ["NET_ADMIN"].
...., "VolumesFrom": null, "CapAdd": ["NET_ADMIN"], "CapDrop": null, .... 5.Starten Sie den Docker auf dem Host-Computer neu.
Neustart des Service Dockers; 6.Starten Sie Ihren Conatiner.
Docker Starten Sie Ihren Container.
quelle
Früher habe ich
docker-compose
mehrere Container gestartet und hatte auch das Problem, dass ein Port der Welt ausgesetzt war, indem ich ufw-Regeln ignorierte.Das Update, um den Port nur für meine Docker-Container verfügbar zu machen, war die folgende Änderung in meiner
docker-compose.yml
Datei:dazu:
Jetzt können die anderen Docker-Container den Port noch benutzen, aber ich kann von außen nicht darauf zugreifen.
quelle