MDstable
NoteSnippetChecklistPlaybook

IPsec — VPN Site-à-Site

Configurer un VPN IPsec site-à-site sur Cisco IOS et strongSwan Linux

snippetadvanced 2025-05-14 6 min read
ipsecvpnsite-to-siteciscostrongswanikev2esptunnel

Concepts fondamentaux

IPsec suite de protocoles pour scuriser les communications IP RFC 4301
Protocoles
AH Authentication Header intgrit authentification pas de chiffrement
ESP Encapsulating Security Payload chiffrement intgrit authentification
Modes
Transport chiffre seulement le payload IP host-to-host)
Tunnel chiffre le paquet IP complet nouvel en-tête IP site-to-site)
Phases IKE
IKE Phase 1 ISAKMP SA
Authentification des pairs PSK ou certificats
Ngociation de lalgorithme de chiffrement du channel de contrle
change Diffie-Hellman pour driver les cls
Port UDP 500 ou 4500 si NAT-T dtect
Modes Main Mode 6 messages ou Aggressive Mode 3 messages moins scuris
IKE Phase 2 IPsec SA
Ngociation des transform sets chiffrement hash
Drivation des cls de session ESP/AH
Rsultat tunnel de donnes chiffr
IKEv2 RFC 7296 remplace IKEv1 plus simple plus scuris moins de messages

Cisco IOS — IKEv1 / Crypto Map (classique)

Site A — Configuration complète

text
Variables
{{PSK_KEY}}
{{SITE_B_IP}}
{{SITE_A_LAN}}
{{SITE_A_WILDCARD}}
{{SITE_B_LAN}}
{{SITE_B_WILDCARD}}
{{SITE_A_IP}}
{{WAN_MASK}}
conf t
! ── Phase 1 : ISAKMP Policy ──────────────────────────────
crypto isakmp policy 10
encr aes 256
hash sha256
authentication pre-share
group 14 ! DH group 14 (2048-bit) minimum recommandé
lifetime 86400 ! 24 heures
! Clé pré-partagée pour le peer distant
crypto isakmp key {{PSK_KEY}} address {{SITE_B_IP}}
! ── Phase 2 : Transform Set ──────────────────────────────
crypto ipsec transform-set TS_AES256 esp-aes 256 esp-sha256-hmac
mode tunnel ! défaut
! Durée de vie de la SA Phase 2
crypto ipsec security-association lifetime seconds 3600 ! 1 heure
! ── ACL intéressante (trafic à chiffrer) ──────────────────
ip access-list extended ACL_IPSEC_SITE_A
permit ip {{SITE_A_LAN}} {{SITE_A_WILDCARD}} {{SITE_B_LAN}} {{SITE_B_WILDCARD}}
! ── Crypto Map ────────────────────────────────────────────
crypto map CMAP_SITE_B 10 ipsec-isakmp
set peer {{SITE_B_IP}}
set transform-set TS_AES256
set pfs group14 ! Perfect Forward Secrecy
match address ACL_IPSEC_SITE_A
! ── Appliquer sur l'interface WAN ─────────────────────────
interface GigabitEthernet0/0
description ** WAN **
ip address {{SITE_A_IP}} {{WAN_MASK}}
crypto map CMAP_SITE_B
no shutdown

Site B — Configuration miroir

text
Variables
{{PSK_KEY}}
{{SITE_A_IP}}
{{SITE_B_LAN}}
{{SITE_B_WILDCARD}}
{{SITE_A_LAN}}
{{SITE_A_WILDCARD}}
conf t
crypto isakmp policy 10
encr aes 256
hash sha256
authentication pre-share
group 14
lifetime 86400
crypto isakmp key {{PSK_KEY}} address {{SITE_A_IP}}
crypto ipsec transform-set TS_AES256 esp-aes 256 esp-sha256-hmac
mode tunnel
ip access-list extended ACL_IPSEC_SITE_B
permit ip {{SITE_B_LAN}} {{SITE_B_WILDCARD}} {{SITE_A_LAN}} {{SITE_A_WILDCARD}}
crypto map CMAP_SITE_A 10 ipsec-isakmp
set peer {{SITE_A_IP}}
set transform-set TS_AES256
set pfs group14
match address ACL_IPSEC_SITE_B
interface GigabitEthernet0/0
crypto map CMAP_SITE_A

