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
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
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
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?
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
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?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.
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. :)
Super. Vielen Dank. Es gibt also keinen Extra-Befehl dafür, somit ist das die beste Lösung.