list2form : gestion des erreurs et des petits fichiers (merci cgi.py…)
[progfou.git] / ipsec / pipsecd2ipsectools
1 #!/bin/sh
2 # pipsecd2ipsectools - outil d'aide à la migration de pipsecd vers ipsec-tools
3 # Copyright ©2011  Agence universitaire de la Francophonie
4 #                  http://www.auf.org/
5 # Licence : GNU General Public License, version 3
6 # Auteur : Progfou <jean-christophe.andre@auf.org>
7 # Création : 2011-02-15
8 # Mise à jour : 2011-09-13
9 #
10 # Mode d'emploi :
11 # - changer les adresses IP ci-dessous en prenant soin de spécifier un réseau
12 #   de CIDR /20 pour se préparer au futur RPV v2
13 LOCALNET="10.230.0.0/20"
14 LOCALIP="10.230.0.254"
15 PUBLICIP="210.245.61.206"
16 GW="118.70.0.243"
17 # - lancer ce script, sous root, dans le serveur où est installé pipsecd et
18 #   sauver le résultat dans un fichier, par exemple :
19 #     # pipsecd2ipsectools > /root/ipsec-tools.conf
20 # - vérifier le résultat obtenu avec votre RTR ou un autre collègue ayant
21 #   déjà fait la migration
22 # - vérifier la configuration des règles de pare-feu pour s'assurer de NE PAS
23 #   faire de NAT en sortie vers 10.0.0.0/8, par exemple :
24 #     # iptables -t nat -I POSTROUTING -d 10.0.0.0/8 -j RETURN
25 # - ajouter les routes statiques recommandées en commentaire dans le résultat
26 #   du lancement du script, soit dans /etc/network/interface, par exemple :
27 #     up ip route replace 10.36.0.0/20 via 118.70.0.243 dev ppp0 src 10.230.0.254
28 #   soit dynamiquement au lancement d'une interface PPP, par exemple dans un
29 #   fichier /etc/ppp/ip-up.d/0000iproute tel que suit :
30 #     #!/bin/sh
31 #     IP="/sbin/ip"
32 #     for net in `awk '/^spdadd .* out /{print $3}' /etc/ipsec-tools.conf` ; do
33 #       $IP route replace "$net" via $PPP_REMOTE dev $PPP_IFACE src 10.230.0.254
34 #     done
35 #     $IP route replace default via $PPP_REMOTE dev $PPP_IFACE src 210.245.61.206
36 # - convenir avec un des admins du RPV (Jean Christophe André ou Moussa Nombré)
37 #   du moment de la bascule de pipsecd vers ipsec-tools
38 # - stopper le service pipsecd et purger le paquet pipsecd devenu inutile :
39 #     # /etc/init.d/pipsecd stop
40 #     # aptitude purge pipsecd
41 # - installer le paquet ipsec-tools et la configuration IPsec natif, par exemple :
42 #     # aptitude install ipsec-tools
43 #     # cat /root/ipsec-tools.conf >> /etc/ipsec-tools.conf
44 #     # service setkey restart
45 # - demander le redémarrage du Netopia correspondant à Montréal
46 # - tester que tout fonctionne bien, depuis le pare-feu et depuis un poste client
47
48 cat << __EOF__
49
50 # REMARQUES :
51 # - l'ordre des règles spdadd est important et doit correspondre à l'ordre
52 #   des routes les plus précises vers les routes les plus générales
53
54 # ne pas utiliser IPsec en réseau local
55
56 spdadd $LOCALNET $LOCALNET any -P out none ;
57 spdadd $LOCALNET $LOCALNET any -P in none ;
58
59 __EOF__
60
61 (
62 # pré-traitement de la liste des réseaux dans /etc/pipsecd/startup
63 awk '
64 /^ifconfig / {
65   IF=substr($2,6)
66   REMOTENET=$5; split(REMOTENET,N,"\.")
67   REMOTEMASK=$7; split(REMOTEMASK,M,"\.")
68   REMOTENET=N[1]"."N[2]"."N[3]".0" # incorrect mais plus simple pour le moment
69   REMOTECIDR=20 # 32-log(256^4-(M[1]*256^3+M[2]*256^2+M[3]*256+M[4]))/log(2)
70   printf("remotenet %s %s\n", IF, REMOTENET"/"REMOTECIDR)
71 }
72 ' /etc/pipsecd/startup
73 # envoi du contenu de /etc/pipsecd/pipsecd.conf
74 sed -e '/^[^#]/s/ *= */=/g' /etc/pipsecd/pipsecd.conf
75 ) | awk -v LOCALNET="$LOCALNET" -v LOCALIP="$LOCALIP" -v LOCALTUNIP="$PUBLICIP" -v GW="$GW" '
76 /^remotenet / {
77   IF=$2; REMOTENET[IF]=$3
78   #printf("# IF=%s REMOTENET=%s\n", IF, REMOTENET[IF])
79 }
80 /^#/ {
81   LASTCOMMENT=$0
82 }
83 /^sa / {
84   SPI=substr($3,5)
85   ENC=substr($4,5); EKEY=substr($5,6); gsub("_","-",ENC)
86   AUTH=substr($6,6); AKEY=substr($7,6); gsub("_","-",AUTH)
87   if (AUTH=="hmac-md5-96") { AUTH="hmac-md5" }
88   if ($8 != "") {
89     OSPI=SPI; OENC=ENC; OEKEY=EKEY; OAUTH=AUTH; OAKEY=AKEY
90     REMOTETUNIP=substr($8,6)
91   } else {
92     ISPI=SPI; IENC=ENC; IEKEY=EKEY; IAUTH=AUTH; IAKEY=AKEY
93   }
94 }
95 /^if / {
96   IF=$2; LSPI=substr($3,10); RSPI=substr($4,11)
97   IPROUTE="ip route add "REMOTENET[IF]" via "GW" src "LOCALIP
98   printf("%s\n#%s\n\n", LASTCOMMENT, IPROUTE)
99   printf("spdadd %s %s any -P out ipsec\n", LOCALNET, REMOTENET[IF])
100   printf("  esp/tunnel/%s-%s/require ;\n", LOCALTUNIP, REMOTETUNIP)
101   printf("spdadd %s %s any -P in ipsec\n", REMOTENET[IF], LOCALNET)
102   printf("  esp/tunnel/%s-%s/require ;\n\n", REMOTETUNIP, LOCALTUNIP)
103   printf("add %s %s esp-old %s -m tunnel\n", LOCALTUNIP, REMOTETUNIP, OSPI)
104   printf("  -E %s 0x%s\n  -A %s 0x%s ;\n", OENC, OEKEY, OAUTH, OAKEY)
105   printf("add %s %s esp-old %s -m tunnel\n", REMOTETUNIP, LOCALTUNIP, ISPI)
106   printf("  -E %s 0x%s\n  -A %s 0x%s ;\n\n", IENC, IEKEY, IAUTH, IAKEY)
107   EMPTYLINE=0
108 }
109 /^[     ]*$/ {
110   if (EMPTYLINE!=1) { print ""; EMPTYLINE=1 }
111 }
112 '
113 exit 0