LINUX:IPv6-Méthode Automatique
→ retour aux Notions de réseau
But
Dans l'article précédent, nous avons découvert la méthode automatique d'attribution des adresses IPv6. Elle est celle qui est à préférer.
C'est une méthode qui n'existe pas sous IPv4. L'adressage de type Global Unicast est généré automatiquement soit aléatoirement soit sur base de l'adresse MAC. Le prefix et la route par défaut est fournie par le routeur concerné. Si ce routeur le spécifie, la main peut être donnée au serveur DHCP. Dans le cas "aléatoire", l'adresse change à chaque redémarrage de façon a éviter le traçage. Elle est connue aussi sous le nom SLAAC (Stateless Address Autoconfiguration). Evidemment l'adresse Link-Local est créée.
Dans notre essai, nous ne disposons pas de serveur DHCP. Seul le modem-routeur de notre ISP va nous aider.
Modem/Routeur de l'ISP
Que nous renseigne le Modem/Routeur de notre ISP, Proximus en l'occurrence?
Dans l'interface Web de ce modem/routeur (BBOX), on peut consulter le prefix de 64 bits ("IPv6 Prefix"). L'IPv6 semble actif mais il n'y a pas de serveur DNS IPv6. Si tout va bien, il nous procurera l'adresse IPv6 globale de la passerelle par défaut IPv6.

Configuration des machines Linux
Les machines serveurs et stations de travail ont été configurée en mode automatique. Voyez l'article sur l'Adressage IPv6 pour les interfaces de configuration. Dans ces interfaces, nous n'avons pas ajouté de paramètres particuliers.
SLAAC
Le système d'attribution automatique de l'adresse Global Unicast se fait de façon autonome. Mais il fait appel au Modem/Routeur de l'ISP (le seul sur le réseau et donc par défaut) pour obtenir le prefix et l'adresse IPv6 de la passerelle par défaut qui est celle du Modem/Routeur.
Il comporte néanmoins deux cas de figure:
- aléatoire et qui change à chaque redémarrage de façon a éviter le traçage.
- sur base de l'adresse MAC du périphérique concerné et donc stable; elle reste inchangée.
Le premier est plus adapté aux stations de travail tandis que le second est plus adapté pour les serveurs surtout s'ils ont une visibilité sur Internet.
Cette option est à ajouter directement dans le fichier de configuration de NetworkManager de l'interface réseau concerné.
La configuration des interfaces, se retrouve dans le répertoire "/etc/NetworkManager/system-connections". Un fichier y est créé portant le nom de l'interface avec comme extension ".nmconnection", par exemple pour l'interface enp0s25", il aura comme nom de fichier "enp0s25.nmconnection".
La configuration liée à IPv6 se retrouve dans la section "[ipv6]". Pour la méthode automatique, elle se présente de la façon suivante:
[ipv6] method=auto
Dans le cas de la station de travail, on choisit la méthode automatique aléatoire pour nous protéger du pistage. La configuration est la suivante:
[ipv6] method=auto addr-gen-mode=stable-privacy
Au lieu d'éditer ce fichier, on peut le faire en ligne de commande:
nmcli connection modify "enp43s0" ipv6.addr-gen-mode stable-privacy
Note: L'interface "enp43s0" est à adapter en fonction de la machine.
Dans cas du serveur, on choisit la méthode automatique basée sur l'adresse MAC:
[ipv6] method=auto addr-gen-mode=eui64
Au lieu d'éditer ce fichier, on peut le faire en ligne de commande:
nmcli connection modify "enp0s25" ipv6.addr-gen-mode eui64
Note: L'interface "enp0s25" est à adapter en fonction de la machine.
Note: Il existe un paramétrage par défaut qui est fonction du type d'installation de base (Server ou WorkStation). Sous Linux Fedora, on le trouve dans le fichier "/etc/os-release".
La commande de ligne:
nmcli connection show enp0s25
affiche la liste des paramètres et parmi eux, les défauts.
On relance le service NetworkManager:
systemctl restart NetworkManager.service
ou on relance la machine.
Remarque
Lors de la constitution de ces adresses en autonome, il y a différentes étapes de vérifications afin de vérifier que ces adresses ne sont pas déjà utilisées. C'est évident dans le cas aléatoire. Normalement tout interface réseau physique doit avec une adresse MAC unique. Mais certains permettent de la changer et il m'est arrivé d'en rencontrer des identiques. En IPv4, cette adresse MAC n'a un impact que sur le réseau local; il suffisait de la placer sur un autre réseau local pour contourner le problème. Ce n'est plus le cas en IPv6, car elle a un effet mondial avec la restriction du prefix.
Constitution de l'adresse sur base de l'adresse MAC
La méthode automatique basée sur l'adresse MAC de l'interface réseau concerné est constituée de la façon suivante:
- On divise l'adresse MAC en deux parties égales. Une adresse MAC est constituée de 6 zones, chacune de 2 chiffres hexadécimaux. Par exemple:
00:1c:c0:92:a2:08
- Entre les deux, on insère la séquence hexadécimale "FFFE". On a la suite:
001C:C0FF:FE92:A208
- Ensuite on inverse le 7ème bit. La partie hexadécimale "00" ou "0000 0000" en binaire devient "0000 0010" en binaire ou "02" en hexadécimal. Ce qui donne:
021C:C0FF:FE92:A208
Au final, on ajoute en début, le prefix pour obtenir l'adresse Global Unicast et "fe80::" pour le Link-Local.
2a02:a03f:c92a:aa00:21c:c0ff:fe92:a208/64 fe80::21c:c0ff:fe92:a208/64
Vérification
IFCONFIG
Serveur
La commande de ligne après filtrage pour notre interface et limitée à IPv6 et l'adresse MAC:
ifconfig
donne:
inet6 2a02:a03f:c92a:aa00:21c:c0ff:fe92:a208 prefixlen 64 scopeid 0x0<global> inet6 fe80::21c:c0ff:fe92:a208 prefixlen 64 scopeid 0x20<link> ether 00:1c:c0:92:a2:08 txqueuelen 1000 (Ethernet)
On remarque la correspondance entre l'adresse MAC et les adresses IPv6. On retrouve le prefix et sa longueur de 64 bits du Modem/Router de notre ISP.
On retrouve l'adresse Global Unicast présentées dans l'article sur l'Adressage IPv6.

