« IPv6 » : différence entre les versions
Aucun résumé des modifications |
Aucun résumé des modifications |
||
Ligne 271 : | Ligne 271 : | ||
*33:33:ff:x:y:z, où x, y et z sont des valeurs héritées de l'adresse IPv6. C'est l'adresse multicast du noeud, x y et z sont les 24 derniers bits de l'adresse IPv6. À toute adresse IPv6 correspond une adresse multicast dérivée de celle-ci, 33:33:ff:x:y:z selon ce principe. | *33:33:ff:x:y:z, où x, y et z sont des valeurs héritées de l'adresse IPv6. C'est l'adresse multicast du noeud, x y et z sont les 24 derniers bits de l'adresse IPv6. À toute adresse IPv6 correspond une adresse multicast dérivée de celle-ci, 33:33:ff:x:y:z selon ce principe. | ||
| |||
= Adresse Unicast Unique Locale ("Unique Local Address" ou "ULA") = | = Adresse Unicast Unique Locale ("Unique Local Address" ou "ULA") = |
Version du 5 novembre 2018 à 18:22
Introduction au protocole IPv6
Remplaçant d'IPv4, il est essentiel de le connaître pour l'avenir.
NB : IPv6 est également détaillé dans Cisco
Rappel Historique
En 1993, le web a commencé à exploser : sites web d'entreprise et accès internet deviennent essentiels. Le problème était alors que l'espace d'adressage IPv4 à rapidement commencé à se réduire.Des blocs d'adresses IPv4 trop conséquents ont été fournis aux structures. On a alors créé des solutions de contournement:
- CIDR abolition des classes, découpage en blocs de taille variable plus précis... Avant cela on fournissait soit des bloc de 256 adresses soit des blocs de 16 millions ! Aujourd'hui les tailles sont adaptées aux besoins réels.
- En 1996, la RFC1918 concernant les adresses privées et le NAT est apparue pour gérer l'urgence.
Mais ce ne sont que des solutions de contournement. Elles sont temporaire et ont des contraintes (plus de communication bout-à-bout, limite de 65000 ports pour le NAT). Une solution globale est nécessaire : IPv6.
L'organisation
L'ICANN (Internet Corporation for Internet Assigned Names and Numbers) est une autorité de régulation sur Internet, qui gère les noms DNS et les adresses IP.
L'IANA (Internet Assigned Numbers Authority) régule les adresses IP, ainsi que d'autres ressources de numérotation (ports TCP/UDP, OID SNMP, etc... Elle découpe les adresses IPv4 en 256 blocs /8 et les affecte aux RIR.
Un RIR (Regional Internet Registry) effectue la gestion régionale des adresses. Elle affecte les blocsq d'adresses aux LIR. La liste des RIR est dispo dans la partie Cisco
Les LIR (Local Internet Registry) Fournissent les adresses à des clients finaux : par exemple chez ceux inscrits chez RIPE NCC on a entre autres : Orange, Free, SFR, OVH, Oxalide, Online, Renater, Renault SAS France, RTE France, etc...
Le 03/02/2011 : L'IANA a confié ses 5 derniers blocs /8 aux 5 RIR : "EndGame"
Le 15/04/2011 : L'APNIC a annoncé avoir commencé l'attribution du dernier /8 en sa possession
Le 14/09/2012 : Le RIPE NCC a annoncé la même chose.
Le 25/09/2015 : L'ARIN n'as plus d'adresses IPv4, trop de demandes en attente par rapport au nombre disponible.
Les règles d'attribution du RIPE NCC aux LIR des blocs IPv4 ont été durcies lors du EndGame, par exemple:
- Utiliser au moins 25% de l'attribution immédiatement
- Utiliser au moins 50% au bout d'un an
- La réservation d'adresses est interdite
- La taille d'une réservation ne se justifie que par le nombre d'appareils nécsessitant une adresse IPv4
- Les technologies permettant d'économiser l'utilisation d'adresses sont encouragées.
La consommation d'adresses après EndGame s'est fortement stabilisée.
Les problèmes d'adressage ont été détectés dès 1993; la fin des spécifications IPv6 a eu lieu dès 1998. Et pourtant seuls 8% des utilisateurs de Google passaient par IPv6 en 2015.
En fonction des pays, IPv6 n'est pas forcément fiable ou rapide à l'utilisation, comme en France ou en Allemagne (contrairement à la Belgique ou aux USA, par exemple.
En juillet 2016:
- France : 11.24% d'adoption
- Belgique : 44%
- USA : 29%
- Allemagne : 23.51%
Différences et points communs avec IPv4
IPv6 est moins bien maîtrisé par les administrateurs s&r. Beaucoup ont l'habitude d'IPv4, mais très peu avec IPv6; il est très peu déployé. On a pourtant beaucoup de points communs :
- Même principe d'encapsulation
- On a toujours adresse source et destination
- On a un routeur par défaut
- On a un MTU
- On a un en-tête.
Mais aussi des différences:
- Un adressage sur 128 bits
- Auto-configuration avec la SLAAC
- Suppression du broadcast et de l'ARP remplacés par multicast et Neighbor Discovery
- Adresse de lien local
- Header de taille fixe qui rend plus simple le code du routeur, et celui-ci est plus performant
- ICMPv6, bien plus important qu'ICMPv4
- Pas de NAT!
- Meilleur support d'IPSec (même si il n'est pas obligatoire)
Point important, on a pas de séparation claire des couches dans le modèle TCP/IP:
- TCP a été légèrement adapté pour IPv6, tout comme UDP
- Ethernet a été légèrement adapté pour IPv6
Bases sur l'adressage IPv6
Les adresses sur 128 bits sont 4 fois plus longues qu'en IPv4; mais ce n'est que la taille de l'adresse : ça ne veut pas dire qu'il n'y a que 4 fois plus d'adresses. En IPv4 on a 4 294 967 296 adresses; en IPv6 on en a 2¹²⁸, soit 3.4*10³⁸, soit BEAUCOUP. On pourrait donner 67 milliard de milliard d'adresses par mm carré de la surface terrestre.
Une adresse IPv6:
- Sur 128 bits donc,
- Découpée en 8 mots de 16 bits
- Qui sont séparés par des :
- Chaque mot est représenté en hexadécimal
Exemples : 2001:0660:3004:4000:0000:0000:0010:0053, fe80:000:000:000:76d0:2bff:fe98:42d7. 2001 est un mot, 0660 un autre mot... Ici, 2001 n'est pas "deux mille un", mais "deux zéro zéro un", puisqu'on est en hexa.
- Un mot codé sur 16 bits contient 4 caractères, et un caractère (de 0 à F) est codé sur 4 bits.
- Attention:
- 10 n'est pas la suite de 09, puisque 1016 == 1610 (10 en hexa est la suite de F)
- 0916 == 0910, en revanche.
C'est difficile au début, parce que l'on est habitué à la base 10 (en Europe en tout cas), où l'on peut compter sur ses doigts. Mais avec de la pratique, cela devient une habitude.
Raccourcir les adresses
- On peut supprimer les 0 en tête de champ (ou en tête de mot, mot == champ)
- Si un champ est composé que de 0, on en laisse un
- Attention, on enlève pas les 0 en fin de champ ! Comme en décimal, 416 != 4016
- On peut remplacer les champs remplis de 0 consécutifs en les remplaçant par "::", une seule fois par adresse, en général au début
- 2001:0:0:4000:0:010:53 devient 2001::4000:0:010:53...
- ...mais pas 2001::4000::010:53
- Sinon on ne sait pas combien de champs à 0 ont été supprimés par :: !
Network ID et Host ID
Une adresse IPv6 de 8 mots de 128 bits est découpée en deux parties :
- 4 mots pour le Network ID, la partie réseau sue 64 bits.
- 4 mots pour le Host ID, 64 bits aussi appellés identifiant de l'hôte.
Le plus petit réseau possible en IPv6 est un /64 (pas de /65 ou plus possible !), même pour les particuliers. Un tel réseau permettrait de faire chez soi un réseau plus grand que tout Internet IPv4 !
Network ID
Première partie de l'adressage. L'adresse réseau est forcément notée au format CIDR (X:Y:Z::/NN), et tous les zéros qui suivent sont remplacés par ::. Exemples:
- 2001:660::/32 : RENATER
- 2001:660:3004::/48 : IRCAM
- 2620:0:860::/46 : Wikipédia
On voit ici que ces réseaux ne sont par arrivés au /64, ce qui leur laisse de la place pour faire des sous-réseaux. Ici L'IRCAM, qui appartient à RENATER, lui a demandé un sous-réseau (Le réseau IRCAM est un sous-réseau de celui de RENATER). Ces 64 premiers bits sont tout l'espace que l'on a pour faire des réseaux et des sous-réseaux; les 64 autres seront forcément réservés aux hôtes.
Boucle Locale
La loopback IPv4 était dans /8 (un gros gâchis). La loopback IPv6 est ::1/128. On voit qu'elle ne contient qu'une seule adresse.
À Noter
- Un client final dispose d'un réseau de taille X;
- Cette taille X devra être un multiple de 4:
- Le masque sera identique pour toutes les adresses
- Personne ne disposera du même numéro de masque
- En gros, ça permet de tomber à la coupure entre deux champs
- Par exemple le réseau de Wikipédia, 2620:0:860::/46, qui est non multiple de 4, a pour première adresse 2620:0:860:: et pour dernière adresse 2620:0:0863:ffff:ffff:ffff:ffff:ffff. On est obligé de faire un calcul mental pour connaître la dernière adresse.
- Le réseau de l'IRCAM, 2001:660:3004::/48 commence avec 2001:660:3004:: et finit avec 2001:660:3004:ffff:ffff:ffff:ffff:ffff. On voit que les champs du NetID ne changent pas.
Types d'adresses IPv6
IPv6 dispose des types d'adresses suivants :
- Unicast de lien local
- Utilisée pour des machines connectées entre elles sans passer par un routeur. C'est un lien entre hôtes utilisant le même réseau Ethernet (switch, câble réseau, FibreOptique). Elles ne passent pas les routeurs et ne sont pas routables sur Internet.
- unicast globale
- Est routable sur Internet (pas de NAT sur IPv6!) : tout le monde peut en avoir une. Comme une adresse publique en IPv4.
- unicast de site local (déprécié):
- Liaison entre machines appartenant à une seule et même structure ou sur le même site géographique. La communication entre hôtes ne passe par aucun routeur externe à la structure. Cette adresse est unique sur le site local, n'est utilisable que sur celui-ci et n'est pas routable sur Internet (mais elle passe les routeurs du site). S'applique à par exemple à : une entreprise avec tous ses locaux au même endroit, une filiale d'une entreprise, une association, un particulier... Mais pas à : Deux filiales d'une même entreprise (même sur le même site géographique), une entreprise sur deux sites différents... NetId différent.
- unicast unique locale
- Comme du "RFC1918++" : Le but est d'imiter les adresses IPv4 privées, de permettre à tout le monde tester IPv6 en interne, et d'éviter que le rachat d'une structure par une autre n'impose la renumérotation des réseaux grâce à un tirage aléatoire.
- multicast
- Associée à un groupe d'hôtes. Tout le groupe est destinataire. Exemple : Neighbor Discovery, IPTV (diffusion d'un contenu identique à beaucoup d'abonnés en même temps).
- anycast
- Adresse associée à un groupe d'hôtes. Un seul de ce groupe d'hôte doit répondre. Exemple : Envoi d'une requête DHCP ou DNS : le premier serveur dispo me répond.
Une adresse unicast est associée à un seul hôte, et est unique sur le lien, le site ou globalement. Rappel : le broadcast n'existe plus en IPv6.
Bien entendu, une seule interface réseau aura plusieurs adresses IPv6 différentes :
- Une adresse unicast de lien local ("link local adress")
- Une adresse unicast globale
- Et peut-être une adresse unicast de site local
- Une loopback
Auto-Configuration de l'adresse de lien local
Un ordinateur même non configuré dispose d'une adresse de lien local : celle-ci est autoconfigurée. On en a une sans rien faire et on peut l'utiliser pour contacter des machines du réseau!
La SLAAC (StateLess Address Auto Configuration) Permet de s'assurer que les adresses sur le même lien peuvent communiquer ensemble, et que les adresses de lien local sont uniques.
Comment faire communiquer deux machines dans un même sous-réseau?
Pré-Requis:
- Être dans le même sous-réseau
- Disposer du même masque de sous-réseau
- Pas besoin de gateway
Un préfixe IPv6 est dédié aux adresses de lien local : fe80::/10 (Le /10 signifie que les caractères qui suivent les 10 premiers seront des 0; c'est la même idée qu'en IPv4).
Comment générer une adresse unique?
- En se basant sur quelque chose qui est déjà unique !
- En utilisant une fonction de dérivation qui est déjà unique
- En contrôlant la non-duplication
Pour assurer l'unicité de la link-local, on utilise l'adresse MAC, qui est unique et disponible sur toutes les cartes réseau.
- Seul le HostID doit être généré
- On a déjà le NetID (fe80::/10)
- On a déjà les 64 premiers bits
- Il nous en reste 64 à générer
Fonctionnement de la SLAAC pour une link-local address:
- Mettre le préfixe fe80::/64
- Prendre l'adresse MAC
- La couper en deux
- Ajouter FFFE au milieu
- Inverser le 7e bit
- Résultat : "EUI-64 modifié"
- Concaténer le préfixe et l'EUI-64 modifié
Exemple:
Adresse MAC : f8:16:54:20:6b:8d
- Je mets fffe au milieu: f816:54ff:fe20:6b8d
- Je fais le complément du 7e bit : fa16:54ff:fe20:6b8d
- EUI-64 modifié : fa16:54ff:fe20:6b8d
- Adresse IPv6 de lien local : FE80::fa16:54ff:fe20:6b8d
NB : Ce n'est pas la seule méthode, on peut aussi utiliser un chiffre au hasard et faire une vérification de non-duplication, comme c'est le cas sur Linux
Intérêt des adresses IPv6 Multicast
Une adresse Multicast correspond à un groupe de machine. Une interface étant configurée avec une adresse multicast recevra tous les paquets envoyés à cette adresse multicast.
Identifier une adresse mutlicast
Elle commence par FF:
- FF00 -> Réservé
- FF01 -> Adresse Multicast de la machine locale (Peu utile, sauf à échanger avec un processus interne de la machine locale)
- FF02 -> Adresse Mutlticast de lien local (toutes les machines du lien local recevront les paquets)
- FF05 -> Adresse Multicast de site local (Pareil pour toutes les machines du site local)
- FF0E -> Adresse Multicast globale (Pareil mais pour tout Internet)
Une liste est disponible : https://www.iana.org/assignments/ipv6-multicast-addresses/ipv6-multicast-addresses.xhtml
Adresses Multicast importantes:
- ff02::1 : toutes les machines du lien local
- ff02::2 : tous les routeurs du lien local
- ff02::101 : tous les serveurs NTP du lien local
- ff05::3 : tous les serveurs dhcp du site local
Pour toute adresse IPv6 configurée:
- FF02::1:FFUV:WXYZ
- C'est une adresse IPv6 multicast dérivée de l'adresse IPv6
- UVWXYZ correspond aux 24 derniers bits de l'adresse IPv6
- Cette adresse multicast est utilisée pour Neighbor Discovery (ND) et Duplicate Address Detection (DAD)
Si j'ai 3 adresses IPv6 configurées, j'aurais 3 adresses multicast automatiquement générées. L'intérêt et de ne plus demander de configuration manuelle : je pourrais travailler avec lde l'autoconfiguration et des adresses multicast; multicast tient d'ailleurs lieu de broadcast. Tout ça fonctionne grâce à SLAAC, ND et DAD.
Je peux utiliser ip maddr show dev enp0s31f
6 pour voir mes adresses MAC et mes adresses de multicast IPv6 correspondantes. J'ai plusieurs adresses MAC configurées par IPv6 (sur Linux en tout cas) : IPv6 "fabrique" des adresses MAC correspondant aux adresses IPv6 (tous types d'adresses : unicast, lien local...). Par exemple l'adresse mac "33:33:00:00:00:01" correspond à l'adresse de multicast "ff02::1" : un message envoyé à ff02::1 aura pour destinataire Ethernet 33:33:00:00:00:01.
Un exemple de la commande ip maddr show dev enp0s31f
6 sur mon PC:
2: enp0s31f6
link 01:00:5e:00:00:01
link 33:33:00:00:00:01
link 33:33:ff:7b:5f:64
link 01:00:5e:00:00:fb
link 33:33:ff:bc:1b:d2
link 33:33:ff:e4:8f:c8
link 33:33:00:00:00:fb
inet 224.0.0.251
inet 224.0.0.1
inet6 ff02::fb
inet6 ff02::1:ffe4:8fc8
inet6 ff02::1:ffbc:1bd2
inet6 ff02::1:ff7b:5f64
inet6 ff02::1 users 2
inet6 ff01::1
On voit qu'IPv6 a aussi un impact sur Ethernet : TCP/UDP ne sont pas les seuls protocoles à avoir été pris en compte.
Ethernet, IPv6 et multicast
IPv6 ne permet pas de broadcast, ni d'ARP. Rappellons que pour chaque adresse IPv6, on a une adresse IPv6 multicast. Sur une interface réseau paramétrée en IPv6, on a des adresses multicast IPv6 et des adresses MAC multicast associées; la couche Ethernet est donc impactée par IPv6 : l'interface écoute sur d'autres adresses MAC que celle codée dans le hardware de la carte réseau. Il y'a même un OUI dédié à cela : 33:33:X "Adresse MAC dédiée au multicast". Ce n'est pas le cas si l'on utilise pas IPv6 (on aura que celle de la carte réseau si l'on est en IPv4).
Cela signifie que si l'on ajoute une adresse IPv6 de lien local, on aura création d'autres adresses MAC, qui utiliseront l'OUI multicast:
- 33:33:00:00:00:01 : Adresse MAC multicast utilisée pour les hôtes de ce lien
- 33:33:00:00:00:FB : Adresse mDNS (Multicast DNS), utilisé pour remplacer le service DNS sur les petits réseaux. Le message correspondant est "Je recherche la machine sur le lien local dont le nom est X"
- 33:33:ff:x:y:z, où x, y et z sont des valeurs héritées de l'adresse IPv6. C'est l'adresse multicast du noeud, x y et z sont les 24 derniers bits de l'adresse IPv6. À toute adresse IPv6 correspond une adresse multicast dérivée de celle-ci, 33:33:ff:x:y:z selon ce principe.
Adresse Unicast Unique Locale ("Unique Local Address" ou "ULA")
Pour rappel, on a une adresse unicast de lien local, valide uniquement sur un lien et qui ne passe pas les routeurs.
Mais on a aussi l'adresse Unicast Unique Locale, qui est faite pour être sur un site géographique, une structure : les paquets passent les routeurs locaux mais ne vont pas sur Internet. Elles ne doivent pas être confondues avec les adresses unicast de site local, qui sont dépréciées, mais qui font sensiblement la même chose!
Les adresses globales elles, sont reconnues par tous et peuvent sortir sur Internet.
Les préfixes sont:
- FE80::/10 (Adresse Unicast de lien local)
- FEC0::/10 (Adresse Unicast de site local, déprécié)
- FC00::/7 : Adresses Unicast uniques locales
- 2000::/3 et 3000::/3 : Adresses Globales
L'objectif des ULA est de remplacer les site local address qui sont imprécises. Elles permettent aussi d'avoir des "adresses privées" non routables sur le net, ainsi que de tester IPv6. Elles permettent enfin d'isoler tous les sites grâce à un algorithme.
Isolation de sites
En IPv4, on a des adresses privées, qui évitent les conflits d'adressage entre deux entreprises différentes, par exemple. Cependant si deux entreprises ayant le même adressage privé se retrouvent à fusionner, on aura alors un souci : il faudra refaire tout l'adressage ! IPv6 essaie d'éviter cela : on a tellement d'adresses que l'on peut dédier des pools entiers à des entreprises sans courir le moindre risque.
Détail de l'adresse unique locale
L'adresse est composé en 4 parties en gros:
- 8 bits: Le préfixe FC00/7, coupé en 2, qui correspond à 11111102 suivi d'un bit à 0 pour FC00 et à 1 pour FD00:0
- FC00::/8 est réservé pour futur usage
- FD00::/8, est le bloc des adresses uniques locales (celui qu'on utilise, en gros!)
- 40 bits : Un ID global, identifiant unique de la structure, qui est identique partout dans cette structure (même dans les sous-réseaux) et est tiré au hasard selon un algorithme précis
- 16 bits : La partie Subnet : identifiant du sous-réseau dans la site, à la discrétion des admins réseau qui peuvent faire les sous-réseaux qu'ils veulent
- 64 bits : La partie Host ID.
En cas de fusion/acquisition de deux entreprises, les global ID sont différents. Il suffit alors simplement de connecter les deux réseaux ensemble (VPN par exemple!), et/ou de configurer le routage. Même avec des VPN, cela reste simple, on peut même aisément connecter et déconnecter des réseaux temporairement, par exemple.
Génération d'un ID global
Pour disposer d'un ID Global unique, un algorithme est proposé:
- Concaténer:
- l'heure actuelle au format NTP 64 bits ("Current time of day in 64-bits NTP format")
- EUID-64 d'une carte réseau (n'importe laquelle)
- Faire un SHA-1 digest
- Prendre les 40 derniers bits
La probabilité de conflit est extrêment faible.
En pratique:
- Sur Linux, le "current time of day blablabla" est obtenu par la commande
date +%s
(c'est en fait tout simplement le temps au format UNIX). - On obtient un chiffre à transformer en binaire,
- auquel on associe une EUID-64 (comme pour générer une adresse avec la SLAAC, on prend une adresse MAC on la modifie etc... et on obtient un EUID-64).
- On concatène le chiffre en binaire et l'EUID-64 qui est lui en hexa
- On le fait passer par un SHA-1 : par exemple
echo 10110111110000010000011111111109f5c:8eff:fe54:04c0 | sha1sum -
(En utilisant la date au moment où j'écrit et l'EUID-64 de ma carte réseau). La commande me renvoie :- 6d7321c24fdb237805fb17206c81f6ce12bc49ff
- Je prend les 40 derniers bits (!Pas les 40 derniers chiffres mais bien les 40 derniers nombres, SHA1renvoyant des hextets!) :
ce12bc49ff.
- Je rajoute le préfixe et je mets ça au format IPv6 : j'ai alors mon NetID, sans sous-réseaux pour l'instant (je peux en faire si je veux):
fdce:12bc:49ff/48
. J'ai mon identifiant global unique. - Je rajoute ma partie subnet à 16 bits :
- fdce:12bc:49ff:0:1::/64 : Un premier sous réseau
- fdce:12bc:49ff:0:2::/64 : Un deuxième sous réseau
- fdce:12bc:49ff:1::/58 : Un troisième sous-réseau
- fdce:12bc:49ff:1:0::/64 : Un sous-sous-réseau
- fdce:12bc:49ff:1:1::/64 : Un deuxième
- Etc...
- Je peux faire 65536 sous-réseaux, ce qui devrait suffire...
On a pas besoin de le faire des miliers de fois, on peut en faire un script si nécessaire (il y'a aussi des sites pour faire ça).