Ubuntu Server CLI: Shrew Soft VPN Client

Nachdem ich schon die Installation des Clients mit GUI auf neueren Ubuntu Versionen beschrieb, hier nun die CLI Variante.

Neuere Ubuntu-Versionen (ich glaube ab ~12.10) haben den Client gar nicht mehr im Repository. Ältere, wie eben die LTS-Versionen, installieren als Abhängigkeit den QT-Client direkt mit, was ich auf einem Server für eher unglücklich halte.

Client Installation

Zuerst den Client von der offiziellen Shrew Soft-Website laden. Zum aktuellen Zeitpunkt ist die neueste Version 2.2.1. Im Anschluss entpacken und in das neue Verzeichnis wechseln:

mkdir -p ~/build && cd ~/build
wget https://www.shrew.net/download/ike/ike-2.2.1-release.tbz2
tar xfvj ike-2.2.1-release.tbz2
cd ike

Folgende Abhängigkeiten sind für das Bauen des Clients ohne GUI notwendig:

sudo apt-get install cmake build-essential libedit-dev libssl-dev flex bison lsb-cxx

Nun kann der Client kompiliert werden:

cmake -DCMAKE_INSTALL_PREFIX=/usr -DQTGUI=NO -DETCDIR=/etc -DNATT=YES
make
sudo make install

Init-Script für den Daemon

Die Beispielkonfiguration für den Daemon, der parallel läuft, reicht in der Regel aus. Diese Konfiguration hat erstmal nichts mit der VPN Konfiguration zu tun, die man später für den Client erstellt:

sudo cp /etc/iked.conf.sample /etc/iked.conf

Nun das Script:

sudo nano /etc/init.d/iked

Folgender Inhalt muss eingefügt werden:

#! /bin/sh -e
### BEGIN INIT INFO
# Provides: IKE daemon
# Required-Start: $network $syslog
# Required-Stop:  $network $syslog
# Default-Start:  2 3 4 5
# Default-Stop:   0 1 6
# Description:    start and stop the Shrew Soft IKE daemon
### END INIT INFO

test -x /usr/sbin/iked || exit 0

. /lib/lsb/init-functions

export PATH="${PATH:+$PATH:}/usr/sbin:/sbin"

case "$1" in
  start)
	log_begin_msg "Starting Shrew Soft IKE daemon..."
	start-stop-daemon --start --quiet --exec /usr/sbin/iked || log_end_msg 1
	log_end_msg 0
	;;
  stop)
	log_begin_msg "Stopping Shrew Soft IKE daemon..."
	start-stop-daemon --stop --quiet --oknodo --exec /usr/sbin/iked || log_end_msg 1
	log_end_msg 0
	;;

  restart)
	log_begin_msg "Restarting Shrew Soft IKE daemon..."
	start-stop-daemon --stop --quiet --oknodo --retry 30 --exec /usr/sbin/iked || log_end_msg 1
	start-stop-daemon --start --quiet --exec /usr/sbin/iked || log_end_msg 1
	log_end_msg 0
	;;

  *)
	log_success_msg "Usage: /etc/init.d/iked {start|stop|restart}"
	exit 1
esac

exit 0

Die Datei ausführbar machen, den Dienst installieren und starten:

sudo chmod +x /etc/init.d/iked && sudo update-rc.d iked defaults && sudo /etc/init.d/iked start

Konfiguration laden und Client starten

Vorab ein Auszug aus der Man-Page zu den Speicherorten:

All user related configuration data is stored under the ~/.iked directory.
Site Configuration files are stored under the ~/.iked/sites directory.
Certificates and keys are are typically stored under the ~/.iked/certs directory.

Der Client arbeitet nach folgender Syntax:

ikec -u Benutzername -p Passwort -r Konfigurationsname -a

Zuerst die Konfiguration der Site nach „~/.iked/sites“ kopieren, denn via Parameter „-r“ wird NICHT die Datei als Pfad eingetragen! Das führt zu einem Crash des Clients. Auch das Angeben eines falschen Site-Namens mag der Client nicht. Ich gehe als Dateinamen von „remotevpn.cfg“ aus:

sudo nano ~/.ike/sites/remotevpn.cfg

Aus der Command-Line kann nun der Client gestartet werden, mit Parameter „-a“ werden auch – falls notwendig für die Site – „-u“ und -p“ notwendig:

ikec -r remotevpn.cfg -u VPNUsername -p VPNPasswort -a

Oder in den Hintergrund legen nach dem Start:

ikec -r remotevpn.cfg -u VPNUsername -p VPNPasswort -a &

Der Client ist interaktiv, folgende Eingaben sind möglich:

c – connect
d – disconnect
h – help
s – status
q – quit

„Connect“ wird benötigt, wenn der Parameter „-a“ für Autostart weggelassen wird.

Optional: Client als Dienst

Für einen interaktiven Prozess als Dienst, verwende ich gerne „screen“:

sudo apt-get install screen

Im Init-Script SESSIONNAME, SITENAME, VPNUSER und VPNPASS anpassen. Werden Benutzer und Passwort nicht benötigt, können die Parameter hierfür in Zeile 19 entfernt werden. SESSIONNAME muss ein eindeutiger Session-Name für Screen sein.

sudo nano /etc/init.d/ikec

Folgender Inhalt muss eingefügt werden:

