• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

SSH login von außerhalb ermöglichen und absichern

harvey

Member
hallo,

ich würde gerne von außerhalb meines lokalen Netzwerkes auf einen meiner Rechner per ssh zugreifen können (und das eigentlich auch nur von einem bestimmten Rechner draußen, der aber keine feste IP hat). Wie konfiguriere ich dafür SSH am besten und sichersten?

Im Moment kann ich mich nur innerhalb meines lokalen Netzwerks per ssh verbinden. Eine Verbindung von außen funktioniert gar nicht, was ich darauf zurückführe, dass ich das ssh-Konfigurationsskript seit Installation noch nicht angerührt habe.
 

longman

Advanced Hacker
harvey schrieb:
hallo,

Eine Verbindung von außen funktioniert gar nicht, was ich darauf zurückführe, dass ich das ssh-Konfigurationsskript seit Installation noch nicht angerührt habe.

Hast Du den ssh Port in Deinem Router schon auf Deinen PC umgeleitet ?

Sorry, bezüglich Sicherheit kann ich Dir nicht besonders weiterhelfen.
Vor einigen Monaten stand mal ein Artikel in der c't wie man mit "anklopfen" den
Port auf Bedarf öffnet. Aber genau kann ich mich nicht erinnern und leider habe ich hier auch
zuviel Chaos, um die c't kurzfristig zu finden.
 

/dev/null

Moderator
Teammitglied
Hi harvey,

ist eigentlich ganz einfach ... .
Damit dein Rechner "von außerhalb" erreichbar ist, musst du in deinem Router den Port 22 auf die interne IP des betreffenden Rechners weiterleiten.
Da dein Router ja auch eine dynamisch zugewiesene IP haben wird, musst du per DynDNS dafür sorgen, dass du ihn auch immer aus dem Internet erreichst.
Damit müsste die Erreichbarkeit schon funktionieren, du kannst diesen Rechner übers Internet per ssh, aber immer noch mit Benutzername/PW erreichen.

Jetzt solltest du dir aber schnellstens Gedanken machen, die Verbindung abzusichern! Das Beschränken auf die IP geht ja nicht und bringt auch niemals die gewünschte und erforderliche Sicherheit.
Es gibt hier im Forum massenweise Tipps zum Absichern von ssh. Die für mich einzig akzeptierte Lösung ist die Authentifizierung mit asymm. Schlüsseln. Auch das ist gut beschrieben.

Falls weitere Fragen ... .

MfG Peter
(zu langsam, aber ich sende es trotzdem)
 
OP
H

harvey

Member
/dev/null schrieb:
Hi harvey,
ist eigentlich ganz einfach ... .
Damit dein Rechner "von außerhalb" erreichbar ist, musst du in deinem Router den Port 22 auf die interne IP des betreffenden Rechners weiterleiten.
Da dein Router ja auch eine dynamisch zugewiesene IP haben wird, musst du per DynDNS dafür sorgen, dass du ihn auch immer aus dem Internet erreichst.
Damit müsste die Erreichbarkeit schon funktionieren, du kannst diesen Rechner übers Internet per ssh, aber immer noch mit Benutzername/PW erreichen.
Hmmm, in meinem "Netzwerk" gibt es eigentlich nur zwei Rechner + DSL-Modem/Router. Wenn es überhaupt einen Rechner "außen" gibt, ist das dann der abgestöpselte und mitgenommene Laptop. Der dann einzig noch verbliebene Rechner hat bereits eine dyndns-Adresse. Trotzdem kann ich momentan diesen Rechner von außen per ssh nicht erreichen, weder über den dyndns-Namen, noch über die IP.
 

/dev/null

Moderator
Teammitglied
Damit hast du aber noch nichts dazu gesagt, ob du im Router die Portweiterleitung drin hast.
Mit dem DynDNS-Namen erreichst du den Router. Und wenn da nix weitergeleitet wird ... .
 
OP
H

harvey

Member
/dev/null schrieb:
Damit hast du aber noch nichts dazu gesagt, ob du im Router die Portweiterleitung drin hast.
Mit dem DynDNS-Namen erreichst du den Router. Und wenn da nix weitergeleitet wird ... .
Da ja der Rechner mit dem DynDNS-Namen der einzig verbliebene Rechner im Netz ist (und somit auch der, auf den ich von außen zugreifen möchte), dachte ich, da muss ich nix mehr weiterleiten. In /etc/ssh/sshd_conf ist die Zeile "Port 22" in der Tat auskommentiert. Muss ich das also ändern? Und warum funktioniert dann ohne dies der Zugriff im lokalen Netz? :???:
 

/dev/null

