ping6.net
Sécurité

Configuration de pare-feu IPv6 : règles essentielles

Configurez votre pare-feu pour IPv6 sans casser la connectivité. Règles ICMPv6 essentielles, exemples Linux et erreurs courantes à éviter.

ping6.net14 décembre 202410 min read
IPv6pare-feusécuritéiptablesnftablesICMPv6

Les pare-feu IPv4 vous permettent de bloquer ICMP sans conséquences majeures. IPv6 ne fonctionne pas comme ça. Bloquez les mauvais messages ICMPv6 et vous casserez la découverte MTU de chemin, la découverte de voisins et la connectivité de base. Votre pare-feu causera silencieusement des échecs de connexion qui prendront des heures à déboguer.

TL;DR - Résumé rapide

Points clés :

  • ICMPv6 est essentiel : contrairement à ICMP IPv4, bloquer ICMPv6 casse les opérations réseau de base
  • Autoriser des types spécifiques : les types 1-3 (erreurs), 128-129 (ping), 133-136 (NDP) sont requis
  • Ne jamais bloquer le type 2 : les messages Packet Too Big sont critiques pour Path MTU Discovery
  • Utiliser hop limit 255 pour NDP : empêche l'usurpation hors lien de la découverte de voisins
  • Appliquer à toutes les familles de protocoles : n'oubliez pas de configurer à la fois iptables et ip6tables

Aller à : Types ICMPv6 essentiels | Exemples Linux | Erreurs courantes


Pourquoi les pare-feu IPv6 sont différents#

En IPv4, ICMP gère les diagnostics comme ping et traceroute. Vous pouvez le bloquer entièrement et la plupart des choses fonctionnent toujours. ARP fonctionne en couche 2, DHCP utilise UDP, et les routeurs utilisent des protocoles dédiés.

IPv6 a fusionné ces fonctions dans ICMPv6. La résolution d'adresse, la découverte de routeur et la détection d'adresse dupliquée dépendent toutes de types ICMPv6 spécifiques. Bloquez-les et les hôtes ne peuvent pas trouver leur passerelle par défaut, les voisins ne peuvent pas communiquer sur le même lien, et les connexions se bloquent quand des inadéquations MTU se produisent.

Les concepteurs du protocole ont fait ce choix délibérément. ICMPv6 fait partie de la spécification IPv6, pas un ajout de diagnostic.

Types ICMPv6 essentiels#

Votre pare-feu doit autoriser ces types ICMPv6 pour la fonctionnalité de base :

TypeNomObjectifBloquer ceci ?
1Destination inaccessiblePort/protocole ferméNon - casse TCP
2Paquet trop grandDécouverte MTU cheminJAMAIS - casse connexions
3Temps dépasséLimite de saut atteinteNon - casse traceroute
128Requête échoRequête pingOptionnel (mais pourquoi ?)
129Réponse échoRéponse pingOptionnel (mais pourquoi ?)
133Sollicitation routeurTrouver passerelle défautJAMAIS - casse connectivité
134Annonce routeurAnnonces passerelleJAMAIS - casse connectivité
135Sollicitation voisinRésolution adresse (équiv. ARP)JAMAIS - casse tout
136Annonce voisinRéponses résolution adresseJAMAIS - casse tout

Bloquer les types ICMPv6 2, 133, 134, 135 ou 136 cassera la connectivité IPv6 de façons subtiles, difficiles à déboguer. Ne le faites pas.

Le type 2 (Paquet trop grand) mérite une attention spéciale. IPv6 n'a pas de fragmentation aux routeurs intermédiaires. Quand un paquet dépasse le MTU de chemin, le routeur l'abandonne et renvoie un message Paquet trop grand. Bloquez ceci et les connexions se bloquent après le SYN/ACK initial. Vous passerez des heures à déboguer pourquoi HTTPS fonctionne mais les gros transferts échouent.

Exemples ip6tables Linux#

Pare-feu hôte minimal#

Pour une machine client ou serveur qui ne route pas de trafic :

# Vider les règles existantes
ip6tables -F
ip6tables -X
 
# Politiques par défaut
ip6tables -P INPUT DROP
ip6tables -P FORWARD DROP
ip6tables -P OUTPUT ACCEPT
 
# Autoriser loopback
ip6tables -A INPUT -i lo -j ACCEPT
 
# Autoriser connexions établies
ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
 
# Autoriser ICMPv6 essentiel
ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 1 -j ACCEPT   # Destination inaccessible
ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 2 -j ACCEPT   # Paquet trop grand
ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 3 -j ACCEPT   # Temps dépassé
ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 128 -j ACCEPT # Requête écho
ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 129 -j ACCEPT # Réponse écho
 