#!/bin/bash
### BEGIN INIT INFO
# Provides: ikec
# Required-Start: $network $syslog
# Required-Stop: $network $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Description: Start ikec
### END INIT INFO

SESSIONNAME=ikecsession
SITENAME=remotevpn.cfg
VPNUSER=Username
VPNPASS=Password

case "$1" in
start)
echo "Open ikec Connection..."
screen -S $SESSIONNAME -d -m ikec -r $SITENAME -u $VPNUSER -p $VPNPASS -a
;;

stop)
echo "Closing ikec Connection..."
su $RUNAS -c "screen -S $SESSIONNAME -X quit"
;;

*)
echo "Fehlerhafter Aufruf"
echo "Syntax: $0 {start|stop}"
exit 1
;;

esac

Die Datei ausführbar- sowie für andere Benutzer unlesbar machen (Zugangsdaten…) und den Dienst installieren/starten:

sudo chmod 700 /etc/init.d/ikec && sudo update-rc.d ikec defaults && sudo /etc/init.d/ikec start

8 Antworten auf “Ubuntu Server CLI: Shrew Soft VPN Client

  1. Enrico

    leider schlägt die Installarion ab dem Befehl „make“ immer fehl. Was kann ich tun?

    pi@raspberrypi:~/build/ike $ make
    [ 15%] Built target ss_ith
    [ 15%] Built target ss_log
    [ 15%] Built target ss_idb
    [ 15%] Built target ss_pfk
    [ 15%] Building CXX object source/libike/CMakeFiles/ss_ike.dir/manager.file.o
    /home/pi/build/ike/source/libike/manager.file.cpp: In member function ‘bool _CONFIG_MANAGER::file_pcf_load(CONFIG&, const char*, bool&)’:
    /home/pi/build/ike/source/libike/manager.file.cpp:682:19: error: aggregate ‘EVP_CIPHER_CTX ctx_cipher’ has incomplete type and cannot be defined
    EVP_CIPHER_CTX ctx_cipher;
    ^~~~~~~~~~
    make[2]: *** [source/libike/CMakeFiles/ss_ike.dir/build.make:102: source/libike/CMakeFiles/ss_ike.dir/manager.file.o] Error 1
    make[1]: *** [CMakeFiles/Makefile2:244: source/libike/CMakeFiles/ss_ike.dir/all] Error 2
    make: *** [Makefile:130: all] Error 2

  2. Bernd

    Kurzes Updates zu der klassen Anleitung,

    Ziel war es unter 14.04 eine automatische Verbindung zu einer FritzBox aufzubauen.

    Gemäß obiger Anleitung:
    1. Compilieren
    2. /etc/init.d/iked einrichten und starten
    3. Konfiguration mit dem Shrew UI testen ==>OK
    4. /etc/init.d/ikec einrichten und manuell starten ==>OK
    Was aber fehlschlug war die automatische Verbindung nach einem Reboot.

    Nach folgenden Schritten gelang aber auch diese:
    1. sudo cp -r /home/myuser/.ike /root (/etc/init.d/ikec startet als root . Also sucht ikec die Konfigurationsdateien auch im Home von root)
    2. ikec musste bei mir nach iked gestartet werden. Daher Änderung der Startreihenfolge durch
    update-rc.d -f ikec remove
    update-rc.d ikec defaults 99

    1. Bernd

      Nachtrag zu meinem vorherigen Kommentar:

      Die Verbindung wird nur dann nach einem Reboot aufgebaut, wenn sich das .ike Verzeichniss
      sowohl in / als auch in /root befindet (also /.ike und /root/.ike). Unschön, funktioniert aber.

      Woran kann das liegen, wie geht das korrekt?

  3. Fabian

    hallo Andre,

    wie bzw. wo bekomme ich die „remotevpn.cfg“ her wenn ich ausschließlich einen Ubuntu 12.04 LTS Server als CLI habe?

    Oder besser… was muss drin stehen(Aufbau)? Die VPN Parameter habe ich per eMail bekommen.

    Danke

    1. André P. Autor

      Hi Fabian,
      puh, das kommt ganz drauf an, die Konfiguration kann immer anders aussehen.
      Je nach dem wie die Daten aussehen, die du per Mail bekommen hast, kann es am einfachsten sein, wenn du an deinem Computer (PC?) den Client installierst, eine neue Konfiguration nach den Vorgaben erstellst und diese dann exportierst.
      Oder hast du die Daten im Format n:version:4 n:network-ike-port:500 ... bekommen?

  4. Karl Mauch

    Zuerst vielen Dank für den Artikel!

    Für mich bleibt folgende Frage offen:
    Wenn ich ikec mit
    ikec -r remotevpn.cfg -u VPNUsername -p VPNPasswort -a &
    im Hintergrund starte, wie kann ich die Verbindung beenden und ikec wieder verlassen (d und q oder nur q im interaktiven Modus)?
    Hintergrund: Ich möchte die VPN-Verbindung per Skript starten, einige Befehle ausführen und dann die Verbindung und ikec wieder beenden.
    Danke.

    1. André P. Autor

      Hi, danke! :)
      Ich würde es im Script einfach im Hintergrund starten lassen und am Ende mit „kill -2 `pidof ikec`“ schließen.
      Die „2“ sendet ein SIGINT für einen „gracefully close“, tötet die Anwendung also nicht einfach, sondern gibt ihr Zeit aufzuräumen. :)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.