OpenVPN eignet sich zum Aufbau eines Virtuellen Privaten Netzwerks(VPN). Die Daten werden dabei über eine mit TLS verschlüsselte Verbindung übertragen. Im folgenden Beitrag wird erklärt, wie Server und Client eingerichtet werden können. Die Beschreibung bezieht sich auf Ubuntu 12.04, sollte sich jedoch auch ohne Probleme auf andere Distributionen übertragen lassen.
Server
Im ersten Schritt wird zunächst der Server konfiguriert. Doch bevor damit begonnen werden kann, müssen alle benötigten Pakete installiert werden.
$ sudo apt-get install bridge-utils openvpn
Da der OpenVPN Server im Bridge-Modus betrieben werden soll, ist eine Anpassung der Netzwerkkonfiguration in der Datei /etc/network/interfaces notwendig. Dabei wird eine Bridge mit der IP-Adresse Konfiguriert und die Physische Netzwerkschnittstelle zu gewiesen.
Ausgehend von folgendem Beispiel ...
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
iface eth0 inet static
address 192.168.0.2
netmask 255.255.254.0
gateway 192.168.0.1
... sollte die Konfiguration nach der Umstellung der folgenden ähnlich sein.
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
iface eth0 inet manual
up ip link set $IFACE up promisc on
down ip link set $IFACE down promisc off
auto br0
iface br0 inet static
address 192.168.0.2
netmask 255.255.254.0
gateway 192.168.0.1
bridge_ports eth0
Sind alle Änderungen durchgeführt kann die Netzwerkkonfiguration neu eingelesen werden. Achtung: Dieser Schritt sollte nur durchgeführt werden, wenn sicher gestellt werden kann, dass die Konfiguration richtig ist und für den Fall, dass die Netzwerkkonfiguration nicht stimmt und der Server nicht mehr erreichbar ist, ein Weg vorhanden den Server über eine Management Konsole oder ähnliches zu erreichen.
$ sudo /etc/init.d/networking restart
Ist dies geschafft, kann das System für die Erstellung der SSL-Zertifikate vorbereitet werden. Die meisten Systeme bringen dafür schon die entsprechenden Skripte mit. Durch den Befehl auf der letzten Zeile wird es möglich alle weiteren Schritte als normaler Nutzer durchzuführen.
$ sudo mkdir /etc/openvpn/easy-rsa/
$ sudo cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0/* /etc/openvpn/easy-rsa/
$ sudo chown -R $USER /etc/openvpn/easy-rsa/
Im vorliegenden Fall gab es ein Problem, dass die OpenSSL Version nicht richtig erkannt wird. Dies lässt sich jedoch durch eine Anpassung der Datei /etc/openvpn/easy-rsa/whichopensslcnf behebe. Hierfür wird, die Zeile 10 die original wie folgt aussieht, ...
elif $OPENSSL version | grep -E "1\.0\.([[:digit:]][[:alnum:]])" > /dev/null; then
... wie folgt geändert.
elif $OPENSSL version | grep -E "1\.0\.([[:digit:]])" > /dev/null; then
Bevor mit der Erstellung fortgefahren werden kann muss die Datei /etc/openvpn/easy-rsa/vars angepasst werden. Dabei sind neben der Schlüsselgröße folgende Werte interessant.
export KEY_COUNTRY="US"
export KEY_PROVINCE="CA"
export KEY_CITY="SanFrancisco"
export KEY_ORG="Fort-Funston"
export KEY_EMAIL="me@myhost.mydomain"
export KEY_EMAIL=mail@host.domain
export KEY_CN=changeme
export KEY_NAME=changeme
export KEY_OU=changeme
export PKCS11_MODULE_PATH=changeme
export PKCS11_PIN=1234
Anschließend werden die Initialen Zertifikate und Schlüssel erstellt.
Achtung: Der Befehl ./clean-all löscht alle eventuell schon vorhandenen Schlüssel. Eine Sicherung dieser bietet sich an.
$ cd /etc/openvpn/easy-rsa/
$ source ./vars
$ ./clean-all
$ ./build-dh
$ ./pkitool --initca
Ist dies geschafft wird das Zertifikat für den Server erstellt und an die entsprechende Stelle kopiert.
Achtung: Der Name der Datei dh4096.pem ist von der gewählten Schlüssellänge abhängig.
$ ./pkitool --server server
$ cd keys/
$ openvpn --genkey --secret ta.key
$ sudo cp server.crt server.key ca.crt dh4096.pem ta.key /etc/openvpn/
Danach ist es Zeit die Beispielkonfiguration zu kopieren und als Vorlage zu verwenden.
$ sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
$ sudo gunzip server.conf.gz
Im folgenden sind ein paar Optionen der Datei server.conf aufgeführt, auf die während der Konfiguration ein genauerer Blick geworfen werden sollte.
local 192.168.0.2
port 1194
dev tap0
script-security 2
up "/etc/openvpn/up.sh br0"
down "/etc/openvpn/down.sh br0"
dh dh4096.pem ; je nach größe des Schlössels anpassen
;server 10.8.0.0 255.255.255.0
server-bridge 192.168.0.2 255.255.255.0 192.168.0.100 192.168.0.200
push "route 192.168.0.2 255.255.255.0"
push "dhcp-option DNS 192.168.0.2" ; IP des DNS servers angeben
push "dhcp-option DOMAIN example.org" ; Suchpfad
tls-auth ta.key 0 ; Das Geheimnis
user nobody
group nogroup
Wie in der Konfiguration zu erkennen ist, wird ein Skript up.sh und ...
#!/bin/sh
BR=$1
DEV=$2
MTU=$3
/sbin/ifconfig $DEV mtu $MTU promisc up
/sbin/brctl addif $BR $DEV
... down.sh benötigt, die Beide unter /etc/openvpn liegen und ausführbar sein müssen.
#!/bin/sh
BR=$1
DEV=$2
/sbin/brctl delif $BR $DEV
/sbin/ifconfig $DEV down
Damit das Routing funktioniert muss es aktiviert werden. Dies kann entweder mit folgendem Befehl temporär bis zum nächsten Neustart erfolgen.
$ echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
Oder es wird der entsprechende Wert in der Datei /etc/sysctl.conf angepasst. Bei dieser Methode muss jedoch der Server neu gestartet werden, damit die Änderung wirksam wird.
net.ipv4.ip_forward=1
Zum Schluss muss noch der OpenVPN Dienst gestartet bzw. neu gestartet werden.
$ sudo service openvpn restart
Client
Bevor mit der eigentlich Konfiguration auf dem Client begonnen wird, muss der Schlüssel noch auf dem Server erstellt werden. Dazu ist eine Anpassung der Datei /etc/openvpn/easy-rsa/vars notwendig. Es sollte mindestens der Wert für KEY_NAME angepasst werden.
Anschließend ist die Erstellung des Client-Schlüssels möglich.
$ cd /etc/openvpn/easy-rsa/
$ source ./vars
$ ./pkitool home
War dieser Vorgang erfolgreich müssen die Dateien ca.crt, home.crt, home.key und ta.key aus dem /etc/openvpn/easy-rsa/keys/ Verzeichnis auf den Client unter /etc/openvpn kopiert werden. Alle weiteren Schritte werden dann auf dem Client ausgeführt.
Auch hier kann eine Vorlage kopiert werden.
$ sudo cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn
Anschließend muss die Datei /etc/openvpn/client.conf angepasst werden. Dabei sollten zunächst folgenden Werten besondere Aufmerksamkeit gelten.
dev tap
remote vpn.example.org 1194
cert home.crt
key home.key
tls-auth ta.key 1
script-security 2
up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf
Das Skript /etc/openvpn/update-resolv-conf sollte nur verwendet werden, wenn der DNS Server im VPN Netz verwendet werden soll. Zum Schluss muss auch hier der OpenVPN Dienst neu gestartet werden.
$ sudo service openvpn restart
Troubleshooting
Wichtig ist, dass beim Aufbau der Verbindung nichts überstürzt wird. Der Verbindungsaufbau brauch einen kurzen Moment. Sollte es dennoch zu Problem kommen, steht die Datei /var/log/syslog zur Verfügung. Sie wird standardmäßig für das Logging verwendet und sollte auf dem Server und auf dem Client bei der Lösungssuche behilflich sein.
Links
- Webseite: OpenVPN Community Software (englisch)