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