# Autoriser découverte voisins (doit être link-local avec hop limit 255)
ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 133 -m hl --hl-eq 255 -j ACCEPT # Sollicitation routeur
ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 134 -m hl --hl-eq 255 -j ACCEPT # Annonce routeur
ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 135 -m hl --hl-eq 255 -j ACCEPT # Sollicitation voisin
ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 136 -m hl --hl-eq 255 -j ACCEPT # Annonce voisin
 
# Autoriser DHCPv6 (si nécessaire)
ip6tables -A INPUT -p udp --dport 546 -j ACCEPT
 
# Journaliser paquets abandonnés (optionnel)
ip6tables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "ip6tables-dropped: "

La vérification hop limit (--hl-eq 255) empêche les paquets de découverte de voisins usurpés de sources hors lien. La découverte de voisins légitime utilise toujours hop limit 255.

Pare-feu serveur#

Ajoutez vos services après les règles ICMPv6 :

# SSH
ip6tables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
ip6tables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP
ip6tables -A INPUT -p tcp --dport 22 -j ACCEPT
 
# HTTP/HTTPS
ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT
ip6tables -A INPUT -p tcp --dport 443 -j ACCEPT
 
# DNS (si serveur DNS)
ip6tables -A INPUT -p udp --dport 53 -j ACCEPT
ip6tables -A INPUT -p tcp --dport 53 -j ACCEPT

La règle SSH utilise recent pour implémenter une limitation de taux basique. Après 4 tentatives de connexion en 60 secondes depuis la même adresse, les tentatives supplémentaires sont abandonnées.

Règles de transfert routeur#

Pour les routeurs ou systèmes qui transfèrent le trafic :

ip6tables -P FORWARD DROP
 
# Autoriser connexions établies
ip6tables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
 
# Autoriser transfert ICMPv6 (critique pour PMTUD)
ip6tables -A FORWARD -p ipv6-icmp --icmpv6-type 1 -j ACCEPT
ip6tables -A FORWARD -p ipv6-icmp --icmpv6-type 2 -j ACCEPT
ip6tables -A FORWARD -p ipv6-icmp --icmpv6-type 3 -j ACCEPT
ip6tables -A FORWARD -p ipv6-icmp --icmpv6-type 128 -j ACCEPT
ip6tables -A FORWARD -p ipv6-icmp --icmpv6-type 129 -j ACCEPT
 
# Autoriser réseau interne à accéder internet
ip6tables -A FORWARD -i eth1 -o eth0 -j ACCEPT

Ne transférez pas les messages de découverte de voisins (133-136). Ceux-ci sont link-local uniquement.

Exemples nftables Linux#

Les distributions modernes utilisent nftables au lieu d'iptables. La syntaxe est plus claire :

# Créer table
nft add table ip6 filter
 
# Créer chaînes
nft add chain ip6 filter input { type filter hook input priority 0\; policy drop\; }
nft add chain ip6 filter forward { type filter hook forward priority 0\; policy drop\; }
nft add chain ip6 filter output { type filter hook output priority 0\; policy accept\; }
 
# Loopback
nft add rule ip6 filter input iif lo accept
 
# Connexions établies
nft add rule ip6 filter input ct state established,related accept
 
# ICMPv6
nft add rule ip6 filter input icmpv6 type { destination-unreachable, packet-too-big, time-exceeded, echo-request, echo-reply } accept
 
# Découverte voisins avec vérification hop limit
nft add rule ip6 filter input icmpv6 type { nd-router-solicit, nd-router-advert, nd-neighbor-solicit, nd-neighbor-advert } ip6 hoplimit 255 accept
 
# SSH avec limitation taux
nft add rule ip6 filter input tcp dport 22 ct state new limit rate 4/minute accept
 
# HTTP/HTTPS
nft add rule ip6 filter input tcp dport { 80, 443 } accept

La notation d'ensemble ({ 80, 443 }) crée une règle au lieu de deux, rendant l'ensemble de règles plus efficace.

Pare-feu Windows#

Le pare-feu Windows active ICMPv6 par défaut pour la plupart des types essentiels, mais vous devriez vérifier :

# Afficher règles ICMPv6 actuelles
Get-NetFirewallRule -DisplayName "*ICMPv6*" | Format-Table DisplayName, Enabled, Direction
 
# Activer tout ICMPv6 entrant (si désactivé)
Enable-NetFirewallRule -DisplayName "Core Networking - Destination Unreachable (ICMPv6-In)"
Enable-NetFirewallRule -DisplayName "Core Networking - Packet Too Big (ICMPv6-In)"
Enable-NetFirewallRule -DisplayName "Core Networking - Neighbor Discovery Solicitation (ICMPv6-In)"
Enable-NetFirewallRule -DisplayName "Core Networking - Neighbor Discovery Advertisement (ICMPv6-In)"
Enable-NetFirewallRule -DisplayName "Core Networking - Router Advertisement (ICMPv6-In)"
 