Cisco IOS — IKEv2 (moderne, recommandé)

text
Variables
{{SITE_B_IP}}
{{PSK_KEY}}
conf t
! ── IKEv2 Proposal ────────────────────────────────────────
crypto ikev2 proposal PROP_IKEv2
encryption aes-cbc-256
integrity sha256
group 14
! ── IKEv2 Policy ──────────────────────────────────────────
crypto ikev2 policy POLICY_IKEv2
proposal PROP_IKEv2
! ── IKEv2 Keyring (PSK) ───────────────────────────────────
crypto ikev2 keyring KR_SITES
peer SITE_B
address {{SITE_B_IP}}
pre-shared-key {{PSK_KEY}}
! ── IKEv2 Profile ─────────────────────────────────────────
crypto ikev2 profile PROF_SITE_B
match identity remote address {{SITE_B_IP}} 255.255.255.255
authentication remote pre-share
authentication local pre-share
keyring local KR_SITES
! ── Transform Set ─────────────────────────────────────────
crypto ipsec transform-set TS_IKEv2 esp-aes 256 esp-sha256-hmac
mode tunnel
! ── Crypto Map ────────────────────────────────────────────
crypto map CMAP_IKEv2 10 ipsec-isakmp
set peer {{SITE_B_IP}}
set transform-set TS_IKEv2
set ikev2-profile PROF_SITE_B
set pfs group14
match address ACL_IPSEC_SITE_A
interface GigabitEthernet0/0
crypto map CMAP_IKEv2

GRE over IPsec

text
Variables
{{TUNNEL_IP_A}}
{{TUNNEL_MASK}}
{{SITE_B_IP}}
{{SITE_A_IP}}
! GRE = tunnel non chiffré (permet multicast, routage dynamique)
! GRE over IPsec = GRE chiffré avec IPsec
conf t
! 1. Créer l'interface tunnel GRE
interface Tunnel0
description ** GRE Tunnel vers Site B **
ip address {{TUNNEL_IP_A}} {{TUNNEL_MASK}}
tunnel source GigabitEthernet0/0 ! interface WAN locale
tunnel destination {{SITE_B_IP}}
tunnel mode gre ip
! OSPF ou autre protocole de routage peut tourner sur le tunnel
ip ospf 1 area 0
! 2. Protéger le trafic GRE avec IPsec
ip access-list extended ACL_GRE
permit gre host {{SITE_A_IP}} host {{SITE_B_IP}}
crypto map CMAP_GRE 10 ipsec-isakmp
set peer {{SITE_B_IP}}
set transform-set TS_AES256
match address ACL_GRE
interface GigabitEthernet0/0
crypto map CMAP_GRE

strongSwan Linux — /etc/ipsec.conf (IKEv2)