Moderator
Teammitglied
"Dachte ich ..." :-(
Ich dachte auch, wenn ich 2x das Wort "Router" schreibe, dann öffnest du in deinem Browser das Bedienmenue deines Routers und stellst dort die Portweiterleitung ein. Nun, jetzt habe ich es das dritte - und letzte - mal geschrieben.

Der Port 22 ist der default- (= Standard-) Port für ssh. Wenn du nix änderst, wird dieser verwendet. Es gibt ja Leute, die der Meinung sind, sie müssen einen anderen Port wählen, um den sshd zu verstecken. IMHO sinnlos ... .
 
OP
H

harvey

Member
/dev/null schrieb:
"Dachte ich ..." :-(
Ich dachte auch, wenn ich 2x das Wort "Router" schreibe, dann öffnest du in deinem Browser das Bedienmenue deines Routers und stellst dort die Portweiterleitung ein. Nun, jetzt habe ich es das dritte - und letzte - mal geschrieben.
Woher soll ich denn ahnen, dass es da in meinem Router/DSL-Modem auch noch was einzustellen gibt? Das ist offensichtlich der Fall. Es sieht aber reichlich unverständlich aus:

Ich kann da z.B. Für jeden einzelnen Rechner eine sog. "Filterfunktion" einschalten. Das habe ich jetzt für karl.site gemacht. Dann kann ich unter "Sperren zeitlich einschränken" als einzige Option die Regel "immer sperren" auswählen. Es folgt eine Liste "Vordefinierte Sperren", von denen einige angekreuzt sind, andere nicht. Nicht angekreuzt sind http, https, smp, pop3 u.a., angekreuzt ist z.B. Telnet (Port 23). Port 22, bzw. SSH ist gar nicht in der Liste. Zum Schluss kann ich aber noch benutzerdefinierte Sperren eingeben und zwar entweder als TCP-Portbereich oder als UDP-Portbereich. Gehe ich nun recht in der Annahme, dass ich hier 1. richtig bin und 2. nichts eintragen muss (ausser eben die Filterfunktion von Aus nach Ein zu verschieben), weil ich sonst eben diesen Port 22 sperren würde?
(Sorry, bin leider absoluter Netzwerklegastheniker)
 

/dev/null

Moderator
Teammitglied
Hier kann ich dir leider nicht weiterhelfen. Router gibt es sehr viele, und welchen du nutzt, hast du leider noch nicht verraten ... .

Mein Tipp: Nimm dir die Anleitung für deinen Router vor (CD oder Suche im Netz). Dort nach "Portweiterleitung" o. ä. suchen. Mitunter nennen das die Hersteller auch "Firewall", auch wenn das nicht ganz stimmt.

Hintergrund: Ein Router lässt (normalerweise) keinerlei ankommenden Traffic vom Internet in dein eigenes Netz durch. Da du aber einen ankommenden Verkehr auf Port 22 benötigst, musst du das dem Router mitteilen. Und noch einmal zur Sicherheit: es geht um ankommenden Traffic!
 
A

Anonymous

Gast
Such mal ob du da irgend was von NAT siehst.
Dort dann weiter mit SUA/NAT

Beginn Port 22 ; Ende Port 22 ; IP Adresse der Rechner im internen LAN den du mit ssh erreichen willst.
Wird jetzt dein Router mit SSH von WAN aus angesprochen, dann leitet er das automatisch an diesen internen Rechner weiter.

Hilfe dort könnte in etwa so aussehen
NAT - SUA/NAT Server Set editieren

Port Übermittlung

Ein SUA/NAT Server Set ist eine Liste interner Server (hinter NAT im LAN), z.B. Web oder FTP, die Sie nach aussen sichtbar machen können, obwohl NAT Ihr gesamtes internes Netzwerk als einen einzelnen Rechner nach aussen erscheinen lässt.

Sie können eine einzelne Port-Adresse oder einen Adressbereich sowie die lokale IP Adresse der/des entsprechenden internen Server(s) zur Übermittlung angeben.
.....

robi
 
OP
H

harvey

Member
Mit den Filtern funktionierte es jedenfalls nicht. Es gab da aber auch noch eine Rubrik "NAT & Portregeln" und da habe ich eine Regel für SSH definiert und unter "umgeleitete Ports" zweimal (einmal für öffentlich und einmal für private Clients) den Port 22 eingetragen. Seitdem klappt der SSH-Zugang. Kapiert habe ich aber nicht mal ansatzweise, was ich da eigentlich getan habe, was für sicherheitsrelevante Dinge eigentlich eher bedenklich ist. :???:

Im einzelnen ist mir nicht klar, was der Unterschied zwischen "Portregeln" und der "Filterfunktion" sein könnte und was mit "öffentlich" und "private client" gemeint ist... :???:
 

/dev/null

Moderator
Teammitglied
Freut mich, dass es jetzt funktioniert.

Was hast du jetzt konkret gemacht: Du hast deinem Router mitgeteilt, dass er auf Port 22 ankommenden Traffic an deinen im eigenen Netz stehenden Rechner mit der IP xx.xx.xx.xx weiterleiten soll. Das ist ja genau das, was du für das Erreichen dieses Rechners per ssh benötigst.
Regel: generell alles dicht, und nur die wirklich benötigten Ports öffnen. Als nächstes solltest du dich aber dann um die Sicherheit deines sshd kümmern ==> hier im Forum suchen und lesen!

"Portregeln" = genau das, was ich oben beschrieben habe. Welcher Port wird an welche IP deines privaten Netzes weitergeleitet.
"Filterfunktion" = irgendwelche Sperren. Zum Bsp., dass ausgehend bestimmte Ports gesperrt werden. Port 80 sperren = Surfen verboten.
"öffentlich" = damit sind die (vereinfacht gesagt) IP-Adressen des Internets gemeint. Die, welche du vom Provider zugewiesen bekommst.
"private client" = das sind deine eigenen Rechner oder auch deren IP. Diese IP sind nicht direkt aus dem Internet zu erreichen.
"NAT" = das ist die Umsetzung von öffentlichen IP zu privaten IP und umgekehrt. Gleichzeitig verhindert NAT, dass ungewollter Traffic von außen die Rechner im internen Netz erreicht. Hier sind wir wieder bei den Portregeln, wenn ein Erreichen dieser Rechner gewünscht ist.
(alles sehr einfach erklärt und keinesfalls vollständig!)

MfG Peter
 
OP
H

harvey

Member
/dev/null schrieb:
"private client" = das sind deine eigenen Rechner oder auch deren IP. Diese IP sind nicht direkt aus dem Internet zu erreichen.
Heisst das jetzt, dass ich für den privaten Bereich den Port 22 eigentlich gar nicht freigeben muss, da ich ja von aussen nur auf die IP will, die mir von meinem Provider zugeteilt wird? Oder ist es umgekehrt? Oder brauche ich doch beide, weil ich auch im internen Netz untereinander mit SSH zugreifen will? :???:
 

/dev/null

Moderator
Teammitglied
Ich glaube, du solltest wirklich noch etwas lesen ... .

Bei der Portweiterleitung wird die (aus dem Internet) ankommende Verbindung auf Port xx (hier:22) an einen einzigen Rechner mit der festgelegten (privaten) IP weitergeleitet. Der Port, an den ins private Netz weitergeleitet wird, ist prinzipiell frei einstellbar. Er muss aber immer mit dem Port übereinstimmen, auf welchem der jeweilige Dienst lauscht. Also auch wieder auf 22.
Selbstverständlich könntest du in der sshd_konfig einen anderen Port eintragen. Dann müsstest du aber auch auf diesen Port umleiten. Aber wozu?
Selbstverständlich muss auf dem jeweiligen Client auch der Firewall den Port 22 durchlassen. Aber das hat ja bei dir auch schon bei der lokalen ssh-Verbindung funktioniert.

Ein ganz klein wenig Sinn macht es, die ssh-Verbindung auf einem anderen Port zu betreiben. Damit kann man Anfänger ein klein wenig verwirren und sich die Logfiles etwas kleiner halten. Sicherheit schaffst du damit keine ("Verstecken spielen" ..).
Dazu trägst du im Router für die ankommende Verbindung eine beliebige höhere Portnummer ein. Die Weiterleitung kann auf Port 22 bleiben. Jetzt musst du natürlich beim Verbindungsaufbau vom Client im Internet immer diesen Port verwenden!
Ich rate aber davon ab!

MfG Peter
 
OP
H

harvey

Member
/dev/null schrieb:
Selbstverständlich könntest du in der sshd_konfig einen anderen Port eintragen.
Du hast mich falsch verstanden. Ich möchte ja gar keinen anderen Port als 22 freigeben. In meinem Router gibt es aber die Möglichkeit den Port 22 zweimal einzutragen: einmal unter "Umgeleitete Ports - öffentlich" und einmal unter "Umgeleitete Ports - Private Client". Zur Zeit habe ich Port 22 in beiden Rubriken stehen. Meine Frage ist nun, ob das wirklich nötig ist, oder ob ich auf einen von beiden Einträgen verzichten kann.
 

/dev/null

Moderator
Teammitglied
Umgeleitete Ports - öffentlich = der von "außen" kommende Port, welcher umgeleitet werden soll auf interne IP xxxxx
Umgeleitete Ports - Private Client = der Port im internen Netz, auf welchen die Umleitung erfolgen soll.

Ich muss einschränkend sagen, dass ich deinen Router und seine Bedienungsanleitung bzw. dessen GUI nicht kenne. Aber mit großer Wahrscheinlichkeit ist das so, wie ich es beschrieben habe.
 

stka

Guru
Wenn du wirklich eine ssh Verbindung von Außen zulassen willst, solltest du dir über die Gefahren im Klaren sein. Es gibt genügend Leute die nur nach offen ssh-Ports im Internet suchen und dann dort versuche einzubrechen. das sieht dann in deinem entsprechenden Log-File so aus:
ep 7 12:39:49 com1 sshd[26538]: Invalid user staff from 85.159.0.44
Sep 7 12:39:50 com1 sshd[26540]: Invalid user sales from 85.159.0.44
Sep 7 12:39:51 com1 sshd[26542]: Invalid user recruit from 85.159.0.44
Sep 7 12:39:52 com1 sshd[26544]: Invalid user alias from 85.159.0.44
Du solltest deshalb keine Zugriffe per Benutzer und Passwort zulassen, sondern nur über publickey. Auch solltest du so ein Programm wie "denyhosts" http://denyhosts.sourceforge.net/ auf deinem System installieren. Dann werden die IPs die versuchen in dein System einzubrechen, sofort gesperrt. Da sieht dann so aus:
Sep 7 12:39:49 com1 sshd[26538]: Invalid user staff from 85.159.0.44
Sep 7 12:39:50 com1 sshd[26540]: Invalid user sales from 85.159.0.44
Sep 7 12:39:51 com1 sshd[26542]: Invalid user recruit from 85.159.0.44
Sep 7 12:39:52 com1 sshd[26544]: Invalid user alias from 85.159.0.44
Sep 7 12:39:52 com1 sshd[26551]: refused connect from ::ffff:85.159.0.44 :):ffff:85.159.0.44)
Damit wird die entsprechende IP sofort für alle Dienste auf dem System gesperrt.
Ohne diese beiden Maßnamen würde ICH keine SSH Verbindung von Außen einrichten.
 

