Reconnexion automatique VPN (PPTP) sous Debian Squeeze

Publié le 11 septembre 2011 par Taltan

Depuis plus d'un an et demi j'utilise le service de VPN IPjetable, d’abord avec Ubuntu puis aujourd'hui avec Debian Squeeze. Ce VPN utilise le protocole PPTP, très facilement configurable et nativement supporté sous Linux. Je ne vais pas expliquer ce qu'est un VPN, d'autres l'ont trés bien fait, notamment l'excellent Korben, ni comment on le configure sous Debian, c'est enfantin (exemple ici, et c'est valable pour toutes distros sous Gnome). Le souci lorsqu'on utilise un service de VPN (même payant) c'est le déconnexion aléatoire de temps en temps. Pour gérer la reconnexion automatique, plusieurs solutions existent à base de scripts ou alors plus visuelles avec vpnautoconnect par exemple, mais aucune de ces solutions ne répond exactement à mon besoin qui est le suivant :

  • Reconnexion automatique en cas de coupure du VPN
  • Support du protocole PPTP
  • Maîtrise total du processus de connexion
  • Pas de connexion automatique au démarrage de la machine
  • Solution à base de scripts
  • Solution portable sur d'autres distributions que Debian
  • Garder la possibilité de se connecter normalement avec NetworkManager (Gnome)

L’idée est donc d'avoir deux icônes sur le tableau de bord, le premier pour lancer la connexion VPN (avec reconnexion automatique en cas de coupure de VPN) et le second pour couper le VPN. Pour ce faire je me suis largement inspiré d'une série de scripts que coredump a mise à disposition sur le forum d'ubuntu.fr, merci à lui pour son gros travail... La solution se résume donc à quatre scripts.

Pré-requis

La configuration du VPN a l'aide de NetworkManager doit être effective, sous Debian Squeeze (64 bits), il est nécessaire d'installer quelques paquets :

apt-get install network-manager-pptp-gnome network-manager-pptp pptp-linux

Pour la configuration, le tuto sur le site d'IPjetable explique bien la procédure de configuration. Il est à noter que sur toutes les distributions 64 bits que j'ai pu tester, j'ai du renseigner, pour le champ passerelle, l'adresse IP du VPN plutot que son FQDN pour que cela fonctionne correctement. Pensez à noter dans un coin le « Nom de la connexion » (IPjetable dans mon cas), il sera utile pour la suite afin de renseigner les variables dans les scripts.

VPN01_connection-service

C'est le script le plus important, il utilise D-bus pour contrôler le NetworkManager, vous trouverez l'explication de son fonctionnement ici. Vous pouvez le récupérer ici : VPN01_connection-service

Une fois récupéré il faut le placer dans le répertoire /usr/local/bin/ en le renommant « connection-service » et le rendre exécutable (commande à exécuter en root)

cp VPN01_connection-service /usr/local/bin/connection-service
chmod +x /usr/local/bin/connection-service

Ce script permet de contrôler en ligne de commande le lancement, l’arrêt et le status du VPN, il peut s'utiliser de manière autonome par rapport aux scripts suivants. Exemples (il faut être root) :

Démarrer le VPN « IPjetable »
connection-service IPjetable start
Vérifier le status (en marche ou arrêté) du VPN
connection-service IPjetable status
Eteindre le VPN « IPjetable »
connection-service IPjetable stop

VPN02_02-loop-vpn

C'est le script qui permet de vérifier en boucle que la connexion VPN est bien active et la relancer si nécessaire, ils est à copier dans le répertoire /etc/NetworkManager/dispatcher.d et à renommer en « 02-loop-vpn » sans le rendre exécutable. Pour info, les scripts qui sont mis dans le répertoire /etc/NetworkManager/dispatcher.d sont exécutés automatiquement à chaque changement d’état du réseau. Donc tant que le script 02-loop-vpn n'est pas rendu exécutable, il sera inactif, c'est là l'astuce ! Vous pouvez récupérer ce script ici : VPN02_02-loop-vpn

#!/bin/bash
CONNECTION_NAME="IPjetable" # renseignez ici le nom de votre connexion VPN
while ! connection-service "$CONNECTION_NAME" status
do
  connection-service "$CONNECTION_NAME" start
  sleep 10
done

Puis (en root)

cp VPN02_02-loop-vpn /etc/NetworkManager/dispatcher.d/02-loop-vpn

VPN03_vpnstart

Ce script permet le lancement de la connexion VPN et d'activer la reconnexion automatique en rendant exécutable le script 02-loop-vpn. Il nécessite le paquet zenity. Il est à placer dans le répertoire /usr/local/bin en le renommant « vpnstart » et à rendre exécutable (commande à exécuter en root). Vous pouvez le récupérer ici : VPN03_vpnstart

#!/bin/bash
# Nécessite le paquet zenity : apt-get install zenity
VPN_NAME="IPjetable"  # renseignez ici le nom de votre connexion VPN
foo=`gksudo -u root -k -m "Entrer votre mot de passe ROOT" /bin/echo "Do you have root access?"`
chmod +x /etc/NetworkManager/dispatcher.d/02-loop-vpn
connection-service "$VPN_NAME" start |
(
echo "# Connexion à $VPN_NAME en cours..." ; sleep 5
) |
zenity --progress --width=400 --auto-close --title="Connexion du VPN $VPN_NAME" --pulsate
cp VPN03_vpnstart /usr/local/bin/vpnstart
chmod +x /usr/local/bin/vpnstart

Le résultat de la commande vpnstart sera :

VPN04_vpnstop

Ce script permet de couper la connexion VPN et de désactiver la reconnexion automatique en rendant non exécutable le script 02-loop-vpn. Il nécessite le paquet zenity. Il est à placer dans le répertoire /usr/local/bin en le renommant « vpnstop » et à rendre exécutable (commande à exécuter en root). Vous pouvez le récupérer ici : VPN04_vpnstop

#!/bin/bash
# Nécessite le paquet zenity : apt-get install zenity
VPN_NAME="IPjetable"  # renseignez ici le nom de votre connexion VPN
foo=`gksudo -u root -k -m "Entrer votre mot de passe ROOT" /bin/echo "Do you have root access?"`
chmod -x /etc/NetworkManager/dispatcher.d/02-loop-vpn
connection-service "$VPN_NAME" stop |
(
echo "# Déconnexion $VPN_NAME en cours..." ; sleep 5
) |
zenity --progress --width=400 --auto-close --title="Déconnexion du VPN $VPN_NAME" --pulsate
cp VPN04_vpnstop /usr/local/bin/vpnstop
chmod +x /usr/local/bin/vpnstop

Le résultat de la commande vpnstop sera :

Conclusion

Voila tout est prêt, il ne reste plus qu'a créer deux lanceurs, un pointant vers « vpnstart » et l'autre vers « vpnstop ». Par exemple :

Vous pouvez récupérer les icônes ici : VPN_icons.tar.gz

Liens