====== 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