J’ai récemment été confronté à un problème. Je souhaitais connecter un Pfsense à un VPN Cisco.
Apres avoir glané pas mal d’informations sur le web, j’ai compris que cela n’allait pas être facile puisque les paquets permettant la connexion ne sont pas inclus dans Pfsense.
Pour se connecter au Cisco on va utiliser un utilitaire : Openconnect. Par défaut il n’est pas installé dans Pfsense, on va donc l’installer.
Le souci c’est que la version de Pfsense que j’utilise (la 2.1.5) est basée sur un FreeBSD 8.3. Hors le paquet officiel précompilé est pour la version 8.4 de FreeBSD. J’ai quand même essayé de l’installer :
pkg_add ftp://ftp.freebsd.org/pub/FreeBSD/ports/amd64/packages-8-stable/Latest/openconnect.tbz
Fetching ftp://ftp.freebsd.org/pub/FreeBSD/ports/amd64/packages-8-stable/Latest/openconnect.tbz... Done.
Fetching ftp://ftp.freebsd.org/pub/FreeBSD/ports/amd64/packages-8-stable/All/vpnc-scripts-20130311_1.tbz... Done.
Fetching ftp://ftp.freebsd.org/pub/FreeBSD/ports/amd64/packages-8-stable/All/libiconv-1.14_1.tbz... Done.
Fetching ftp://ftp.freebsd.org/pub/FreeBSD/ports/amd64/packages-8-stable/All/libxml2-2.8.0_3.tbz... Done.
A priori tout a l’air bon.
Afin que la commande soit disponible directement depuis la shell on utilise la commande rehash
A partir de maintenant vous pouvez déjà vous connecter via la commande openconnect.
openconnect --background --user=USERNAME --no-cert-check vpn.domain.tld
Openconnect va directement faire appel à vpnc et créer l’interface tun pour vous. Si vous voulez gérer cette interface via l’interface web de Pfsense, vous n’allez pas pouvoir. En effet un filtre s’applique à toutes les interfaces de type tun. Il faut donc renommer l’interface une fois que le vpn est connecté. Et pourquoi seulement après ? Car Openconnect n’accepte pas des interfaces de connexion différentes de tunX (hard codé dans le logiciel).
On peut donc renommer l’interface comme ceci :
ifconfig tun8 name ovpnc8
elle apparaitra donc dans l’interface et vous pourrez la gérer et l’affecter a une interface dans Pfsense.
Ok, maintenant on va rendre tout cela automatique via un script et le positionner dans la cron :
#!/bin/sh
#Variable to adjust
HOSTPING=HOST_TO_PING
HOSTPVN=VPN_ADDRESS
USER=wolfyxvf
PASS=strongpassword
INITTUN=tun8
NAMETUN=ovpnc8
#Tools
PING='/sbin/ping'
IFCONFIG='/sbin/ifconfig'
OPENCONNECT='/usr/local/sbin/openconnect'
DATE=`date`
PINGRES=`$PING -c 2 $HOSTPING`
PLOSS=`echo $PINGRES : | grep -o '[0-9][0-9][0-9].[0-9]% packet loss' | cut -f1 -d%'`
echo "$DATE : Loss Result : $PLOSS"
if [ "100.0" = "$PLOSS" ];
then
echo "$DATE : Deleting Old Interface : $NAMETUN"
$IFCONFIG $NAMETUN down
$IFCONFIG $NAMETUN destroy
echo "$DATE : Creating Interface : $INITTUN"
$IFCONFIG $INITTUM create
$IFCONFIG $INITTUM up
echo "$DATE : Starting : $NAMETUN"
echo -n $PASS | exec $OPENCONNECT --background --interface=$INITTUN --user=$USER --no-cert-check $HOSTPVN
echo "$DATE : Renaming Interface : $INITTUN to $NAMETUN"
$IFCONFIG tun8 name ovpnc8
echo "$DATE : Now running : $NAMETUN"
else
echo "$DATE : Already running"
fi
Puis on le met dans la cron de root :
crontab -e
*/10 * * * * /root/openconnect-vpn.sh >> /var/log/openconnect_pinger.log 2>&1
Petite note :
J’ai eu un souci lors du montage du VPN. Celui-ci me modifiait mon resolv.conf. Etant donné mon installation je ne souhaitais pas que cela arrive, j’ai donc mis en place un flag immutable
chflags schg /etc/resolv.conf
References :
- : Installation des paquets FreeBSD sur Pfsense
- : Interface tun non disponible dans l’interface Pfsense
- : Script d’automatisation du VPN