[Resolu] vpn avec 2 ips dynamiques

Forum traitant de la distribution sécurisée montante nommée IP cop et basée sur la distribution Smoothwall. C'est à l'heure actuelle le forum le plus actif du site.

Modérateur: modos Ixus

[Resolu] vpn avec 2 ips dynamiques

Messagepar popoch » 22 Juil 2004 14:41

Bonjour,

je dois mettre en place un vpn entre 2 reseaux. Pour cela j utilise 2 ipcops avec des ips publiques dynamiques. Le pb c est que le vpn tombe souvent a cause du changement d ips.

Pour remedier a cela j ai essaye le script vpn watch, mais cela ne fonctionne pas...

Je recherches donc des personnes qui ont mis en place des configurations identiques, pour avoir quelques conseils... j ai essaye de mettre en place en script shell qui lorsqu il ne reussit pas a pinger un hote, lance la commande "ipsecctrl S" pour reinitialiser le tunnel, mais ca na marche pas terrible.


Merci d avance pour vos reponses.
Dernière édition par popoch le 26 Juil 2004 16:41, édité 1 fois au total.
:D :D :D


Cordialement popoch
Avatar de l’utilisateur
popoch
Vice-Amiral
Vice-Amiral
 
Messages: 582
Inscrit le: 05 Mars 2004 01:00
Localisation: Brest / Lannion / Rennes

Messagepar nl » 22 Juil 2004 15:22

Utilise ddclient, disponible sur dyndns.org. C'est celui que j'utilise et cela fct parfaitement. Installation facile.
Si l'automobile avait progressé de la même façon que l'informatique, une Rolls-Royce couterait aujourd'hui 100 dollars, ferait 300.000 kilomètres avec un seul litre d'essence et exploserait une fois par an en tuant tous ses passagers. (Cringely)
Avatar de l’utilisateur
nl
Capitaine de vaisseau
Capitaine de vaisseau
 
Messages: 254
Inscrit le: 19 Déc 2002 01:00
Localisation: Suisse

Messagepar popoch » 22 Juil 2004 15:49

je n ai pas de pb avec mon dyndns... le client ipcop fonctionne tres bien, je n ai pas besion d en installer un autre supplementaire...


je voudrais juste faire en sorte que le tunnel se recree automaitquement qd les ips des 2 ipcops changent...
:D :D :D


Cordialement popoch
Avatar de l’utilisateur
popoch
Vice-Amiral
Vice-Amiral
 
Messages: 582
Inscrit le: 05 Mars 2004 01:00
Localisation: Brest / Lannion / Rennes

Messagepar nl » 22 Juil 2004 16:04

Je t'ai mis la source complète, car l'adresse ne fct plus


http://www.ixus.net/modules.php?mop=mod ... 8&forum=10


Bonjour,

Aprés avoir lu à plusieurs reprise le mal de certain à relancer leurs connections VPN (Dyndns): voici ce qui va vous changer la vie.
et vous évitera ce message:

"packet from IP:500: initial Main Mode message received on IP:500 but no connection has been authorized"


Voici, le script "ipsecmon.pl" perl à installer dans /usr/local/bin/ :

#------------------couper ici-------------------------------
#!/usr/bin/perl

# ipsec_monitor for FreeS/WAN
# Copyright (C) 2003 by Tim Niemueller <tim@niemueller.de>
# Website: http://www.niemueller.de/software/perl/ipsecmonitor
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.


#### Modules
use strict;
use Getopt::Long;
use POSIX qw(setsid);
use Fcntl ':flock';

#### Constants, just to make code readable
my $VERSION="0.1";
my $ipsec="/usr/sbin/ipsec"; ########## Fonction de votre distrib

#### Get parameters
my %params=();
GetOptions("conn=s" => \\$params{'conn'},
"host=s" => \\$params{'host'},
"script:s" => \\$params{'script'},
"t:i" => \\$params{'t'},
"d" => \\$params{'d'},
"s" => \\$params{'s'},
) or usage();
if ( ($params{'conn'} eq "") || ($params{'host'} eq "") ) {
usage();
}
if ( ($params{'script'} ne "") && (! -x $params{'script'}) ) {
failure_exit("The script file does not exist or is not executable.");
}
if ($params{'t'} eq "") {
$params{'t'} = 180;
}

