Tag Archive: cli

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