Aperçu

Grenode utilise abondamment des liaisons VPN entre ses machines pour s'affranchir des distances et des réseaux traversés.

De telles liaisons sont utilisées sur le backbone de Grenode :

Cette documentation liste les différents tunnels de Grenode, puis explique comment mettre en place un nouveau tunnel, si le besoin s'en fait sentir.

Schéma Générique d'une liaison VPN

  • N est le numéro de tunnel (arbitraire pour chaque tunnel)
  • A et B sont les parties locales de l'adresse IP de la machine (exemple pour soupirail : 91.216.110.1 , A = 1)

Schéma :

     10.N.47.A/32                                                  10.N.47.B/32
  tun-Bviatransit × -------------------  gre  ------------------ × tun-Aviatransit

                           10.N.50.A/32       10.N.50.B/32
                           -----------  ipsec  ----------

      dummy0 × MACHINE_A × eth2                      eth1 × MACHINE_B × dummy0
91.216.110.A               ip fixe pub        ip fixe pub               91.216.110.B

Liste des tunnels

Actif ? left leftvia rightvia right
2 obsolète passavant gitoyen ielo estran
4 obsolète soupirail miséricable gitoyen passavant
5 obsolète soupirail miséricable ielo batture
6 obsolète gaffe tetaneutral.net ielo estran
8 obsolète radeau ldn ielo batture
9 obsolète soupirail freewifi ielo batture
10 oui gaffe tetaneutral.net ielo batture
11 obsolète soupirail miséricable edx batture
12 - - - - -
13 obsolète radeau ldn edx safran
14 obsolète ajut ? gitoyen chaloupe
15 non - temp batture ? ipmax estran
16 oui gaffe tetaneutral.net edx safran
17 oui gaffe tetaneutral.net BGP safran
26 non caravelle hasgard rezopole batture
29 obsolète havre (grs) MNEI ielo batture
30 non - temp grouteur ? ielo estran
31 oui safran ielo gitoyen rafiot
32 oui safran gitoyen gitoyen rafiot
33 oui batture ielo gitoyen rafiot

Mise en place

Pour mettre en place ces tunnels, nous utilisions openswan, et avons migré vers strongswan avec le passage à jessie, donc :

apt-get install strongswan strongswan-pki

Sur la suite de cette documentation, nous utiliserons l'exemple du tunnel entre ajut et ?chaloupe.

Génération et copie des certificats

On génère d'abord (en root) une clef privée sur chaque machine, puis un certificat :

cd /etc/ipsec.d/
ipsec pki --gen --type rsa --outform pem --size 4096 > private/safran-key.pem
ipsec pki --self --in private/safran-key.pem --outform pem --lifetime 3650 --dn "CN=safran-16" > certs/safran-16.pem

À la fin du fichier /etc/ipsec.secrets, on fait appel à cette nouvelle clef générée :

echo ": RSA /etc/ipsec.d/private/safran-key.pem" >> /etc/ipsec.secrets

Sur chacune des machines, on copie ensuite le certificat généré sur l'autre machine (ici, copier safran-16.pem dans /etc/ipsec.d/certs/ sur gaffe, et vice et versa).

Configuration d'IPSec

Configuration générale

Sur les deux machines, on prépare ensuite la configuration générale d'IPSec, avec le fichier /etc/ipsec.conf suivant :

config setup

include /var/lib/strongswan/ipsec.conf.inc

conn %default
    dpdaction=clear
    dpdtimeout=120
    dpddelay=30

include /etc/ipsec.d/ipsec.*.conf

Pour s'assurer que le client réessaie de monter le tunnel en cas d'échec, il faut configurer l'option suivante dans /etc/strongswan.d/charon.conf :

retry_initiate_interval = 20

Si la machine est un routeur gérant beaucoup de routes, il faut configurer les lignes suivantes dans /etc/strongswan.d/charon.conf :

install_routes = no
process_routes = no
interfaces_use = eth1.XXX,eth1.XXX  # liste des interfaces (publiques) par lesquelles des tunnels sont montés

Configuration spécifique sur les machines