if ($params{'s'}) {
use Sys::Syslog qw(:DEFAULT setlogsock);
setlogsock('unix');
openlog("ipsec_monitor($params{'conn'})", "", "authpriv");
}

# Where should we create the lock file?
my $lockfile = "/var/lock/ipsec_monitor.$params{'conn'}.lock";

#### Signals
$SIG{'TERM'} = \\&terminate_daemon;
$SIG{'HUP'} = \\&check_status;

#### Globals to make it quick and dirty
my $oldaddr = "";

#### Main Program, main() like

daemonize();
create_lock();

while (1) {
my $oa = $oldaddr;
my $na = check_status();
# logmsg("debug", "IP checked: ".join(".", unpack('C4', $oa))." -> ".join(".", unpack('C4', $na)));
sleep $params{'t'};
}


#### Subs related to time handling and alarms
sub check_status {
my $newaddr=gethostbyname($params{'host'});
if ($newaddr ne $oldaddr) {
# Address has changed, replace connection
logmsg("info", "IP change detected: ".join(".", unpack('C4', $oldaddr))." -> ".join(".", unpack('C4', $newaddr)));
if ($oldaddr ne "") {
# On Startup this is empty of course...
logmsg("info", "Replacing connection");
system("$ipsec auto --replace $params{'conn'}");
if ($params{'script'}) {
# We have a script file, wait 60 seconds and then excute it
sleep 60;
system($params{'script'});
}
}
$oldaddr = $newaddr;
}
return $newaddr;
}


#### Subs related to basic program stuff (daemon, fifo, lock etc.)

# Could be modified to syslog for example
sub logmsg {
my $priority = shift;
my $msg = shift;

if ($params{'d'}) {
my $now=localtime();
print "$now ($priority): ".printf($msg, @_)."\\n";
} else {
if ($params{'s'}) {
syslog($priority, $msg, @_);
}
}
}

# logs the errors and exits the program
sub failure_exit {
logmsg($_[0]);
die $_[0];
}


# Disconnects from console
sub daemonize {
if (! $params{'d'}) {
my $pid;
chdir '/' or failure_exit("Can't chdir to /: $!");
open STDIN, '/dev/null' or failure_exit("daemonize: Can't read /dev/null: $!");
open STDOUT, '>/dev/null' or failure_exit("daemonize: Can't write to /dev/null: $!");
defined($pid = fork) or failure_exit("Can't fork: $!");
exit 0 if $pid;
setsid() or failure_exit("Can't start a new session: $!");
print LOCK $$;
logmsg("info", "Started successfully");
}
}

# creates the lockfile
sub create_lock {
open(LOCK, ">$lockfile");
my $ok = flock(LOCK, LOCK_EX | LOCK_NB);
failure_exit("It seems that another instance is already running") if (! $ok);
}


# removes the lockfile
sub remove_lock {
flock(LOCK, LOCK_UN);
close(LOCK);
unlink $lockfile;
}

# Terminates daemon closing ISDN connection,
# used as signal handler
sub terminate_daemon {
alarm 0; # Stop timer
remove_lock();
logmsg("info", "Stopped");
if ($params{'s'}) {
closelog();
}
exit;
}

# prints some basic usage message
sub usage {
print "ipsec_monitor v$VERSION\\n",
"Copyright (C) 2003 by Tim Niemueller\\n\\n",
"Monitors a hostname and when it changes replaces the IPSec\\n",
"connection (FreeS/WAN style) to get the link up again\\n\\n",
"Usage: ipsec_monnitor --conn=CONNECTIONNAME \\\\\\n",
" --host=HOSTNAME [options]\\n",
"where options are:\\n",
"--conn=CONN: FreeS/WAN Connection name\\n",
"--host=HOST: Hostname of the connection to be monitored\\n",
"--script=..: Path to an additional script that is executed 1 minute\\n",
" after the connection has been replaced. For example routing\\n",
" stuff that needs to be done. Script must be executable!\\n",
"-t t : check every t seconds if connection parameters have changed\\n",
" Dafault: 180 seconds\\n",
"-d : Debug mode. Do not fork to background, log output to STDOUT\\n",
"-s : Use Syslog for logging. Default is no logging.\\n",
"\\n";
exit 1;
}
#--------------------------------couper ici-------------------------------------------------

