21x9.org

OpenVPN

Categories: [blog]
Tags: [linux], [debian], [openvpn], [vpn], [wheezy]

Ein VPN ist eine praktische Sache und eine der seltenen Maßnahmen, die sowohl Komfort als auch Sicherheit erhöhen. Die Einrichtung eines VPNs kann recht komplex sein, mit OpenVPN geht es aber ziemlich leicht. Außerdem stehen für OpenVPN Clients für quasi jedes Betriebssystem zur Verfügung.

Die Installation beginnt mit:

apt-install openvpn

Während der Installation wird keine Konfigurationsdatei angelegt, jedoch wird eine Beispieldatei mitgeliefert, diese nutzen wir jetzt für das weitere Vorgehen:

zcat /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server.conf

Die Authentifizierung erfolgt bei OpenVPN über Zertifikate, um unsere Benutzer sinnvoll verwalten zu können benötigen wir eine Certificate Authority (CA). Auch hier werden von OpenVPN entsprechende Hilfsmittel mitgeliefert:

cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0/ /etc/openvpn/easy-rsa

Die Beispieldaten enthalten einige Dateien die wir nicht benötigen. Diese entfernen wir mit dem Befehl ./clean-all im Verzeichnis /etc/openvpn/easy-rsa/. Wird der Befehl später erneut ausgeführt gehen hierbei alle ausgestellten Zertifikate verloren, sofern diese nicht separat gesichert wurden, es empfiehlt sich daher dies auch zu tun.

Die CA nutzt einige Umgebungsvariablen, die in der Datei /etc/openvpn/easy-rsa/vars festgelegt werden. Diese müssen vor der ersten Verwendung angepasst werden:

export EASY_RSA="pwd"
export OPENSSL="openssl"
export PKCS11TOOL="pkcs11-tool"
export GREP="grep"
export KEY_CONFIG=$EASY_RSA/whichopensslcnf $EASY_RSA
export KEY_DIR="$EASY_RSA/keys"
echo NOTE: If you run ./clean-all, I will be doing a rm -rf on $KEY_DIR
export PKCS11_MODULE_PATH="dummy"
export PKCS11_PIN="dummy"
export KEY_SIZE=2048
export CA_EXPIRE=3650
export KEY_EXPIRE=3650
export KEY_COUNTRY="DE"
export KEY_PROVINCE="NRW"
export KEY_CITY="Cologne"
export KEY_ORG="21×9.org"
export KEY_EMAIL="ca@21×9.org"
export KEY_CN=changeme
export KEY_NAME=changeme
export KEY_OU=21×9
export PKCS11_MODULE_PATH=changeme
export PKCS11_PIN=1234

Die Variablen können nun mittels cd /etc/openvpn/easy-rsa;source ./vars eingelesen werden.

Anschließend kann die CA erzeugt werden:

./build-ca

Im Unterverzeichnis ./keys/ sollten sich nun folgende Dateien befinden:

ca.crt
ca.key
index.txt
serial

Nun kann das Zertifikat für den OpenVPN-Server generiert werden (optional kann zuvor mittels ./build-inter) noch ein intermediate Zertifikat für die CA erzeugt werden, dies ermöglicht es den geheimen CA-Schlüssel sicher abseits des Servers zu verwahren und trotzdem weiter Client-Zertifikate zu signieren).

./build-key-server server

Die hierbei erzeugten Dateien in ./keys/ sind:

server.crt
server.csr
server.key

Im nächsten Schritt wird nun noch ein Diffie-Hellman-Key erzeugt (./keys/dh2048.pem):

./build-dh

Fehlt noch der HMAC (Hash-based Message Authentication Code):

openvpn –genkey –secret ./keys/ta.key

Nun kann der erste Client-Key erzeugt werden, er dient später zur Anmeldung am VPN, jeder Benutzer sollte sein eigenes Zertifikat erhalten:

./build-key gpkvt

Hierbei werden folgende Dateien erzeugt:

gpkvt.crt
gpkvt.csr
gpkvt.key

Hier ein Überblick über die bisher erzeugten Zertifikate und deren Einsatz:

