MDstable
NoteSnippetChecklistPlaybook

Transition IPv4 → IPv6

Dual-stack, tunnels 6in4/6to4/ISATAP, NAT64/DNS64, DHCPv6, configuration Cisco & Linux

snippetadvanced 2025-05-14 7 min read
ipv6transitiondual-stacknat64dns646in4tunneldhcpv6ciscolinux

Mécanismes de transition — Vue d'ensemble

| Mécanisme | Description | Use case | Complexité | |--------------------|------------------------------------------------------------|-----------------------------------------------|------------| | Dual-stack | IPv4 + IPv6 simultanés sur chaque interface et nœud | Méthode recommandée — migration progressive | Faible | | 6in4 (manuel) | Encapsulation IPv6 dans IPv4 (proto 41) | Deux sites reliés via Internet IPv4 uniquement| Moyenne | | 6to4 (automatique) | Préfixe 2002::/16 dérivé de l'IP publique IPv4 | Déprécié — utiliser 6in4 ou tunnel broker | Moyenne | | ISATAP | Tunnel intra-site IPv6 dans IPv4 (hosts → routeur) | Migration interne sans changer l'infra IPv4 | Moyenne | | NAT64 + DNS64 | Accès IPv4 depuis des clients IPv6-only | Réseaux mobiles, clouds IPv6-only | Élevée | | 464XLAT (CLAT+PLAT)| Double traduction IPv4↔IPv6↔IPv4 | Terminaux mobiles IPv6-only sur réseau 4G/5G | Élevée |

⚠ Attention —

6to4 (2002::/16) et Teredo sont officiellement dépréciés (RFC 7526, RFC 8190). Ne pas les déployer dans un environnement de production. Préférer un tunnel 6in4 explicite ou un service de tunnel broker (Hurricane Electric : tunnelbroker.net).

Dual-Stack

text
Principe :
Chaque nœud et chaque interface supporte IPv4 ET IPv6 simultanément
Deux tables de routage indépendantes (ip route / ipv6 route)
Le choix du protocole dépend du DNS : AAAA → IPv6, A → IPv4
(RFC 6724 : IPv6 préféré si disponible — Happy Eyeballs RFC 8305)
text
Variables
{{IPV4_ADDR}}
{{IPV4_MASK}}
{{IPV6_ADDR}}
{{PREFIX}}
! Cisco — Dual-Stack sur un routeur
conf t
ipv6 unicast-routing ! OBLIGATOIRE — désactivé par défaut
interface GigabitEthernet0/0
ip address {{IPV4_ADDR}} {{IPV4_MASK}}
ipv6 address {{IPV6_ADDR}}/{{PREFIX}}
ipv6 address fe80::1 link-local
no shutdown
! Vérification des deux tables
show ip route
show ipv6 route
show interfaces GigabitEthernet0/0
bash
# Linux — Dual-Stack
# L'activation IPv6 est automatique si le noyau est compilé avec IPv6
# Vérifier les adresses
ip addr show
ip -4 addr show
ip -6 addr show
# Vérifier les deux tables de routage
ip -4 route show
ip -6 route show
# Activer IPv6 si désactivé (net.ipv6.conf.all.disable_ipv6=1)
sysctl -w netipv6confalldisable_ipv60
sysctl -w netipv6confdefaultdisable_ipv60

Tunnel 6in4 Manuel (proto 41)

text
Encapsulation directe d'IPv6 dans des paquets IPv4 (IP proto 41)
Les deux extrémités du tunnel connaissent l'IP publique IPv4 de l'autre
Pas de découverte automatique — configuration explicite des deux côtés

Cisco — Tunnel 6in4

text
Variables
{{REMOTE_SITE}}
{{LOCAL_WAN_IP}}
{{REMOTE_WAN_IP}}
conf t
interface Tunnel0
description Tunnel IPv6-in-IPv4 vers {{REMOTE_SITE}}
tunnel mode ipv6ip ! mode 6in4 (proto 41)
tunnel source {{LOCAL_WAN_IP}} ! IP publique locale
tunnel destination {{REMOTE_WAN_IP}} ! IP publique distante
ipv6 address 2001:db8:tunnel::1/64
ipv6 address fe80::1 link-local
no shutdown
! Route IPv6 vers le site distant via le tunnel
ipv6 route 2001:db8:remote::/48 Tunnel0
! Côté distant (R2)
interface Tunnel0
tunnel mode ipv6ip
tunnel source {{REMOTE_WAN_IP}}
tunnel destination {{LOCAL_WAN_IP}}
ipv6 address 2001:db8:tunnel::2/64
ipv6 address fe80::2 link-local
no shutdown
ipv6 route 2001:db8:local::/48 Tunnel0
! Vérifications
show interface Tunnel0
show ipv6 route
ping ipv6 2001:db8:tunnel::2 source Tunnel0

Linux — Tunnel 6in4 (SIT)

bash
Variables
{{REMOTE_V4}}
{{LOCAL_V4}}
# Créer le tunnel SIT (Simple Internet Transition)
ip tunnel add tun0 mode sit remote {{REMOTE_V4}} local {{LOCAL_V4}} ttl 64
ip link set tun0 up
ip -6 addr add 2001db8tunnel1/64 dev tun0
# Route vers le réseau distant
ip -6 route add 2001db8remote/48 dev tun0
# Vérifications
ip tunnel show tun0
ip -6 addr show dev tun0
ip -6 route show
ping6 2001db8tunnel2
# Persistance (fichier /etc/network/interfaces ou systemd-networkd)
# Voir la documentation de la distribution

