====== 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**:
# 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.
# 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
gitoyen mycelium : PSK ""
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
==== Configuration de mycelium ====
Sur le serveur **mycelium** éditer le fichier ''/etc/network/interfaces'' et ajouter la configuration de l'interface **ipsec0**:
# 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.
# 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 ""
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