Docker - Portainer nicht über das Internet erreichbar

  • Hallo zusammen,

    leider habe ich Probleme den Docker Container Portainer über die IP mit den Ports 9443 oder 9000 zu erreichen.

    Dabei bin ich wie folgt vorgegangen (Testweise Server neu installiert und nach dem Test heruntergefahren):

    Testweise habe ich dann folgende Dinge ausprobiert:


    Per docker ps habe ich geprüft ob der Container läuft:

    82701e65f8c6 portainer/portainer-ce:latest "/portainer" 41 seconds ago Up 40 seconds 8000/tcp, 9000/tcp, 0.0.0.0:9443->9443/tcp, :::9443->9443/tcp portainer


    ss -tulpen gibt folgendes aus:

    tcp LISTEN 0 4096 0.0.0.0:9443 0.0.0.0:* users:(("docker-proxy",pid=3191,fd=4)) ino:41036 sk:5 cgroup:/system.slice/docker.service <->


    sudo ufw status Status: inactive


    sudo nano /etc/sysctl.conf #net.ipv4.ip_forward=1 ändern in net.ipv4.ip_forward=1 sudo sysctl -p



    Ich hoffe Ihr könnt mir da weiter helfen, ich stehe da leider auf dem Schlauch.

    LG

  • Nur zur Sicherheit: Du hast die IP mit dem Port 9443 eh über httpS angesprochen, oder? Weil mit http:// geht da nichts, der Port 9000 - sofern du den exposest (was du aber im Docker run nicht machst) wäre der http port.


    EDIT: Für die Zukunft würde ich dir einen reverse proxy dafür empfehlen oder portainer nur über VPN (tailscale z.b) erreichbar machen.

  • Den Port 9443 hatte ich über https versucht zu erreichen und 9000 über http. Den Port 9000 hatte ich ausprobiert steht aber oben nicht im Code vom ersten Post drin.

    Als VPN nehme ich Wireguard mit einer Web Oberfläche, welche ich über Portainer installieren wollte.

    Probiert habe ich jetzt auch einen Webbrowser auf Port 80 zu installieren, dieser war auch nicht zu erreichen. docker run -d --name apache -p 80:80 httpd

    Der Server wurde dafür neu aufgesetzt ohne apache über apt install zu installieren.

  • Ich versuche per IP auf die Seiten zu kommen


    curl -v IP:9443

    * Trying IP:9443...

    * connect to IP port 9443 failed: Timed out

    * Failed to connect to IP port 9443 after 21045 ms: Couldn't connect to server

    * Closing connection 0

    curl: (28) Failed to connect to IP port 9443 after 21045 ms: Couldn't connect to server

  • Sind die iptables NAT Regeln korrekt eingerichtet?


    Übrigens ist deine Firewall eine Katastrophe. Da kann man auch direkt Werbung für den Server in Hacker Kreisen schalten. Also erste Amtshandlung: Den Server absichern!

  • Wie im ersten Post erwähnt ist der Server nur ein Testserver und wird nach dem testen heruntergefahren. Mein anderer Server auf dem nachher alles laufen soll ist abgesichert.


    Die Nat Einstellungen werde ich überprüfen wenn ich wieder zu Hause bin. Theoretisch sollte ja Docker selbst die iptables regeln erstellen oder?

  • Teste auch mal, ob du auf dem Server selbst auf Portainer zugreifen kannst, z.B. mit telnet


    $ telnet SERVER_IP:9443
    $ telnet 127.0.0.1:9443

    Danach auch mal direkt mit curl. Um sicher zu stellen, dass die App überhaupt richtig läuft und die Docker iptables Regeln richtig funktionieren. Danach kannst du den Zugriff von extern debuggen.

  • Schalte die Firewall aus und versuche den Zugriff nochmal. Ich gehe stark davon aus, dass das das Problem ist.

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

  • Theoretisch sollte ja Docker selbst die iptables regeln erstellen oder?

    Theoretisch. Aber Port 9000 taucht auch nicht auf, und den wolltest du ja eigentlich auch haben.


    Schalte die Firewall aus und versuche den Zugriff nochmal.

    Die Firewall ist ja aus, darauf hab ich ja hingewiesen. Außerdem braucht man ja einige iptables Regeln für Forwarding und NAT.


    Du versuchst den Zugriff über die IP und nicht über einen Hostnamen? Der Server ist dafür eingerichtet, auf die IP zu lauschen?

  • Du musst eigentlich gar nix an IPTables machen, damit Docker funktioniert und sicher ist. Bzw. andersrum: wenn man was macht ist die Chance groß, etwas zu verbaseln.

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

  • Du musst eigentlich gar nix an IPTables machen, damit Docker funktioniert und sicher ist.

    Eigentlich sollte das so sein. Docker erstellt selber die nötigen Einträge für die Portweiterleitungen, wenn man das in der Dockerkonfiguration angibt.


    Bzw. andersrum: wenn man was macht ist die Chance groß, etwas zu verbaseln.

    Auch da stimme ich zu. Aber kontrollieren, ob alle Einträge stimmen, kann man ja mal.


    Was mir aber fehlt: Auch auf dem Host laufen Services, die vermutlich nicht von außen erreichbar sein sollen. Dafür gibt es keine Firewall-Einträge. Für die ist man selber verantwortlich, und diesbezüglich gibt es nichts in den iptables Listen von oben.

  • Sind die iptables NAT Regeln korrekt eingerichtet?

    Teste auch mal, ob du auf dem Server selbst auf Portainer zugreifen kannst, z.B. mit telnet


    $ telnet SERVER_IP:9443
    $ telnet 127.0.0.1:9443

    Danach auch mal direkt mit curl. Um sicher zu stellen, dass die App überhaupt richtig läuft und die Docker iptables Regeln richtig funktionieren. Danach kannst du den Zugriff von extern debuggen.

    Theoretisch. Aber Port 9000 taucht auch nicht auf, und den wolltest du ja eigentlich auch haben.


    Die Firewall ist ja aus, darauf hab ich ja hingewiesen. Außerdem braucht man ja einige iptables Regeln für Forwarding und NAT.


    Du versuchst den Zugriff über die IP und nicht über einen Hostnamen? Der Server ist dafür eingerichtet, auf die IP zu lauschen?

    Den Port 9000 habe ich testweise ausprobier aber wieder verworfen, da dieser auch nicht funktioniert und ich den lieber über https laufen lassen will.

  • Ich hatte im telnet Beispiel oben leider einen kleinen Fehler. Dort bitte keinen Doppelpunkt zwischen Host und Port nutzen. (Leider durch C&P nicht gesehen). Das war auch mehr als Hinweis gedacht, nicht um es 1:1 einfach so zu kopieren.


    Code
    telnet HOST PORT


    Der Rest sieht etwas verstörend aus. Du musst die Platzhalter schon noch durch die richtige IP ersetzen. im curl Befehl darf dann natürlich kein telnet mehr vorkommen, sondern schon das richtige Protokoll:

    Code
    curl -k https://127.0.0.1:9443
  • Danke für den Hinweis, mit telnet kenne ich mich nicht so besonders aus und ich dachte ich sollte auch curl mit telnet machen. Die Platzhalter habe ich immer mit der richtigen IP eingetragen und nur hier wieder raus genommen.


    Code
    telnet 217.160.*** 9443
    Trying 217.160.***...
    telnet: Unable to connect to remote host: Connection timed out
    telnet 127.0.0.1 9443
    Trying 127.0.0.1...
    Connected to 127.0.0.1.
    curl -k https://217.160.***:9443
    curl: (28) Failed to connect to 217.160.*** port 9443 after 130962 ms: Connection timed out
    curl -k https://127.0.0.1:9443
    curl: (35) OpenSSL SSL_connect: Connection reset by peer in connection to 127.0.0.1:9443
  • So, ich hab das Problem umgangen, indem ich es einfach auf dem Server bei Netcup installiert habe und es funktionierte direkt ohne Probleme.

    Da ich eigentlich erstmal alles testen wollte habe ich es auf einem kleinen 1€ Server bei St***o probiert, wo es aber warum auch immer nicht ging.

  • Haben die nicht eine Softwarefirewall? Da kannst du so viel bei den Iptables rum machen wie du willst. Was mich allerdings wundert ist, dass auf localhost es auch nicht ging...

    Google St***o Firewall.

  • Da ich eigentlich erstmal alles testen wollte habe ich es auf einem kleinen 1€ Server bei St***o probiert, wo es aber warum auch immer nicht ging.

    Ggf. eine Information die schon im Initalposting nützlich gewesen wäre. Per Default gehen wohl die meisten von einem VPS oder RS hier bei Netcup aus.