DHCPv6 Stateful

Cisco — Serveur DHCPv6

text
Variables
{{POOL_NAME}}
{{DOMAIN_NAME}}
conf t
! Définir le pool DHCPv6
ipv6 dhcp pool {{POOL_NAME}}
address prefix 2001:db8:1::/64 lifetime infinite infinite
dns-server 2001:4860:4860::8888 ! Google DNS IPv6
dns-server 2001:4860:4860::8844
domain-name {{DOMAIN_NAME}}
!sip-server ipv6 2001:db8:1::10 ! optionnel
! Activer le serveur DHCPv6 sur l'interface
interface GigabitEthernet0/0
ipv6 address 2001:db8:1::1/64
ipv6 dhcp server {{POOL_NAME}}
ipv6 nd managed-config-flag ! M=1 → DHCPv6 stateful
ipv6 nd other-config-flag ! O=1 → DNS via DHCPv6 (stateless)
no shutdown
! Vérifications DHCPv6
show ipv6 dhcp pool
show ipv6 dhcp binding
show ipv6 dhcp interface

Cisco — Relais DHCPv6

text
Variables
{{DHCPV6_SERVER_ADDR}}
conf t
! Sur l'interface du réseau client (entre clients et serveur DHCPv6)
interface GigabitEthernet0/1
ipv6 dhcp relay destination {{DHCPV6_SERVER_ADDR}}
ipv6 nd managed-config-flag
no shutdown

Linux — Client DHCPv6

bash
Variables
{{INTERFACE}}
# dhclient (ISC)
dhclient -6 {{INTERFACE}}
# wide-dhcpv6-client
dhcp6c -c /etc/wide-dhcpv6/dhcp6c.conf {{INTERFACE}}
# systemd-networkd — fichier /etc/systemd/network/10-eth0.network
# [Network]
# DHCP=yes (ou ipv6 pour DHCPv6 uniquement)
# IPv6AcceptRA=yes

NAT64 + DNS64

text
Objectif : permettre aux clients IPv6-only d'accéder aux serveurs IPv4-only
Architecture :
Client IPv6 → DNS64 (resolver) → NAT64 (routeur de bordure) → Serveur IPv4
Préfixe bien connu NAT64 : 64:ff9b::/96
Synthèse d'adresse IPv6 : 64:ff9b::{{IPv4}}
Exemple : 8.8.8.864:ff9b::808:808
(8.8.8.8 en hex = 0x08080808 → 808:808)
Calcul manuel :
IP : 8.8.8.8 → décimal → hexadécimal
8 = 08, donc 8.80808 → 0x0808
64:ff9b::0808:080864:ff9b::808:808
DNS64 (RFC 6147) :
Resolver synthétise une réponse AAAA si :
1. Pas d'enregistrement AAAA natif pour le FQDN
2. Enregistrement A présent → AAAA synthétisée = 64:ff9b::A
Les clients IPv6-only peuvent alors contacter 64:ff9b::A
Le NAT64 traduit la destination vers l'adresse IPv4 réelle
Préfixe personnalisé (RFC 7050) :
Un opérateur peut utiliser son propre préfixe /96 à la place de 64:ff9b::/96
Le préfixe est annoncé aux clients via DHCP option 108 ou RDNSS

NAT64 sur Linux (Jool)

bash
Variables
{{PUBLIC_IPV4}}
# Installation Jool (kernel module NAT64)
modprobe jool
jool instance add --iptables --pool6 64ff9b/96
# Configurer le pool IPv4 pour la traduction
jool pool4 add --tcp {{PUBLIC_IPV4}}/32 1-65535
jool pool4 add --udp {{PUBLIC_IPV4}}/32 1-65535
jool pool4 add --icmp {{PUBLIC_IPV4}}/32 1-65535
# Vérification
jool instance display
jool pool4 display
jool session display

OSPFv3 — Routage IPv6

text
OSPFv3 = OSPF pour IPv6 (RFC 5340)
Utilise les LLA (fe80::/10) comme adresses source des paquets Hello
Router-ID obligatoirement en format IPv4 (32 bits) — souvent = loopback IPv4
Instances séparées de OSPFv2 (processus indépendants)
text
Variables
{{ROUTER_ID}}
conf t
! Activer OSPFv3
ipv6 router ospf 1
router-id {{ROUTER_ID}} ! ex: 1.1.1.1 — format IPv4 obligatoire
log-adjacency-changes detail
! Activer OSPFv3 par interface
interface GigabitEthernet0/0
ipv6 ospf 1 area 0
ipv6 ospf cost 10 ! optionnel
interface GigabitEthernet0/1
ipv6 ospf 1 area 1
! Vérifications OSPFv3
show ipv6 ospf neighbor
show ipv6 ospf neighbor detail
show ipv6 ospf database
show ipv6 route ospf
show ipv6 ospf interface brief

Checklist déploiement dual-stack

Checklist0/12
💡 Tip —

Activer IPv6 progressivement segment par segment — ne jamais désactiver IPv4 avant d'avoir validé la connectivité IPv6 de bout en bout sur le segment cible. En dual-stack, si IPv6 est cassé, les clients basculent automatiquement sur IPv4 (Happy Eyeballs) sans interruption visible — ce qui peut masquer des problèmes IPv6 en production pendant des semaines.

OPS·BRAIN v1.027 notes · Networklocal