Reverse SSH Tunnelling Fehler?
Heyho,
Bin noch relativ am Anfang was Networking angeht, habe aber so in meiner Minecraft Zeit für mich und meine Freunde Minecraft Server mit NGROK gemacht. Ich wollte schon immer mal wissen, wie sowas geht und hatte mir deshalb das Ziel gesetzt sowas (natürlich mit weniger Funktionen) nachzumachen.
Vllt habe ich einen komplett falschen Ansatz, aber grundlegend hatte ich so gedacht:
Ich starte auf dem PC auf dem der Minecraft Server läuft einen reverse SSH Tunnel mit dem Command:
ssh -N -R localhost:4444:192.168.2.157:25565 root@90.206.38.138
- 90.206.38.138 → Das ist mein dedicated debian 11 Linux Server (Die IP, die hier steht, ist natürlich ausgedacht).
Nachdem ich den reverse ssh tunnel gestartet habe, sollte mein lokaler Minecraft Server doch sozusagen von dem dedicated Server aus erreichbar sein.
Also wenn dann andere z.b. 90.206.38.138:4444 auf ihrem PC eingeben, sollten sie mit meinem lokalen Minecraft Server verbunden werden, was halt nicht funktioniert.
Habe ich irgendwas falsch verstanden bzw. kann mir jemand erklären was ich ändern/tun müsste damit dass so klappt?
LG
1 Antwort
Hier ist die manpage von ssh.
Das hier dürfte der relevante Teil sein, der nicht für das gewünschte Verhalten führt.
-R
[...]
By default, TCP listening sockets on the server will be bound to the loopback interface only. This may be overridden by specifying a bind_address An empty bind_address or the address `*' , indicates that the remote socket should listen on all interfaces.
Wenn ich deinen Syntax richtig deute, sagt du ssh, dass der TCP Socket auf dem Server unter localhost (loopback Interface) horchen soll. Du wirst also nur auf meinem Server über Localhost darauf zugreifen können.
Du könntest entweder den Stern aus der manpage nutzen oder du trägst statt localhost deine Server IP Adresse ein.
Dann solltest du auch von außerhalb deines Servers den TCP Socket nutzen können.
Ich habe es jetzt selber mit einem anderen Service getestet.
Ein Satz weiter im manpage steht folgendes:
Specifying a remote bind_address will only succeed if the server's GatewayPorts option is enabled (see sshd_config5).
Auszug aus sshd_config5.
Zusammengefasst musst du du folgende Zeile in deine /etc/ssh/sshd_config auf deinem Server einfügen:
GatewayPorts clientspecified
Die Zeile dürfte egal. Überprüfe, ob es diesen Config Parameter kein zweites Mal aktiv in der Config gibt. Du kannst die Zeile dann entfernen oder mit # auskommentieren.
Im Anschluss musst du den SSH Server reloaden bzw. neustarten.
systemctl reload ssh
Dann wird der folgende Befehl auch funktionieren.
ssh -N -R 90.206.38.138:4444:localhost:25565 root@90.206.38.138
Zum überprüfen kannst du folgendes auf deinem Server ausführen.
netstat -tulpen
Du solltest in der Ausgabe eine Zeile mit ungefähr folgenden Inhalt finden:
tcp 0 0 90.206.38.138:4444 0.0.0.0:* LISTEN [...]
Du solltest auch überprüfen/testen, ob dein Minecraft Server auf localhost lauscht, bzw. erreichbar. Kannst du auf deinem PC, wo der Minecraft Server läuft, den Server per localhost beitreten? In der Minecraft server.properties gibt dazu die Zeile server-ip=.
Auch wenn jetzt der Port Forward über SSH läuft, könnte der Minecraft Server nicht extern erreichbar sein. Es könnte sein, dass der Minecraft Server auch das UDP Protokoll nutzt. SSH Port Forfwarding unterstützt nur TCP. Ich konnte keine offizielle und eindeutige Aussage über die Nutzung von UDP finden.
ES FUNKTIONIERT!!! DANKE
Ich hätte da noch eine weitere Frage, jetzt ist es so, dass ich eine Domain habe die hinter CloudNet liegt. IP:4444 funktioniert aber domain.de:4444 nicht, ich vermute dass das mit der Protection CloudFlares zu tun hat, gibt es aber einen Weg wie ich das trotzdem machen kann? Also so dass der Server IP nicht sichtbar ist und ich mich so vor Angriffen schützen kann?
Ich kenne mich mit CloudNet nicht aus.
Wenn du bei deiner Domain ein A Record zu der IP Domain deines Servers einrichtest, wird es funktionieren. Die Domain wird zu deiner Server IP aufgelöst und der Minecraft kann antworten. Mit einem A Record kann die Server IP sehr leicht herausgefunden werden.
Für dieses Problem solltest du dich mit CloudNet beschäftigen und nachlesen wie es umgesetzt ist.
Ich könnte mir mögliche Ursachen vorstellen:
Hat dein Server noch eine andere IP Adresse, die dein Anbieter benutzt? Hast du eventuell eine Software auf deinem Server, die dann per localhost auf dein Minecraft Server zugreift?
Du könntest dein SSH Port Porward auf allen IP Adressen lauschen lassen.
ssh -N -R "*:4444:localhost:25565" root@90.206.38.138
Ein anderer möglicher Grund könnte IPv6 sein. Vielleicht leitet dein Dienst nur IPv6 weiter oder die fehlenden Unterstützung von IPv6 wird nicht erkannt und es wird nicht auf IPv4 gewechselt.
Ohne weitere Infos von CloudNet werden ich nicht helfen können.
Hey,
Danke für die schnelle Antwort, habe es jetzt so probiert:
ssh -N -R 90.206.38.138:4444:localhost:25565 root@90.206.38.138
Wenn ich "-R" weglasse:
ssh -N 90.206.38.138:4444:localhost:25565 root@90.206.38.138
kommt folgender Fehler:
ssh: Could not resolve hostname 90.206.38.138:4444:192.168.2.157:25565: Der angegebene Host ist unbekannt.
Klappt leider immernoch nicht :/