Laut ssh.com und Wikipedia wurde 1995 die erste Version und Implementierung des SSH-Protokolls veröffentlicht. Die Aufgabe des Autors bestand darin, eine sichere Alternative zu rlogin, telnet und rsh zu entwickeln, die dann für die Remoteverwaltung verwendet wurden. Es ist merkwürdig, dass die Entstehung des SSH-Protokolls durch einen Informationssicherheitsvorfall erleichtert wurde, bei dem der Angreifer eine beeindruckende Datenbank mit Benutzernamen / Passwörtern von Servern sammelte, einfach das Universitätsnetzwerk abhörte und Authentifizierungspakete extrahierte (Benutzername / Passwort-Paare wurden unverschlüsselt übertragen).
Das Protokoll gewann schnell an Popularität und wurde nach einer langen Zeit der Verfeinerungen und Verbesserungen 2006 von der IETF standardisiert. Seitdem hat er es geschafft, zum De-facto-Standard für die Fernverwaltung von Textkonsolensystemen zu werden. Neben der Textkonsole selbst bietet das Protokoll eine Reihe weiterer nützlicher Funktionen, z. B. Dateiübertragung und Portweiterleitung. Es geht um die Portweiterleitung und ihre nicht allzu offensichtliche Anwendung, die in diesem Artikel behandelt wird.
Das SSH-Protokoll bietet zwei Portweiterleitungsmodi - Vorwärts und Rückwärts. Im Direktmodus können Sie einen empfangenden TCP-Port auf der SSH-Clientseite öffnen und alle Verbindungen zu diesem Port an die Serverseite weiterleiten.

Wenn beispielsweise ein Remotedesktopserver (RDS) auf unserem SSH-Server ausgeführt wird, können wir das SSH-Protokoll verwenden, um eine Verbindung zu diesem Server herzustellen, auch wenn keine direkte Netzwerkverbindung möglich ist (z. B. durch eine Firewall blockiert). So:

Im zweiten Portweiterleitungsmodus - Reverse - können Sie die Rollen des SSH-Servers und -Clients austauschen (wie auf den weitergeleiteten Port angewendet). Im umgekehrten Modus wird der überwachende TCP-Port auf der SSH-Serverseite geöffnet, und die Anwendung, die diesen Port bedient, befindet sich auf der SSH-Clientseite. Es ist selten nützlich, aber in der Regel sehr treffend.

Wenn Sie diese beiden Modi und unser Beispiel mit einem Remotedesktopserver kombinieren, erhalten Sie folgende Konfiguration:

Auf den ersten Blick sieht es überflüssig aus. Aber zusammen mit der offensichtlichen Redundanz haben wir zwei wichtige Eigenschaften:
- Das Netzwerk muss lediglich die Netzwerkadresse des Hosts sicherstellen, auf dem sich der SSH-Server befindet, damit ein solches Schema ordnungsgemäß funktioniert. Die Knoten, auf denen der RDS-Server und der Client ausgeführt werden, können ihre Netzwerkadressen mindestens jede Minute ändern (oder sie können sogar Adressen im privaten Netzwerk haben, wir benötigen nur ausgehendes NAT, das häufig als "Internetverbindung" bezeichnet wird).
- Trotz der Tatsache, dass für uns der RDS-Server von überall im Internet zugänglich ist, können andere Benutzer keine Verbindung zu ihm herstellen (vorausgesetzt, der SSH-Server enthält keine Sicherheitslücken). Und da das RDS-Protokoll auch bei einem erfolgreichen Angriff auf den SSH-Server über eine eigene Zugriffskontrolle verfügt, muss der Angreifer auch einen Angriff auf RDS ausführen. Die Wahrscheinlichkeit, sowohl eine SSH-Server-Sicherheitsanfälligkeit als auch eine RDS-Server-Sicherheitsanfälligkeit zu haben, ist viel geringer als diese Wahrscheinlichkeit für jede Komponente einzeln.
Wenn Sie genau hinschauen, sehen Sie in diesem Diagramm zwei unabhängige Computernetzwerke. Mit One - Transport - können Sie SSH-Verbindungen herstellen. Ein anderes - internes - wird für angewandte Zwecke verwendet. Wir werden versuchen, in den folgenden Artikeln einige interessante Schlussfolgerungen aus dieser Beobachtung zu ziehen, aber lassen Sie uns zunächst zu unseren Experimenten zurückkehren.
Stellen Sie eine Verbindung zu Ihrem Heimcomputer her
Im Hof des 21. Jahrhunderts dauert die Zustellung eines Netzwerkpakets von Sibirien nach Kalifornien 0,1 Sekunden, die ganze Welt ist in Computernetzwerke verwickelt und TCP / IP befindet sich sogar in Zahnbürsten. Es scheint, dass wir mit einer solchen Verbundenheit von allem mit allem vor langer Zeit in der Lage sein sollten, einen Computer nicht nur durch physische Präsenz in der Nähe von Eingabegeräten, sondern auch über das Netzwerk fernzusteuern. Darüber hinaus gibt es dafür zahlreiche Technologien und Protokolle. Microsoft Remotedesktop, VNC-Variationen von * nix-Systemen, Citrix-Lösungen, Tausende von ihnen ... Dennoch können sich nur wenige von uns der Fähigkeit rühmen, mit einer dieser Technologien von überall auf der Welt eine Verbindung zu ihrem Heimcomputer herzustellen.
Es gibt zwei Gründe, warum sich nur wenige rühmen können, eine Verbindung zu ihrem eigenen Heimcomputer herzustellen, und sie sind miteinander verbunden. Das erste ist das Fehlen einer typischen Heimcomputeradresse im globalen Netzwerk. Die Wurzeln dieses Sachverhalts reichen bis ins Jahr 1981 zurück, in dem der IPv4-Standard erstmals beschrieben wurde, der bis heute (für sich genommen mit Änderungen und Ergänzungen) verwendet wird, um die meisten Websites im Internet anzusprechen. Die Autoren des Standards entschieden, dass der Adressraum mit einer Kapazität von 3,7 Milliarden Adressen für alle Geräte auf der Welt ausreicht, aber die Realität erwies sich als hart. IPv4 Internet wird voraussichtlich nicht bis September 2019 verfügbar sein.
Darüber hinaus kann ein typischer Internetbenutzer, der keine Websites hostet, alle Vorteile der Zivilisation nutzen, ohne eine Adresse im globalen Netzwerk zu haben, sondern sich nur auf eine Adresse in einem privaten Netzwerk und NAT-Anbieter zu beschränken. Mit anderen Worten, für die meisten Internetnutzer gibt es keinen Unterschied zwischen dem Vorhandensein und Fehlen einer globalen IP-Adresse für ihre Geräte. Unter solchen Umständen nimmt die Anzahl derjenigen, an die der Anbieter eine globale IP-Adresse im globalen Netzwerk ausgibt, rapide ab. Daher befindet sich ein typischer Heimcomputer in einem privaten Netzwerk und hat keine globale Adresse. Selbst wenn der Anbieter dem Benutzergerät dennoch eine Adresse im globalen Netzwerk zuweist, ist dieses Gerät ein Heimrouter, der NAT von einem privaten Heimnetzwerk aus ausführt. Der Benutzer kann natürlich den Port auf dem Router weiterleiten, aber selbst in diesem besten Fall kann sich die globale Adresse des Routers von Tag zu Tag ändern. Ja, es gibt Anbieter, die den Dienst „Static IP“ gegen eine geringe Gebühr anbieten. In der Praxis stellt der Benutzer jedoch zu diesem Zeitpunkt fest, dass das Spiel die Kerze nicht wert ist. Wenn Sie etwas mit Ihrem Heimcomputer tun müssen, können Sie auch anrufen anrufen.
Die hartnäckigsten können diese Suche bis zum Ende durchlaufen und auf den zweiten Grund stoßen, warum das Öffnen des Zugangs zu ihrem Computer über das Internet nur für diejenigen Unterhaltung ist, die übermütig sind. Dieser Grund ist alltäglich - Informationssicherheit. Das globale Netzwerk ist global, früher oder später wird jemand vom anderen Ende der Welt und mit schlechten Absichten an Ihr Tor klopfen. Das Scannen des offenen Ports, auf den der Remotedesktopserver antwortet, ist keine sehr schwierige Aufgabe, und sicher, dass TCP SYN früher oder später aus einem chinesischen Dorf zu Ihrem supergeheimen Port 32167 kommt.
Wenn Sie mit SSH zu unserer exotischen Portweiterleitung zurückkehren, werden Sie feststellen, dass diese Funktionen beide Gründe beseitigen.
Erstellen Sie sich einen TeamViewer
Sie müssen sofort reservieren, dass TeamViewer ein großartiges Produkt mit einer Vielzahl sehr unterschiedlicher Funktionen ist. Im Rahmen dieses Artikels werden wir nur eine Möglichkeit für uns sammeln, eine sichere Verbindung über das Internet über das Remotedesktopprotokoll zu einem Computer hinter NAT herzustellen. Trotzdem möchte ich vorschlagen, dass die Verbindung zu jedem Computer mit Internetzugang das Hauptunterscheidungsmerkmal von TeamViewer ist, weshalb dieses Produkt so beliebt ist. Und genau diese Verbindung können wir mit unserer SSH-Konfiguration aus dem ersten Teil des Artikels mit unseren eigenen Händen implementieren.
Also, die Aufgabenbedingungen: Es gibt einen Heimcomputer und einen Laptop, beide laufen unter Windows 10. Es ist erforderlich, vom Laptop aus zu ermöglichen, von überall auf der Welt über das Remotedesktopprotokoll auf den Heimcomputer zugreifen zu können. Unser System umfasst unseren Remotecomputerserver für den Heimcomputer, einen Laptop mit einem Remotedesktopclient und einen SSH-Server. Der SSH-Server ist die einzige Komponente, die eine globale IP-Adresse und permanente Verfügbarkeit erfordert. Die einfachste Möglichkeit, diese Anforderungen zu erfüllen, besteht darin, einen SSH-Server in der Cloud zu hosten. Yandex.Cloud ist großartig (hauptsächlich aufgrund seiner Preispolitik), daher werden wir es verwenden. Das Ergebnis ist wie folgt:

Beginnen wir mit der Vorbereitung unseres Heimcomputers. Stellen Sie zunächst sicher, dass der Fernzugriff generell zulässig ist. Dies kann über die Registerkarte RAS in den zusätzlichen Systemeinstellungen erfolgen:

Ab April 2018 verfügt Windows 10 bereits über einen SSH-Client unter den Befehlszeilenprogrammen. Dies wird uns helfen, weniger abgelenkt zu werden, indem wir verschiedene Software installieren und sofort zur Sache kommen. Zunächst generieren wir einen Schlüssel für SSH. Öffnen Sie die PowerShell-Shell und führen Sie 'ssh-keygen' aus. Wenn wir nach dem Passwort für den Schlüssel gefragt werden, lassen Sie es leer. Zeigen Sie nach dem Generieren des Schlüssels seinen offenen Teil auf der Konsole mit dem Befehl 'cat $ HOME / .ssh / id_rsa.pub' an. Das Ergebnis des Befehls ist nützlich, um den SSH-Server in der Cloud zu starten. Sie sollten so etwas bekommen:

Wir müssen den privaten Teil des SSH-Schlüssels auf den Laptop kopieren. Dieser Teil des Schlüssels befindet sich in der Datei '$ HOME / .ssh / id_rsa' (ohne das Suffix ".pub") und kann als reguläre Datei kopiert werden. Verwenden Sie beispielsweise ein USB-Flash-Laufwerk (wir gehen davon aus, dass es als Laufwerk F bereitgestellt ist :)
copy $HOME/.ssh/id_rsa f:\
Führen Sie nun unseren SSH-Server aus. Erstellen Sie eine virtuelle Maschine (VM) in Yandex.Cloud. Für unsere Zwecke können Sie eine "leichte" VM mit 1 vCPU und 0,5 Gigabyte RAM auswählen. Wählen Sie im Abschnitt Netzwerkeinstellungen das Standardnetzwerk mit einer automatischen IP-Adresse aus. Geben Sie im Abschnitt "Zugriff" als Login "home" ein. Kopieren Sie im Eingabefeld des SSH-Schlüssels das, was im vorherigen Schritt auf unserer Konsole angezeigt wurde:

Klicken Sie auf "VM erstellen" und warten Sie auf den Abschluss. Nachdem die Erstellung der virtuellen Maschine abgeschlossen ist, müssen wir ihre IP-Adresse herausfinden:

Wir benötigen die IP-Adresse unserer virtuellen Maschine, um den SSH-Client auf dem Heimcomputer und dem Laptop auszuführen. Führen Sie es auf diese Weise auf dem Computer aus (in diesem und den folgenden Befehlen müssen Sie 84.201.141.36 durch die IP-Adresse Ihrer VM ersetzen):
ssh -NR 3389:localhost:3389 home@84.201.141.36
Wenn Sie gefragt werden, ob Sie eine Verbindung zu einem unbekannten Server herstellen möchten, antworten Sie mit "Ja". Wenn wir dann keinen Text auf der Konsole sehen, ist alles gut gegangen. Konfigurieren Sie nun den Laptop. Kopieren Sie den privaten Schlüssel von unserem Flash-Laufwerk:
mkdir -Force $HOME/.ssh copy f:\id_rsa $HOME/.ssh/id_rsa
Führen Sie den SSH-Client aus:
ssh -NL 1025:localhost:3389 home@84.201.141.36
Jetzt können Sie den Remotedesktopzugriffsclient (mstsc.exe) auf dem Laptop ausführen und localhost: 1025 als Verbindungsadresse angeben. Hurra, es funktioniert!
Oder funktioniert fast. Wenn Sie den SSH-Prozess auf Ihrem Heimcomputer stoppen, kann keine Verbindung mehr hergestellt werden. Wir müssen diesen Prozess automatisch starten lassen, wenn das System startet, und auch neu starten, wenn die Verbindung getrennt wird. Dies kann beispielsweise erreicht werden, indem ein PowerShell-Skript erstellt und als obligatorisch registriert wird, damit es beim Start des Computers in Gruppenrichtlinien ausgeführt werden kann. Sie müssen nur berücksichtigen, dass es im Namen des Systemkontos gestartet wird. Dies bedeutet, dass Sie sicherstellen müssen, dass unser SSH-Schlüssel für das Systemkonto verfügbar ist.
Kommen wir zuerst zum Schlüssel. Führen Sie PowerShell als Administrator aus und führen Sie die folgenden Befehle aus:
copy $HOME/.ssh/id_rsa "$(gwmi win32_userprofile | where {$_.SID -eq "S-1-5-18"} | select -ExpandProperty LocalPath)/rds_id_rsa" icacls "$(gwmi win32_userprofile | where {$_.SID -eq "S-1-5-18"} | select -ExpandProperty LocalPath)/rds_id_rsa" /reset
Aktivieren Sie gleichzeitig im selben PowerShell-Fenster die Skriptausführung:
Set-ExecutionPolicy RemoteSigned
Erstellen Sie nun das eigentliche Skript. Öffnen Sie unseren bevorzugten Texteditor (Notepad ist ebenfalls geeignet) und schreiben Sie dieses Skript (denken Sie daran, die IP-Adresse des SSH-Servers durch die von Yandex angegebene zu ersetzen):
while (1) { & $(get-command ssh |select -expandproperty Path) ` -i "$(gwmi win32_userprofile | where {$_.SID -eq "S-1-5-18"} | select -ExpandProperty LocalPath)/rds_id_rsa" ` -o StrictHostKeyChecking=accept-new -o ExitOnForwardFailure=yes ` -NR 3389:localhost:3389 home@84.201.141.36 Start-Sleep -Seconds 15 }
Speichern Sie das Skript in dem gewünschten Verzeichnis. Zum Schluss registrieren Sie es für die automatische Ausführung. Führen Sie dazu den Gruppenrichtlinien-Editor (Win + R → gpedit.msc) aus und öffnen Sie die Elemente „Computerkonfiguration“ → „Windows-Konfiguration“ → „Skripte (Start / Ende)“ → „Start“. Verwenden Sie auf der Registerkarte "PowerShell-Skripte" die Schaltfläche "Hinzufügen" und geben Sie den Pfad zu unserem gespeicherten Skript an.

Wir werden das gleiche auf einem Laptop tun. Erste PowerShell als Administrator:
copy $HOME/.ssh/id_rsa "$(gwmi win32_userprofile | where {$_.SID -eq "S-1-5-18"} | select -ExpandProperty LocalPath)/rds_id_rsa" icacls "$(gwmi win32_userprofile | where {$_.SID -eq "S-1-5-18"} | select -ExpandProperty LocalPath)/rds_id_rsa" /reset Set-ExecutionPolicy RemoteSigned
Dann bereiten wir ein Skript in einem Texteditor vor (es unterscheidet sich geringfügig vom vorherigen, aber wie zuvor ersetzen wir die IP-Adresse durch die, die Ihnen von Yandex gegeben wurde):
while (1) { & $(get-command ssh |select -expandproperty Path) ` -i "$(gwmi win32_userprofile | where {$_.SID -eq "S-1-5-18"} | select -ExpandProperty LocalPath)/rds_id_rsa" ` -o StrictHostKeyChecking=accept-new -o ExitOnForwardFailure=yes ` -NL 1025:localhost:3389 home@84.201.141.36 Start-Sleep -Seconds 15 }
Das Non-End registriert es, um beim Start mit "gpedit.msc" zu starten. Starten Sie den Computer und den Laptop neu (um sicherzustellen, dass alles richtig startet) und voila! Jetzt sind unser Heimcomputer und unser Laptop für immer miteinander verbunden (solange unsere virtuelle Maschine in Yandex.Cloud eingeschaltet und zugänglich ist).
Na und?
Ist das nicht toll? In jedem Café, an jedem Flughafen können Sie sich mit Ihrem Zuhause verbinden und Ihre Lieblingsbilder mit Katzen sehen. Oder bitte nach Hause mit der Aufnahme von Beethovens 5. Symphonie in voller Lautstärke. Oder interessieren Sie sich für den Erfolg Ihrer Minenfarm. Oder sehen Sie, was zu Hause mit einer Webcam passiert. Aber wie viele Anwendungen haben eine solche Möglichkeit, sich zu "teleportieren"? Unsere Lösung hat aber auch Nachteile.
Erstens ist das Einrichten einer Verbindung nicht der einfachste und unterhaltsamste Vorgang. Und falls etwas schief geht, ist das Debuggen etwas komplizierter als die Ersteinrichtung. Natürlich wird dieses Problem durch Ausdauer und Geduld gelöst, aber selbst der geringe Arbeitsaufwand kann Zweifel an der Durchführbarkeit der Bemühungen aufkommen lassen.
Zweitens kostet eine virtuelle Maschine in der Cloud Geld. Bei Yandex können Sie sich auf mindestens 480 Rubel pro Monat verlassen. Dies ist natürlich kein exorbitantes Geld, sondern immer noch ihr eigenes, das im Schweiß einer Person verdient wird. Ob es sich lohnt, Bilder mit Katzen dieses Geldes anzusehen, muss jeder selbst entscheiden, aber es kann durchaus sein, dass alle Vorteile unserer Lösung durch seinen Preis durchgestrichen werden.
Das Preisproblem kann erheblich geglättet werden, indem die Ausgaben mit Freunden und Gleichgesinnten geteilt werden. Da die virtuelle Maschine für Aufgaben verwendet wird, für die keine nennenswerte Rechenleistung erforderlich ist, ist eine Leistungsverschlechterung äußerst unwahrscheinlich. Und der wirtschaftliche Effekt ist spürbar: Wenn Sie eine virtuelle Maschine mit zehn Personen mieten, muss jeder nur 48 Rubel pro Monat bezahlen. In diesem Fall kann die Frage des Vertrauens die Harmonie verletzen: Jeder Gleichgesinnte hat die Möglichkeit, über einen SSH-Server eine Verbindung zu einem anderen Computer herzustellen. In dem Fall, dass jeder Benutzer sichere Kennwörter in seinen Konten hat, ist dies kein Problem. Aber ehrlich gesagt ist ein sicheres Passwort für die Eingabe Ihres Heimcomputers eher eine Ausnahme als eine Regel.
Fortsetzung folgt
Nehmen wir also an, wir stellen 10 Gleichgesinnte zusammen, richten alles wie oben beschrieben ein und alles funktioniert für alle. Unser Club von Liebhabern von Bildern mit Katzen nutzt sicher die Gelegenheit, für nur 48 Rubel pro Monat ohne Registrierung und SMS über das Internet zu ihnen nach Hause zu gehen. Jeder ist glücklich und glücklich. Die Frage ist: Sind die Möglichkeiten unserer „Technologie“ nur auf Katzen beschränkt und ist es möglich, sie für etwas Ernsthafteres zu verwenden?
Natürlich kannst du. Wenn wir in unseren Überlegungen "Heimcomputer" durch "Server in der Cloud erstellen" und "Laptop" durch "Arbeitscomputer im Büro" ersetzen, erhalten wir etwas, das den Titel "Zugriffssystem auf die Entwicklungsinfrastruktur" verdient. Und wenn wir eine IP-Kamera anstelle eines Build-Servers und einen Sicherheitsposten anstelle eines funktionierenden Computers haben, erhalten wir ein „Videoüberwachungssystem“.
In beiden Fällen muss jedoch den Fragen der Zugangskontrolle mehr Aufmerksamkeit geschenkt werden. Insbesondere wenn ich einen SSH-Server für mehrere Benutzer freigebe, möchte ich diese Benutzer voneinander isolieren. Und selbst bei dieser Freigabe sind wir gezwungen, jede einzelne Ressource jedes Benutzers einem separaten TCP-Port zuzuweisen und seine Nummer zu speichern. Das Adressieren nach Zahlen kann bald ziemlich mühsam werden, daher möchte ich Ressourcen aussagekräftige Namen zuweisen können. Wir werden jedoch im nächsten Artikel darüber sprechen, wie die Situation verbessert werden kann.
In der Zwischenzeit vielen Dank für Ihre Aufmerksamkeit und bitte teilen Sie Ihre Gedanken in den Kommentaren.