Donc voila une fois le script installé, il faut le rendre executable (chmod 755 ipsecmon.pl).


Voici un script "reload.sh" qui va relancer une conn vpn, à ajouter dans /usr/local/bin

#----------------------couper ici---------------------------------------
#!/bin/sh
echo "redemarrage ipsec vpnclient1";
/usr/sbin/ipsec auto --replace vpnclient1
/usr/sbin/ipsec auto --rereadsecrets
/usr/sbin/ipsec auto --up vpnclient1

exit 0
#------------------------couper ici--------------------------------------

rendre le script executable (chmod 755 reload.sh)
VPNCLIENT1 est le nom du --conn dans ipsec.conf.


Voici la syntaxe à utiliser sur le serveur VPN:

perl /usr/local/bin/ipsemon.pl --conn VPNCLIENT1 --host=toto.riri.tata --script=/usr/local/bin/reload.sh -s

--HOST: c'est l'adresse de type dyndns (ou static), de votre VPNCLIENT1




Voila il reste plus qu'a reproduire fonction du nombre de client (VPNCLIENT2, VPNCLIENT3 etc...), et recreer un reload.sh par client (reload1.sh, reload2.sh etc...)




Voila en esperant que cela réponde à un besoin.
Si l'automobile avait progressé de la même façon que l'informatique, une Rolls-Royce couterait aujourd'hui 100 dollars, ferait 300.000 kilomètres avec un seul litre d'essence et exploserait une fois par an en tuant tous ses passagers. (Cringely)
Avatar de l’utilisateur
nl
Capitaine de vaisseau
Capitaine de vaisseau
 
Messages: 254
Inscrit le: 19 Déc 2002 01:00
Localisation: Suisse

Messagepar popoch » 22 Juil 2004 16:06

je suis desole mais ton lien ne fonctionne pas... :cry:
:D :D :D


Cordialement popoch
Avatar de l’utilisateur
popoch
Vice-Amiral
Vice-Amiral
 
Messages: 582
Inscrit le: 05 Mars 2004 01:00
Localisation: Brest / Lannion / Rennes

Messagepar popoch » 22 Juil 2004 16:07

merci beaucoup... je test cela tout de suite 8)
:D :D :D


Cordialement popoch
Avatar de l’utilisateur
popoch
Vice-Amiral
Vice-Amiral
 
Messages: 582
Inscrit le: 05 Mars 2004 01:00
Localisation: Brest / Lannion / Rennes

Messagepar nl » 22 Juil 2004 16:07

Si tu cherches dans le forum tu trouveras aussi :

#!/bin/sh
#a placer dans /usr/local/bin/
#chmod 755 /usr/local/bin/reconn_vpn.sh
#crontab -e
#*/5 * * * * /usr/local/bin/reconn_vpn.sh

LOG=/var/log/messages
getip() {
IP=`/usr/local/sbin/ipsec eroute | fgrep "@" | cut -f2 -d"@"`
}
# verif si Tunnel si UP
OK=no
getip
if ! [ "$IP" ]; then
#echo "PAS ADRESSE IP VALIDE";
OK = no;
else
# echo "ADRESSE IP EXISTE";
# echo $IP;
for i in $IP; do
if [ $OK = "no" ]; then
ping -n -q -c 1 -i 1 $i
if [ $? = "0" ]; then
OK=yes
fi
fi
done
#echo $OK;
fi
if [ $OK = "no" ]; then
# pas de vpn ou déconnecté
/usr/local/bin/ipsecctrl R
echo $(date)" : Reconnexion VPN" >>$LOG;
fi
Si l'automobile avait progressé de la même façon que l'informatique, une Rolls-Royce couterait aujourd'hui 100 dollars, ferait 300.000 kilomètres avec un seul litre d'essence et exploserait une fois par an en tuant tous ses passagers. (Cringely)
Avatar de l’utilisateur
nl
Capitaine de vaisseau
Capitaine de vaisseau
 