bash
Variables
{{LOCAL_WAN_IP}}
{{LOCAL_LAN}}
{{LOCAL_PREFIX}}
{{REMOTE_WAN_IP}}
{{REMOTE_LAN}}
{{REMOTE_PREFIX}}
# /etc/ipsec.conf
config setup
charondebug"ike 1, knl 1, cfg 0" # 0=silent, 1=info, 2=debug
uniqueidsno
conn site-to-site
# Paramètres généraux
autostart # monter automatiquement au démarrage
typetunnel
keyexchangeikev2
# Phase 1 (IKE)
ikeaes256-sha256-modp2048! # ! = exact match uniquement
ikelifetime
# Phase 2 (ESP)
espaes256-sha256-modp2048!
lifetime
margintime
rekeyfuzz100
# PFS
dpdactionrestart # Dead Peer Detection
dpddelay
dpdtimeout
# Site local
left{{LOCAL_WAN_IP}}
leftsubnet{{LOCAL_LAN}}{{LOCAL_PREFIX}}
leftid{{LOCAL_WAN_IP}}
# Site distant
right{{REMOTE_WAN_IP}}
rightsubnet{{REMOTE_LAN}}{{REMOTE_PREFIX}}
rightid{{REMOTE_WAN_IP}}
# Authentification
authbypsk
bash
Variables
{{LOCAL_WAN_IP}}
{{REMOTE_WAN_IP}}
{{PSK_KEY}}
# /etc/ipsec.secrets
# Format : left right : PSK "clé"
{{LOCAL_WAN_IP}} {{REMOTE_WAN_IP}} PSK "{{PSK_KEY}}"
# Avec certificats
# : RSA /etc/ipsec.d/private/site-a.key
bash
# Démarrer et gérer strongSwan
systemctl start strongswan
systemctl enable strongswan
# Monter/démonter un tunnel
ipsec up site-to-site
ipsec down site-to-site
ipsec restart
# Recharger la configuration sans restart
ipsec reload

Vérifications Cisco

text
Variables
{{PEER_IP}}
! Phase 1 — Sessions ISAKMP/IKE
show crypto isakmp sa
show crypto ikev2 sa
! Exemple sortie show crypto isakmp sa :
! IPv4 Crypto ISAKMP SA
! dst src state conn-id status
! 203.0.113.2 198.51.100.1 QM_IDLE 1001 ACTIVE ← Phase 1 OK
! Phase 2 — Sessions IPsec
show crypto ipsec sa
show crypto ipsec sa peer {{PEER_IP}}
! Compteurs de paquets chiffrés/déchiffrés
show crypto ipsec sa | include pkts
! Transform sets configurés
show crypto ipsec transform-set
! IKEv2
show crypto ikev2 sa detailed
show crypto ikev2 stats

Vérifications Linux (strongSwan)

bash
# Vue globale de toutes les SAs
ipsec statusall
ipsec status
# XFRM (kernel IPsec)
ip xfrm state # Security Associations (SA)
ip xfrm policy # Security Policies (SP)
ip xfrm monitor # events en temps réel
# Compteurs
ip -s xfrm state
# Logs
journalctl -u strongswan -f
tail -f /var/log/daemon.log | grep charon

Troubleshooting

text
Problèmes Phase 1 courants :
- Encryption/Hash mismatch → comparer les proposals IKE des deux côtés
- DH Group mismatch → group 14 minimum (group 1/2/5 = obsolètes)
- Lifetime mismatch → le plus court des deux sera utilisé (IKEv1)
- PSK différente → vérifier caractère par caractère
- NAT-T non activé → UDP 4500 bloqué par firewall intermédiaire
- Port UDP 500 bloqué → vérifier ACLs sur les interfaces WAN
Problèmes Phase 2 courants :
- ACL intéressante asymétrique → les deux côtés doivent avoir ACLs miroir
- Transform set mismatch → comparer esp encryption/hash
- Overlapping proxy-IDs → vérifier subnets LAN
Cisco debug :
debug crypto isakmp ! Phase 1 events
debug crypto ipsec ! Phase 2 events
debug crypto ikev2 ! IKEv2 events
undebug all
💡 Tip —

Pour le NAT traversal, IKE utilise le port UDP 4500 après avoir détecté du NAT (au lieu du port 500 standard). S'assurer que UDP 4500 est ouvert dans les deux sens sur tous les firewalls intermédiaires. Sur Cisco IOS, NAT-T est activé automatiquement ; sur strongSwan, il est activé par défaut. Si le tunnel monte mais que le trafic ne passe pas, vérifier aussi que le protocole ESP (IP protocol 50) n'est pas bloqué, ou que UDP 4500 est utilisé pour encapsuler ESP en cas de NAT.

OPS·BRAIN v1.027 notes · Networklocal