Archiv der Kategorie: Workaround

Usability and Addons Integration unblog Technical Workarounds and Tutorials for Professionals

SSH Tunnel Reverse Port forwarding

VPN Tunnel mit SSH Port Weiterleitung

SSH ist bei Linux von Beginn an dabei, auch Apple hat Secure Shell in macOS integriert, und Microsoft verpasste ebenfalls OpenSSH unter Windows 10 ab 1803 und Server 2019 als optio­nales Feature. Dazu gibt es SSH-Tunnel und SSH Port forwarding von den seit geraumer Zeit bekannten Tools wie PuTTY und KiTTY. Warum also SSH nicht auch als VPN Tunnel nutzen, dabei stehen nützliche Möglichkeiten für den Einsatz zur Verfügung, beispielsweise wenn ein VPN Tunnel nicht an der Firewall terminiert werden soll, oder wenn in Unternehmensnetzwerke zusätzliche Software nicht installiert werden kann, oder die rechte dazu fehlen. Ein SSH Reverse Tunnel ist immer dann hilfreich, wenn es Zugriff auf ein Remote Computer geben soll, dieser hinter einer Firewall steht.

Anwendung von SSH als VPN Tunnel und Port forwarding mit OpenSSH auf Linux, macOS und Windows

SSH Tunnel zu Remote Host B

Bei diesem Beispiel wird ein Tunnel von Host A zu Host B aufgebaut, Host B ist ein Webserver von diesem die Intranet Seite http://192.168.111.10 auf Host A geöffnet werden soll. Die einzige voraussetzung ist dabei, das es beim Router ein NAT Mapping über Port 22 zu Host B gibt, und das SSH auf jedem Host vorhanden ist.

SSH Tunnel zu Remote Host B
Abbildung: ssh tunnel host A to host B

Das Command im Linux Terminal auf Host A wie folgt ausführen:

$ ssh -NT -L 80:192.168.111.10:80 cherry@172.17.16.15 -p 45680

Auf Host A kann nun die Webseite http://localhost geöffnet werden. Der SSH Tunnel macht die Weiterleitung über TCP Port 80 auf Host B von 192.168.111.10 zum localhost 127.0.0.1 auf Host A, der externe Port ist 45680. Bei Host B authentifizieren wir mit Benutzer cherry.

Die Bedeutung der Parameter:
-L = Lokaler Port.
-N = kein Remote Command ausführen.
-p = Externer SSH Port (NAT Port bei Firewall).
-T = kein Terminal öffnen.

Auf dem Host B muss der SSH Daemon konfiguriert und aktiviert sein, in der Konfigurationsdatei /etc/ssh/sshd_config sind folgende Einstellungen erforderlich, diese bei vielen Linux distributionen der Standard ist.

# Force SSH Protocol 2
Protocol 2

#Turn on Privileged Separation for security
UsePrivilegeSeparation yes

#Deny root login
PermitRootLogin no

#Do not allow empty passwords
PermitEmptyPasswords no

# installations will only check .ssh/authorized_keys
AuthorizedKeysFile      .ssh/authorized_keys

# Forward my X Sessions
X11Forwarding yes
X11DisplayOffset 10

# I hate Motd displays
PrintMotd no

# It's alliivee
TCPKeepAlive yes

#AllowTcpForwarding yes

  Die mit # auskommentierten Zeilen sind default Werte, zB. #AllowTcpForwarding ist per default yes.

Als SSH Server eignen sich viele Geräte, die auf Linux und FreeBSD OS laufen, so auch Synology NAS, FreeNAS, FreePBX Distro, OpenWrt, Raspberry Pi (Raspbian) und nun auch Windows Server, um nur einige zu nennen.

SSH Tunnel zu Remote Host C

In diesem Beispiel wird ein SSH Tunnel von Host A zu Host C aufgebaut, Host C ist ein RDS-Terminalserver, Host B dient als Port forwarder.

In diesem Beispiel wird ein SSH Tunnel von Host A zu Host C aufgebaut
Abbildung: ssh tunnel host A to host C

Das Command im Linux Terminal auf Host A wie folgt ausführen:

$ ssh -NT -L 3389:192.168.111.10:3389 cherry@172.17.16.15 -p 43389

Die Remotedesktop Sitzung zu Host C wird über localhost auf Host A aufgebaut, durch drücken der Taste Win + R wird Ausführen geöffnet, dazu die Eingabe mstsc /v:localhost mit OK bestätigen.

 In diesem Beispiel wird der Standard TCP Port 3389 für RDP als interner sowie auch als externer Port verwendet. Es können alle unprivilegierte Ports (-L) höher als 1024 verwendet werden, kommt ein anderer Port als 3389 zur Anwendung, dann muss der Port zur ausführung an RDP übergeben werden, zB: mstsc /v:localhost:44389