Messages: 254
Inscrit le: 19 Déc 2002 01:00
Localisation: Suisse

Messagepar popoch » 22 Juil 2004 16:33

merci beaucoup...
:D :D :D


Cordialement popoch
Avatar de l’utilisateur
popoch
Vice-Amiral
Vice-Amiral
 
Messages: 582
Inscrit le: 05 Mars 2004 01:00
Localisation: Brest / Lannion / Rennes

Messagepar popoch » 22 Juil 2004 16:41

pour le contenu de ton script "reload.sh"


on pourrait pas le remplacer par :

/usr/local/bin/ipsecctrl S

:?: :?:

Est ce que en chargeant le script au demarrage en le rajoutant ds le rc.local, il tournerait en fond de tache tout le tps ???
:D :D :D


Cordialement popoch
Avatar de l’utilisateur
popoch
Vice-Amiral
Vice-Amiral
 
Messages: 582
Inscrit le: 05 Mars 2004 01:00
Localisation: Brest / Lannion / Rennes

Messagepar popoch » 22 Juil 2004 16:44

PS : je suis en version 1.4b3 des 2 cotes...

j ai essaye les 2 scripts et il y en a aucun qui marche.... ca me desespere... :cry:


perl /usr/local/bin/ipsecmon.pl --conn=xxxxx --host=xxxxx.ath.cx --script:/usr/local/bin/reload.sh -t:60 -d -s
Invalid option linkage for "conn=s"
Invalid option linkage for "host=s"
Invalid option linkage for "script:s"
Invalid option linkage for "t:i"
Invalid option linkage for "d"
Invalid option linkage for "s"


/usr/local/bin/reconn_vpn.sh : line 1: fgrep: command not found
/usr/local/bin/reconn_vpn.sh : line 11: OK: command not found


:cry: :cry:
:D :D :D


Cordialement popoch
Avatar de l’utilisateur
popoch
Vice-Amiral
Vice-Amiral
 
Messages: 582
Inscrit le: 05 Mars 2004 01:00
Localisation: Brest / Lannion / Rennes

Messagepar nl » 23 Juil 2004 08:48

Le 2ème fonctionne parfaitement avec la 1.3.

Pourquoi utilises-tu une version beta en production ? C'est pas très prudent ...

Ca doit pas être compliqué de modifier ce script pour la 1.4

on pourrait pas le remplacer par :

/usr/local/bin/ipsecctrl S


/usr/local/bin/ipsecctrl R pour être exact
Si l'automobile avait progressé de la même façon que l'informatique, une Rolls-Royce couterait aujourd'hui 100 dollars, ferait 300.000 kilomètres avec un seul litre d'essence et exploserait une fois par an en tuant tous ses passagers. (Cringely)
Avatar de l’utilisateur
nl
Capitaine de vaisseau
Capitaine de vaisseau
 
Messages: 254
Inscrit le: 19 Déc 2002 01:00
Localisation: Suisse

Messagepar popoch » 23 Juil 2004 10:13

pour ipsecctrl R = "reload secrets and certificats"

pour ipsecctrl S = "restart vpn connexion"


C est ipsecctrl S que j utilise actuellement pour reouvrir le tunnel qd le vpn tombe. C estpour cela que je pose la question... Peut etre qu il y a une difference entre la version 1.3 et 1.4 ...


En ce qui concerne l utilisation de la version 1.4 au lieu de la 1.3, j en ai longuement parle sur ce forum et finalement je me suis decide pour la 1.4... Je n ai aucun pb hormis les reconnexions vpn...


Pour le deuxieme script, c est cette ligne qui est a l orignie du pb... :

Code: Tout sélectionner
IP=`/usr/local/sbin/ipsec eroute | fgrep "@" | cut -f2 -d"@"`


le chemin pour ipsec n est pas bon...

il faudrait le remplacer par celle ci :

Code: Tout sélectionner
IP=`/usr/sbin/ipsec eroute | fgrep "@" | cut -f2 -d"@"`


Mais il me reste encore a regle l histoire de la commande "fgrep", grep existe bien sur la version 1.4, mais la syntaxe ne correspond pas...
:D :D :D


