it-swarm.com.de

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

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 mich aber immer noch mit Datenbanken an anderen Ports dieses Computers verbinden. Irgendeine Idee, was ich falsch mache?

EDIT: Diese Datenbanken befinden sich in Docker-Containern. Könnte das zusammenhängen? Überschreibt es meine UFW-Konfiguration?

EDIT2: Ausgabe von Sudo 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)
42
ESala

Das Problem bestand darin, das Flag -p für Container zu verwenden.

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

Mögliche Lösungen sind:

  1. Verwenden Sie das -p -Flag nicht mehr. Verwenden Sie stattdessen die Docker-Verknüpfung 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, das Flag -p zu verwenden, weisen Sie Docker an, Ihr iptables nicht zu berühren, indem Sie es in /etc/docker/daemon.json deaktivieren und neu starten:

    { "iptables" : false }

Ich empfehle Option 1 oder 2. Beachten Sie, dass Option 3 hat Nebenwirkungen , wie Container, die keine Verbindung zum Internet herstellen können.

61
ESala

16.04 stellt neue Herausforderungen. Ich habe alle Schritte wie gezeigt ausgeführt Docker hinter der UFW-Firewall ausführenABER Ich konnte Docker plus UFW NICHT zum Laufen bringen am 16.04. 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 /etc/docker/daemon.json erstellen und Folgendes einfügen:

{
    "iptables": false
}

Ich habe dann Sudo service docker stop dann Sudo service docker start ausgegeben. ENDLICH folgt docker einfach den entsprechenden Regeln in UFW.

Zusätzliche Daten: Docker überschreibt UFW!

8
Hal Jordan

Wenn Sie das Init-System von systemd (Ubuntu 15.10 und höher) verwenden, bearbeiten Sie den /etc/docker/daemon.json (muss möglicherweise erstellt werden, wenn er nicht vorhanden ist), und stellen Sie sicher, dass der iptables -Schlüssel konfiguriert ist:

{   "iptables" : false }

EDIT: Dies kann dazu führen, dass Sie die Verbindung zum Internet aus Containern heraus verlieren

Wenn Sie UFW aktiviert haben, stellen Sie sicher, dass Sie von Containern aus auf das Internet zugreifen können. Wenn nicht, müssen Sie DEFAULT_FORWARD_POLICY als ACCEPT für /etc/default/ufw definieren und den hier beschriebenen Trick anwenden: https://stackoverflow.com/a/17498195/507564

4
orshachar

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.

2
kimy82

Verwendung von /etc/docker/daemon.json mit Inhalten

{
  "iptables": false
}

klingt vielleicht nach einer Lösung , 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 die Datei /etc/docker/daemon.json 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 ihn mit docker-compose up ausführen.

Ich habe das Problem und die Lösung ausführlicher beschrieben in diesem Artikel

Ich hoffe es hilft!

2
mkubaczyk

In meinem Fall habe ich iptables so geändert, dass nur von bestimmten IP-Adressen aus auf Docker zugegriffen werden kann.

Gemäß Antwort von ESala :

Wenn Sie das -p -Flag 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 an den 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 über die angegebene Quell-IP-Adresse (z. B. 1.1.1.1) möglich ist:

-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-save > /tmp/iptables.conf und iptables-restore < /tmp/iptables.conf verwenden, um iptables-Regeln zu sichern, zu bearbeiten und wiederherzustellen.

1
AI Mechanic
  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.

0
Stefan

Verwenden Sie --network = Host, wenn Sie den Container starten, damit Docker den Port einem isolierten Host-Netzwerk anstatt einem Standardbrückennetzwerk zuordnet. Ich sehe keine legalen Möglichkeiten, ein überbrücktes Netzwerk zu blockieren. Alternativ können Sie ein benutzerdefiniertes Netzwerk mit Isolation verwenden.

0
thecoder

Ich habe docker-compose verwendet, um mehrere Container zu starten, und hatte auch das Problem, dass ein Port der Welt ausgesetzt war, indem ich ufw-Regeln ignorierte.

Der Fix, um den Port nur für meine Docker-Container verfügbar zu machen, war diese Änderung in meiner docker-compose.yml -Datei:

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.

0
TmTron