On configure les liaisons dans /etc/ipsec.d/, dans un fichier au nom explicite (citant les deux AS de premier hop de chaque côté s'ils sont connus). Par exemple, pour le fichier sur safran correspondant au tunnel vers gaffe et passant par EDX puis ttnn, on l'appelle ipsec.gaffe_via_edx_ttnn.conf.

On a donc sur safran :

conn gaffe_via_edx_ttnn
    left=149.7.4.180
    leftsubnet=10.16.50.10/32
    leftsourceip=10.16.50.10
    leftcert=safran-16.pem
    right=91.224.149.11
    rightsubnet=10.16.50.9/32
    rightsourceip=10.16.50.9
    rightcert=gaffe-16.pem
    auto=add

Le côté « left » correspond à la machine sur laquelle on est, et right l'autre bout du tunnel. On spécifie les IPs privées (du tunnel) pour chaque côté, ainsi que l'IP publique de la machine distante sur laquelle établir le tunnel. Si on ne connaît pas celle-ci (par exemple parce qu'elle est dynamique), on peut simplement omettre le paramètre "right" : cela produit une association "flottante" qui accepte les connexions depuis n'importe quelle IP publique.

La ligne auto sert à démarrer le tunnel ; un des deux côtés doit avoir start pour lancer automatiquement le tunnel, on peut mettre add sur l'autre côté pour que le tunnel soit ajoutés aux tunnels existants. Ici, add est sur safran, puisqu'il attend que gaffe monte le tunnel.

La configuration sur gaffe :

conn safran_via_ttnn_edx
    left=91.224.149.11
    leftcert=gaffe-16.pem
    leftsubnet=10.16.50.9/32
    leftsourceip=10.16.50.9
    right=149.7.4.180
    rightcert=safran-16.pem
    rightsubnet=10.16.50.10/32
    rightsourceip=10.16.50.10
    keyingtries=%forever
    auto=start

Configuration réseau

Sur l'interface publique utilisée (IPSec)

Sur cette interface, il faut ajouter l'IP du tunnel prévue à la section précédente. On ajoute donc à la section eth0 sur gaffe :

# les ips du tunnel vers safran
up   ip addr add 10.16.50.9/32 peer 10.16.50.10 dev $IFACE
down ip addr del 10.16.50.9/32 peer 10.16.50.10 dev $IFACE || true

De même, sur safran, on ajoute à la section eth0 :

# les ips du tunnel vers gaffe
up   ip addr add 10.16.50.10/32 peer 10.16.50.9 dev $IFACE
down ip addr del 10.16.50.10/32 peer 10.16.50.9 dev $IFACE || true

Interface pour le tunnel GRE

Le module GRE est nécessaire pour avoir des vrais tunnels de niveau 2, ce qui est nécessaire pour l'ospf entre deux routeurs. On ajoute sur chacune des machines une interface manuelle, à laquelle nous allons attribuer :

  • une IPv4 correspondant à l'IP du tunnel IPSec, en remplaçant 50 par 47 et
  • une IPv6 prise dans le Plan niveau3 IPv6, à ajouter dans les sections « Configuration des tunnels GRE pour encapsuler l'ipv6 » et « Découpage du réseau IPv6 ».

Cette interface doit monter (en pre-up) le tunnel GRE via l'IPSec. On utilise une règle iptables pour fixer le MTU et le clamp MSS respectivement à 1400 et 1360.

On a donc sur safran :

auto tun-16-gaffe
iface tun-16-gaffe inet manual
    pre-up ip tunnel add $IFACE mode gre remote 10.16.50.9 local 10.16.50.10
    up ip link set $IFACE up
    up ip link set $IFACE mtu 1400
    up iptables -t mangle -A POSTROUTING -o $IFACE -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1360
    up ip addr add 10.16.47.10/32 peer 10.16.47.9/32 dev $IFACE
    up ip -6 addr add 2001:912:0:FF16::10/64 dev $IFACE nodad
    down ip link set $IFACE down
    post-down ip tunnel del $IFACE

Et sur gaffe :

auto tun-16-safran
iface tun-16-safran inet manual
    pre-up ip tunnel add $IFACE mode gre remote 10.16.50.10 local 10.16.50.9
    up ip link set $IFACE up
    up ip link set $IFACE mtu 1400
    up iptables -t mangle -A POSTROUTING -o $IFACE -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1360
    up ip addr add 10.16.47.9/32 peer 10.16.47.10/32 dev $IFACE
    up ip -6 addr add 2001:912:0:FF16::9/64 dev $IFACE nodad
    down ip link set $IFACE down
    post-down ip tunnel del $IFACE

Démarrage et tests

Au point où on est rendus, on peut démarrer ipsec, puis les tunnels, et tester que chacune des machines pingue l'autre sur chacune des IPs (IPSec, puis GRE).

Par exemple sur ajut (après avoir lancé ipsec et le tunnel sur chaloupe) :

systemctl start ipsec
ipsec up chaloupe_via_gitoyen
ping 10.16.50.10 #-> si ok :
ping 10.16.47.10 #-> si ok, tout est bon.

Si tout ne fonctionne pas comme attendu, des infos utiles peuvent être trouvées :

  • dans /var/log/syslog
  • dans /var/log/auth.log
  • avec la commande ipsec status

Source routing pour liaison VPN multiple entre deux mêmes routeurs

Exemple : liaison entre soupirail et batture via miséricable et free.

              192.168.1.8
          +-- eth1.51 -------{free}
         /
soupirail                                  ...   {ielo} ---- eth0.606 --- batture
         \
          +-- eth0   --------{misericable}
              192.168.0.8

L'objectif est de faire deux liens ipsec :

  • batture_via_misericableielo
  • batture_via_freeielo

Il faut s'assurer que les paquets ip provenant de soupirail avec l'adresse 192.168.1.8 (respectivement 192.168.0.8) passe par lien free (resp. miséricable).

Pour cela il faut faire du source routing.

Ajouter les tables de routage nécessaire

echo "10      misericable" >> /etc/iproute2/rt_tables
echo "20      free"    >> /etc/iproute2/rt_tables

Ajout les routes sur les interfaces

Dans /etc/network/interfaces :

# sur l'interface eth0 de soupirail
up ip route add 192.168.0.0/24 src 192.168.0.8 dev $IFACE table misericable
up ip route add default via 192.168.0.1 table misericable
up ip route add 212.85.148.234 via 192.168.0.1 table misericable               # adresse de batture sur la patte ielo
up ip rule add from 192.168.0.0/24 table misericable
down ip rule del from 192.168.0.0/24 table misercable
down ip route del 212.85.148.234 via 192.168.0.1 table misericable
down ip route del default via 192.168.0.1 table misericable
down ip route del 192.168.0.0/24 src 192.168.0.8 dev $IFACE table misericable

# sur l'interface eth0.51 de soupirail
up ip route add 192.168.1.0/24 src 192.168.1.8 dev $IFACE table free
up ip route add default via 192.168.1.1 table free
up ip route add 212.85.148.234 via 192.168.1.1 table free       # adresse de batture sur la patte ielo
up ip rule add from 192.168.1.0/24 table free
down ip rule del from 192.168.1.0/24 table free
down ip route del 212.85.148.234 via 192.168.1.1 table free
down ip route del default via 192.168.1.1 table free
down ip route del 192.168.1.0/24 src 192.168.1.8 dev $IFACE table free