Table des matières
IPsec
Introduction
Sur Debian 9 (Stretch) c'est strongSwan 5.5.1 qui est le logiciel pour l'IPsec
Description
Dans la documentation ci-dessous, on utilise IPsec sans les policies du Kernel, mais en utilisant une interface virtuelle (ipsec0).
L'avantage, est que trafic de la connexion VPN IPsec est bien identifiée dans cette interface. Il est aussi plus simple de voir le routage et les règles de firewall.
Une table de routage dédié sera utile pour avoir une gateway par défaut par interface. Voir: https://www.thomas-krenn.com/en/wiki/Two_Default_Gateways_on_One_System
Installation
Sur les deux serveurs qui vont s'interconnecter, installer le package strongswan
sudo apt-get install strongswan
Configuration
Les trois fichiers les plus importants sont:
/etc/ipsec.conf
/etc/ipsec.secrets
/etc/strongswan.d/charon.conf
Plan de connexion
Le serveur gitoyen est le côté Gitoyen
- IP Publique: 80.67.163.55
- IP tunnel point-to-point: 10.123.124.1/30
Le serveur mycelium est le côté de Mycélium. Particularité de ce serveur, il est derrière du NAT. Il faut ouvrir les ports UDP 500 et 4500 vers son IP privée.
- IP Publique: 88.190.142.78
- IP tunnel point-to-point: 10.123.124.2/30
La configuration souhaitée est du Site-to-Site PSK. Voir le scénario proposé: https://www.strongswan.org/testing/testresults/ikev2/net2net-psk/
Configuration de gitoyen
Sur le serveur gitoyen éditer le fichier /etc/network/interfaces
et ajouter la configuration de l'interface ipsec0:
- /etc/network/interfaces
# IPsec interco Gitoyen <-> Mycelium auto ipsec0 iface ipsec0 inet static # Adresse IP et masque de sous-réseau address 10.123.124.1/30 # Création du tunnel ipsec0 en mode VTI (Virtual Tunnel Interface) # sur la clé 999 (le flux du tunnel IPsec sera envoyé dans cette clé) # En local l'IP du serveur et remote n'importe qui. Nous sommes dans # une configuration ou c'est le serveur distant derrier un NAT qui # se connecte. pre-up ip tunnel add ipsec0 local 80.67.163.55 remote 0.0.0.0 mode vti key 999 # Desactivation des policy kernel pour ipsec0 pre-up sysctl -w net.ipv4.conf.ipsec0.disable_policy=1 # Montage de l'interface avec un MTU de 1436 up ip link set up mtu 1436 dev ipsec0 # Routage du bloc 80.67.162.0/24 dans l'interface ipsec0 post-up ip route add 80.67.162.0/24 dev ipsec0 # Démontage de l'interface (ifdown) down ip tunnel del ipsec0
Puis lancer la commande suivante pour monter l'interface.
ifup ipsec0
Maintenant il faut éditer le fichier /etc/ipsec.conf
pour y mettre la configuration du VPN IPsec.
- /etc/ipsec.conf
# ipsec.conf - strongSwan IPsec configuration file # Configuration par défaut config setup conn %default # La clé IKE a une durée de 60 minutes avant renégociation ikelifetime=60m keylife=20m rekeymargin=3m keyingtries=1 # Authentification par secret (PSK) qui se trouve dans /etc/ipsec.secrets authby=secret # Mode IKEv2 keyexchange=ikev2 mobike=no # Configuration du tunnel Gitoyen <-> mycelium conn gitoyen-to-mycelium # Nom local leftid=gitoyen # IP local left=80.67.163.55 # Subnet partagé dans la phase 2. Ici tout passe, on gére le flux dans # l'interface ipsec0 et routage leftsubnet=0.0.0.0/0 # Pas de firewall (NAT) de se côté leftfirewall=no # Nom distant rightid=mycelium # IP distantes right=88.190.142.78 # Subnet partagé dans la phase 2. Ici tout passe, on gére le flux dans # l'interface ipsec0 et routage rightsubnet=0.0.0.0/0 # Chiffrement esp=aes256-sha256-modp8192 ike=aes256-sha256-modp8192 # On envoie le flux dans l'interface ipsec0 avec la clé 999 mark=999 # Connexion auto au démarrage auto=start include /var/lib/strongswan/ipsec.conf.inc
left
correspond à local,right
correspond à distant (du point du vue du serveur où on se trouve)- L'authenfication se fait via une clé partagée (PSK): https://wiki.strongswan.org/projects/strongswan/wiki/PskSecret
- Utilisation de IKEv2: https://wiki.strongswan.org/projects/strongswan/wiki/IKEv2CipherSuites
- Utilisation de ESP
- Cipher utilisé: AES256-SHA256-DH18
Editer le fichier /etc/ipsec.secrets
pour y mettre la clé partagée
- /etc/ipsec.secrets
gitoyen mycelium : PSK "<PRE SHARED KEY>"
Pour pouvoir gérer l'interface réseau ipsec0 et le routage, éditer le fichier /etc/strongswan.d/charon.conf
mettre no
aux options suivantes, décommenter si besoin.
- /etc/strongswan.d/charon.conf
install_routes = no install_virtual_ip = no
Configuration de mycelium
Sur le serveur mycelium éditer le fichier /etc/network/interfaces
et ajouter la configuration de l'interface ipsec0:
- /etc/network/interfaces
# IPsec interco Mycelium <-> Gitoyen auto ipsec0 iface ipsec0 inet static # Adresse IP et masque de sous-réseau address 10.123.124.2/30 # Création du tunnel ipsec0 en mode VTI (Virtual Tunnel Interface) # sur la clé 999 (le flux du tunnel IPsec sera envoyé dans cette clé) # En local n'importe quelle IP peut se connecter et remote IP distante. # Nous sommes dans une configuration ou c'est ce serveur qui se connecte à distance # car derriere un NAT pre-up ip tunnel add ipsec0 local 0.0.0.0 remote 80.67.163.55 mode vti key 999 # Desactivation des policy kernel pour ipsec0 pre-up sysctl -w net.ipv4.conf.ipsec0.disable_policy=1 # Montage de l'interface avec un MTU de 1436 up ip link set up mtu 1436 dev ipsec0 # Ajout de la gateway par défaut pour les connexions provenants de l'interface ipsec0 # dans la table dédiée routes-mycelium post-up ip route add default via 10.123.124.2 dev ipsec0 table routes-mycelium # Ajout d'une règle qui indique les connexions provenant du bloc 80.67.162.0/24 # soit gérées par la table de routage routes-mycelium post-up ip rule add from 80.67.162.0/24 table routes-mycelium # Démontage de l'interface (ifdown) down ip tunnel del ipsec0
Avant de monter l'interface il faut ajouter un nouveau fichier pour iproute2 afin de déclarer une nouvelle table de routage dédié au routage mycélium. Éditer le fichier /etc/iproute2/rt_tables.d/mycelium
et ajouter la ligne suivante:
1 routes-mycelium
Puis lancer la commande suivante pour monter l'interface.
ifup ipsec0
Maintenant il faut éditer le fichier /etc/ipsec.conf
pour y mettre la configuration du VPN IPsec.
- /etc/ipsec.conf
# ipsec.conf - strongSwan IPsec configuration file config setup conn %default ikelifetime=60m keylife=20m rekeymargin=3m keyingtries=1 authby=secret keyexchange=ikev2 mobike=no conn mycelium-to-gitoyen leftid=mycelium # N'importe quel IP peut se connecter car NAT left=%any leftsubnet=0.0.0.0/0 # Il y a un firewall NAT devant ce serveur leftfirewall=yes rightid=gitoyen right=80.67.163.55 rightsubnet=0.0.0.0/0 esp=aes256-sha256-modp8192 ike=aes256-sha256-modp8192 mark=999 auto=start include /var/lib/strongswan/ipsec.conf.inc
left
correspond à local,right
correspond à distant (du point du vue du serveur où on se trouve)- L'authenfication se fait via une clé partagée (PSK): https://wiki.strongswan.org/projects/strongswan/wiki/PskSecret
- Utilisation de IKEv2: https://wiki.strongswan.org/projects/strongswan/wiki/IKEv2CipherSuites
- Utilisation de ESP
- Cipher utilisé: AES256-SHA256-DH18
Editer le fichier /etc/ipsec.secrets
pour y mettre la clé partagée
mycelium gitoyen : PSK "<PRE SHARED KEY>"
Pour pouvoir gérer l'interface réseau ipsec0 et le routage, éditer le fichier /etc/strongswan.d/charon.conf
mettre no
aux options suivantes, décommenter si besoin.
install_routes = no install_virtual_ip = no
Connexion
Démarrage du service
systemctl start ipsec
Status du service
systemctl status ipsec
Arrêt du service
systemctl stop ipsec
État de la connexion
ipsec statusall
Connections: mycelium-to-gitoyen: %any...80.67.163.55 IKEv2 mycelium-to-gitoyen: local: [mycelium] uses pre-shared key authentication mycelium-to-gitoyen: remote: [gitoyen] uses pre-shared key authentication mycelium-to-gitoyen: child: 0.0.0.0/0 === 0.0.0.0/0 TUNNEL Security Associations (1 up, 0 connecting): mycelium-to-gitoyen[53]: ESTABLISHED 39 minutes ago, 192.168.1.210[mycelium]...80.67.163.55[gitoyen] mycelium-to-gitoyen[53]: IKEv2 SPIs: 1e4a14679360a74f_i* e01fdf36d2be6af0_r, pre-shared key reauthentication in 13 minutes mycelium-to-gitoyent[53]: IKE proposal: AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_8192 mycelium-to-gitoyen{89}: INSTALLED, TUNNEL, reqid 22, ESP in UDP SPIs: c6e7ce45_i c605ba7e_o mycelium-to-gitoyen{89}: AES_CBC_256/HMAC_SHA2_256_128/MODP_8192, 806600 bytes_i (9295 pkts, 0s ago), 59527 bytes_o (269 pkts, 0s ago), rekeying in 3 minutes mycelium-to-gitoyen{89}: 0.0.0.0/0 === 0.0.0.0/0
Si aucune connexion
Security Associations (0 up, 0 connecting): none
Routage (forwarding)
Sur les deux serveurs
echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/99-ip-forward.conf sysctl -w net.ipv4.ip_forward=1
Vu qu'il y a une interface ipsec0 pour la connexion VPN IPsec, il est possible d'activer le forwarding de manière habituelle
Sur le server OpenVPN
iptables -A FORWARD -i ipsec0 -o tunx -j ACCEPT iptables -A FORWARD -o ipsec0 -i tunx -j ACCEPT
Sur le server Interco
iptables -A FORWARD -i ipsec0 -o ethx -j ACCEPT iptables -A FORWARD -o ipsec0 -i ethx -j ACCEPT