Configurer un VPN IPsec multi-sites sur Debian 13 avec strongSwan 6
- Mise à jour le 12 sept. 2025

À chaque nouvelle version majeure, Debian intègre des paquets logiciels mis à jour. Debian 13 “Trixie” est désormais livré avec strongSwan 6, qui apporte des changements importants dans le format de configuration par rapport aux versions précédentes. Par conséquent, les fichiers de configuration des anciennes versions comme Debian 12 ne sont plus compatibles, car la syntaxe a été entièrement repensée.
Dans ce guide, je vais montrer comment configurer strongSwan 6 pour une architecture VPN IPsec multi-sites utilisant trois routeurs Debian 13. Cette configuration s’appuie sur mon tutoriel précédent pour Debian 12 “Bookworm”, que vous pouvez consulter ici : Configurer un VPN IPsec multi-sites avec strongSwan sur Debian 12.
- L’architecture présentée dans ce tutoriel inclut trois routeurs exécutant Debian et strongSwan :
- Siège (Headquarters) : le cœur du réseau, hébergeant quatre segments pour les utilisateurs, les téléphones IP, le WiFi et les serveurs applicatifs. Il agit également comme passerelle VPN pour le trafic inter-sites entre la Succursale 1 et la Succursale 2.
- Succursale 1 : comprend trois réseaux pour les utilisateurs, les téléphones IP et le WiFi.
- Succursale 2 : comprend trois réseaux pour les utilisateurs, les téléphones IP et le WiFi.
Schéma de l’architecture réseau

