OpenVPN
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:
- ca.crt - Das öffentliche CA-Zertifikat, es wird auf dem Server und jedem Client benötigt.
- ca.key - Der private CA-Schlüssel, er wird zur Erzeugung weiterer Client-Zertifikate benötigt und darf nicht weitergegeben werden.
- server.cert - Das öffentliche Zertifikat des Servers.
- server.key - Der private Key des Servers.
- dh2048.pem - Die Diffie-Hellman Parameter für den Keyaustausch.
- ta.key - Der private TLS-Auth Key.
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]].