OpenVPN

Aus Thomas Wiki
Zur Navigation springen Zur Suche springen

Mit einem virtuellen privaten Netzwerk (VPN) lassen sich Rechner und Netze über ein fremdes Netz miteinander verbinden. Um dieses virtuelle private Netzwerk gegen "Lauscher" und andere unbefugte Gäste zu sichern, werden die Verbindungen verschlüsselt, wobei der verteilte Schlüssel oder ein Zertifikat auch der Identifizierung und Authentifizierung dient.

Die Verbindung zwischen den Rechnern oder Netzen wird Tunnel genannt.

OpenVPN einrichten

Der Aufbau und die Einrichtung wird im mehreren Schritten für den Server und den Client beschrieben.

Schlüssel erzeugen

Pre-Shared-Keys werden mit folgenden Befehlen erzeugt und geschützt:

cd /etc/openvpn
sudo /usr/sbin/openvpn --genkey --secret preshared.key
sudo chown root:root /etc/openvpn/preshared.key
sudo chmod 400 /etc/openvpn/preshared.key

Schlüssel auf Clients verteilen

Den Pre-Shared-Key kann man mit Diskette / USB-Stick oder über Netzwerk auf die Clients verteilen. Wichtig ist, dass der Key über einem sicheren Weg auf den Client gelangt, damit kein Dritter in den Besitz des Keys gelangt. Wer den Key besitzt kann damit einen Tunnel aufbauen. Eine Möglichkeit ist ihn über ssh zu kopieren.

scp preshared.key root@<client-adresse>:/etc/openvpn

Schutz des Keys auf dem Client

Durch die Übertragung der Rechte an root wird der Key vor anderen Nutzern und durch nur lesenden Zugriff vor versehentlichem Löschen geschützt.

sudo chown root:root /etc/openvpn/preshared.key
sudo chmod 400 /etc/openvpn/preshared.key

Der Key kann natürlich auch auf einen externen Datenträger gespeichert werden, der verschlüsselt sein sollte, um den Key vor Verlust und Missbrauch zu schützen.


Erstellen der Configurationsdateien

Server

Mit dem tun-Device könne zwei Rechner miteinander verbunden werden. Das verbinden ganzer Netzwerke erfolgt über tap-Devices. Um Rechner hinter einer Firewall (z.B. DSL-Router) zu verbinden, muss der Port 1194 (früher 5000) von der Firewall weitergeleitet werden. Sitzen beide Rechner hinter einer Firewall reicht es, wenn als Protokoll TCP verwendet wird und nur der TCP-Port 1194 auf den Server weitergeleitet wird.(Ist noch genauer zu untersuchen.)

Erstelle für den Server eine Konfigurationsdatei /etc/openvop/server.conf:

dev tun
ifconfig 10.0.0.1 10.0.0.2
proto tcp-server
secret /etc/openvpn/preshared.key
comp-lzo
dev [tun | tap]
Bestimmt den zu verwendenden Gerätetyp tun oder tap
ifconfig <ip-lokal> <ip-remote>
gibt die lokale und entfernte IP-Adresse an
comp-lzo
aktiviert eine Komprimierung durch den Tunnel, was sich insbesondere auf langsamen Verbindungen positiv auswirkt.
proto [tcp-server|tcp-client|udp]
es wird TCP statt UDP verwendet und er Rechner ist der Server

Client

Erstelle dazu eine Konfigurationsdatei /etc/openvop/client.conf:

remote <surver-ip-address>
dev tun
ifconfig 10.0.0.2 10.0.0.1
proto tcp-client
secret /etc/openvpn/preshared.key
comp-lzo

Verwendet der Server TCP, so muss der Client als Protokoll tcp-client festlegen.

OpenVPN starten

Der Tunnel wird mit folgenden Befehlen auf dem Server und Client gestartet:

Server

sudo /usr/sbin/openvpn --config /etc/openvpn/server.conf

Client

sudo /usr/sbin/openvpn --config /etc/openvpn/client.conf

