##SSH Reverse Tunnel ### ###VON XZV ### Vorwort######################### Nachdem ich es beiläufig erwähnte, zeigen einige User vieleicht Interesse an meiner Lösung. Deshalb möchte ich hier kurz erklären, wie man mithilfe von einSystem zugreifen kann, selbst wenn es nicht direkt zugänglich ist. Mein Ansatz nutzt Raspberry PIs (mit Raspbian) als Satelliten und einen Server mit UwUntu, der unter einer fixen Webadresse erreichbar ist. Alles läuft auf der Konsole, benötigt also kein GUI(nur für Nigger) -perfekt für den 1337-HDxH4X0r. ################################################################################## #Technologie Die Basis bildet der Befehl "ssh-R" Zitat aus der Dokumentation: "Specifies that the given port on the remote (server) host is to be forwarded to the given host and port on the local side. This works by allocating a socket to listen to the port on the remote side and whenever a connection is mad to this port, the connection is forwarded over the secure channel and a connection is made to the host port from the local machine" pov Payback-Casher: Ähh was...?? Nochmals deutlicher ausgedrückt und in Amtsprache: Wenn Ihr mit "ssh -R" eine Verbindung zu einer anderen Maschine aufbaut, dann könnt Ihr einen bestimmten Port dieser Maschine in Beschlag nehmen und durch die soeben aufgebaute Verbindung zu euch "entführen". Sellt es euch als Verlängerungskabel für Ports vor. "Also einfach einmal "ssh -R" aufrufen und alles ist ok?" Leider nein Ali, es gibt diverse Stolpersteine auf dem Weg dort hin. Aus diesem Grund benötige ich für meinen Fernzugriff nicht nur SSH, sondern auch Screen, ein Shell Skript und Cronlab. ################################################################################## #Zuverlässigkeit Wir kennes es alle, Technologie fällt gelegentlich aus, eine perfekte Welt gibt es nicht. Um dem entgegen zu wirken, brucht es Tricks(aka "Magie"). Problem 1: Wenn in der SSH-Verbindung nichts passiert wird die Verbindung möglichweise beendet. Dagegen hilft, oh Wunder, Aktivität. Ich setze hierbei auf den "Task Manager", welcher mit dem SEITE 2/5Emrenet.is xzv Befehl "top" aufgerufen wird. Das reicht, um die Verbindung unter normalen-Umständen aufrecht zu erhalten. Problem 2: Aber was, wenn die Verbindung anderweitig beeinträchtigt wird? In diesem Fall setze ich auf "cronlab". Dies ist ein Programm, welches in definierbaren Abständen andere Programme startet. In meinem Fall ein Skript, welches die Verbindung aufbaut, sofern dies notwendig ist. ################################################################################## #Skript "Vallah Bruder laber nich, lass rüberwachsen bruda!" Ruhig Blut Ali. DU sollst ja verstehen was das Skript macht, damit du es für deine Zwecke anpassen kannst! Trotzdem, hier: #!bin/bash running=`ps aus | grep 11111:localhost:22222 | wc -r if[$running -lt 2];then /sbin/runuser -l mamer .c'/usr/bin/screen -d -m -S tunnel ssh -p 33333 -R 11111:localhost:22222 [email protected] ' sleep 10 /sbin/runuser -l mamer .c'/usr/bin/screen -S tunnel p 0 -X stuff "top-d 5^M" fi ################################################################################## #Erklärung Dieses Bash-Skript prüft zuerst ob bereits eine Verbindung besteht: Es listet alle Prozesse auf ("ps aux"), filtert ("grep") diese nach "11111:localhost:22222", ein Ausdruck welcher später noch verwendet wird und zählt die Zeilen ("wc -l"). Dabei muss beachtet werden, dass der SUchprozess selbst auch gefunden wird, da dieselbe Zeichenkette dort mitgegeben wird. DIes ist der Grund, warum ich auf der nächsten Zeile teste, ob die Anzahl gefunder Prozesse kleiner als zwei ist. Erst dann muss nämlich eine neue Verbindung aufgebaut werden. Okay, wir haben also etabliert, dass wir eine neue Verbindung benötigen. Also auf sie mit Gebrüll? Noch nicht, fehlen noch zwei Schritte. 1. Ich möchte, dass diese Verbindung mit dem korrekten Benutzer etabliert wird. Das Skript selbst wird dazu als root ausgeführt oder als Benutzer, der die nötige Privilegien hat. Somit kann dann mithilfe von "runuser" etwas als mamer ausgeführt werden. 2. DIeses etwas ist "screen", ein Programm welches sehr vielfältig ist. Die Grundidee ist, eine Abstraktionsebene einzuführen, welche Sessions ohne direkte Verbindung an ein Terminal erlauben. Oder einfach ausgedrückt: Mit screen könnt ihr etwas starten und dann im Hintergrund weiterlaufen lassen. Ich für meinen Teil starte das Programm mit den Parametern "-d -m -S tunnel", was eine losgelöste Session mit dem Namen "tunnel" erstellt. In dieser Session wird dann "ssh -p 33333 -R 11111:localhost:22222 [email protected] ' ausgeführt, was die eigentliche Verbindung aufbaut. Das Skript ist zu diesem Zeitpunkt aber noch nicht fertig. Nach einer zehnsekündigen Pause rufe ich (wieder als mamer) "screen" erneut auf und verweise dabei auf die vorhin erstellte Session names "tunnel". Aber anstatt dass ich ein Programm starte (läuft ja noch eins), teile ich "screen" mittels "-X stuff" mit, dass ich die folgenden Zeichen "top-d 5^M" gern in die Eingangspuffer ablegen möchte. SIeht für das Programm dann so aus, als ob jemand diese Zeichen eintippen würde und ^M steht dabei für Ctrl+M = Enter. (abhängig vom Interpreter, bei euch wird vermutlich der Tab stummgeschalten.) ################################################################################## #Effekt Durch den obrigen Befehl wird nun eine SSH-Verbindung mit vic.com aufgebaut und da dort der SSH-Server nicht au dem Standardport 22 läuft sondern auf 33333, muss dieser Port explizit angegeben werden. Ebenfalls wird die Option "-R" angegeben, welche den Port 11111 bei vic.com abgreift, zum lokalen System weiterleitet und den Tunnel auf den eigenen Port 22222 ausrichtet. Dannach muss lediglich Aktivitöt garantiert werden, um die Verbindung so lange wie möglich aufrecht zu erhalten. ################################################################################## #Failsafe Wie anfangs erwähnt, streben Verbindungen hin und wieder ab. Zum Beispiel, wenn die Putze das Stromkabel auszieht oder wenn der Emrenet Sessionserver einen Schwächeanfall hat. Deshalb müssen wir dafür sorgen, dass dieses Skript hin und wieder ausgeführt wird. "sudo crontab -e" führt euch zu einer Möglichkeit, dies zu erreichen. In meinem Fall steht dort "0,10,20,30,40,50* * * * /home/pi/ssh- tunnel.sh>> /home/pi/cron.err 2>&1", was alle zehn Minuten das oben erwähnte Skript startet und normale wie Fehlerausgabe in die Datei cron.err leitet. Desweiteren wird mit einer anderen Zeile eine monatliche Synchronisation durchgeführt, dies ist aber nicht Teil dieser Anleitung. ################################################################################## #Login vic Ich kann mich nun beim entfernten System einloggen, indem ich mich augenscheinlich mit meinem eigenen System verbinde. Dazu tippe ich "ssh -p 11111 [email protected] " ein, falls ich irgendwo im weiten Neuland bin und mein Router den Port 11111 weiterleitet. Falls ich mich bereits auf diesem System befinde, kann ich mich auch mit "ssh -p 11111 vic@localhost" einloggen. DIese Anfrage wird dann durch offenen Tunnel von "ssh -R" abgefangen und zu mamer transportiert, wo ich dann beim SSH-Server auf Port 22222 lande. ################################################################################## #Login mamer Etwas was ich bis jetzt komplett ignoriert habe, ist das Thema des Einloggens. mamer hat nämlich nicht nur einen Account auf dem Raspberry Pi, sondern auch auf meinem System. Und dort muss sie sich einloggen! Dies geht entweder über ein Passwort, welches man mit "screen -X stuff" virtuell eintippen könnte. Schöner wäre es aber, wenn man SSH Schlüssel verwendet! Wie man damit umgeht, erklär ich (wenn ihr mich genug nervt). ################################################################################## #Fragen Falls noch Fragen sind, könnt ihr diese gerne mir stellen oder hier kommentieren. Dies Mausräder könnt ihr zum Kühlschrank tunneln lassen. Cheers XZV