linux_strongswan

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
linux_strongswan [2019/05/16 10:13] – [Établissement de la connexion] nekanlinux_strongswan [2021/03/05 14:15] (Version actuelle) nekan
Ligne 1: Ligne 1:
 ====== Installation d'un VPN site à site avec StrongSwan ====== ====== Installation d'un VPN site à site avec StrongSwan ======
 +<label type="info">Création</label> --- //[[nekan@shyrkasystem.com|Nicolas THOREZ]] 2019/05/15 20:20//
  
 Le recours à un VPN est très utile dans différents cas. Les plus importants sont : Le recours à un VPN est très utile dans différents cas. Les plus importants sont :
Ligne 7: Ligne 8:
 Sous linux, il existe plusieurs possibilités pour établir un tunnel VPN. Les plus courantes seront OpenVPN, intéressant dans le cadre d'un poste itinérant, et StrongSwan, pour les tunnel IPSec site à site. Sous linux, il existe plusieurs possibilités pour établir un tunnel VPN. Les plus courantes seront OpenVPN, intéressant dans le cadre d'un poste itinérant, et StrongSwan, pour les tunnel IPSec site à site.
  
-<note important>Ce tutoriel a été réalisé sur deux debian stretch (version 9.4 et 9.7) et en tant que root. Les adresses IP choisies sont volontairement fausses.</note>+<callout type="danger" icon="true" title="Droits">Ce tutoriel a été réalisé sur deux debian stretch (version 9.4 et 9.7) et en tant que root. Les adresses IP choisies sont volontairement fausses.</callout>
  
 ===== Installation ===== ===== Installation =====
  
   * On commence par mettre à jour notre base de paquets.   * On commence par mettre à jour notre base de paquets.
-<code bash>apt-get update</code>+<sxh bash>apt-get update</sxh>
   * On installe le paquet nécessaire.   * On installe le paquet nécessaire.
-<code bash>apt-get install strongswan</code>+<sxh bash>apt-get install strongswan</sxh>
   * La partie "Installation" est terminée. Cette étape doit être réalisée sur chacune des deux têtes de pont de notre tunnel VPN, à savoir les deux postes.   * La partie "Installation" est terminée. Cette étape doit être réalisée sur chacune des deux têtes de pont de notre tunnel VPN, à savoir les deux postes.
  
Ligne 36: Ligne 37:
     * La plage d'adressage à utiliser pour attribuer une adresse IP locale aux postes distants (on peut aussi une adresse unique si une seule machine (la tête de pont donc) doit se connecter).     * La plage d'adressage à utiliser pour attribuer une adresse IP locale aux postes distants (on peut aussi une adresse unique si une seule machine (la tête de pont donc) doit se connecter).
  
-<note warning>Attention aux plages d'adressage. Un VPN ne pourra jamais fonctionner correctement si une plage d'adressage (par exemple : 192.168.0.0/24) existe des deux côtés du tunnel. En effet, les routeurs chercherons toujours à utiliser les routes les plus courtes et si une plage correspond aussi bien à du local qu'à du distant, la route locale sera toujours plus courte.</note>+<callout type="warning" icon="true" title="Adressage IP">Attention aux plages d'adressage. Un VPN ne pourra jamais fonctionner correctement si une plage d'adressage (par exemple : 192.168.0.0/24) existe des deux côtés du tunnel. En effet, les routeurs chercherons toujours à utiliser les routes les plus courtes et si une plage correspond aussi bien à du local qu'à du distant, la route locale sera toujours plus courte.</callout>
  
 Voici donc mon tableau récapitulatif : Voici donc mon tableau récapitulatif :
Ligne 61: Ligne 62:
  
   * On commence par établir une carte réseau virtuelle qui correspond au routeur de la plage destinée aux postes distants :   * On commence par établir une carte réseau virtuelle qui correspond au routeur de la plage destinée aux postes distants :
-<code bash>nano /etc/network/interfaces</code>+<sxh bash>nano /etc/network/interfaces</sxh>
   * On ajoute notre interface :   * On ajoute notre interface :
-<code bash># "auto" correspond aux montage automatique de l'interface au démarrage de la machine+<sxh bash># "auto" correspond aux montage automatique de l'interface au démarrage de la machine
 # "eth1:0" correspond à l'interface virtuelle 0 (la première) de l'interface physique eth1 # "eth1:0" correspond à l'interface virtuelle 0 (la première) de l'interface physique eth1
 auto eth1:0 auto eth1:0
 # On déclare l'interface avec une adresse statique # On déclare l'interface avec une adresse statique
 iface eth1:0 inet static iface eth1:0 inet static
