it-swarm.com.de

Wie kann ich meine Firewall für Docker konfigurieren?

Mein Computer hostet eine Anwendung auf Port 1234, auf die nur von meinem Computer aus zugegriffen werden darf. Mein Docker-Container (auf dem Apache ausgeführt wird) sollte jedoch darauf zugreifen können. In ähnlicher Weise hostet mein Docker-Container eine Reihe von Ressourcen an verschiedenen Ports, auf die ebenfalls nur von meinem Computer aus zugegriffen werden kann. Dies wird durch die Tatsache weiter erschwert, dass mein System eine Bridge für dieses bestimmte Netzwerk verwendet:

NETWORK ID          NAME                DRIVER              SCOPE
4d4b5e752963        bridge              bridge              local               
c387eb42698a        project_default     bridge              local               
6818c0eb94bf        Host                Host                local               
f7e4ed6c05a2        none                null                local  

Diese Bridge hat (ärgerlicherweise) immer eine zufällig generierte ID, die sich bei jedem Neustart des Docker Compose-Setups ändert:

br-c387eb42698a Link encap:Ethernet  HWaddr 02:42:29:95:fd:2c  
          inet addr:172.18.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:29ff:fe95:fd2c/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:405753 errors:0 dropped:0 overruns:0 frame:0
          TX packets:530699 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:85147217 (85.1 MB)  TX bytes:75260996 (75.2 MB)

Kurz gesagt, ich brauche Folgendes:

  • Beliebig Host auf br-c387eb42698a (oder wie auch immer der Netzwerkname lautet), um auf Port 1234 auf meinem lokalen Computer zuzugreifen (praktischerweise 172.18.0.1)
  • Mein Rechner soll auf irgendeinen Port auf irgendeinen Host in diesem Subnetz zugreifen können. (Standard)
  • Die Welt wird niemals in der Lage sein, auf irgendeinen Port vom Subnetz aus zuzugreifen oder Port 1234.

Im Idealfall würde eine Lösung hier IP-unabhängig funktionieren, sodass es nicht darauf ankommt, dass sich die Bridge im Subnetz 172.18.0.0/24 befindet, und dass keine Daten verloren gehen oder verloren gehen, wenn ich mit einem Netzwerk verbunden bin, das passiert um das Subnetz 172.18.0.0/24 zu enthalten.

Das Einfachste, was ich mir vorstellen kann, ist, den Namen der Benutzeroberfläche zu verwenden und daraufhin UFW-Regeln einzurichten, aber das kann ich nicht wirklich, da sich meine Benutzeroberfläche ständig ändert.

Wie kann ich das machen? Während ich dies lieber in reinem ufw (oder iptables, falls erforderlich) tun möchte, bin ich offen für Lösungen, bei denen Docker so konfiguriert wird, dass immer eine dauerhafte ID (oder sogar ein benutzerdefinierter Name?) Zugewiesen wird die Bridge-Schnittstelle.

3
Kaz Wolfe

Dies ist in Vanilla UFW nicht möglich, da sich der Schnittstellenname in einem konstanten Zustand der Unwahrscheinlichkeit befindet. Um so etwas einzurichten, sollte ein manuell definiertes Netzwerk erstellt werden. Kurz gesagt, man kann die Treiberoptionen von Dockers bridge in der Compose-Konfiguration verwenden, um ein benutzerdefiniertes Netzwerk zu erstellen. Das wird ungefähr so ​​aussehen:

networks:
    my_bridge:
        driver: bridge
        driver_opts:
            com.docker.network.bridge.name: my-bridge

Von hier aus kann die Brückenkonfiguration zu jedem Dienst in der Erstellungsdatei hinzugefügt werden:

myimage:
    image: myimage:1.0
    ports:
        - "2580:2580"
    networks:
        - my_bridge

Beim nächsten Start des Compose-Systems wird dann das neue Netzwerk mit dem richtigen Namen erstellt:

my-bridge Link encap:Ethernet  HWaddr 11:22:33:44:55:66  
      inet addr:172.18.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
      inet6 addr: fe80::42:1122:3344:5566/64 Scope:Link
      UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
      RX packets:11 errors:0 dropped:0 overruns:0 frame:0
      TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:0 
      RX bytes:788 (788.0 B)  TX bytes:695 (695.0 B)

Von dort aus sind das Hinzufügen von UFW-Regeln, um die Verbindung zu Port 1234 zu ermöglichen, trivial:

ufw allow in on my-bridge from any to any port 1234

Und plötzlich funktioniert alles perfekt!

5
Kaz Wolfe

Um die akzeptierte Antwort zu integrieren, können Sie auch einen Docker-Befehl verwenden, um das Netzwerk außerhalb von docker-compose zu erstellen:

Sudo docker network create -d bridge -o com.docker.network.bridge.name=my-bridge my_bridge

Anschließend können Sie die ausstellenden Netzwerke überprüfen

ip link show

Jetzt können Sie in Ihren Compose-Dateien das Standardnetzwerk neu routen oder ein beliebiges Netzwerk definieren, das Sie dem bereits vorhandenen Netzwerk neu zuordnen möchten

version: "3"
services:
  test:
    image: nginx:Alpine
    ports:
      - "80:80"
networks:
  default:
    external:
      name: my_bridge
1