---
title: "IPsec — VPN Site-à-Site"
domain: network
subdomain: vpn
type: snippet
tags: [ipsec, vpn, site-to-site, cisco, strongswan, ikev2, esp, tunnel]
difficulty: advanced
status: stable
updated: "2025-05-14"
---
## Concepts fondamentaux

```
IPsec = suite de protocoles pour sécuriser les communications IP (RFC 4301)

Protocoles :
  AH  (Authentication Header)      : intégrité + authentification, pas de chiffrement
  ESP (Encapsulating Security Payload) : chiffrement + intégrité + 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)
    → Négociation de l'algorithme de chiffrement du channel de contrôle
    → Échange Diffie-Hellman pour dériver les clés
    → Port UDP 500 (ou 4500 si NAT-T détecté)
    → Modes : Main Mode (6 messages) ou Aggressive Mode (3 messages, moins sécurisé)

  IKE Phase 2 (IPsec SA) :
    → Négociation des transform sets (chiffrement, hash)
    → Dérivation des clés de session ESP/AH
    → Résultat = tunnel de données chiffré

IKEv2 (RFC 7296) : remplace IKEv1, plus simple, plus sécurisé, moins de messages
```

## Cisco IOS — IKEv1 / Crypto Map (classique)

### Site A — Configuration complète

```text
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
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
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
! 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
# /etc/ipsec.conf
config setup
    charondebug="ike 1, knl 1, cfg 0"  # 0=silent, 1=info, 2=debug
    uniqueids=no

conn site-to-site
    # Paramètres généraux
    auto=start                           # monter automatiquement au démarrage
    type=tunnel
    keyexchange=ikev2

    # Phase 1 (IKE)
    ike=aes256-sha256-modp2048!          # ! = exact match uniquement
    ikelifetime=24h

    # Phase 2 (ESP)
    esp=aes256-sha256-modp2048!
    lifetime=1h
    margintime=9m
    rekeyfuzz=100%

    # PFS
    dpdaction=restart                    # Dead Peer Detection
    dpddelay=30s
    dpdtimeout=120s

    # 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
    authby=psk
```

```bash
# /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
! 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.
</Tip>
