salut à tous,
Décidément le VPN d'ipcop (option RPV en bon français), je n'ai jamais réussi à le faire fonctionner sans avoir à cliquer quasiment tous les jours sur "reconnecter" pour qu'il se relance, et même des fois plusieurs fois par jour. J'ai mis en place Zerina, qui fonctionne très bien, mais j'aime moins la sécurité, j'ai donc arrêté.
J'ai voulu absolument remettre ce vpn fiable (c'est plutôt pénible d'appeler son client et lui expliquer qu'il faut cliquer sur la flèche en rond, etc )
Et pour ce faire, j'ai fait un script qui fonctionne très bien (taux de connexion de 97% entre 2 points en moyenne), et je vous le propose :
- Code: Tout sélectionner
cat ./reconn_vpn_v2.sh
#!/bin/sh
# creation par mab - le 27/09/2010
# remise en service d'un vpn ipcop en cas de coupure
# cas teste : - perte de la configuration d'un vpn (manque une ligne dans "ipsec eroute")
# - vpn en attente de reconnexion (message "%hold" dans "ipsec eroute" pour le vpn concerne)
# - la route du vpn est active dans l'interface, mais est morte de l'autre cote (le RUHERE ne fonctionne pas)
# - todo : le ping du réseau local distant semble impossible, merci de m'aider si vous savez comment on fait
# Script sous licence gpl
#
LOG=/var/log/messages
nosec=0
/usr/sbin/ipsec eroute >/tmp/liste2.txt
while IFS=' ' read a01 evpn_netlanloc[$nosec] a02 evpn_netlandist[$nosec] a03 evpn_netwandist[$nosec];
do
evpn_netreseaulandist[$nosec]="$(echo ${evpn_netlandist[$nosec]}|cut -f1 -d"/")"
evpn_netreseauwandist[$nosec]="$(echo ${evpn_netwandist[$nosec]}|cut -f2 -d"@"|cut -f1 -d":")"
nosec=$((nosec + 1 ))
done < /tmp/liste2.txt
back_ifs=$IFS
novpn=0
while IFS=, read vpn_no[$novpn] vpn_actif[$novpn] vpn_nom[$novpn] a04 vpn_typevpn[$novpn] a06 a07 a08 a09 vpn_netlanloc
[$novpn] a11 vpn_netwandist[$novpn] vpn_netlandist[$novpn] a14 a15 a16 a17 a18 a19 a20 a21 a22 a23 a24 a25 a26
vpn_commentaire[$novpn] a28 a29
do
if [ "${vpn_actif[$novpn]}" == "on" ]&&[ "${vpn_typevpn[$novpn]}" == "net" ]; then
vpn_addresselandist[$novpn]="$(echo ${vpn_commentaire[$novpn]}|awk '{print $1}')"
vpn_reseaulandist[$novpn]="$(echo ${vpn_netlandist[$novpn]}|cut -f1 -d"/")"
vpn_down[$novpn]="non"
#on va tester si la route existe dans ipsec mais est morte
ligne[$novpn]="$(echo ${evpn_netreseaulandist[*]}|grep "${vpn_reseaulandist[$novpn]}")"
if [ "${ligne[$novpn]}" == "" ]; then
vpn_down[$novpn]="oui"
fi
cptpassage=0
#on va tester si la route manque dans ipsec
while (( $cptpassage <= $nosec ));
do
if [ "${evpn_netreseaulandist[$cptpassage]}" == "${vpn_reseaulandist[$novpn]}" ]&&[ "${vpn_down[$novpn]}" != "oui" ];
then
if [ "${evpn_netreseauwandist[$cptpassage]}" == "%hold" ]; then
vpn_down[$novpn]="oui"
fi
fi
cptpassage=$((cptpassage + 1))
done
### on peut pas pinguer un reseau local distant via le vpn sur ipcop.... :-(
### si quelque'un sait comment faire, ça serait sympa de m'expliqer comment.
### #on va tester si 5 pings passent
### ping -c 5 -q -w 10 ${vpn_addresselandist[$novpn]}
### retval=$?
### if [ "$retval" > 0 ]; then
### vpn_down[$novpn]="oui"
### fi
# maintenant, on sait si le canal est bon ou mauvais
if [ ${vpn_down[$novpn]} == "oui" ]; then
/usr/bin/logger -t reconn-vpn "le reseau ${vpn_nom[$novpn]} n est pas actif, tentative de relance du vpn numero
${vpn_no[novpn]}"
echo -e "le reseau ${vpn_nom[$novpn]} n est pas actif, tentative de relance du vpn numero ${vpn_no[novpn]}"
/usr/local/bin/ipsecctrl S ${vpn_no[$novpn]}
fi
novpn=$((novpn + 1 ))
fi
done < /var/ipcop/vpn/config
IFS=$back_ifs
il faut aussi rajouter évidemment dans le crontab un
- Code: Tout sélectionner
*/2 * * * * /endroit-du-script-a-adapter-en-fonction/reconn_vpn_v2.sh
Bien entendu, il faut mettre le script ET la modif du crontab de chaque côté du VPN/RPV.
Ce script est plus précis que l'autre qui se trouve dans le Newbie kit, car il teste vpn par vpn et ne reconnecte que le vpn qui est déconnecté au lieu de tout redémarrer en aveugle, tuant tous les VPN en cours, même ceux qui ne sont pas déconnectés !
J'ai essayé de le rendre le moins gourmand possible en ressources, il y a peut-être moyen de faire mieux.
J'aimerais savoir aussi où est-il le plus convenable d'écrire ce script.
J'attends vos commentaires !