-        address 10.0.1.1/24</code+        address 10.0.1.1/24</sxh> 
-  * On édite le fichier de configuration. +  * On active notre nouvelle interfacve : 
-<code bash>nano /etc/ipsec.conf</code>+<sxh bash>ifup eth1:0</sxh
 +  * On édite le fichier de configuration d'ipsec : 
 +<sxh bash>nano /etc/ipsec.conf</sxh>
   * On écris la configuration choisie dans le fichier :   * On écris la configuration choisie dans le fichier :
-<code bash>## On commence par la configuration générale du deamon ipsec+<sxh bash>## On commence par la configuration générale du daemon ipsec
 config setup config setup
     # Cette ligne sert à l'établissement des logs     # Cette ligne sert à l'établissement des logs
Ligne 127: Ligne 130:
     # On indique notre souhait de forcer l'encapsulation des données (pour plus de sécurité)     # On indique notre souhait de forcer l'encapsulation des données (pour plus de sécurité)
     forceencaps=yes     forceencaps=yes
-    # Cette ligne permet d'indiquer au deamon ipsec, son comportement en cas de perte de connexion+    # Cette ligne permet d'indiquer au daemon ipsec, son comportement en cas de perte de connexion
     # pull pour attendre l'établissement d'une connexion de la part de l'autre tête de pont     # pull pour attendre l'établissement d'une connexion de la part de l'autre tête de pont
     # push pour établir cette connexion     # push pour établir cette connexion
     modeconfig=push     modeconfig=push
-</code>+</sxh>
   * Une fois ce fichier de configuration enregistrée, il faut éditer le fichier qui contiendra le PSK :   * Une fois ce fichier de configuration enregistrée, il faut éditer le fichier qui contiendra le PSK :
-<code bash>nano /etc/ipsec.secrets</code>+<sxh bash>nano /etc/ipsec.secrets</sxh>
   * Dans ce fichier, on indique notre PSK (J'ai choisi "Azerty123" pour l'exemple) en le précédant de l'adresse IP publique locale puis l'adresse IP publique distante, ce qui aura pour effet d'associer ce PSK à la connexion que nous avons paramétrée.   * Dans ce fichier, on indique notre PSK (J'ai choisi "Azerty123" pour l'exemple) en le précédant de l'adresse IP publique locale puis l'adresse IP publique distante, ce qui aura pour effet d'associer ce PSK à la connexion que nous avons paramétrée.
-<code bash># PSK pour test-vpn +<sxh bash># PSK pour test-vpn 
-78.79.1.2 89.90.3.4 : PSK "Azerty123"</code>+78.79.1.2 89.90.3.4 : PSK "Azerty123"</sxh>
  
-<note important>Il faut obligatoirement ouvrir les port UDP 500 et UDP 4500 sur votre solution de pare-feu et ce, pour chaque tête de pont.</note>+<callout type="danger" icon="true" title="Pare-feu">Il faut obligatoirement ouvrir les port UDP 500 et UDP 4500 sur votre solution de pare-feu et ce, pour chaque tête de pont.</callout>
  
 Notre première tête de pont est paramétrée. Passons à la seconde. Notre première tête de pont est paramétrée. Passons à la seconde.
Ligne 147: Ligne 150:
  
   * On commence par établir une carte réseau virtuelle qui correspond au routeur de la plage destinée aux postes distants :   * On commence par établir une carte réseau virtuelle qui correspond au routeur de la plage destinée aux postes distants :
-<code bash>nano /etc/network/interfaces</code>+<sxh bash>nano /etc/network/interfaces</sxh>
   * On ajoute notre interface :   * On ajoute notre interface :
-<code bash># "auto" correspond aux montage automatique de l'interface au démarrage de la machine+<sxh bash># "auto" correspond aux montage automatique de l'interface au démarrage de la machine
 # "eth1:0" correspond à l'interface virtuelle 0 (la première) de l'interface physique eth1 # "eth1:0" correspond à l'interface virtuelle 0 (la première) de l'interface physique eth1
 auto eth1:0 auto eth1:0
 # On déclare l'interface avec une adresse statique # On déclare l'interface avec une adresse statique
 iface eth1:0 inet static iface eth1:0 inet static
-        address 10.0.2.1/32</code+        address 10.0.2.1/32</sxh> 
-  * On édite le fichier de configuration. +  * On active notre nouvelle interfacve : 
-<code bash>nano /etc/ipsec.conf</code>+<sxh bash>ifup eth1:0</sxh
 +  * On édite le fichier de configuration d'ipsec : 
 +<sxh bash>nano /etc/ipsec.conf</sxh>
   * On écris la configuration choisie dans le fichier :   * On écris la configuration choisie dans le fichier :
-<code bash>## On commence par la configuration générale du deamon ipsec+<sxh bash>## On commence par la configuration générale du daemon ipsec
 config setup config setup
     # Cette ligne sert à l'établissement des logs     # Cette ligne sert à l'établissement des logs
