Page suivante - Page précédente - Table des matières

4. Le client

Nous nous consacrons maintenant au client. En pratique, lorsqu'elle est utilisé pour permettre l'accès à un réseau distant, cette machine peut facilement servir de serveur Samba (réseau Windows), DHCP, ou même web interne. L'aspect important dont il faut se souvenir est que cette machine doit être aussi sécurisée que possible, étant donnée qu'elle fait fonctionner tout votre réseau distant.

4.1 Le noyau

Commençons par le commencement. Vous devez disposer de ppp dans votre noyau. Si vous souhaitez autoriser plusieurs machines à utiliser le tunnel, il vous faut aussi les services de firewall et de transmission (forwarding). Si le client consiste en une seule machine, ppp est suffisant.

4.2 Réaliser la liaison

La liaison est créée en lançant pppd à travers un pseudo terminal lui-même créé par pty-redir et connecté à ssh. C'est ce que réalise la séquence de commande suivante.

# /usr/sbin/pty-redir /usr/bin/ssh -t -e none -o 'Batchmode yes' -c blowfish -i /root/.ssh/identity.vpn -l joe> /tmp/vpn-device
# sleep 10
# /usr/sbin/pppd `cat /tmp/vpn-device`
# sleep 15
# /sbin/route add -net 172.16.0.0 gw vpn-internal.mycompany.com netmask 255.240.0.0
# /sbin/route add -net 192.168.0.0 gw vpn-internal.mycompany.com netmask 255.255.0.0

Clairement, on lance ssh, et on redirige ses entrées et sorties vers pppd. Les options passées à ssh le configurent pour s'exécuter sans caractère d'échappement (-e), en utilisant l'algorithme de chiffrement blowfish (-i), en mode terminal (-l), avec les options 'Batchmode yes' (-o). Les commandes sleep sont utilisées pour espacer les exécutions des commandes pour que chacune puisse compléter son initialisation avant que la suivante ne soit lancée.

4.3 Faire des scripts

Bien sûr, vous ne souhaitez pas avoir à taper ces commandes à chaque fois que vous souhaitez voir le tunnel fonctionner. J'ai écrit un ensemble de scripts bash qui gardent le tunnel en état de fonctionnement. Vous pouvez télécharger le package à partir d'ici. Il suffit de les télécharger et de les décompresser dans /usr/local/vpn. Vous trouverez trois fichiers à l'intérieur:

  • vpnd: le script qui contrôle la connexion du tunnel.
  • check-vpnd: un script qui sera lancé par le cron pour vérifier que le VPN fonctionne toujours.
  • pty-redir: un petit exécutable requis pour l'initiation du tunnel.

Vous aurez besoin d'éditer le script vpnd pour assigner quelques valeurs telles que le nom d'utilisateur du client et le nom du serveur. Vous pourrez aussi avoir besoin de modifier la section starttunnel du script pour spécifier le réseau utilisé. Vous trouverez ci-dessous une copie du script pour le plaisir des yeux. Remarquez que vous pouvez mettre le script dans un répertoire différent, il suffit de changer la variable VPN_DIR.

#! /bin/bash
#
# vpnd: Monitor the tunnel, bring it up and down as necessary
#
USERNAME=vpn-username
IDENTITY=/root/.ssh/identity.vpn
VPN_DIR=/usr/local/vpn
LOCK_DIR=/var/run
VPN_EXTERNAL=vpn.mycompany.com
VPN_INTERNAL=vpn-internal.mycompany.com
PTY_REDIR=${VPN_DIR}/pty-redir
SSH=${VPN_DIR}/${VPN_EXTERNAL}
PPPD=/usr/sbin/pppd
ROUTE=/sbin/route
CRYPTO=blowfish
PPP_OPTIONS="noipdefault ipcp-accept-local ipcp-accept-remote local noauth nocrtscts lock nodefaultroute"
ORIG_SSH=/usr/bin/ssh
starttunnel () {
$PTY_REDIR $SSH -t -e none -o 'Batchmode yes' -c $CRYPTO -i $IDENTITY -l $USERNAME> /tmp/vpn-device
sleep 15
$PPPD `cat /tmp/vpn-device` $PPP_OPTIONS
sleep 15
# Add routes (modify these lines as necessary)
/sbin/route add -net 10.0.0.0 gw $VPN_INTERNAL netmask 255.0.0.0
/sbin/route add -net 172.16.0.0 gw $VPN_INTERNAL netmask 255.240.0.0
/sbin/route add -net 192.168.0.0 gw $VPN_INTERNAL netmask 255.255.0.0
}
stoptunnel () {
kill `ps ax | grep $SSH | grep -v grep | awk '{print $1}'`
}
resettunnel () {
echo "reseting tunnel."
date>> ${VPN_DIR}/restart.log
eval stoptunnel
sleep 5
eval starttunnel
}
checktunnel () {
ping -c 4 $VPN_EXTERNAL 2>/dev/null 1>/dev/null
if [ $? -eq 0 ]; then
ping -c 4 $VPN_INTERNAL 2>/dev/null 1>/dev/null
if [ $? -ne 0 ]; then
eval resettunnel
fi
fi
}
settraps () {
trap "eval stoptunnel; exit 0" INT TERM
trap "eval resettunnel" HUP
trap "eval checktunnel" USR1
}
runchecks () {
if [ -f ${LOCK_DIR}/tunnel.pid ]; then
OLD_PID=`cat ${LOCK_DIR}/vpnd.pid`
if [ -d /proc/${OLD_PID} ]; then
echo "vpnd is already running on process ${OLD_PID}."
exit 1
else
echo "removing stale pid file."
rm -rf ${LOCK_DIR}/vpnd.pid
echo $$> ${LOCK_DIR}/vpnd.pid
echo "checking tunnel state."
eval checktunnel
fi
else
echo $$> ${LOCK_DIR}/vpnd.pid
eval starttunnel
fi
}
case $1 in
check)  if [ -d /proc/`cat ${LOCK_DIR}/vpnd.pid` ]; then
kill -USR1 `cat ${LOCK_DIR}/vpnd.pid`
exit 0
else
echo "vpnd is not running."
exit 1
fi ;;
reset)  if [ -d /proc/`cat ${LOCK_DIR}/vpnd.pid` ]; then
kill -HUP `cat ${LOCK_DIR}/vpnd.pid`
exit 0
else
echo "vpnd is not running."
exit 1
fi ;;
--help | -h)
echo "Usage: vpnd [ check | reset ]"
echo "Options:"
echo "     check    Sends running vpnd a USR1 signal, telling it to check"
echo "              the tunnel state, and restart if neccesary."
echo "     reset    Sends running vpnd a HUP signal, telling it to reset"
echo "              it's tunnel connection." ;;
esac
ln -sf $ORIG_SSH $SSH
settraps
runchecks
while true; do
i=0
while [ $i -lt 600 ]; do
i=((i+1))
sleep 1
done
eval checktunnel
done

4.4 LRP - Projet de Routeur Linux (Linux Router Project)

J'ai lancé cette installation sur un Pentium 90 exécutant la distribution LRP de Linux. LRP est une distribution de Linux qui tient et se charge sur une seule disquette. Vous en apprendrez plus sur http://www.linuxrouter.org/. Vous pouvez télécharger ici mon package LRP pour le client VPN. Vous aurez aussi besoin des packages ppp et ssh du sîte LRP.


Page suivante - Page précédente - Table des matières