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
N° | 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