Ligne 213: Ligne 218:
     # On indique notre souhait de forcer l'encapsulation des données (pour plus de sécurité)     # On indique notre souhait de forcer l'encapsulation des données (pour plus de sécurité)
     forceencaps=yes     forceencaps=yes
-    # Cette ligne permet d'indiquer au deamon ipsec, son comportement en cas de perte de connexion+    # Cette ligne permet d'indiquer au daemon ipsec, son comportement en cas de perte de connexion
     # pull pour attendre l'établissement d'une connexion de la part de l'autre tête de pont     # pull pour attendre l'établissement d'une connexion de la part de l'autre tête de pont
     # push pour établir cette connexion     # push pour établir cette connexion
     modeconfig=push     modeconfig=push
-</code>+</sxh>
  
-<note>On remarque bien que les parties "left" et "right" ont été inversées entre les deux configurations.</note>+<callout type="info" icon="true" title="Configurations inversées">On remarque bien que les parties "left" et "right" ont été inversées entre les deux configurations.</callout>
  
   * Une fois ce fichier de configuration enregistrée, il faut éditer le fichier qui contiendra le PSK :   * Une fois ce fichier de configuration enregistrée, il faut éditer le fichier qui contiendra le PSK :
-<code bash>nano /etc/ipsec.secrets</code>+<sxh bash>nano /etc/ipsec.secrets</sxh>
   * Dans ce fichier, on indique notre PSK (J'ai choisi "Azerty123" pour l'exemple) en le précédant de l'adresse IP publique locale puis l'adresse IP publique distante, ce qui aura pour effet d'associer ce PSK à la connexion que nous avons paramétrée.   * Dans ce fichier, on indique notre PSK (J'ai choisi "Azerty123" pour l'exemple) en le précédant de l'adresse IP publique locale puis l'adresse IP publique distante, ce qui aura pour effet d'associer ce PSK à la connexion que nous avons paramétrée.
-<code bash># PSK pour test-vpn +<sxh bash># PSK pour test-vpn 
-89.90.3.4 78.79.1.2 : PSK "Azerty123"</code>+89.90.3.4 78.79.1.2 : PSK "Azerty123"</sxh>
  
-<note important>Il faut obligatoirement ouvrir les port UDP 500 et UDP 4500 sur votre solution de pare-feu et ce, pour chaque tête de pont.</note>+<callout type="danger" icon="true" title="Pare-feu">Il faut obligatoirement ouvrir les port UDP 500 et UDP 4500 sur votre solution de pare-feu et ce, pour chaque tête de pont.</callout>
  
 La configuration des deux têtes de pont est maintenant terminée. Il ne reste plus qu'à lancer la connexion. La configuration des deux têtes de pont est maintenant terminée. Il ne reste plus qu'à lancer la connexion.
Ligne 233: Ligne 238:
 ===== Prise en compte des paramétrages ===== ===== Prise en compte des paramétrages =====
  
-Pour établir la connexion, il faut d'abord prendre en compte les configurations établies. Le plus simple est de redémarrer le deamon ipsec. Sinon il faut recharger la configuration.+Pour établir la connexion, il faut d'abord prendre en compte les configurations établies. Le plus simple est de redémarrer le daemon ipsec. Sinon il faut recharger la configuration.
  
-<note warning>Attention : si vous avez plusieurs tunnel VPN et que vous redémarrer le deamon, la connexion des autres tunnels sera coupée. La première méthode est donc réservée aux postes ne gérant qu'un seul tunnel.</note>+<callout type="warning" icon="true" title="Redémarrage">Attention : si vous avez plusieurs tunnel VPN et que vous redémarrer le daemon, la connexion des autres tunnels sera coupée. La première méthode est donc réservée aux postes ne gérant qu'un seul tunnel.</callout>
  
-  * Du coup, pour redémarrer le deamon ipsec : +  * Du coup, pour redémarrer le daemon ipsec : 
-<code bash>/etc/init.d/ipsec restart</code>+<sxh bash>/etc/init.d/ipsec restart</sxh>
  
-  * Sinon, pour recharger la configuration, on commence par s'assuree que la connexion est à l'arrêt : +  * Sinon, pour recharger la configuration, on commence par s'assurer que la connexion est à l'arrêt : 
-<code bash>ipsec down test-vpn</code>+<sxh bash>ipsec down test-vpn</sxh>
   * On recharge la configuration :   * On recharge la configuration :
-<code bash>ipsec reload</code>+<sxh bash>ipsec reload</sxh>
   * On recharge tous les secrets et autres paramètres supplémentaires :   * On recharge tous les secrets et autres paramètres supplémentaires :