Cordialement popoch
Avatar de l’utilisateur
popoch
Vice-Amiral
Vice-Amiral
 
Messages: 582
Inscrit le: 05 Mars 2004 01:00
Localisation: Brest / Lannion / Rennes

Messagepar popoch » 26 Juil 2004 16:40

Voila le script modifie pour la version 1.4 :

Code: Tout sélectionner
#!/bin/sh
LOG=/var/log/messages
getip() {
IP=`/usr/sbin/ipsec eroute | grep -F "@" | cut -f2 -d"@"`
}
# verif si Tunnel si UP
OK=no
getip
if ! [ "$IP" ]; then
#echo "PAS ADRESSE IP VALIDE";
OK=no;
else
# echo "ADRESSE IP EXISTE";
# echo $IP;
for i in $IP; do
if [ $OK = "no" ]; then
ping -n -q -c 1 -i 1 $i
if [ $? = "0" ]; then
OK=yes
fi
fi
done
#echo $OK;
fi
if [ $OK = "no" ]; then
# pas de vpn ou déconnecté
/usr/local/bin/ipsecctrl S
echo $(date)" : Reconnexion VPN" >>$LOG;
fi


A automatise avec le cron et c est tout bon... :wink:
:D :D :D


Cordialement popoch
Avatar de l’utilisateur
popoch
Vice-Amiral
Vice-Amiral
 
Messages: 582
Inscrit le: 05 Mars 2004 01:00
Localisation: Brest / Lannion / Rennes

Messagepar Viking » 19 Oct 2004 18:36

Bjr à tous,

merci pour cette astuced bien pratique quand on utilise un VPN avec une ou des adresse dynamiques.

Toutefois, j'ai effectué quelques modification sur le script afin de le rendre plus efficace.
En effet, si on utilise le script tel que, on ne peur jamais pinguer l'hote puisque le résultat de la commande :
/usr/sbin/ipsec eroute | grep -F "@" | cut -f2 -d"@" donne un truc comme ça
10.0.0.1:0
en effet, l'adresse extraite est aussi extraite avec des données supplémentaires.
ainsi, j'ai modifié la ligne de commande pour donner ceci :
/usr/sbin/ipsec eroute | grep -F "@" | cut -f2 -d"@" | grep -F ":" | cut -f1 -d":"
ainsi, seule l'adresse IP du VPN distant apparait.
Ce qui donne pour le script final ceci :



#!/bin/sh
LOG=/var/log/messages
getip() {
IP=`/usr/sbin/ipsec eroute |grep -F "@" | cut -f2 -d"@" | grep -F ":" | cut -f1 -d":"`
}
#verif si tunel si UP
OK=no
getip
if ! [ "$IP" ]; then
echo "PAS D'ADRESSE IP VALIDE";
OK=no;
else
echo "ADRESSE IP EXISTE";
for i in $IP; do
if [ $OK = "no" ]; then
ping -n -q -c 1 -i 1 $i
if [ $? = "0" ]; then
OK=yes
fi
fi
done
fi
if [ $OK = "no" ]; then
echo "pas de vpn ou déconnecté"
/usr/local/bin/ipsecctrl S
echo $(date)" : Reconnexion VPN" >>$LOG;
fi

En conclusion, ce script permet le test de la connexion et ne force par la réinitialisation de l'IPSEC tout le temps comme précédement.

bon courage à tous
Mieux vaut une tête bien faite qu'une tête bien pleine (Montaigne)
Avatar de l’utilisateur
Viking
Premier-Maître
Premier-Maître
 
Messages: 63
Inscrit le: 11 Sep 2003 00:00
Localisation: Oise

Messagepar popoch » 20 Oct 2004 11:23

Tu as teste le script sur la version 1.4 final ?
:D :D :D


Cordialement popoch
Avatar de l’utilisateur
popoch
Vice-Amiral
Vice-Amiral
 
Messages: 582
Inscrit le: 05 Mars 2004 01:00
Localisation: Brest / Lannion / Rennes

Suivant

Retour vers IPCop

Qui est en ligne ?

Utilisateur(s) parcourant actuellement ce forum : Aucun utilisateur inscrit et 1 invité