#!/bin/sh # pipsecd2ipsectools - outil d'aide à la migration de pipsecd vers ipsec-tools # Copyright ©2011 Agence universitaire de la Francophonie # http://www.auf.org/ # Licence : GNU General Public License, version 3 # Auteur : Progfou # Création : 2011-02-15 # Mise à jour : 2011-09-13 # # Mode d'emploi : # - changer les adresses IP ci-dessous en prenant soin de spécifier un réseau # de CIDR /20 pour se préparer au futur RPV v2 LOCALGW="210.245.61.206" LOCALIP="10.230.0.254" LOCALNET="10.230.0.0/20" # - lancer ce script, sous root, dans le serveur où est installé pipsecd et # sauver le résultat dans un fichier, par exemple : # # pipsecd2ipsectools > /root/ipsec-tools.conf # - vérifier le résultat obtenu avec votre RTR ou un autre collègue ayant # déjà fait la migration # - vérifier la configuration des règles de pare-feu pour s'assurer de NE PAS # faire de NAT en sortie vers 10.0.0.0/8, par exemple : # # iptables -t nat -I POSTROUTING -d 10.0.0.0/8 -j RETURN # - ajouter les routes statiques recommandées en commentaire dans le résultat # du lancement du script, soit dans /etc/network/interface, par exemple : # up ip route replace 10.36.0.0/20 via 118.70.0.243 dev ppp0 src 10.230.0.254 # soit dynamiquement au lancement d'une interface PPP, par exemple dans un # fichier /etc/ppp/ip-up.d/0000iproute tel que suit : # #!/bin/sh # IP="/sbin/ip" # for net in `awk '/^spdadd .* out /{print $3}' /etc/ipsec-tools.conf` ; do # $IP route replace "$net" via $PPP_REMOTE dev $PPP_IFACE src 10.230.0.254 # done # $IP route replace default via $PPP_REMOTE dev $PPP_IFACE src 210.245.61.206 # - convenir avec un des admins du RPV (Jean Christophe André ou Moussa Nombré) # du moment de la bascule de pipsecd vers ipsec-tools # - stopper le service pipsecd et purger le paquet pipsecd devenu inutile : # # /etc/init.d/pipsecd stop # # aptitude purge pipsecd # - installer le paquet ipsec-tools et la configuration IPsec natif, par exemple : # # aptitude install ipsec-tools # # cat /root/ipsec-tools.conf >> /etc/ipsec-tools.conf # # service setkey restart # - demander le redémarrage du Netopia correspondant à Montréal # - tester que tout fonctionne bien, depuis le pare-feu et depuis un poste client cat << __EOF__ # REMARQUES : # - l'ordre des règles spdadd est important et doit correspondre à l'ordre # des routes les plus précises vers les routes les plus générales # ne pas utiliser IPsec en réseau local spdadd $LOCALNET $LOCALNET any -P out none ; spdadd $LOCALNET $LOCALNET any -P in none ; __EOF__ ( # pré-traitement de la liste des réseaux dans /etc/pipsecd/startup awk ' /^ifconfig / { IF=substr($2,6) REMOTENET=$5; split(REMOTENET,N,"\.") REMOTEMASK=$7; split(REMOTEMASK,M,"\.") REMOTENET=N[1]"."N[2]"."N[3]".0" # incorrect mais plus simple pour le moment REMOTECIDR=20 # 32-log(256^4-(M[1]*256^3+M[2]*256^2+M[3]*256+M[4]))/log(2) printf("remotenet %s %s\n", IF, REMOTENET"/"REMOTECIDR) } ' /etc/pipsecd/startup # envoi du contenu de /etc/pipsecd/pipsecd.conf sed -e '/^[^#]/s/ *= */=/g' /etc/pipsecd/pipsecd.conf ) | awk -v LOCALGW="$LOCALGW" -v LOCALIP="$LOCALIP" -v LOCALNET="$LOCALNET" ' /^remotenet / { IF=$2; REMOTENET[IF]=$3 #printf("# IF=%s REMOTENET=%s\n", IF, REMOTENET[IF]) } /^#/ { LASTCOMMENT=$0 } /^sa / { SPI=substr($3,5) ENC=substr($4,5); EKEY=substr($5,6); gsub("_","-",ENC) AUTH=substr($6,6); AKEY=substr($7,6); gsub("_","-",AUTH) if (AUTH=="hmac-md5-96") { AUTH="hmac-md5" } if ($8 != "") { OSPI=SPI; OENC=ENC; OEKEY=EKEY; OAUTH=AUTH; OAKEY=AKEY REMOTEGW=substr($8,6) } else { ISPI=SPI; IENC=ENC; IEKEY=EKEY; IAUTH=AUTH; IAKEY=AKEY } } /^if / { IF=$2; LSPI=substr($3,10); RSPI=substr($4,11) IPROUTE="ip route add "REMOTENET[IF]" via "LOCALGW" src "LOCALIP printf("%s\n#%s\n\n", LASTCOMMENT, IPROUTE) printf("spdadd %s %s any -P out ipsec\n", LOCALNET, REMOTENET[IF]) printf(" esp/tunnel/%s-%s/require ;\n", LOCALGW, REMOTEGW) printf("spdadd %s %s any -P in ipsec\n", REMOTENET[IF], LOCALNET) printf(" esp/tunnel/%s-%s/require ;\n\n", REMOTEGW, LOCALGW) printf("add %s %s esp-old %s -m tunnel\n", LOCALGW, REMOTEGW, OSPI) printf(" -E %s 0x%s\n -A %s 0x%s ;\n", OENC, OEKEY, OAUTH, OAKEY) printf("add %s %s esp-old %s -m tunnel\n", REMOTEGW, LOCALGW, ISPI) printf(" -E %s 0x%s\n -A %s 0x%s ;\n\n", IENC, IEKEY, IAUTH, IAKEY) EMPTYLINE=0 } /^[ ]*$/ { if (EMPTYLINE!=1) { print ""; EMPTYLINE=1 } } ' exit 0