Configurer l'IPv6 sur un VPS : adressage, DNS inverse et pare-feu

L'IPv6 n'est plus optionnelle : elle conditionne la délivrabilité des courriels, l'accès depuis les réseaux mobiles et le référencement. Voici la configuration complète.

Maillage de nœuds réseau autour d'un bloc d'adresses IPv6

L'IPv6 a cessé d'être un sujet d'avenir. Une part importante du trafic mobile en Amérique du Nord est native IPv6, plusieurs grands fournisseurs de messagerie acceptent mieux le courriel émis en IPv6 correctement configuré, et un service joignable dans les deux familles réduit sa dépendance aux couches de traduction. Sur nos VPS, chaque VM reçoit quatre adresses IPv6 en plus de son IPv4.

Ce guide couvre la configuration statique sous Ubuntu 24.04 avec Netplan, la publication DNS, le DNS inverse et le filtrage.

1. Faire l'état des lieux

bash
ip -6 addr show
ip -6 route show
ping6 -c3 2620:fe::fe

Trois cas se présentent. Si une adresse globale (commençant par 2 ou 3) est présente et que le ping répond, tout est déjà en place. Si vous ne voyez qu'une adresse en fe80::, seul le lien-local existe. Si l'adresse est là mais que le ping échoue, la route par défaut manque.

2. Configurer l'adresse avec Netplan

Ubuntu Server utilise Netplan. Les fichiers vivent dans /etc/netplan/ ; le YAML y est sensible à l'indentation, qui doit être faite d'espaces.

bash
sudo tee /etc/netplan/60-ipv6.yaml <<'EOF'
network:
  version: 2
  ethernets:
    ens3:
      dhcp4: true
      accept-ra: false
      addresses:
        - "2602:xxxx:xxxx:1::10/64"
      routes:
        - to: "::/0"
          via: "2602:xxxx:xxxx:1::1"
          on-link: true
      nameservers:
        addresses: [2620:fe::fe, 2606:4700:4700::1111, 9.9.9.9]
EOF

sudo chmod 600 /etc/netplan/60-ipv6.yaml
sudo netplan try

netplan try applique la configuration et la annule automatiquement au bout de 120 secondes si vous ne confirmez pas. Sur une machine distante, c'est le filet qui vous évite de perdre l'accès sur une faute de frappe. Confirmez avec Entrée, puis sudo netplan apply.

Adressage statique ou autoconfiguration ? Si votre hébergeur annonce le préfixe par Router Advertisement, laissez accept-ra: true et retirez le bloc addresses : la VM se configure seule. Le mélange des deux, RA actif et adresse statique, produit des routes par défaut concurrentes et des pertes intermittentes difficiles à diagnostiquer.

3. Vérifier la connectivité

bash
ip -6 addr show ens3
ip -6 route get 2620:fe::fe
ping6 -c3 2606:4700:4700::1111
traceroute6 -n ipv6.google.com
curl -6 -s https://ifconfig.co

curl -6 doit renvoyer exactement l'adresse que vous avez configurée. Une adresse différente signale une IPv6 temporaire générée par les extensions de confidentialité, acceptable sur un poste, gênant sur un serveur dont le DNS inverse doit correspondre.

bash
# fixer l'adresse source sortante
sudo tee /etc/sysctl.d/99-ipv6-serveur.conf <<'EOF'
net.ipv6.conf.all.use_tempaddr = 0
net.ipv6.conf.default.use_tempaddr = 0
EOF
sudo sysctl --system

4. Publier l'enregistrement AAAA

Un enregistrement AAAA suffit à rendre le service joignable en IPv6. Gardez la même valeur de TTL que le A pour éviter des comportements asymétriques pendant une migration.

zone DNS
exemple.com.  300  IN  A     198.51.100.42
exemple.com.  300  IN  AAAA  2602:xxxx:xxxx:1::10

Ne publiez l'AAAA qu'une fois le service réellement joignable en IPv6. Un client en double pile privilégie l'IPv6 : si le port n'écoute qu'en IPv4, l'utilisateur attend l'expiration du délai avant le repli. Pour un serveur web, contrôlez la présence de listen [::]:443 ssl; dans Nginx ; pour tout service, sudo ss -tulpen | grep ':::'.

5. Configurer le DNS inverse (PTR)

L'enregistrement PTR associe une adresse IP à un nom. Il n'est pas géré chez votre registraire mais chez le détenteur du préfixe, donc chez votre hébergeur, via sa console. Chez FFxF, le reverse DNS est configurable sur chaque adresse attribuée à la VM.

Il est indispensable pour l'envoi de courriel : la plupart des grands destinataires rejettent ou classent en indésirable un message venu d'une adresse IPv6 sans PTR, ou dont le PTR ne « boucle » pas.

bash
dig -x 2602:xxxx:xxxx:1::10 +short
# doit renvoyer : mail.exemple.com.

dig +short mail.exemple.com AAAA
# doit renvoyer : 2602:xxxx:xxxx:1::10

Les deux résolutions doivent se répondre l'une à l'autre. Un PTR qui pointe vers un nom sans AAAA correspondant est traité comme une absence de PTR.

6. Filtrer l'IPv6

L'erreur classique : un pare-feu bien réglé en IPv4, et rien en IPv6. Les adresses IPv6 des serveurs sont balayées comme les autres, les préfixes sont publics et les plages actives se déduisent du DNS.

bash
grep IPV6 /etc/default/ufw     # doit afficher IPV6=yes
sudo ufw status verbose        # les règles doivent apparaître en (v6)

Si IPV6=no, corrigez le fichier puis sudo ufw disable && sudo ufw enable. Les règles écrites ensuite couvrent les deux familles automatiquement.

Ne bloquez pas tout l'ICMPv6. Contrairement à l'IPv4, le protocole en dépend pour fonctionner : découverte des voisins, découverte du MTU de chemin. Filtrer l'ICMPv6 sans discernement provoque des connexions qui s'établissent puis se figent sur les gros transferts. UFW autorise le nécessaire par défaut ; ne le retirez pas.

7. Faire écouter les services

Une adresse configurée ne sert à rien si les démons n'écoutent qu'en IPv4.

bash
sudo ss -tulpen | grep -E ':::|\[::\]'
  • Nginx : ajoutez listen [::]:80; et listen [::]:443 ssl;.
  • OpenSSH : écoute sur les deux familles par défaut, sauf si ListenAddress restreint.
  • Postfix : inet_protocols = all.
  • Docker : nécessite "ipv6": true et un préfixe dédié dans daemon.json pour donner de l'IPv6 aux conteneurs.

Checklist

  • Adresse globale et route par défaut présentes (ip -6 route).
  • ping6 et curl -6 sortent avec l'adresse attendue.
  • AAAA publié seulement après vérification de l'écoute du service.
  • PTR configuré et cohérent avec l'AAAA.
  • Pare-feu actif en v6, ICMPv6 préservé.
  • Test final sur test-ipv6.com depuis un client, et depuis le serveur.