Die unkomplizierte Firewall (UFW) blockiert bei Verwendung von Docker nichts

44

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 sshund 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)
ESala
quelle
welche datenbank? Welcher Hafen? Sind Sie sicher, dass dies dieselbe Maschine ist? Was ist die Ausgabe von ufw status
solsTiCe
@solsTiCe Ja, ich bin sicher, es ist die gleiche Maschine. Die Datenbank ist InfluxDB (auf einem Docker-Container) mit Ports 8083und 8086. Ich habe die ufw status verboseAusgabe in der Frage hinzugefügt . Vielen Dank.
ESala

Antworten:

64

Das Problem war die Verwendung der -pFlagge auf Containern.

Es stellt sich heraus, dass Docker Änderungen direkt an Ihrem Gerät vornimmt iptables, die nicht mit angezeigt werden ufw status.

Mögliche Lösungen sind:

  1. Stoppen Sie die -pFlagge. Verwenden Sie stattdessen Docker-Verknüpfungen oder Docker-Netzwerke .

  2. Binden Sie die Behälter lokal, damit sie nicht außerhalb Ihrer Maschine liegen:

    docker run -p 127.0.0.1:8080:8080 ...

  3. Wenn Sie darauf bestehen, die -pFlagge zu verwenden, weisen Sie Docker an, Ihre nicht zu berühren, iptablesindem Sie sie deaktivieren /etc/docker/daemon.jsonund 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.

ESala
quelle
8
Das ist so nützlich - ich war verrückt danach, auf Ports zugreifen zu können, die ich in ufw nicht zugelassen hatte. Die Verwendung von iptables = false führt jedoch häufig dazu, dass Container auf localhost verfügbar werden, z. B. für das Reverse-Proxying. Um sicherzustellen, dass der Container korrekt abhört, verwenden Sie nicht -p 80:80, sondern -p 127.0.0.1:80:80 oder einen anderen Port wie 127.0.0.1:3000:80 für Reverse-Proxying mit Nginx oder Apache und ohne Port Zusammenstöße.
Andreas Reiff
2
@AndreasReiff du hast recht, aber in letzter Zeit habe ich es am besten gefunden, -pso 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:80und a --linkfür die anderen ein. Auf diese Weise können keine Portkonflikte auftreten, und der einzige Zugriffspunkt ist nginx.
ESala
1
Überprüfen Sie auch diesen Beitrag für eine dritte Vorsichtsmaßnahme, die Sie treffen müssen! svenv.nl/unixandlinux/dockerufw
Henk
1
Wichtig : /etc/default/dockerIst eine Konfigurationsdatei, die von der Upstart-Konfiguration verwendet wird. Wenn Sie von "upstart" nach "systemd" gewechselt sind, wird diese Datei nicht verwendet.
Orshachar
@ESala Sie sollten darüber nachdenken, die Markierung dieser Antwort aufzuheben, da sie datiert ist.
Ctbrown
8

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.jsonund Folgendes einfügen:

{
    "iptables": false
}

Ich habe dann sudo service docker stopdann sudo service docker startENDLICH Docker ausgegeben, folgt einfach den entsprechenden Regeln in UFW.

Zusätzliche Daten: Docker setzt UFW außer Kraft!

Hal Jordan
quelle
Mit Ubuntu 16.04 und Docker Version 17.09 unterbricht diese Lösung die ausgehende Verbindung von den Containern. Siehe Antwort askubuntu.com/a/833363/262702 und askubuntu.com/a/954041/262702
ctbrown
5

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 der iptablesSchlüssel konfiguriert ist:

{   "iptables" : false }

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_POLICYwie ACCEPTauf /etc/default/ufwund gelten beschriebenen Trick hier: https://stackoverflow.com/a/17498195/507564

orshachar
quelle
2

Eine schnelle Problemumgehung besteht darin, Docker auszuführen und die Portzuordnung durchzuführen. Das kannst du immer tun

docker run ...-p 127.0.0.1:<ext pot>:<internal port> ...

um zu verhindern, dass von außen auf Ihren Docker zugegriffen werden kann.

kimy82
quelle
2

Verwendung /etc/docker/daemon.jsonmit Inhalten

{
  "iptables": false
}

hö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.jsonDatei erstellt haben, rufen Sie Folgendes auf:

sed -i -e 's/DEFAULT_FORWARD_POLICY="DROP"/DEFAULT_FORWARD_POLICY="ACCEPT"/g' /etc/default/ufw
ufw reload

So richten Sie die Standardweiterleitungsrichtlinie in UFW zum Akzeptieren ein und verwenden Folgendes:

iptables -t nat -A POSTROUTING ! -o docker0 -s 172.17.0.0/16 -j MASQUERADE

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!

mkubaczyk
quelle
1

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 :

Wenn Sie -pflag für Container verwenden, nimmt Docker Änderungen direkt an iptables vor und ignoriert das ufw.

Beispiel für Datensätze, die von Docker zu iptables hinzugefügt wurden

Routing zur 'DOCKER'-Kette:

-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER

Weiterleiten von Paketen von der 'DOCKER'-Kette zum Container:

-A DOCKER -i docker0 -j RETURN
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 6379 -j DNAT --to-destination 172.17.0.3:6379

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):

-A PREROUTING -s 1.1.1.1 -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT -s 1.1.1.1 ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER

Möglicherweise möchten Sie iptables-Regeln verwenden iptables-save > /tmp/iptables.confund iptables-restore < /tmp/iptables.confsichern, bearbeiten und wiederherstellen.

AI Mechanic
quelle
0

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.

thecoder
quelle
0
  1. Melden Sie sich bei Ihrer Docker-Konsole an:

    sudo docker exec -i -t docker_image_name / bin / bash

  2. Und dann in Ihrer Docker-Konsole:

    sudo apt-get update
    sudo apt-get install ufw
    sudo ufw allow 22
    
  3. Fügen Sie Ihre UFW-Regeln hinzu und aktivieren Sie das UFW

    sudo ufw aktivieren

    • Ihr Docker-Image muss mit --cap-add = NET_ADMIN gestartet werden

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)

vim /var/lib/docker/containers/containerid/hostconfig.json

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.

Stefan
quelle
0

Früher habe ich docker-composemehrere 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.ymlDatei:

ports:
- "1234:1234"

dazu:

ports:
- "1234"

Jetzt können die anderen Docker-Container den Port noch benutzen, aber ich kann von außen nicht darauf zugreifen.

TmTron
quelle