OpenSSH ist in der Lage über Tun-Interfaces ein Layer 3 VPN herzustellen. Dies ist eine sehr einfache Variante, besonders schön ist das man SSH auch in vielen Fällen über einen Proxy verwenden kann.
Szenario
Aufbau:
- Firewall (intern: 10.10.0.254, extern: 55.66.77.88, macht PAT über externes Interface)
- SSHVPN VM ist eine VMware Maschine auf meinem VMware Server (intern: 10.10.0.122, tun0: 10.255.255.1, macht PAT über internes Interface)
- Mein PC (Ubuntu 10.10 Maschine mit NX intern: 10.10.0.80)
- Mein Netbook in dem Beispiel irgendwo im Internet mit UMTS Stick (Ubuntu 10.10 Netbook Edition)
- Auf der Firewall ist ein NAT Portforwarding für TCP Port 22 auf 10.10.0.122 eingerichtet
Der Client
Falls noch kein Schlüsselpaar für root existiert muss eines angelegt werden.
toor@sshvpn-vm:~$ sudo ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/root/.ssh/id_rsa. Your public key has been saved in /home/root/.ssh/id_rsa.pub. The key fingerprint is: 05:d2:94:2e:16:fd:96:29:5c:6d:13:b5:55:8f:ce:31 root@sshvpn-vm The key's randomart image is: +--[ RSA 2048]----+ | .+o. ..o. +| | ..+.. + +.| | + o.+ .E .| | o +.= o o | | . .So o | | | | | | | | | +-----------------+ toor@sshvpn-vm:~$
Am einfachsten ist es ohne Passwort. Meine Empfehlung: Unbedingt mit Passwort machen, ist sicherer 😉 Den Namen unverändert lassen, auch den Speicherort. id_rsa wird im .ssh Verzeichnis beim Verbindungsaufbau vom ssh Client automatisch verwendet sofern vorhanden.
Anpassen der /etc/network/interfaces Datei
Folgenden Absatz an das Ende der Datei anfügen.
iface tun0 inet static pre-up ssh -S /var/run/sshvpn-tun-ctrl -M -f -w 0:0 55.66.77.88 true pre-up sleep 5 address 10.255.255.2 pointopoint 10.255.255.1 netmask 255.255.255.252 up route add -net 10.10.0.0 netmask 255.255.255.0 gw 10.255.255.1 tun0 post-down ssh -S /var/run/sshvpn-tun-ctrl -O exit 55.66.77.88
Der Server
Anpassen der /etc/ssh/sshd_config Datei
Hinzufügen / Anpassen folgender Optionen
PermitTunnel point-to-point PermitRootLogin forced-commands-only
PermitRootLogin existiert bei Ubuntu Systemen (steht auf Yes) schon bei anderen Distris kann das anders sein. Falls die PermitRootLogin existiert die orginale einfach auskommentieren.
Anpassen der /root/.ssh/authorized_keys Datei
tunnel="0",command="/sbin/ifdown tun0;/sbin/ifup tun0" ssh-rsa AAAA.... root@sshvpn-vm
Ab ssh-rsa muss alles ersetzt werden durch den Inhalt aus dem generierten öffentlichen Schüssel vom Client. (/root/.ssh/id_rsa.pub)
Anpassen der /etc/network/interfaces Datei
Folgenden Absatz an das Ende der Datei anfügen.
iface tun0 inet static address 10.255.255.1 netmask 255.255.255.252 pointopoint 10.255.255.2
IP Forwarding auf dem Server aktivieren
$ sysctl -w net.ipv4.ip_forward=1
Für eine dauerhaftes IP Forwarding muss mann noch die /etc/sysctl.conf anpassen.
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
NAT aktivieren
Ich habe auf meinem SSHVPN Server NAT aktiviert damit ich ohne Routing arbeiten kann, das ist einfacher.
Folgendes Script in /etc/init.d anlegen.
iptables.nat.sshvpn:
/sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Aktivieren für Systemstart:
$ update-rc.d iptables.nat.sshvpn defaults
Test des VPN Tunnels
Auf dem Client kann der Tunnel mit folgendem Kommando gestartet werden.
$ sudo ifup tun0
Der SSH Client baut dann die Verbindung zum Server auf und richtet das Tunnelinterface ein.
Ein einfacher Ping zeigt das es funktioniert hat.
$ ping 10.10.0.80 PING 10.10.0.80 (10.10.0.80) 56(84) bytes of data. 64 bytes from 10.10.0.80: icmp_req=1 ttl=64 time=99.57 ms 64 bytes from 10.10.0.800: icmp_req=2 ttl=64 time=90.238 ms 64 bytes from 10.10.0.80: icmp_req=3 ttl=64 time=90.217 ms 64 bytes from 10.10.0.80: icmp_req=4 ttl=64 time=90.181 ms
Viel Spaß mit euren eigenen SSH VPNs 😉