Iptables Anfänger: Zugriff auf Port 3306 von MariaDB docker-compose Service auf eine dedizierte IP legen

  • Hallo zusammen,


    ich habe eine private Umgebung (Mailu E-Mail, Nextcloud, Webpage, MariaDB, myPhpAdmin, ...) über docker-compose Schritt für Schritt hinter einen Nginx Reverse Proxy aufgebaut.

    Abgesichert habe ich dies aktuell mit Fail2ban, No-Root-Login, Public-Key und anderer ssh-Port.


    Ich verwende noch eine für mich ganz nützliche Desktop Applikation QMapShack. In der MariaDB speichere ich meine GPS Fahrrad Tracks. In QMapShack gebe ich dazu die Credentials für den Zugriff auf die MariaDB Datenbank ein.


    Hierzu habe ich im docker-compose für den MariaDB Service den Port 3306 aufgemacht:

    Code
    ...
    services:
    mariadb:
    container_name: mariadb
    image: mariadb:10.5
    restart: "no"
    ports:
    - my_netcpup_server_ip:3306:3306
    ...


    Das funktioniert auch soweit. Jedoch fühle ich mich nicht besonders wohl, da ich hier den Port aufmache.

    Von daher will ich den Zugriff auf `Port 3306` auf eine einzige IP (Heimnetz) reduzieren und von außerhalb gehe ich dann über ein VPN drauf. Ich gehe davon aus, dass ich dies dann über Iptables machen kann/muss.


    Bis dato habe ich noch noch nichts mit Iptables gemacht, habe mir aber schon ein paar Dinge angeschaut und dabei einen "heiden Respekt vor Iptables :/" bekommen, da auch noch Docker im Spiel ist.


    Ich sehe für mich, dass ich hier nur einiges auf Anhieb richtig machen werde aber vieles falsch und nach einem "Try und Error-Thema" schaut es auch nicht aus.

    Ich will mich hier dann auch nicht selber aus dem System ausschließen und dann über Rettungssystem alles wieder aktivieren.


    Von daher vielen Dank für eine Starthilfe von den Experten hier in der Community.

    Toto12

  • änderungen bei iptables sind nicht bootsafe, aus genau dem lockout grund.

    also wenn du dich mal aussperrst, rechner neu starten.
    alternativ -> via scp auf der konsole anmelden und dort die regeln wieder entfernen.


    als tipp: die willst den INPUT von Paketen auf port 3306 bearbeiten. und diese entweder rejecten oder droppen.


    docker macht da ja irgendwas über eigene iptablesregeln - da weiß ich nicht genau wie (aber da es intern aus einem container in einen anderen geht, ists vermutlich via FORWARD und nicht INPUT). ggf. musst du an erste stelle bei INPUT stellen, dass kommunikation aus internen netzen immer ok (accept) ist (auch für vpn).

  • Vorab erst mal abzuklären: hast Du denn zu Hause eine feste IP? Sonst läuft der o.g. Ansatz ins Leere, sobald sich Deine IP ändert.


    Ich würde da anders rangehen: Auf dem öffentlichen Docker Host definitiv keinen DB Port ins Internet freigeben, wenns geht die Datenbank zu Hause hosten. Dann brauchst Du für zu Hause gar nichts machen und kannst Dich direkt mit der DB verbinden. Wenn Du von außen / unterwegs Zugang haben willst, kannst Du ein VPN in Dein Heimnetz einrichten (z.B. über Router), oder Dir https://www.zerotier.com/ installieren und damit ein MeshVPN aufmachen.


    Falls das Home-Hosting gar nicht geht, DB auf dem NC Server hosten, DB Port trotzdem nicht aufmachen, Zerotier via Docker dort integrieren und nur über ZT auf die DB zugreifen.

    RS Ostern L OST22 (~RS "3000" G9.5) (8C,24GB,960GB) | RS Cyber Quack (1C,2GB,40GB)

  • Erst schon mal vielen Dank für die Anregungen.

    Ja genau. ich kann es ja einfach anders herum machen. DB Zuhause hosten und dann über VPN drauf zugreifen. Hätte ich ja auch drauf kommen können :)


    Ja IP Wechsel ist eigentlich ein Thema. Da der Wechsel aber nur alle paar Monate vorkommt und ich ein kleines Script laufen habe, dass mir dies per E-Mail mitteilt und ich auch keine kritischen Themen als Privat-Anwender laufen habe, stelle ich die dann manuell um (VPN, etc.). Auf DynDNS habe ich bisher auch verzichtet.

    Mein VPN läuft auf einem kleinen Raspi mit PiHole und PiVPN. Der Raspi wird etwas zu schwach sein für eine MariaDB. Da bräuchte ich dann noch einen kleinen Server. Dies müsste ich mal recherchieren, was hier an Hardware in Frage käme.


    Die Zerotier-Lösung schaue ich mir auf jeden Fall mal an. Danke für den Tipp.


    Ich habe etwas auf ubuntuusers gespienzt und die man Pages studiert. Ich werde daher temporär mal versuchen die iptables anzupassen. Dies wäre für morgen mein erster Versuch, da die Einstellungen ja flüchtig sind ...

    Code
    iptables --table filter --append DOCKER_USER --protocol tcp --source my_home_net_ip --destination-port 3306 --jump ACCEPT
    iptables --table filter --append DOCKER_USER --protocol tcp --destination-port 3306 --jump DROP
  • Ginge - je nach Bedürfnissen - auch mit

    Code
    iptables -I INPUT --protocol tcp --dport 3306 -j DROP
    
    iptables -I INPUT -s <home_net> -j ACCEPT

    die letzte zeile kannst du dir bei einem ssh tunnel sparen. können die meisten programme für datenbanken von sich aus (z.b. heidisql)


    telnet von außen vorher / nachher nicht vergessen, damit es getestet ist :)

  • Ich habe es nun wie folgt umgesetzt:


    Ich habe über iptables nur die Heimnetz IP für den Port 3306 zum Zugang für die MariaDB freigegeben:

    Code
    iptables --table filter --insert DOCKER-USER --protocol tcp --destination-port 3306 --jump DROP
    iptables --table filter --insert DOCKER-USER --protocol tcp --source <heimnetz-ip> --destination-port 3306 --jump ACCEPT


    Dann habe ich mir TLS/SSL Zertifikate für Server und Client erzeugt, gemäß dieser für mich sehr guten Anleitung erzeugt:

    https://www.cyberciti.biz/faq/how-to-setup-mariadb-ssl-and-secure-connections-from-clients/


    Für die Desktop Applikation QMapShack habe ich dann in meinem Git Fork noch das "DB Open" auf SSL/TLS umprogrammiert.


    So gehe ich nun von außerhalb über VPN ins Heimnetz und von dort dann über SSL/TLS zur Datenbank in den Docker Container.


    Damit denke ich, bin ich nun mal fürs erste auf der sicheren Seite.


    Nochmals vielen Dank an Mainboarder und TBT - Ihr habt mich auf den richtigen Pfad gesetzt.