SSH VPN: Unterschied zwischen den Versionen
| (5 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
| Zeile 20: | Zeile 20: | ||
! Rolle !! Interface !! Adresse | ! Rolle !! Interface !! Adresse | ||
|- | |- | ||
| − | | | + | | kali || tun0 || 10.9.0.1/30 |
|- | |- | ||
| − | | | + | | victim || tun0 || 10.9.0.2/30 |
|- | |- | ||
| − | | | + | | fw2XX || egal || 192.168.HS.2XX:9922 |
|} | |} | ||
| Zeile 32: | Zeile 32: | ||
auf '''beiden''' Seiten mit Root-Rechten laufen. Ein unprivilegierter Benutzer kann den Tunnel | auf '''beiden''' Seiten mit Root-Rechten laufen. Ein unprivilegierter Benutzer kann den Tunnel | ||
nicht aufbauen. | nicht aufbauen. | ||
| + | |||
| + | Am besten den ssh-key-pub-key von root auf die Gegenseite in die /root/.ssh/authorized_keys eintragen | ||
== Konfiguration des sshd == | == Konfiguration des sshd == | ||
| Zeile 41: | Zeile 43: | ||
<pre> | <pre> | ||
PermitTunnel yes | PermitTunnel yes | ||
| − | |||
</pre> | </pre> | ||
| Zeile 53: | Zeile 54: | ||
;Verbindung mit tun-Device herstellen | ;Verbindung mit tun-Device herstellen | ||
| − | *sudo ssh -w 0:0 root@ | + | *sudo ssh -w 0:0 root@fw2XX.sec-labs.de -p 9922 |
Die Angabe <code>0:0</code> bedeutet: lokal <code>tun0</code>, entfernt <code>tun0</code>. Solange | Die Angabe <code>0:0</code> bedeutet: lokal <code>tun0</code>, entfernt <code>tun0</code>. Solange | ||
| Zeile 116: | Zeile 117: | ||
;Internes Netz über den Tunnel routen | ;Internes Netz über den Tunnel routen | ||
| − | *sudo ip route add | + | *sudo ip route add 10.0.10.0/24 via 10.9.0.2 |
;Route prüfen | ;Route prüfen | ||
| − | *ip route get | + | *ip route get 10.0.10.123 |
;Erreichbarkeit testen | ;Erreichbarkeit testen | ||
| − | *ping -c 3 | + | *ping -c 3 10.0.10.1 |
== Automatisierung über die ssh-config == | == Automatisierung über die ssh-config == | ||
Aktuelle Version vom 13. August 2026, 13:53 Uhr
SSH-VPN mit tun-Device
Beschreibung
OpenSSH kann mehr als Portweiterleitung: Mit der Option -w baut es auf beiden
Seiten ein tun-Interface auf. Damit entsteht ein echter Layer-3-Tunnel, durch den
sich beliebige IP-Pakete routen lassen — ein vollwertiges, wenn auch einfaches VPN über Port 22.
Typischer Einsatz: Von aussen ist nur der SSH-Port einer Maschine erreichbar. Über diesen einen Zugang soll das gesamte dahinterliegende interne Netz erreichbar werden.
Szenario
- Client (aussen): Notebook des Administrators
- Server (innen):
it2XX, per SSH von aussen erreichbar, Gateway ins interne Netz - Internes Netz:
10.0.10.0/24 - Tunnelnetz:
10.9.0.0/30
| Rolle | Interface | Adresse |
|---|---|---|
| kali | tun0 | 10.9.0.1/30 |
| victim | tun0 | 10.9.0.2/30 |
| fw2XX | egal | 192.168.HS.2XX:9922 |
Voraussetzungen
Das Anlegen eines tun-Devices ist eine privilegierte Operation. Die SSH-Sitzung muss deshalb auf beiden Seiten mit Root-Rechten laufen. Ein unprivilegierter Benutzer kann den Tunnel nicht aufbauen.
Am besten den ssh-key-pub-key von root auf die Gegenseite in die /root/.ssh/authorized_keys eintragen
Konfiguration des sshd
- Konfigurationsdatei öffnen
- sudo vim /etc/ssh/sshd_config
- Folgende Optionen setzen
PermitTunnel yes
- Dienst neu starten
- sudo systemctl restart ssh
- Konfiguration prüfen
- sudo sshd -T | grep -i permittunnel
Tunnel aufbauen
- Verbindung mit tun-Device herstellen
- sudo ssh -w 0:0 root@fw2XX.sec-labs.de -p 9922
Die Angabe 0:0 bedeutet: lokal tun0, entfernt tun0. Solange
diese Sitzung besteht, existiert der Tunnel. Die Interfaces sind nach dem Verbindungsaufbau
vorhanden, aber noch ohne Adresse und im Zustand DOWN.
- Interfaces kontrollieren (auf beiden Seiten)
- ip link show tun0
Adressvergabe
Auf dem Client
- Adresse zuweisen und Interface aktivieren
- sudo ip addr add 10.9.0.1/30 dev tun0
- sudo ip link set tun0 up
Auf dem Server it2XX
- Adresse zuweisen und Interface aktivieren
- sudo ip addr add 10.9.0.2/30 dev tun0
- sudo ip link set tun0 up
Test der Punkt-zu-Punkt-Verbindung
- Gegenstelle anpingen
- ping -c 3 10.9.0.2
Erst wenn dieser Ping funktioniert, machen Routing und NAT Sinn.
Routing und NAT auf dem Server
- IP-Forwarding dauerhaft aktivieren
- echo 'net.ipv4.ip_forward=1' | sudo tee /etc/sysctl.d/99-forward.conf
- sudo sysctl --system
- ACCEPT und NAT einrichten
- iptables -t nat -A POSTROUTING -s 10.9.0.0/30 -j MASQUERADE
- iptables -P FORWARD ACCEPT
Ohne Masquerading würden die Antwortpakete aus dem internen Netz an 10.9.0.1
gerichtet — eine Adresse, die dort niemand kennt. Alternativ liesse sich auf den internen
Hosts eine statische Route setzen; Masquerading ist der Weg mit dem geringsten Eingriff.
Route auf dem Client
- Internes Netz über den Tunnel routen
- sudo ip route add 10.0.10.0/24 via 10.9.0.2
- Route prüfen
- ip route get 10.0.10.123
- Erreichbarkeit testen
- ping -c 3 10.0.10.1
Automatisierung über die ssh-config
OpenSSH kann Adressvergabe und Routing selbst anstossen.
- Datei anlegen
- vim ~/.ssh/config
Host vpn-it2XX
HostName it2XX.example.net
User root
Tunnel point-to-point
TunnelDevice 0:0
PermitLocalCommand yes
LocalCommand ip addr add 10.9.0.1/30 dev tun0 && ip link set tun0 up && ip route add 192.168.2XX.0/24 via 10.9.0.2
ServerAliveInterval 30
ServerAliveCountMax 3
Auf der Serverseite übernimmt ein Skript die Gegenseite:
- Skript anlegen
- sudo vim /usr/local/sbin/tun-up.sh
#!/bin/bash ip addr add 10.9.0.2/30 dev tun0 ip link set tun0 up
- Skript ausführbar machen
- sudo chmod 755 /usr/local/sbin/tun-up.sh
- Verbindung starten
- sudo ssh vpn-it2XX
Persistenz mit autossh
Bricht die SSH-Sitzung ab, verschwinden Interface und Route ersatzlos. autossh
überwacht die Verbindung und baut sie automatisch neu auf.
- Paket installieren
- sudo apt install autossh
- Tunnel dauerhaft betreiben
- sudo autossh -M 0 -f -N vpn-it2XX
Grenzen des Verfahrens
- TCP over TCP
Der Tunnel läuft über eine TCP-Verbindung. Die darin transportierten TCP-Verbindungen bringen ihre eigene Fehlerkorrektur mit. Bei Paketverlust schaukeln sich beide Retransmission-Timer gegenseitig hoch, der Durchsatz bricht ein — der sogenannte TCP meltdown. Für Administrationszugriffe ist das unkritisch, für Durchsatz oder instabile Leitungen ungeeignet.
- Root auf beiden Seiten
PermitRootLogin und PermitTunnel sind Zugeständnisse, die in
produktiven Umgebungen gut begründet sein wollen.
- Kein Ersatz für ein richtiges VPN
Für den Dauerbetrieb sind WireGuard, strongSwan oder OpenVPN die richtige Wahl. Das SSH-VPN ist das Werkzeug für den Fall, dass genau ein Port offen ist und nichts weiter installiert werden darf.
Alternative: sshuttle
sshuttle erreicht ein ähnliches Ergebnis ohne Änderung am sshd und ohne
Root-Rechte auf der Gegenseite. Es setzt die Regeln lokal selbst und leitet den Verkehr über
eine gewöhnliche SSH-Sitzung.
- Paket installieren
- sudo apt install sshuttle
- Internes Netz tunneln
- sudo sshuttle -r benutzer@it2XX.example.net 192.168.2XX.0/24
- Zusätzlich DNS über den Tunnel leiten
- sudo sshuttle --dns -r benutzer@it2XX.example.net 192.168.2XX.0/24
Für das Verständnis ist der Weg über -w der lehrreichere: Tunnel-Interface,
Forwarding und Masquerading sind dort einzeln sichtbar und einzeln zu prüfen. sshuttle ist
die Variante für den Arbeitsalltag.
Übung
- Aktivieren Sie
PermitTunnelaufit2XXund prüfen Sie die effektive Konfiguration. - Bauen Sie den Tunnel auf und vergeben Sie die Adressen des Tunnelnetzes.
- Prüfen Sie mit
ping, dass die Punkt-zu-Punkt-Strecke steht. - Aktivieren Sie IP-Forwarding und richten Sie Masquerading ein.
- Setzen Sie die Route auf dem Client und erreichen Sie einen internen Host.
- Beobachten Sie den Tunnel mit
tcpdump -i tun0in einer zweiten Sitzung, während Sie den internen Host anpingen. - Beenden Sie die SSH-Sitzung und beobachten Sie, was mit Interface und Route geschieht.
- Bauen Sie den Tunnel über
~/.ssh/configerneut auf.