= VPN mit SSH =

Zum Aufbau eines VirtualPrivateNetwork kann auch ssh benutzt
werden. Diese Lösung ist einfach und schnell und man benötigt
lediglich zwei Linux-Maschinen, auf denen SSH installiert ist.

== Vorteil ==

Ein Vorteil ist wohl der leichte und schnelle Aufbau der
Netzwerkverbindung. Da ich das jedoch noch nicht persönlich
ausprobiert habe, rufe ich die Leser dieses Wikis auf,
weitergehende Erfahrungen hier einzutragen!

== Nachteil ==

Dieser Tunnel hat jedoch einen entscheidenden Nachteil: Er setzt
auf dem bestehenden SSH-Protokoll auf, das auf einer TCP-Verbindung
basiert. Das bedeutet, daß TCP-typisch (und im Gegensatz z.B. zum
UDP-Protokoll) sowohl der vollständige Erhalt als auch die
Reihenfolge der Pakete bei der Übertragung garantiert wird. Falls
also mal ein einzelnes Paket in den Wirren des Internet verloren
geht, steht das gesamte VPN so lange, bis die beiden SSH-Programme
sich wieder synchronisiert haben. Wenn wir ein verbindungsloses
Protokoll (wie GRE beim VPNmitPPTP oder ESP bei VPNmitIPSec)
benutzen, bewirkt ein verschwundenes Datenpaket nur, daß genau
dieses eine Datenpaket weg ist. Das darüberliegende Protokoll, das
das VPN benutzt, kann sich dann wie üblich überlegen, ob es das
Paket neu haben will (z.B. bei TCP) oder verwirft (z.B. bei
Streamingdaten). Andere Datenpakete und Verbindungen über das VPN
werden so lange jedoch nicht gebremst.

Inzwischen habe ich die Seite
http://sites.inka.de/sites/bigred/devel/tcp-tcp.html gefunden, auf
der noch schöner erklärt ist, warum nicht nur UDP über TCP, sondern
viel schlimmer noch TCP über TCP ein grosses Problem ist.

Ein weiterer Nachteil ist, daß man auf Plattformen angewiesen ist,
die ssh unterstützen, d.h. ein Aufbau mit einer
Windows-Gegenstation könnte problematisch werden. Ggf. würde ich es
jedoch mal mit dem freien Windows-SSH-Programm PuTTY versuchen.

== Installation ==
Da ich bisher noch keine Erfahrungen mit ssh-Tunneln gesammelt
habe, bitte ich den geneigten Wiki-Leser, diese nachzutragen... 

--ThomasBayen

== Beispiel 1 ==
folgendes Beispiel erstellt einen Tunnel und funktioniert ohne
Probleme
{{{
HOME=/home/tuser
HOST=192.168.1.50
GATEWAY=217.18.187.9
# generat a key for authentication
ssh-keygen -t dsa
scp $HOME/.ssh/id.dsa.pub $GATEWAY:$HOME/.ssh/authorized_keys
# open tunneling
ssh -2 -g -N -L 23:$HOST:23 $GATEWAY $* 2>/dev/null &
}}}
--Uwe Schimon <uwe@mailpost.de>

== Beispiel2 ==

Ich habe über VPN ssh-Zugang zu Kleopatra. Caesar befindet sich im selben Netz wie Kleopatra, aber ich kann Caesar nicht direkt erreichen.

=== entfernten Port auf lokalen Rechner umleiten ===

Ich starte ssh auf Caesar:
{{{
caesar:~# ssh -R 2222:caesar:22 kleopatra
}}}

Das öffnet Port 2222 am Localhost-Interface auf kleopatra. Zugriffe werde auf Port 22 auf Caesar weitergeleitet.

Mit
{{{
caesar:~# ssh -R "*:2222:caesar:22" kleopatra
}}}
ist es auch möglich Port 2222 auf allen Interfaces von kleopatra zu öffnen, oder anstelle von "*" eine bestimmte IP-Adresse anzugeben. Voraussetzung dazu ist jedoch die Option {{ ~GatewayPorts clientspecified }} in der sshd_config von kleopatra. Per Voreinstellung kann nur ans Localhost-Interface gebunden werden.

=== lokalen Port tunneln ===

Alternativ starte ich auf Kleopatra:
{{{
kleopatra:~# ssh -L <VPN-IP-Adresse von Kleopatra>:8080:caesar:8080 caesar
}}}

Dann kann ich mit
http://kleopatra:8080/ auf den Webserver auf Caesar (Port 8080) zugreifen.

--PeterHormanns

== Lösung in Java ==

Es kann sinnvoll sein, über einen Tunnel in Java nachzudenken, damit man auf jeder Plattform einen identischen Verbindungsaufbau anbieten kann. Läuft ein Client-Programm ausschließlich unter Linux, ist der oben beschriebene Weg sicherlich der sinnvollste.

Auch die Java-Bibliothek [JSch|http://www.jcraft.com/jsch/] erlaubt es neben normalen SSH-Verbindungen auch einen SSH-Tunnel aufzubauen. Hierzu habe ich einen [einfach erklärten Artikel mit Beispiel|http://www.beanizer.org/site/index.php/en/Articles/Java-ssh-tunneling-with-jsch.html] gefunden.

Auf [http://linuxmafia.com/ssh/java.html] gibt es auch noch eine Menge andere SSH-Implementierungen in Java. JSch habe ich jedoch schonmal benutzt (es wird vom Eclipse Mercurial Plugin benutzt).

Wer nun zum Beispiel einen Tunnel für MySQL aufbauen will, findet im [MySQL-Forum|http://forums.mysql.com/read.php?30,249779,249779] eine sehr lange Link-Liste zum Thema. Andererseits ist das Verständnis von Port Forwarding eigentlich recht trivial, wenn der Tunnel einmal steht, also nicht von der Fülle der Texte verwirren lassen... 

--ThomasBayen

== Links ==
* [http://www.stunnel.org/examples/pppvpn_robertk_de.html Ausführlich mit stunnel] 
* [http://www.heise.de/newsticker/meldung/69122 OpenSSH auf dem Weg zum vollwertigen VPN]
* [http://www.openssh.org]

--PeterHormanns

\\
[{Tag Ssh VPN}]