# Autoriser serveur SSH sur IPv6
New-NetFirewallRule -DisplayName "SSH (IPv6)" -Direction Inbound -Protocol TCP -LocalPort 22 -Action Allow -Profile Any -RemoteAddress Any

Pour serveurs web :

New-NetFirewallRule -DisplayName "HTTP (IPv6)" -Direction Inbound -Protocol TCP -LocalPort 80 -Action Allow
New-NetFirewallRule -DisplayName "HTTPS (IPv6)" -Direction Inbound -Protocol TCP -LocalPort 443 -Action Allow

Groupes de sécurité cloud#

AWS#

Les groupes de sécurité sont avec état et autorisent automatiquement le trafic de retour établi. Ajoutez des règles explicites pour :

  • ICMPv6 : utilisez « All ICMPv6 » ou sélectionnez types spécifiques
  • Services : ajoutez vos ports TCP/UDP

Azure#

Les groupes de sécurité réseau (NSG) gèrent IPv6. Les règles par défaut autorisent le trafic sortant et établi. Ajoutez des règles entrantes pour les services.

GCP#

Les règles de pare-feu supportent IPv6. Créez des règles séparées avec --source-ranges=::/0 pour IPv6. Les règles par défaut n'incluent pas ICMPv6, donc ajoutez-le explicitement.

Les trois fournisseurs nécessitent que vous activiez IPv6 sur le VPC/réseau d'abord. IPv6 n'est pas activé par défaut.

Erreurs courantes#

Bloquer tout ICMPv6#

L'erreur de pare-feu IPv6 la plus courante. Les administrateurs portent les règles IPv4 qui bloquent tout ICMP et se demandent pourquoi IPv6 ne fonctionne pas. Si vous ne vous souvenez que d'une chose de cet article : ne bloquez jamais tout ICMPv6.

Pas de règles de pare-feu IPv6#

Certains admins configurent iptables soigneusement mais ignorent complètement ip6tables. IPv6 est alors complètement ouvert. Les deux familles de protocoles nécessitent des règles de pare-feu.

Oublier le filtrage de sortie#

La plupart des exemples montrent uniquement les règles d'entrée. Si vous implémentez un filtrage de sortie strict (vous devriez), autorisez les types ICMPv6 sortants 133, 135 et 128. Bloquer les sollicitations de voisin sortantes empêche l'hôte de résoudre les voisins.

Mauvais hop limit sur découverte voisins#

Accepter les paquets de découverte de voisins sans vérifier hop limit (255) permet aux attaquants d'envoyer des annonces de routeur ou voisin usurpées de n'importe où sur internet. Vérifiez toujours hop limit.

Autoriser trop#

Activer « tout ICMPv6 » est plus sûr que de tout bloquer, mais c'est toujours excessif. Vous n'avez pas besoin d'autoriser les messages Multicast Listener Discovery depuis internet, par exemple. Utilisez des types spécifiques.

Tester votre pare-feu#

Après avoir configuré les règles, vérifiez la connectivité de base :

# Tester ping (nécessite types ICMPv6 128/129)
ping6 -c 3 2001:4860:4860::8888
 
# Tester découverte MTU chemin (nécessite type ICMPv6 2)
# Envoyer gros paquet, vérifier qu'il ne se bloque pas
curl -6 -v https://ipv6.google.com/
 
# Vérifier découverte voisins (nécessite types 135/136)
ip -6 neigh show
 
# Vérifier routes (nécessite types 133/134)
ip -6 route show

Depuis un autre hôte, testez que les ports non autorisés sont réellement bloqués :

# Devrait expirer ou retourner « Connection refused »
telnet -6 votre:serveur::adresse 23
 
# Devrait fonctionner (si SSH autorisé)
ssh -6 votre:serveur::adresse

Utilisez des scanners en ligne comme IPv6 Port Scanner (ipv6-tools.com) ou test-ipv6.com pour vérifier votre pare-feu depuis des réseaux externes.


Les pare-feu IPv6 nécessitent de comprendre ce que fait ICMPv6. Le protocole n'est pas optionnel ou juste pour les diagnostics. Autorisez les types essentiels, vérifiez que la découverte de voisins fonctionne, et testez la découverte MTU de chemin avec du vrai trafic. Faites ceci correctement et votre pare-feu IPv6 sera à la fois sécurisé et fonctionnel.

Articles connexes#