Outils pour utilisateurs

Outils du site


Panneau latéral

vpn-auto

Lancement automatique d'un VPN en fonction du réseau

Il peut être pratique, pour pas oublier de lancer son VPN, de le lancer automatiquement. Ici on partira du principe que le VPN est lancé dans tout autre réseau que son réseau local personnel.

Du coup, une méthode est de créer des scripts pour dans les répertoires se situant dans /etc/network/.

Par exemple, lancer automatiquement le VPN lorsqu'on est dans un certain réseau on peut écrire un script dans le répertoire /etc/network/if-up.d/monvpn :

#!/bin/sh
if [ ! -e /var/run/monvpn.pid ]; then
    echo "monvpninactif" > /var/run/monvpn.pid
fi
 
pid=`cat /var/run/monvpn.pid`
reseau_maison=`ip a | grep "192.168.2.40"`
reseau_lycee=`ip a | grep "172.16."`
 
if [ ! -e /proc/$pid ] && [ -z ${reseau_maison} ]; then
    if [ -z ${reseau_lycee} ]; then
        openvpn /home/pec/.vpn/rezine443.vpn &
        echo $! > /var/run/vpnrezine.pid
    else
        openvpn /home/pec/.vpn/rezine-lycee.vpn &
        echo $! > /var/run/vpnrezine.pid
    fi
fi

Il faut ensuite permettre l'execution de ce script :

chmod +x /etc/network/if-up.d/monvpn

Dans ce script, on veut pouvoir utiliser deux fichiers de configuration différents. On passe par le port 443 avec un fichier de conf classique dans tout autre réseau que son réseau local. Si ce réseau correspond à une établissement comme un lycée, on veut pouvoir s'authentifier sur un proxy pour lancer son VPN, du coup on veut lancer openvpn avec un autre fichier de conf.

Dans tous les cas, on écrit dans un fichier le PID du processus (numéro qui permet de connaitre le processus openvpn lancé). Cela sera utile lorsqu'on se déconnectera de ce réseau, pour terminer la session VPN proprement.

Lorsqu'on quitte un réseau, on veut que le VPN s'arrête et ne reste pas bloqué en tâche de fond avec le risque d'avoir des bugs en arrivant dans un autre réseau (mauvaises routes, processus qui ne s'arrête pas, soucis DNS…). On crée donc un script dans le répertoire /etc/network/if-post-down.d/ avec ceci dedans :

#!/bin/sh
pid=`cat /var/run/vpnrezine.pid`
 
if [ "$IFACE" != "tun0" ]; then
  if [ -e /proc/$pid ]; then
    /sbin/resolvconf -d "tun0.openvpn" ;
    kill $pid ; kill -INT $pid ; kill -HUP $pid ; kill -KILL $pid
  fi
fi

On rend le script executable : chmod +x /etc/network/if-post-down.d/arretvpn

Ce script réccupère le PID d'openvpn généré au lancement de celui-ci, si l'interface désactivée est différente du tunnel (câble ou wifi), alors on supprime le serveur DNS le cas échéant (si il a été ajouté à resolv.conf et qu'on tue openvpn, ce serveur DNS reste dans resolv.conf et c'est très compliqué de le virer sans avoir à rebooter… :( ). Ensuite on arrête openvpn, ce qui fait tomber la connection tun0.

Ce même genre de scripts peuvent être lancés par NetworkManager ou par le client DHCP. On pourra donc mettre des scripts dans /etc/dhcp/dhclient-enter-hooks.d qui se lancerons à l'attribution d'une IP par un serveur DHCP, dans /etc/dhcp/dhclient-exit-hooks.d à la “perte” d'une IP ou dans les répertoires pre-down.d, pre-up.d, situés dans /etc/NetworkManager/dispacher.d/. Ces scripts se lanceront selon l'état des interfaces réseau : à la déconnexion d'une interface ou à la connexion. (non testé)

vpn-auto.txt · Dernière modification: 2016/09/08 17:55 (modification externe)