An meiner Hochschule wird OpenVPN eingesetzt um die W-Lan Verbindungen effektiv zu verschlüsseln. Da ich relativ viel in Linux unterwegs bin, und OpenVPN in diversen Window-Managern (i3, XFCE, KDE) und auf der Konsole nutze, suchte ich eine Möglichkeit, um OpenVPN bequem und sicher starten und stoppen zu können.
Es kommt – zumindest bei mir – häufiger vor, dass ich mit mehr als einem VPN verbunden bin. Ein simples „killall“ zum Terminieren einer einzelnen Verbindung ist in diesem Fall nicht angebracht. Ich erweiterte die OpenVPN Konfigurationen daher zunächst um folgende Zeilen (hier exemplarisch für die Konfiguration der FH):
writepid /var/run/openvpn-fh.pid
Dies erleichtert es zu überprüfen, ob ein Tunnel aufgebaut ist, und welcher Prozess für diesen Zuständig ist. Anschließend kann mit folgendem Script der Tunnel gestartet und gestoppt werden:
#!/bin/sh PIDFILE=/var/run/openvpn-fh.pid CONFIG=fh.ovpn if [ "$1" != 'start' ] && [ "$1" != 'stop' ]; then echo "usage: $0 {start|stop}" exit 1 fi if [ $(id -u) -ne 0 ]; then exec sudo $0 $1 exit 1 fi vpnrunning() { if [ ! -f $PIDFILE ]; then return 1 else pid=$(cat $PIDFILE) if kill -0 $pid 2>/dev/null ; then return 0 else return 1 fi fi } case $1 in start) if vpnrunning; then echo "openvpn already running" >&2 else exec openvpn --cd /etc/openvpn --config $CONFIG --daemon fi ;; stop) if vpnrunning; then exec kill $(cat $PIDFILE) else echo "openvpn is not running" >&2 fi ;; esac
Die Zeilen 3 und 4 beinhalten die wichtigsten Konfigurationspfade. Die Zeilen 6 bis 9 überprüfen die übergebenen Parameter auf Richtigkeit. Sofern der aufrufende Benutzer keine Root-Rechte hat, versucht der folgende Block (Zeilen 11-14), diese mittels sudo zu erlangen. Die Zeilen 16-27 prüfen, ob der VPN-Prozess bereits läuft. Der Rest des Scripts befasst sich damit, den entsprechenden Prozess bei Bedarf zu starten und zu stoppen.
Das Script liegt unter /usr/local/bin/fhvpn
. Damit normale Benutzer VPN-Tunnel auf- und abbauen können, ist folgende Zeile in /etc/sudoers
nötig:
myUser ALL=NOPASSWD: /usr/local/bin/fhvpn
et voilá. Nun kann mittels fhvpn start und fhvpn stop das VPN kontrolliert werden. Eine mögliche Verbesserung wäre, den Namen der VPN-Konfiguration als zweiten Parameter entgegenzunehmen. Dem Leser sei diese Aufgabe selbst überlassen.
Noch mehr Automatismus
Es gibt viele Möglichkeiten, um die WLan-Verbindung zu verwalten. Neben händisch Konfigurationen mit wpa-supplicant (besonders interessant ist hier der Bereich Roaming in Kombination mit den üblichen up und down-Scripten) gibt es beispielsweise den häufig installierten Networkmanager oder wicd. Lässt man diese nach erfolgreicher Verbindung den Tunnel automatisch aufbauen, muss in der OpenVPN-Config das Passwort für die Zertifikatsdatei hinterlegt werden. Ich möchte an dieser Stelle ausdrücklich auf die damit verbundenen Sicherheitsrisiken hinweisen, da dass Passwort im Klartext gespeichert werden muss.
echo "askpass client.p" >> /etc/openvpn/fh.ovpn echo -n "mein-passwort" > /etc/openvpn/client.p chmod 400 /etc/openvpn/client.p
Zumindest für wicd ist es zusätzlich nötig, Scipte anzulegen welche ohne Parameter gestartet werden können. Diese sehen z.B. so aus:
#!/bin/sh exec fhvpn start
Diese Scripte können dann nach einer erfolgreichen Verbindung automatisch gestartet werden.
Have fun!