Station de travail
La commande de ligne après filtrage pour notre interface et limitée à IPv6 et l'adresse MAC:
ifconfig
donne:
inet6 2a02:a03f:c92a:aa00:7ac8:705d:c409:bd43 prefixlen 64 scopeid 0x0<global> inet6 fe80::df8d:c88c:7fc9:21ac prefixlen 64 scopeid 0x20<link> ether 7c:8a:e1:a1:81:82 txqueuelen 1000 (Ethernet)
On remarque qu'il n'y a pas de correspondance entre l'adresse MAC et les adresses IPv6 qui sont aussi différentes et aléatoires pour la partie "host". On retrouve le prefix et sa longueur de 64 bits du Modem/Router de notre ISP.
ROUTE
Serveur
Visualisons les routes avec la commande:
route -6n
qui donne:
Table de routage IPv6 du noyau Destination Next Hop Flag Met Ref Use If 2a02:a03f:c92a:aa00::/64 :: U 100 3 0 enp0s25 2a02:a03f:c92a:aa00::/56 fe80::aa6a:bbff:fe88:99e3 UG 100 1 0 enp0s25 fe80::/64 :: U 1024 3 0 enp0s25 ::/0 fe80::aa6a:bbff:fe88:99e3 UG 100 3 0 enp0s25 ::1/128 :: Un 0 5 0 lo 2a02:a03f:c92a:aa00:21c:c0ff:fe92:a208/128 :: Un 0 4 0 enp0s25 fe80::21c:c0ff:fe92:a208/128 :: Un 0 4 0 enp0s25 ff00::/8 :: U 256 4 0 enp0s25 ::/0 :: !n -1 1 0 lo
On remarque l'adresse du routeur par défaut "fe80::aa6a:bbff:fe88:99e3".
La commande correspondante en IPv4:
route -n
donne:
Table de routage IP du noyau Destination Passerelle Genmask Indic Metric Ref Use Iface 0.0.0.0 192.168.1.1 0.0.0.0 UG 100 0 0 enp0s25 192.168.1.0 0.0.0.0 255.255.255.0 U 100 0 0 enp0s25
L'adresse du router par défaut est "192.168.1.1".
Station de travail
Visualisons les routes avec la commande:
route -6n
qui donne:
Table de routage IPv6 du noyau Destination Next Hop Flag Met Ref Use If 2a02:a03f:c92a:aa00::/64 :: U 100 1 0 enp43s0 2a02:a03f:c92a:aa00::/56 fe80::aa6a:bbff:fe88:99e3 UG 100 1 0 enp43s0 fe80::/64 :: U 1024 2 0 enp43s0 ::/0 fe80::aa6a:bbff:fe88:99e3 UG 100 5 0 enp43s0 ::1/128 :: Un 0 6 0 lo 2a02:a03f:c92a:aa00:7ac8:705d:c409:bd43/128 :: Un 0 3 0 enp43s0 fe80::df8d:c88c:7fc9:21ac/128 :: Un 0 3 0 enp43s0 ff00::/8 :: U 256 8 0 enp43s0 ::/0 :: !n -1 1 0 lo
On remarque l'adresse du routeur par défaut "fe80::aa6a:bbff:fe88:99e3".
Voisinage
Pour récupérer la table des adresses MAC connues, la commande est différente en IPv6 par rapport à IPv4:
ip -6 neighbour show
qui donne après filtrage:
2a02:a03f:c92a:aa00:: dev enp0s25 lladdr a8:6a:bb:88:99:e3 router STALE fe80::aa6a:bbff:fe88:99e3 dev enp0s25 lladdr a8:6a:bb:88:99:e3 router STALE
Sous IPv4, la commande analogue:
arp -a
donne
_gateway (192.168.1.1) at a8:6a:bb:88:99:e3 [ether] on enp0s25
On retrouve les mêmes adresses MAC en liaison avec le prefix et l'adresse de cette machine routeur par défaut.
PING
Pour effectuer le "ping" vers une adresse IPv6, il existe deux commandes analogues:
ping -6
et
ping6
Par exemple pour l'adresse Global Unicast:
ping6 2a02:a03f:c92a:aa00:21c:c0ff:fe92:a208
Par contre, pour l'adresse Link-Local, il faut préciser l'interface réseau par laquelle on doit passer (enp0s25):
ping6 fe80::21c:c0ff:fe92:a208%enp0s25
ou
ping6 -I enp0s25 fe80::21c:c0ff:fe92:a208
Accès Internet
L'adresse IPv6 Global Unicast est une adresse publique et nom locale comme dans le cas IPv4.
On peut le vérifier en allant interroger un site Internet dédié à cet effet. On lance, sur le serveur, la ligne de commande suivante:
curl -6 ifconfig.me
qui donne:
2a02:a03f:c92a:aa00:21c:c0ff:fe92:a208
qui est l'adresse IPv6 du serveur.
Pour IPv4, cette même commande:
curl -4 ifconfig.me
donne:
80.201.9.156
qui est l'adresse IPv4 publique du Modem/Routeur de notre ISP (voir la première image).
Zone DNS
Maintenant qu'on a une adresse IPv6 pour notre serveur WEB, on va ajouter cette information dans la zone DNS de nos noms de domaine. Cet enregistrement est de type "AAAA".
Quand l'opération est effectuée, on interroge le serveur DNS concerné. Nous avons pris le cas de domaine "adbweb.gslb.eu". Voici la commande de ligne:
host -t AAAA adbweb.gslb.eu ns1.gslb.me
qui donne:
Using domain server: Name: ns1.gslb.me Address: 45.32.69.64#53 Aliases: adbweb.gslb.eu has IPv6 address 2a02:a03f:c92a:aa00:21c:c0ff:fe92:a208
La commande équivalente en IPv4:
host -t A adbweb.gslb.eu ns1.gslb.me
donne:
Using domain server: Name: ns1.gslb.me Address: 45.63.4.153#53 Aliases: adbweb.gslb.eu has address 80.201.9.156
Pour l'adresse IPv4, il faut placer une commande de redirection (PAT) sur le Modem/Routeur de notre IPS pour transférer la requête vers le serveur WEB local. En IPv6, ce n'est plus nécessaire. Le problème avec notre ISP est qu'il active son propre FireWall: toute requête peut sortir mais ne peut rentrer. En conséquence, notre serveur ne peut être interrogé à partir d'Internet en IPv6 mais en interne, si.
HTTPD
Sur notre serveur WEB Local, nous avions limité l'écoute seulement au protocole IPv4 pour les ports 80 et 443.
Dans la configuration, on trouve les options:
... Listen 0.0.0.0:80 ... Listen 0.0.0.0:443 https ...
Pour les étendre à IPv6, on modifie ces lignes comme suit:
... Listen 80 ... Listen 443 https ...
On relance ce service:
systemctl restart httpd.service
Maintenant le listage des ports ouverts:
netstat -nltp | grep httpd
donne:
tcp6 0 0 :::443 :::* LISTEN 977/httpd tcp6 0 0 :::80 :::* LISTEN 977/httpd
Alors qu'avant, on avait:
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1146/httpd tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 1146/httpd
Avantage
Mon Modem/Routeur de mon ISP présente un problème. Il ne prend pas en compte la fonctionnalité "Router Loopback". En conséquence, si à partir de mon réseau local, je veux accéder à mon serveur WEB, la requête donne en IPv4 l'adresse IPv4 du Modem/Router qui n'est pas le serveur WEB. La requête à partir de l'intérieur du réseau n'atteint pas le serveur WEB.
Il y avait deux solutions:
- avoir notre propre serveur DNS qui mappe le nom de domaine publique à l'adresse IPv4 locale du serveur en remplacement de l'adresse publique.
- ajouter dans le fichier "/etc/hosts" sous Linux ou "C:\windows\system32\drivers\etc\hosts" des clients WEB, l'adresse IPv4 locale de ce serveur WEB. Mais si on est hors de notre réseau local, cette ligne devait être désactivée, ce n'est pas pratique.
Sur une machine Linux ou MS Windows, c'est facile mais sur un SmartPhone ou une tablette, c'est pratiquement impossible ou du moins délicat. De plus, un invité ne pouvait y accéder à partir de mon Wifi local. C'est aussi délicat de lui demander cette opération de modification.
Maintenant en interne, l'adressage se fait en IPv6 et en externe, l'IPv6 étant filtré par l'ISP, la requête se rabat sur le protocole IPv4 majoritairement utilisé sur Internet dans ce cas.
Je résous ce problème par la même occasion et je n'ai plus besoin de ces modifications dans les systèmes.
FireWall
Pour le protocole IPv4, le service du FireWall est "iptables.service". Le protocole IPv6 a son propre service: "ip6tables.services". Il faut dont maintenant le configurer car le protocole IPv6 est activé.
Sa configuration se met dans le fichier "/etc/sysconfig/ip6tables" dont voici un contenu de base:
*filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] # # INPUT # -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -p ipv6-icmp -j ACCEPT -A INPUT -i lo -j ACCEPT # HTTPD -A INPUT -m conntrack --ctstate NEW -m tcp -p tcp --dport 80 -j ACCEPT -A INPUT -m conntrack --ctstate NEW -m tcp -p tcp --dport 443 -j ACCEPT # Resolver -A INPUT -m conntrack --ctstate NEW -m udp -p udp --dport 5355 -j ACCEPT # DHCP6 -A INPUT -m conntrack --ctstate NEW -m udp -p udp --dport 547 --sport 546 -s fe80::/64 -j ACCEPT -A INPUT -m conntrack --ctstate NEW -m udp -p udp --dport 546 --sport 547 -d fe80::/64 -j ACCEPT # journal des refus -A INPUT -j LOG --log-level debug --log-prefix "R:INPUT6-MORT " -A INPUT -j DROP # # OUTPUT # -A OUTPUT -o lo -j ACCEPT -A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A OUTPUT -p ipv6-icmp -j ACCEPT # DNS -A OUTPUT -m conntrack --ctstate NEW -m tcp -p tcp --dport 53 -j ACCEPT -A OUTPUT -m conntrack --ctstate NEW -m udp -p udp --dport 53 -j ACCEPT # Whois -A OUTPUT -m conntrack --ctstate NEW -m tcp -p tcp --dport 43 -j ACCEPT # NTP -A OUTPUT -m conntrack --ctstate NEW -m tcp -p tcp --dport 123 -j ACCEPT -A OUTPUT -m conntrack --ctstate NEW -m udp -p udp --dport 123 -j ACCEPT # HTTPD -A OUTPUT -m conntrack --ctstate NEW -m tcp -p tcp --dport 80 -j ACCEPT -A OUTPUT -m conntrack --ctstate NEW -m tcp -p tcp --dport 443 -j ACCEPT # Resolver -A OUTPUT -m conntrack --ctstate NEW -m udp -p udp --dport 5355 -j ACCEPT -A OUTPUT -m conntrack --ctstate NEW -m tcp -p tcp --dport 5355 -j ACCEPT # DHCP6 -A OUTPUT -m conntrack --ctstate NEW -m udp -p udp --dport 546 --sport 547 -d fe80::/64 -j ACCEPT -A OUTPUT -m conntrack --ctstate NEW -m udp -p udp --dport 547 --sport 546 -s fe80::/64 -j ACCEPT # journal des refus -A OUTPUT -j LOG --log-level debug --log-prefix "R:OUTPUT6-MORT " -A OUTPUT -j DROP # # FORWARD # # journal des refus -A FORWARD -j LOG --log-level debug --log-prefix "R:FORWARD6-MORT " -A FORWARD -j DROP COMMIT #################################################################################### # Generated by webmin *mangle :PREROUTING ACCEPT [0:0] :FORWARD ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :INPUT ACCEPT [0:0] COMMIT #################################################################################### # Generated by webmin *nat :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] :PREROUTING ACCEPT [0:0] COMMIT # Completed
Pour le filtrage en sortie (OUTPUT), j'ai préféré faire le détail; d'habitude, on laisse tout sortir. La majorité des ports sont seulement ouvert au protocole IPv4 mais il subsiste quelques uns qui restent pour les deux protocoles (DNS, NTP, resolver) plus les cas particuliers des protocoles DHCP6 et ICMP6.
De son côté, l'entrée (INPUT) doit être contrôlée. Comme ci-dessus, les protocoles DHCP6, resolver et ICMP6 doivent être ouverts. Les protocoles HTTP doivent aussi être ouverts à Internet car c'est un serveur WEB. Remarquez la portée limitée au réseau local des protocole DHCP6 et resolver.
Pour le moment, le transfert (FORWARD) entre interfaces n'est pas utilisé.
En fin de chaque filtre, avant le refus final, on écrit un message dans le journal d'Ip6tables afin de détecter tout blocage.
Le reste est pour mémoire et il a été ajouté automatiquement à la configuration de base venant avec l'installation du système.
On active et on relance ce service:
systemctl enable ip6tables.service systemctl restart ip6tables.service
DNS
Dans la configuration, le serveur DNS au niveau du Modem/Router de notre ISP n'est pas présent en IPv6 mais seulement en IPv4. Proximus n'en a pas. Et il y en peu à travers le monde, preuve qu'on est encore loin de passer uniquement au protocole IPv6.
Si on veux l'ajouter, on conseille de prendre par exemple, ceux de Google:
- Primaire : 2001:4860:4860::8888
- Secondaire : 2001:4860:4860::8844
→ retour aux Notions de réseau