Bei Host B muss der Kernel für IP forwarding aktiviert sein, das Command hierfür in der Shell als root ist:

$ net.ipv4.ip_forward = 1

Alternativ wird mit echo in der Shell Console das selbe bewirkt:

$ echo 1 > /proc/sys/net/ipv4/ip_forward

Den aktuellen IPv4 forward Status wie folgt abfragen:

$ sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1

Mit 1 wird die aktivierung bestätigt, 0 gilt für die deaktivierung. Die Änderung ist nicht Boot persistent, damit nach dem nächsten start das IP forwarding wieder aktiv ist, editiert man mit nano oder mit sudo vi /etc/sysctl.conf

# Controls IP packet forwarding
net.ipv4.ip_forward = 1

Es empfiehlt sich zur Authentifizierung ein SSH Schlüssel zu verwenden, ein Schlüsselpaar kann wie folgt erzeugt werden:

$ ssh-keygen -f ~/.ssh/key_rsa -t rsa -b 4096

Den Public Key ~/.ssh/key_rsa.pub speichert man im Home Pfad des Benutzers, hier in diesem Beispiel auf dem Host B unter dem Pfad in der Datei ~/.ssh/authorized_keys, mehr dazu in diesem Artikel hier.

  Die Authentifizierung unter Verwendung von SSH Schlüssel ist nicht nur sicherer, es bieten sich weitere vorteile, Beispielweise wird der Anwender nicht aufgefordert ein Passwort eingeben zu müssen, auch lässt sich so der SSH Tunnel und weitere Commands aus einem Script ausführen.

SSH Tunnel unter macOS

Bei Apple macOS steht SSH erst nach der Aktivierung zur Verfügung, dies im Terminal wie folgt zur Ausführung kommt:

$ sudo systemsetup -setremotelogin on

Danach kann der SSH Tunnel unter macOS aufgebaut werden.

$ ssh -i ~/.ssh/key_rsa -NT -R 3389:192.168.111.11:3389 cherry@172.17.16.15 -p 43389

Mit dem Remote Desktop for Mac wird jetzt bei Gateway localhost eingetragen und die RDP Session aufgebaut, auf diese weise sind Terminalserver geschützt und nur über SSH erreichbar.

macOS bietet auch die möglichkeit zur automatisierung und nutzt dazu launchd und die launch system services, folgendes Script wird angelegt unter:
@/Library/LaunchDaemons/server.hostc.client.cherry.home.plist mit folgendem Inhalt:

<plist version="1.0">
   <dict>
   <key>Label</key>
   <string>server.hostc.client.cherry.home</string>
   <key>ProgramArguments</key>
   <array>
	  <string>ssh</string>
	  <string>-NTC</string>
	  <string>-o ServerAliveInterval=60</string>
	  <string>-o ExitOnForwardFailure=yes</string>
	  <string>-i</string>
	  <string>/Users/cherry/.ssh/key_rsa</string>
	  <string>-R 3389:192.168.111.11:3389</string>
	  <string>cherry@172.17.16.15</string>
          <string>-p 43389</string>
   </array>
   <key>UserName</key>
   <string>cherry</string>
   <key>RunAtLoad</key>
   <true>
   <key>KeepAlive</key>
   <true>
</true></true></dict>
</plist>

OpenSSH-Server Installation aus PowerShell

Bei Windows Server 2019 kann der OpenSSH-Server auch mit erhöhten Rechte aus der PowerShell als Administrator bereitgestellt werden.

PS C:\> Get-WindowsCapability -Online | ? name -like *OpenSSH.Server* | Add-WindowsCapability -Online
  Bei Windows 10 ist der OpenSSH Client in den Einstellungen zu finden, unter Apps & Features – Optionale Features – OpenSSH-Client.

Windows Dateityp und Dateiendung Einstellungen

Windows Dateityp und Dateiendung zum öffnen anpassen und ändern

Windows wählt anhand der Dateiendung, welche Anwendung beim doppelklicken einer Datei geöffnet wird. Weist eine Datei die Endung .txt auf, wird normalerweise diese in Notepad geöffnet. Ein Bild mit der Erweiterung .jpg öffnet standardmässig den Windows-Fotobetrachter oder ein Bildbearbeitungsprogramm, wenn ein solches installiert wurde. Es kann jedoch vorkommen das Windows zur falschen, oder nicht gewünschten Anwendung greift, oder es findet gar kein Programm. Mit welchem Programm ein bestimmter Dateityp geöffnet wird, entscheidet Windows aufgrund von Einstellungen in der Windows-Registry.