/dev/null

Moderator
Teammitglied
So weit war ich mit ihm noch nicht :) Wollte den TE nicht zuschütten.
Aber ich habe bereits 2x darauf hingewiesen ... .

NB: Ich stehe auf fail2ban - und selbstverständlich auf publickey. Das sehr gute fail2ban betrachte ich aber nicht als Tool zur Erhöhung der Sicherheit, sondern lediglich um das Log klein zu halten.
Ja, nebenbei wird die Sicherheit durch Verprellen der Spielmatzen auch ein klein wenig erhöht ... .

MfG Peter
 
OP
H

harvey

Member
stka schrieb:
Wenn du wirklich eine ssh Verbindung von Außen zulassen willst, solltest du dir über die Gefahren im Klaren sein. Es gibt genügend Leute die nur nach offen ssh-Ports im Internet suchen und dann dort versuche einzubrechen.
Genau deshalb habe ich den Port auch gleich wieder zugemacht (was übrigens auch die allermeiste Zeit so bleiben wird).

das sieht dann in deinem entsprechenden Log-File so aus
Würdest du mir gerade noch mal verraten, in welchem log-File ich so was sehen kann?

Du solltest deshalb keine Zugriffe per Benutzer und Passwort zulassen, sondern nur über publickey. Auch solltest du so ein Programm wie "denyhosts" http://denyhosts.sourceforge.net/ auf deinem System installieren. Dann werden die IPs die versuchen in dein System einzubrechen, sofort gesperrt.
Gut, das werde ich versuchen. Kriege ich da irgendwo noch ein rpm für Suse 10.2 her? Oder könnte ich nicht einfach dieses aktuelle rpm für Suse 10.3 nehmen und reinbügeln? (Weil es Python ist, könnte das ja gut klappen. Das Suse-rpm hat halt den Vorteil gegenüber dem von sourceforge, dass es schon für init.d usw. voreingestellt ist.)
 

/dev/null

Moderator
Teammitglied
Ich habe dich schon zwei mal darauf hingewiesen, dass du dich umgehend um die Absicherung deines sshd kümmern solltest und dass es hier im Forum genügend Beiträge und Anleitungen dazu gibt. Sogar komplette sshd_conf gibt es hier. Ich habe auch angeboten, dir dabei zu helfen. Ich habe dir auch mitgeteilt, dass denyhosts oder auch fail2ban kaum ein echter Sicherheitsgewinn ist, sondern nur die Logs klein hält.

Leider bist du mit keinem einzigen Wort darauf eingegangen. OK, es ist dein Rechner, und du bist höchstwahrscheinlich erwachsen.

Ich danke dir für das Lesen meiner Beitrage.


Peter
(Bei dem der sshd ständig durchlaufen, und der Port 22 ständig geöffnet sein muss, der ausschließlich eine Authentisierung mit langen asymmetrischen Schlüsseln (publickey) benutzt und zulässt, diese regelmäßig austauscht, die Spielmatzen mit fail2ban ärgert, und sich regelmäßig um seine Systemlogs kümmert. Und dafür ruhig schlafen kann.)
 
Oben