Der Server benötigt (neben ca.crt) die Dateien server.crt, dh2048.pem (öffentlich), server.key und ta.key (privat). Der Client benötigt (neben ca.crt) die Dateien gpkvt.crt (öffentlich), gpkvt.key und ta.key (privat).

Wie oben bereits angedeutet sollten die Zertifikate nicht dauerhaft in ./keys abgelegt werden, damit sie bei einem versehentlichen Aufruf von ./clean-all nicht verlorengehen. Wir erstellen daher nun ein besser geeignetes Verzeichnis und kopieren die Daten:

mkdir -p /etc/openvpn/certs
cp -pv /etc/openvpn/easy-rsa/keys/{ca.{crt,key},gpkvt.{crt,key},server.{crt,key},ta.key,dh2048.pem} /etc/openvpn/certs/

Mit unseren Zertifikaten in der Tasche können wir nun OpenVPN selbst konfigurieren. Ohne Zertifikate gibt es keine Möglichkeit die nötigen Funktionstests durchzuführen. Die Konfigurationsdatei ist /etc/openvpn/server.conf:

port 1194
proto udp
dev tun
ca /etc/openvpn/certs/ca.crt
cert /etc/openvpn/certs/server.crt
key /etc/openvpn/certs/server.key
dh /etc/openvpn/certs/dh2048.pem
tls-auth /etc/openvpn/certs/ta.key 0
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist /etc/openvpn/ipp.txt
keepalive 10 120
comp-lzo
persist-key
persist-tun
status /var/log/openvpn-status.log
verb 1
mute 20
user nobody
group nobody

Bei der Konfiguration handelt es sich um ein Minimalsetup. In der Regel wird man noch weitere Einstellungen bezüglich Routing, etc. vornehmen. Zu diesen Einstellungen gehören meist auch iptables-Regeln. Damit wird es möglich mittels OpenVPN auf weitere Rechner im Netzwerk des OpenVPN-Servers zuzugreifen. Die Routing-Einstellungen können meist auch Clientseitig vorgenommen werden, eine typische serverseitige Konfiguration sieht wie folgt aus:

push “route 10.8.0.0 255.255.255.0"
push “redirect-gateway def1 bypass-dhcp"
push “dhcp-option DNS 8.8.8.8"

Mittels der Option client-to-client kann man auch die Kommunikation unterhalb der verbundenen VPN-Clients erlauben. Dies sollte aber nur in privaten Netzen erfolgen in denen sich alle Teilnehmer kennen und vertrauen können.

Die nötigen iptables-Regeln für die oben aufgeführte Konfiguration lauten in den meisten Fällen:

iptables -A INPUT -p udp -m state –state NEW -m udp –dport 1194 -j ACCEPT
iptables -A FORWARD -s 10.8.0.0/24 -j ACCEPT
iptables -A FORWARD -m state –state RELATED,ESTABLISHED -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

Außerdem muss IP-Forwarding generell eingeschaltet werden:

sed -i ‘s/net.ipv4.ip_forward = 0/net.ipv4.ip_forward = 1/’ /etc/sysctl.conf
sysctl -p

Nun kann der Server gestartet werden:

/etc/init.d/openvpn start

Die Konfiguration der jeweiligen Clients fällt je nach Betriebssystem sehr unterschiedlich aus. Allen gemein ist jedoch die Sammlung aus den oben aufgeführten Zertifikaten für den Client sowie einer client.conf.

Ein Beispiel für eine client.conf findet sich unter /usr/share/doc/openvpn/examples/sample-config-files/client.conf.

Im wesentlichen wird die client.conf analog zur server.conf befüllt. Lediglich die Pfade zu den Zertifikaten müssen angepasst werden (bestenfalls relative Pfade verwenden). Bei tls-auth muss zudem statt einer 0 eine 1 am Ende angegeben werden, dies ist in der Beispielkonfiguration aber bereits der Fall.

Unter Linux kann (bei Desktops) der network-manager mit openvpn-Plugin verwendet werden. Unter MacOS kann man [[https://code.google.com/p/tunnelblick/|tunnelblick]] nutzen. Für Windows finden sich Clients auf der [[https://openvpn.net/index.php/open-source/downloads.html|OpenVPN-Website]].