Standard-Apps nach Dateityp auswählen

Windows blendet die Dateiendungen standardmässig aus, die Auskunft darüber geben könnte, ob beispielsweise ein Bild im PNG-, im JPG- oder BMP-Format vorliegt. Möchte man wissen um was für eine Datei es sich handelt, öffnet man mit einem Rechtsklick auf der Datei das Kontextmenü und geht zu Eigenschaften. Im Reiter Allgemein steht hinter Dateityp zum Beispiel JPG File (.jpg).

Windows Dateityp Dateiendung, Eigenschaften-von-JPG-File

In diesem Beispiel ist IrfanView zum öffnen von JPG-Dateien registriert. Mit dem Button Ändern kann ein anderes Programm zum öffnen gewählt werden.

Windows Dateityp und Dateiendung

Die Dateiendungen standardmässig einblenden, dazu geht man im Windows-Explorer auf Ansicht – Optionen – Ordner- und Suchoptionen ändern.

Explorer: Ordner- und Suchoptionen ändern

Im Reiter Ansicht bei Erweiterungen bei bekannten Dateitypen ausblenden die Option deaktivieren, danach werden bei den Dateinamen die zuvor verborgenen Endungen sichtbar.

Windows Dateityp und Dateiendung Einstellungen in Explorer-Ordneroptionen

Die App zu einem Dateityp findet man auch in den Einstellungen.

Einstellungen-Standard-Apps

Unter Standard-Apps können Anwendungen zu Dateitypen ausgewählt werden. Weiter unten findet man unter Standard-Apps nach Dateityp auswählen eine Liste mit Dateitypen. Mit klick auf ein + können Apps (Anwendungen) ausgewählt werden.

Windows Dateityp und Dateiendung Einstellungen, Einstellungen-Standard-Apps

Windows 10 Kontextmenü bearbeiten

Mit klick der rechten Maustaste im Explorer an einer leeren stelle in einem Ordner, erscheint normalerweise das Kontextmenü – Neu > Textdokument.

Windows-Explorer-Context-New-Textdocument

Fehlt im Explorer-Kontextmenü der Eintrag Textdokument, kann dieser wieder hinzugefügt werden.

Die Zuordnung zum Explorer-Kontextmenü – Neu > Textdokument zu einem Programm kann direkt in die Windows-Registry eingetragen werden. Hierzu in einem als Administrator geöffneten Command Prompt die folgenden Zeilen ausführen:

REG ADD "HKCR\.txt" /ve /t REG_SZ /d "textfile" /f
REG ADD "HKCR\.txt" /v "Content Type" /t REG_SZ /d "text/plain" /f
REG ADD "HKCR\.txt" /v "PerceivedType" /t REG_SZ /d "text" /f
REG ADD "HKCR\.txt\ShellNew" /v "ItemName" /t REG_EXPAND_SZ /d "@%%SystemRoot%%\system32\notepad.exe,-470" /f
REG ADD "HKCR\.txt\ShellNew" /v "NullFile" /t REG_SZ /d "" /f

Die Schlüssel für das Explorer-Kontextmenü Neu > Textdokument, im Registrierungseditor unter HKEY_CLASSES_ROOT\.txt

Windows-Registry
Windows-Registry
Registrierungs-Editor-ShellNew
Windows-Registry

  Sind mehrere Editoren installiert, wie beispielsweise Notepad++ und VS Code. Kann es vorkommen das bei der Konfiguration der von Windows standardmässig zugewiesene Notepad Editor aus der Registry entfernt wurde. Eine Dateiendung kann auf verschiedene weise zu einem Programm zugeordnet werden, einerseits durch ausführen der folgenden zwei Zeilen in einem als Administrator geöffneten Command Prompt:

ASSOC .txt=txtfile
FTYPE textfile="%ProgramFiles%\Windows NT\Accessories\WORDPAD.EXE" "%1"

Tipp! Möchte man zum Beispiel unter Windows 10 Perl Scripts ausführen, kann mit folgenden Zeilen die Dateiendung .pl zum Perl Interpreter zugeordnet werden:

ASSOC .pl=PerlSkript
FTYPE PerlSkript=C:\Perl64\bin\perl.exe %1 %*
  Vorausgesetzt ist das ActivePerl für Windows installiert ist.