Site 1 – Siège (Passerelle VPN)
Commençons par la configuration du site principal. Ce site centralise toutes les connexions VPN des autres emplacements et sert également d’autorité pour autoriser certains flux — dans ce cas, le réseau VoIP — entre la Succursale 1 et la Succursale 2.
Siège – Prérequis
- Installer le paquet strongSwan :
root@HQ:~# apt update && apt install strongswan
- Activer le démarrage automatique de
nftables
:
root@HQ:~# systemctl enable nftables.service
Siège – Configuration de nftables
La configuration de nftables
est simplifiée ici, permettant aux réseaux d’accéder à Internet et de communiquer entre eux. En environnement de production, vous pouvez souhaiter configurer des règles de filtrage entre les VLANs.
- Modifier le fichier
/etc/nftables.conf
:
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
chain input {
type filter hook input priority 0; policy accept;
}
chain forward {
type filter hook forward priority 0; policy accept ;
}
chain output {
type filter hook output priority 0; policy accept;
}
}
#NAT for outgoing traffic.
table ip my_nat {
chain my_masquerade {
type nat hook postrouting priority 100;
ip daddr != { 10.1.0.1, 192.168.0.0/16 } oifname wan masquerade comment "output nat"
}
}
- Recharger la configuration de
nftables
:
root@HQ:~# nft -f /etc/nftables.conf
Siège – Configuration réseau
Configurer les interfaces réseau du siège
Ici, nous configurons nos deux interfaces réseau : lan
et wan
. Pour plus de détails sur la façon de renommer les interfaces réseau dans Debian, consultez ce guide : Renommer les interfaces réseau sur Debian. Nous allons configurer le système pour exécuter automatiquement le script /usr/local/sbin/ipconf.sh
(que nous créerons plus tard) lorsque l’interface lan
sera activée.
- Modifier le fichier
/etc/network/interfaces
:
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
# This is an autoconfigured IPv6 interface
allow-hotplug wan
iface wan inet static
address 10.1.0.1
netmask 255.255.255.0
gateway 10.1.0.254
allow-hotplug lan
iface lan inet static
address 192.168.1.254
netmask 255.255.255.0
up /usr/local/sbin/ipconf.sh
- Redémarrer le système ou relancer le service networking :
root@HQ:~# systemctl restart networking
Activer le routage IP pour le mode passerelle
Comme notre serveur Debian va agir en tant que routeur, nous devons activer le routage IP.
- Créer un fichier
/etc/sysctl.d/99-ipforward.conf
et y ajouter la ligne suivante :
net.ipv4.ip_forward=1
- Appliquer la modification avec la commande suivante :
root@HQ:~# sysctl -p /etc/sysctl.d/99-ipforward.conf
Script réseau
Le script /usr/local/sbin/ipconf.sh
sera exécuté au démarrage. Il est utilisé pour configurer automatiquement les interfaces VLAN.
- Créer un fichier
/usr/local/sbin/ipconf.sh
:
#!/bin/sh
# Script de configuration des VLANs pour l’interface lan
# Ce script crée les interfaces VLAN et attribue les adresses IP
# Exécuté au démarrage pour que les VLANs soient prêts avant le lancement des services
# --- CONFIGURATION DES VLANs SUR L’INTERFACE lan ---
modprobe 8021q
ip link add link lan name users type vlan id 2
ip link add link lan name voip type vlan id 3
ip link add link lan name wifi type vlan id 4
ip link add link lan name servers type vlan id 5
# Activation des interfaces VLAN
ip link set users up
ip link set voip up
ip link set wifi up
ip link set servers up
# --- ATTRIBUTION DES ADRESSES IP AUX INTERFACES VLAN ---
ip addr add 192.168.2.254/24 dev users
ip addr add 192.168.3.254/24 dev voip
ip addr add 192.168.4.254/22 dev wifi
ip addr add 192.168.5.254/24 dev servers
- Modifier les permissions afin que le script
/usr/local/sbin/ipconf.sh
soit exécutable :
root@host:~# chmod +x /usr/local/sbin/ipconf.sh
Siège – Configuration de strongSwan
Fichier principal de configuration strongSwan : /etc/swanctl/swanctl.conf
- Modifier le fichier
/etc/swanctl/swanctl.conf
afin de configurer les connexions site-à-site. L’objectif est de permettre aux réseaux VoIP de tous les sites de communiquer entre eux, et d’autoriser les utilisateurs de la Succursale 1 et de la Succursale 2 à accéder au réseau des serveurs du siège :
connections {
######################################################
# Tunnel entre le Siège (HQ) et la Succursale 1 (B1) #
######################################################
hq-b1 {
version = 2 # Utiliser IKEv2
mobike = no # Désactiver MOBIKE (IPs statiques, pas de mobilité attendue)
local_addrs = 10.1.0.1 # IP publique (ou IP WAN) du siège
remote_addrs = 10.10.0.1 # IP publique de la succursale 1
proposals = aes128-sha256-x25519 # Propositions IKE
reauth_time = 0 # Désactiver la réauthentification, utiliser seulement le rekey
dpd_delay = 20s # Envoyer une sonde Dead Peer Detection toutes les 20s
dpd_timeout = 60s # Considérer le pair comme inactif après 60s
local {
auth = psk # Authentification par clé pré-partagée
id = 10.1.0.1 # Identifiant local (HQ)
}
remote {
auth = psk
id = 10.10.0.1 # Identifiant distant (B1)
}
children {
net-net {
# Sélecteurs de trafic (sous-réseaux autorisés dans ce tunnel)
# Sous-réseaux du siège + VLAN VoIP de B2 (pour VoIP inter-sites via HQ)
local_ts = 192.168.1.0/24, 192.168.3.0/24, 192.168.5.0/24, 192.168.20.0/24, 192.168.23.0/24
# Sous-réseaux de la Succursale 1
remote_ts = 192.168.10.0/24, 192.168.12.0/24, 192.168.13.0/24
start_action = start # Démarrer automatiquement le tunnel au lancement
rekey_time = 3600 # Renouvellement des clés toutes les 60 minutes
dpd_action = restart # Redémarrer la connexion si le pair est inactif
esp_proposals = aes128gcm128-x25519
}
}
}
######################################################
# Tunnel entre le Siège (HQ) et la Succursale 2 (B2) #
######################################################
hq-b2 {
version = 2 # Utiliser IKEv2
mobike = no # Désactiver MOBIKE (IPs statiques, pas de mobilité attendue)
local_addrs = 10.1.0.1 # IP publique (ou IP WAN) du siège
remote_addrs = 10.20.0.1 # IP publique de la succursale 2
proposals = aes128-sha256-x25519 # Propositions IKE
reauth_time = 0 # Désactiver la réauthentification, utiliser seulement le rekey
dpd_delay = 20s # Envoyer une sonde Dead Peer Detection toutes les 20s
dpd_timeout = 60s # Considérer le pair comme inactif après 60s
local {
auth = psk # Authentification par clé pré-partagée
id = 10.1.0.1 # Identifiant local (HQ)
}
remote {
auth = psk
id = 10.20.0.1 # Identifiant distant (B2)
}
children {
net-net {
# Sélecteurs de trafic (sous-réseaux autorisés dans ce tunnel)
# Sous-réseaux du siège + VLAN VoIP de B1 (pour VoIP inter-sites via HQ)
local_ts = 192.168.1.0/24, 192.168.3.0/24, 192.168.5.0/24, 192.168.10.0/24, 192.168.13.0/24
# Sous-réseaux de la Succursale 2
remote_ts = 192.168.20.0/24, 192.168.22.0/24, 192.168.23.0/24
start_action = start # Démarrer automatiquement le tunnel au lancement
rekey_time = 3600 # Renouvellement des clés toutes les 60 minutes
dpd_action = restart # Redémarrer la connexion si le pair est inactif
esp_proposals = aes128gcm128-x25519
}
}
}
}
######################################
# Secrets partagés (Pre-Shared Keys) #
######################################
secrets {
ike-hq-b1 {
id = 10.1.0.1
peer_id = 10.10.0.1
secret = "JohnWeakPasswd:)"
}
ike-hq-b2 {
id = 10.1.0.1
peer_id = 10.20.0.1
secret = "JohnWeakPasswd:)"
}
}
- Redémarrer le service
strongswan
pour appliquer les changements :
root@HQ:~# systemctl restart strongswan
Site 2 – Succursale 1 : Configuration du VPN
Passons maintenant à la configuration de la première succursale. La mise en place est similaire à celle du siège, car elle nécessite également la configuration des interfaces réseau ainsi que du service strongSwan.
Succursale 1 – Prérequis
- Installer le paquet strongSwan :
root@B1:~# apt update && apt install strongswan
- Activer le démarrage automatique de
nftables
:
root@B1:~# systemctl enable nftables.service
Succursale 1 – Configuration de nftables
Comme pour le siège, la configuration de nftables
est simplifiée ici. Aucune règle de filtrage n’est appliquée dans cet exemple.
- Modifier le fichier
/etc/nftables.conf
:
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
chain input {
type filter hook input priority 0; policy accept;
}
chain forward {
type filter hook forward priority 0; policy accept ;
}
chain output {
type filter hook output priority 0; policy accept;
}
}
#NAT for outgoing traffic.
table ip my_nat {
chain my_masquerade {
type nat hook postrouting priority 100;
ip daddr != { 10.10.0.1, 192.168.0.0/16 } oifname wan masquerade comment "output nat"
}
}
- Recharger la configuration de
nftables
:
root@host:~# nft -f /etc/nftables.conf
Succursale 1 – Configuration réseau
Configurer les interfaces réseau de la succursale 1
Ici, nous configurons nos deux interfaces réseau : lan
et wan
.
- Modifier le fichier
/etc/network/interfaces
:
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
# This is an autoconfigured IPv6 interface
allow-hotplug wan
iface wan inet static
address 10.10.0.1
netmask 255.255.255.0
gateway 10.10.0.254
allow-hotplug lan
iface lan inet static
address 192.168.10.254
netmask 255.255.255.0
up /usr/local/sbin/ipconf.sh
Activer le routage IP pour le mode passerelle
- Créer un fichier
/etc/sysctl.d/99-ipforward.conf
et y ajouter la ligne suivante :
net.ipv4.ip_forward=1
- Appliquer la modification avec la commande suivante :
root@B1:~# sysctl -p /etc/sysctl.d/99-ipforward.conf
Script réseau
Le script /usr/local/sbin/ipconf.sh
sera exécuté au démarrage afin de configurer automatiquement les interfaces VLAN.
- Créer un fichier
/usr/local/sbin/ipconf.sh
:
#!/bin/sh
# Script de configuration des VLANs pour l’interface lan
# Ce script crée les interfaces VLAN et attribue les adresses IP
# Exécuté au démarrage pour que les VLANs soient prêts avant le lancement des services
# --- CONFIGURATION DES VLANs SUR L’INTERFACE lan ---
modprobe 8021q
ip link add link lan name users type vlan id 2
ip link add link lan name voip type vlan id 3
ip link add link lan name wifi type vlan id 4
# Activation des interfaces VLAN
ip link set users up
ip link set voip up
ip link set wifi up
# --- ATTRIBUTION DES ADRESSES IP AUX INTERFACES VLAN ---
ip addr add 192.168.12.254/24 dev users
ip addr add 192.168.13.254/24 dev voip
ip addr add 192.168.14.254/22 dev wifi
- Modifier les permissions afin que le script
/usr/local/sbin/ipconf.sh
soit exécutable :
root@B1:~# chmod +x /usr/local/sbin/ipconf.sh
Succursale 1 – Configuration de strongSwan
Fichier principal de configuration strongSwan : /etc/swanctl/swanctl.conf
- Modifier le fichier
/etc/swanctl/swanctl.conf
:
connections {
######################################################
# Tunnel entre la Succursale 1 (B1) et le Siège (HQ) #
######################################################
b1-hq {
version = 2 # Utiliser IKEv2
mobike = no # Désactiver MOBIKE (IPs statiques, pas de mobilité attendue)
local_addrs = 10.10.0.1 # IP publique de la succursale 1
remote_addrs = 10.1.0.1 # IP publique (ou IP WAN) du siège
proposals = aes128-sha256-x25519 # Propositions IKE
reauth_time = 0 # Désactiver la réauthentification, utiliser seulement le rekey
dpd_delay = 20s # Envoyer une sonde Dead Peer Detection toutes les 20s
dpd_timeout = 60s # Considérer le pair comme inactif après 60s
local {
auth = psk # Authentification par clé pré-partagée
id = 10.10.0.1 # Identifiant local (B1)
}
remote {
auth = psk # Authentification par clé pré-partagée
id = 10.1.0.1 # Identifiant local (HQ)
}
children {
net-net {
# Sélecteurs de trafic (sous-réseaux autorisés dans ce tunnel)
# Sous-réseaux B1
local_ts = 192.168.10.0/24, 192.168.12.0/24, 192.168.13.0/24
# Sous-réseaux du siège + VLAN VoIP de B2 (pour VoIP inter-sites via HQ)
remote_ts = 192.168.1.0/24, 192.168.3.0/24, 192.168.5.0/24, 192.168.20.0/24, 192.168.23.0/24
start_action = start # Démarrer automatiquement le tunnel au lancement
rekey_time = 3600 # Renouvellement des clés toutes les 60 minutes
dpd_action = restart # Redémarrer la connexion si le pair est inactif
esp_proposals = aes128gcm128-x25519
}
}
}
}
######################################
# Secrets partagés (Pre-Shared Keys) #
######################################
secrets {
ike-b1-hq {
id = 10.10.0.1
peer_id = 10.1.0.1
secret = "JohnWeakPasswd:)"
}
}
- Redémarrer le service
strongswan
pour appliquer les changements :
root@B1:~# systemctl restart strongswan
Site 3 – Succursale 2 : Configuration du VPN
Succursale 2 – Prérequis
- Installer le paquet strongSwan :
root@B2:~# apt update && apt install strongswan
- Activer le démarrage automatique de
nftables
:
root@B2:~# systemctl enable nftables.service
Succursale 2 – Configuration de nftables
Comme pour le siège, la configuration de nftables
est simplifiée ici. Aucune règle de filtrage n’est appliquée dans cet exemple.
- Modifier le fichier
/etc/nftables.conf
:
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
chain input {
type filter hook input priority 0; policy accept;
}
chain forward {
type filter hook forward priority 0; policy accept ;
}
chain output {
type filter hook output priority 0; policy accept;
}
}
#NAT for outgoing traffic.
table ip my_nat {
chain my_masquerade {
type nat hook postrouting priority 100;
ip daddr != { 10.20.0.1, 192.168.0.0/16 } oifname wan masquerade comment "output nat"
}
}
- Recharger la configuration de
nftables
:
root@B2:~# nft -f /etc/nftables.conf
Succursale 2 - Configuration réseau
Configurer les interfaces réseau de la succursale 2
Ici, nous configurons nos deux interfaces réseau: lan
et wan
.
- Modifier le fichier
/etc/network/interfaces
:
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
allow-hotplug wan
iface wan inet static
address 10.20.0.1
netmask 255.255.255.0
allow-hotplug lan
iface lan inet static
address 192.168.21.254
netmask 255.255.255.0
up /usr/local/sbin/ipconf.sh
Activer le routage IP pour le mode passerelle
- Créer un fichier
/etc/sysctl.d/99-ipforward.conf
et y ajouter la ligne suivante :
net.ipv4.ip_forward=1
- Appliquer la modification avec la commande suivante :
root@B2:~# sysctl -p /etc/sysctl.d/99-ipforward.conf
Script réseau
Le script /usr/local/sbin/ipconf.sh
sera exécuté au démarrage afin de configurer automatiquement les interfaces VLAN.
- Créer un fichier
/usr/local/sbin/ipconf.sh
:
#!/bin/sh
# Script de configuration des VLANs pour l’interface lan
# Ce script crée les interfaces VLAN et attribue les adresses IP
# Exécuté au démarrage pour que les VLANs soient prêts avant le lancement des services
# --- CONFIGURATION DES VLANs SUR L’INTERFACE lan ---
modprobe 8021q
ip link add link lan name users type vlan id 2
ip link add link lan name voip type vlan id 3
ip link add link lan name wifi type vlan id 4
# Activation des interfaces VLAN
ip link set users up
ip link set voip up
ip link set wifi up
# --- ATTRIBUTION DES ADRESSES IP AUX INTERFACES VLAN ---
ip addr add 192.168.22.254/24 dev users
ip addr add 192.168.23.254/24 dev voip
ip addr add 192.168.24.254/22 dev wifi
- Modifier les permissions afin que le script
/usr/local/sbin/ipconf.sh
soit exécutable :
root@host:~# chmod +x /usr/local/sbin/ipconf.sh
Succursale 2 – Configuration de strongSwan
Fichier principal de configuration strongSwan : /etc/swanctl/swanctl.conf
- Modifier le fichier
/etc/swanctl/swanctl.conf
:
connections {
######################################################
# Tunnel entre la Succursale 2 (B2) et le Siège (HQ) #
######################################################
b2-hq {
version = 2 # Utiliser IKEv2
mobike = no # Désactiver MOBIKE (IPs statiques, pas de mobilité attendue)
local_addrs = 10.20.0.1 # IP publique de la succursale 2
remote_addrs = 10.1.0.1 # IP publique (ou IP WAN) du siège
proposals = aes128-sha256-x25519 # Propositions IKE
reauth_time = 0 # Désactiver la réauthentification, utiliser seulement le rekey
dpd_delay = 20s # Envoyer une sonde Dead Peer Detection toutes les 20s
dpd_timeout = 60s # Considérer le pair comme inactif après 60s
local {
auth = psk # Authentification par clé pré-partagée
id = 10.20.0.1 # Identifiant local (B2)
}
remote {
auth = psk # Authentification par clé pré-partagée
id = 10.1.0.1 # Identifiant local (HQ)
}
children {
net-net {
# Sélecteurs de trafic (sous-réseaux autorisés dans ce tunnel)
# Sous-réseaux B2
local_ts = 192.168.20.0/24, 192.168.22.0/24, 192.168.23.0/24
# Sous-réseaux du siège + VLAN VoIP de B1 (pour VoIP inter-sites via HQ)
remote_ts = 192.168.1.0/24, 192.168.3.0/24, 192.168.5.0/24, 192.168.10.0/24, 192.168.13.0/24
start_action = start # Démarrer automatiquement le tunnel au lancement
rekey_time = 3600 # Renouvellement des clés toutes les 60 minutes
dpd_action = restart # Redémarrer la connexion si le pair est inactif
esp_proposals = aes128gcm128-x25519
}
}
}
}
######################################
# Secrets partagés (Pre-Shared Keys) #
######################################
secrets {
ike-b2-hq {
id = 10.20.0.1
peer_id = 10.1.0.1
secret = "JohnWeakPasswd:)"
}
}
- Redémarrer le service
strongswan
pour appliquer les changements :
root@B2:~# systemctl restart strongswan
Dépannage
- Ping depuis le siège:
root@HQ:~# ping 192.168.20.254 -I 192.168.1.254
- Ping depuis la succursale 1:
root@B1:~# ping 192.168.5.254 -I 192.168.12.254
- Ping depuis la succursale 2:
root@B2:~# ping 192.168.13.254 -I 192.168.23.254
- Vérifier les logs:
root@HQ:~# journalctl -u strongswan
- Lister les configurations strongSwan chargées :
root@HQ:~# swanctl --list-conns
hq-b1: IKEv2, no reauthentication, no rekeying, dpd delay 20s
local: 10.1.0.1
remote: 10.10.0.1
local pre-shared key authentication:
id: 10.1.0.1
remote pre-shared key authentication:
id: 10.10.0.1
net-net: TUNNEL, rekeying every 3600s, dpd action is start
local: 192.168.1.0/24 192.168.3.0/24 192.168.5.0/24 192.168.20.0/24 192.168.23.0/24
remote: 192.168.10.0/24 192.168.12.0/24 192.168.13.0/24
hq-b2: IKEv2, no reauthentication, no rekeying, dpd delay 20s
local: 10.1.0.1
remote: 10.20.0.1
local pre-shared key authentication:
id: 10.1.0.1
remote pre-shared key authentication:
id: 10.20.0.1
net-net: TUNNEL, rekeying every 3600s, dpd action is none
local: 192.168.1.0/24 192.168.3.0/24 192.168.5.0/24 192.168.10.0/24 192.168.13.0/24
remote: 192.168.20.0/24 192.168.22.0/24 192.168.23.0/24
- Lister les IKE_SAs actuellement actives de strongSwan :
root@HQ:~# swanctl --list-sas
hq-b2: #6, ESTABLISHED, IKEv2, d0f895ea384c5d55_i 3b76bf7604c051fd_r*
local '10.1.0.1' @ 10.1.0.1[500]
remote '10.20.0.1' @ 10.20.0.1[500]
AES_CBC-128/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/CURVE_25519
established 433s ago
net-net: #7, reqid 2, INSTALLED, TUNNEL, ESP:AES_GCM_16-128
installed 433s ago, rekeying in 2974s, expires in 3527s
in c19f2fff, 672 bytes, 8 packets, 231s ago
out ca67ea94, 672 bytes, 8 packets, 231s ago
local 192.168.1.0/24 192.168.3.0/24 192.168.5.0/24 192.168.10.0/24 192.168.13.0/24
remote 192.168.20.0/24 192.168.22.0/24 192.168.23.0/24
hq-b1: #5, ESTABLISHED, IKEv2, 7c785e920c3a199a_i fddac3562b3129fe_r*
local '10.1.0.1' @ 10.1.0.1[500]
remote '10.10.0.1' @ 10.10.0.1[500]
AES_CBC-128/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/CURVE_25519
established 1274s ago
net-net: #5, reqid 1, INSTALLED, TUNNEL, ESP:AES_GCM_16-128
installed 1274s ago, rekeying in 2179s, expires in 2686s
in c8d03828, 56952 bytes, 678 packets, 236s ago
out cc5e72e5, 56952 bytes, 678 packets, 236s ago
local 192.168.1.0/24 192.168.3.0/24 192.168.5.0/24 192.168.20.0/24 192.168.23.0/24
remote 192.168.10.0/24 192.168.12.0/24 192.168.13.0/24