oder auf SuSE Linux / openSuSE Linux mit rcopenvpn start sowohl für den Server als auch für den Client. rcopenvpn liest alle Dateien /etc/openvpn/*.conf.

Firewall auf Basis IPTables

Wird eine Firewall auf der Basis von iptables verwendet, dann muss die Firewall auf beiden Rechnern für den virtuellen Tunnel geöffnet werden. Dies geschieht mit folgendem Script:


Script

Das folgende Scrip richtet den Tunnel ein, so dass bei Verwendung eines Notebooks und Wireless-LAN keine Daten am Tunnel verbei gesendet werden können.

#! /bin/sh

IPTABLES=/usr/sbin/iptables

# Das Script beruht auf eine Beitrag von Achim Leitner
# in linuxuser 12/2004
# 
# Es kann nicht nur ein Notebook ueber WLAN verbinden, sondern auch
# zwei Netze sicher ueber Internet vebinden.
# Entsprechende Befehle sind daher zu kommentieren
# auszukommentieren.
#
# Die IPTABLES-Definitionen wurden so geaendert, dass es auch mit
# der SuSE Firewall funktioniert. D.h. die Definitionen wurden
# am Anfang der Chains eingefuegt und nicht am Ende angehaengt.
# 
 
# TUNDEV : Geraet fuer den Tunnel
# LANDEV : Geraet ueber das der Tunnel laeuft
# WLAN   = no ; Tunnel dient nicht zur Sicherung eines WLAN
# WLAN   = yes ; Tunnel soll ein Notebook ueber WLAN anbinden. 

# Globale Variablen fuer Tunnel und LAN Geraete setzen. 
# TUNDEV = tun0, tun1 ... 
# LANDEV = wlan0, wlan1, ... oder lan0, lan1, ... oder modem0, modem1, ...
# (modem0, modem1 gilt fuer Waehlverbindungen) 
# WLAN = no , yes
# Port = 1194 (default ab 2.0)

TUNDEV=tun1
LANDEV=eth1
WLAN=no
PORT=1194

# Erstmal sicherstellen, dass das Tunneldevice geladen ist.

/sbin/modprobe tun

# Die Weiterleitung der IP-Pakete muss aktiviert sein.

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

# Mit -I INPUT werden die Regeln vorne angefuegt. D.h. sie werden in umgekehrter 
# Reihenfolge der Einfuegung abgearbeitet. 

# Bei Anbindung Verbindung zweier interne Netze (Intranets) ueber das Internet
# sollen die Server die Netze gesichert durchs Internet verbinden, aber auch anderen Rechnern den 
# Zugang zum Internet er lauben. Soll nur ein Notebook ueber WLAN an den Server gebunden werden, 
# kann alles ausser den Tunnel verboten werden.
# Bei einer gesicherten Verbindung ueber WLAN werden die eingehenden Pakete des Tunnels auf dem 
# realen Interface akzeptiert. Alle anderen Pakete werden verworfen.
 
[ "$WLAN" = "yes" ] && $IPTABLES -I INPUT -i $LANDEV  -j DROP

# Der Tunnel muss in jedem Fall seine Pakete auf Port 1194 (default)
# empfangen koennen. (Ab Version 2.0, sonst 5000)

$IPTABLES -I INPUT -i $LANDEV -p udp --dport $PORT -j ACCEPT

# Bei einer gesicherten Verbindung ueber WLAN werden alle ausgehenden Pakete,
# die am Tunnel vorbei gehen wollen, verboten.

[ "$WLAN" = "yes" ] && $IPTABLES -I OUTPUT -o $LANDEV -j DROP

# Der Tunnel muss in jedem Fall seine Pakete auf Port 1194 (default)
# senden koennen. 

$IPTABLES -I OUTPUT -o $LANDEV -p udp --dport $PORT -j ACCEPT

# Nur wenn ein Notebook angeschlossen wird und
# keine Weiterleitung erfolgen soll.

[ "$WLAN" = "yes" ] && $IPTABLES -I FORWARD -i $LANDEV -j DROP

# Fuer den Tunnel: Da wir vertrauenswuerdige Enden haben,
# koennen wir alles was im Tunnel kommt akzeptieren.

$IPTABLES -I INPUT -i $TUNDEV -j ACCEPT
$IPTABLES -I OUTPUT -o $TUNDEV -j ACCEPT

# Die Weiterleitung der Pakete muss beim WLAN mit Notebook 
# nur auf den Server definiert werden.
# Bei der Verbindung zweier Intranets ueber Internet muss die
# Weiterleitung auf beiden Rechnern erlaubt werden.
# Schaden kann sie auf dem Notebook nicht. 

$IPTABLES -I FORWARD -i $TUNDEV -j ACCEPT
$IPTABLES -t nat -I POSTROUTING -o $LANDEV -j MASQUERADE