Outil d'aide à la migration de pipsecd vers ipsec-tools.
authorProgfou <jean-christophe.andre@auf.org>
Wed, 16 Feb 2011 10:21:56 +0000 (17:21 +0700)
committerProgfou <jean-christophe.andre@auf.org>
Wed, 16 Feb 2011 10:21:56 +0000 (17:21 +0700)
sysadmin/pipsecd2ipsectools [new file with mode: 0755]

diff --git a/sysadmin/pipsecd2ipsectools b/sysadmin/pipsecd2ipsectools
new file mode 100755 (executable)
index 0000000..4ad48eb
--- /dev/null
@@ -0,0 +1,77 @@
+#!/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 <jean-christophe.andre@auf.org>
+# Création : 2011-02-15
+# Mise à jour : 2011-02-16
+LOCALGW="210.245.61.206"
+LOCALIP="10.230.0.254"
+LOCALNET="10.230.0.0/20"
+
+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=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 }
+}
+'