-<code bash>ipsec rereadall</code>+<sxh bash>ipsec rereadall</sxh>
  
  
Ligne 252: Ligne 257:
 Il ne nous reste plus qu'à établir la connexion. Pour cela : Il ne nous reste plus qu'à établir la connexion. Pour cela :
   * On commence par vérifier si notre connexion n'est pas déjà établie (nous avons choisi un mode de démarrage automatique).   * On commence par vérifier si notre connexion n'est pas déjà établie (nous avons choisi un mode de démarrage automatique).
-<code bash>ipsec statusall</code>+<sxh bash>ipsec statusall</sxh>
  
 Si la connexion existe déjà, la console nous renvoie des informations de ce genre : Si la connexion existe déjà, la console nous renvoie des informations de ce genre :
-<code bash>Status of IKE charon daemon (strongSwan 5.5.1, Linux 4.9.0-9-amd64, x86_64):+<sxh bash>Status of IKE charon daemon (strongSwan 5.5.1, Linux 4.9.0-9-amd64, x86_64):
   uptime: 17 hours, since May 15 18:06:34 2019   uptime: 17 hours, since May 15 18:06:34 2019
   malloc: sbrk 1810432, mmap 0, used 1228912, free 581520   malloc: sbrk 1810432, mmap 0, used 1228912, free 581520
Ligne 277: Ligne 282:
 test-vpn{28}:  INSTALLED, TUNNEL, reqid 1, ESP in UDP SPIs: c26dcbcf_i c82d3f3f_o test-vpn{28}:  INSTALLED, TUNNEL, reqid 1, ESP in UDP SPIs: c26dcbcf_i c82d3f3f_o
 test-vpn{28}:  AES_CBC_256/HMAC_SHA2_256_128/MODP_2048, 0 bytes_i, 0 bytes_o, rekeying in 34 minutes test-vpn{28}:  AES_CBC_256/HMAC_SHA2_256_128/MODP_2048, 0 bytes_i, 0 bytes_o, rekeying in 34 minutes
-test-vpn{28}:   10.0.1.0/24 === 10.0.2.1/32</code>+test-vpn{28}:   10.0.1.0/24 === 10.0.2.1/32</sxh>
  
 Si ce n'est pas le cas, il suffit d'établir la connexion grâce à la commande : Si ce n'est pas le cas, il suffit d'établir la connexion grâce à la commande :
-<code bash>ipsec up test-vpn</code>+<sxh bash>ipsec up test-vpn</sxh>
  
 Nous aurons alors droit à un message de ce type : Nous aurons alors droit à un message de ce type :
-<code bash>initiating IKE_SA test-vpn[5] to 89.90.3.4+<sxh bash>initiating IKE_SA test-vpn[5] to 89.90.3.4
 generating IKE_SA_INIT request 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(HASH_ALG) N(REDIR_SUP) ] generating IKE_SA_INIT request 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(HASH_ALG) N(REDIR_SUP) ]
 sending packet: from 78.79.1.2[500] to 89.90.3.4[500] (1172 bytes) sending packet: from 78.79.1.2[500] to 89.90.3.4[500] (1172 bytes)
Ligne 289: Ligne 294:
 parsed IKE_SA_INIT response 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(HASH_ALG) N(MULT_AUTH) ] parsed IKE_SA_INIT response 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(HASH_ALG) N(MULT_AUTH) ]
 remote host is behind NAT remote host is behind NAT
-sending cert request for "CN=VPN root CA"+sending cert request for "CN=VPN certificate CA"
 authentication of '78.79.1.2' (myself) with pre-shared key authentication of '78.79.1.2' (myself) with pre-shared key
 establishing CHILD_SA test-vpn establishing CHILD_SA test-vpn
Ligne 300: Ligne 305:
 scheduling reauthentication in 27990s scheduling reauthentication in 27990s
 maximum IKE_SA lifetime 28530s maximum IKE_SA lifetime 28530s
-connection 'test-vpn' established successfully</code>+connection 'test-vpn' established successfully</sxh>
  
-<note tip>Félicitation, votre tunnel est monté!</note>+<callout type="success" icon="true" title="Installation">Félicitation, votre tunnel est monté!</callout>
  
 ===== Résolution des pannes ===== ===== Résolution des pannes =====
  
 +<panel type="danger" title="Problème">
 +Si le tunnel ne veux pas se monter.
 +</panel>
 +<panel type="info" title="Vérification">
 +Il est intéressant d'observer les logs de la tête de pont distante lors de l'initialisation de la connexion :
 +<sxh bash>tail -f /var/log/kern.log</sxh>
  
 +Une autre bonne source d'information est d'observer sur le pare-feu, le flux de paquets sur les ports UDP 500. Par exemple sur un pare-feu de type IPTables sous debian :
 +<sxh bash>tcpdump -i any host 78.79.1.2 and port 500</sxh>
 +</panel>
  
 +~~DISCUSSION~~
  • linux_strongswan.1558001607.txt.gz
  • Dernière modification : 2019/05/16 08:13
  • (modification externe)