Coexistence IPv4-IPv6 : Tunnel dynamique 6-to-4
A l’heure ou l’implémentation de l’IPv6 dans les réseaux s’accélère (certes encore trop lentement), on observe des situations délicates du point de vue de la coexistence IPv6-IPv6. Cet article a pour objectif d’expliquer la configuration d’une méthode de transition, les tunnels dynamiques 6-to-4…
Introduction
Cette technique fait partie de celles qui ont pour but de permettre l’interconnexion de plusieurs « îlots » IPv6 en passant au travers d’un réseau IPv4. L’idée principale est, du point de vue du réseau IPv4, de considérer les paquets IPv6 comme étant les données à faire transiter, ce qui aura pour effet d’encapsuler le paquet IPv6 dans un paquet IPv4 (delà la notion de tunnel faisant référence à l’encapsulation entre deux points donnés).
Les tunnels 6-to-4 dynamiques, comme leur nom l’indique ne sont pas figés, c’est à dire qu’ils sont établis à la demande. D’un point de vue du fonctionnement, cela sous-entend que la source du tunnel ne change pas, mais par contre la destination, elle, n’est pas définie.
Comment peut-on établir un tunnel si il n’y a pas de destination ?
C’est là la particularité du 6-to-4, la destination du tunnel n’est pas figée, mais elle est toutefois fournie par le biais de l’adresse destination contenue dans le paquet IPv6, ce qui fait que le tunnel aboutira à un endroit donné, selon le réseau de destination qu’il faut atteindre… Oui mais comment ?
L’astuce réside dans l’adressage IPv6 de l’ilot. Avec du 6-to-4, il faut absolument respecter les règles suivantes:
- L’adresse globale de l’îlot doit faire partie des adresses 2002::/16 (espace d’adresses réservées pour le 6-to-4)
- L’adressage de l’îlot doit être fonction de l’adresse IPv4 qui donne accès au réseau IPv4 « central ».
Prenons un exemple concret:
Trois îlots IPv6 sont séparés par un réseau IPv4. Afin de pouvoir utiliser des tunnels 6-to-4, il faut adresser ces ilots IPv6 en tenant compte de l’adresse IPv4 du routeur d’accès. Donc par exemple, l’ilot situé derrière R1 sera adressé en fonction de 192.168.0.1.
L’adresse 6-to-4 de l’îlot sera composée comme ceci: 2002:PREFIX:IPV4::/48, c’est-à-dire que l’on doit incorporer l’adresse IPv4 traduite en hexadécimal dans l’adresse IPv6. Le préfixe 2002: forme les 16 premiers bits, les 32 bits suivants seront ceux de l’adresse IPv4, le tout formant un réseau /48. Ensuite tous les sous-réseaux de l’îlot doivent appartenir à cette adresse générale.
Concrètement, l’ilot IPv6 derrière R1 aura l’adresse: 2002:C0A8:1::/48 ( 192=C0, 168=A8,0 = 00, 1 = 01, soit 2002:C0A8:0001:: où on peut omettre les 0 non significatif).
On aura donc au final trois îlots:
- R1: 2002:C0A8:1::/48
- R2: 2002:C0A8:2::/48
- R3: 2002:C0A8:3::/48
Etant donné qu’en IPv6 la bonne pratique veut que l’on attribue un subnet en /64 par sous-réseau, il reste 16 bits pour effectuer les découpes (soit 65536 sous-réseaux). Pour l’exercice, on utilisera un seul sous-réseau de chaque côté. Comme ceci:
Fonctionnement des tunnels 6-to-4
Prenons par exemple un PC situé derrière R1 qui communique au travers du tunnel 6-to-4 (qui n’est pas encore configuré dans cet article bien entendu ) avec un PC sur le réseau IPv6 de R2. Lorsque le paquet IPv6 arrive sur R1, ce dernier constate qu’il s’agit d’un paquet à destination d’un réseau 6-to-4, il déduit donc l’adresse IPv4 du routeur qui donne accès à ce réseau IPv6 (soit ici 192.168.0.2), il peut donc générer un paquet IPv4 à destination de 19.168.0.2 qui contiendra le paquet IPv6 d’origine.
Le paquet IPv4 arrive à R2, R2 constate qu’il contient un paquet IPv6 pour un réseau auquel il est connecté et n’a donc plus qu’à l’y diffuser.
Entre R1 et R2 la structure des données serait la suivante:
|ETHERNET|-|IPv4|-|IPv6|-|DATA|
L’avantage principal de ce genre de tunnel est l’évolutivité. Il n’est pas nécessaire de configurer plus d’un tunnel localement, puisque la destination est définie dynamiquement. Par contre, l’inconvénient majeur de cette technique, c’est qu’il n’est pas possible, sans avoir recours à d’autre technique, d’utiliser un protocole de routage entre les deux ilots IPv6. Il faut obligatoirement travailler avec du routage statique.
Ceci dit, il suffit de rajouter une route 2002::/16 qui pointe vers le tunnel … ce n’est pas la mer à boire !.
Configuration des tunnels 6-to-4
Sur chaque routeur, il faut créer une interface Tunnel avec les paramètres suivants:
- Mode IPv6ip 6to4
- Source : adresse IPv4 ou nom de l’interface ipv4
- Destination: aucune!
- Adresse IPv6: 2002:PREFIX:IPV4:????::/64
Il faut donc attribuer une adresse IPv6 correspondant à un subnet de l’îlot à l’interface du tunnel.
En détail pour R1…
Configuration de l’interface ethernet (ipv4)
R1>en
R1#conf t
R1(config)#int fa0/0
R1(config-if)#ip address 192.168.0.1 255.255.255.0
R1(config-if)#no shut R1(config-if)#exit
Configuration de l’interface loopback IPv6 (simulation du réseau derrière R1) et activation du routage IPv6
R1(config)#ipv6 unicast-routing
R1(config)#interface loopback 0
R1(config-if)#ipv6 address 2002:C0A8:1::1/64
R1(config-if)#exit
Configuration du tunnel 6-to4 et de la route IPv6
R1(config)#interface Tunnel 0
R1(config-if)#tunnel mode ipv6ip 6to4
R1(config-if)#tunnel source fa0/0
R1(config-if)#ipv6 address 2002:C0A8:1:FFFF::1/64
R1(config-if)#exit
R2(config)#ipv6 route 2002::/16 Tunnel 0
Il reste ensuite à configurer R2 et R3 selon le même principe:
Pour R2:
version 12.4 service timestamps debug datetime msec
service timestamps log datetime msec
no service password-encryption !
hostname R2 !
boot-start-marker boot-end-marker ! !
no aaa new-model
memory-size iomem 5
ip cef ! no ip domain lookup !
ipv6 unicast-routing multilink bundle-name authenticated !
archive log config hidekeys !
interface Loopback0
no ip address ipv6 address 2002:C0A8:2::1/64 !
interface Tunnel0
no ip address
no ip redirects
ipv6 address 2002:C0A8:2:FFFF::1/64
tunnel source FastEthernet0/0
tunnel mode ipv6ip 6to4 !
interface FastEthernet0/0
ip address 192.168.0.2 255.255.255.0
duplex auto speed auto !
interface FastEthernet0/1
no ip address
shutdown
duplex auto
speed auto !
ip forward-protocol nd !
no ip http server
no ip http secure-server !
ipv6 route 2002::/16 Tunnel0 !
control-plane !
line con 0 exec-timeout 0 0
logging synchronous
line aux 0 line vty 0 4
login !
end
Enfin, pour R3:
version 12.4
service timestamps debug datetime msec
service timestamps log datetime msec
no service password-encryption !
hostname R3 !
boot-start-marker
boot-end-marker !
no aaa new-model
memory-size iomem 5
ip cef !
no ip domain lookup !
ipv6 unicast-routing multilink bundle-name authenticated !
archive
log config
hidekeys !
interface Loopback0
no ip address
ipv6 address 2002:C0A8:3::1/64 !
interface Tunnel0
no ip address
no ip redirects
ipv6 address 2002:C0A8:3:FFFF::1/64
tunnel source FastEthernet0/0
tunnel mode ipv6ip 6to4 !
interface FastEthernet0/0
ip address 192.168.0.3 255.255.255.0
duplex auto speed auto !
interface FastEthernet0/1
no ip address
shutdown
duplex auto
speed auto !
ip forward-protocol nd !
no ip http server
no ip http secure-server !
ipv6 route 2002::/16 Tunnel0 !
control-plane !
line con 0 exec-timeout 0 0
logging synchronous
line aux 0 line vty 0 4
login !
end
Il ne reste maintenant plus qu’à vérifier …
R1#ping ipv6 2002:c0a8:3::1 source 2002:c0a8:1::1
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 2002:C0A8:3::1, timeout is 2 seconds:
Packet sent with a source address of 2002:C0A8:1::1 !!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 24/36/56 ms
R1#ping ipv6 2002:c0a8:2::1 source 2002:c0a8:1::1
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 2002:C0A8:2::1, timeout is 2 seconds:
Packet sent with a source address of 2002:C0A8:1::1 !!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 20/32/44 ms R1#
Tout est en ordre, les réseaux derrière R1, R2 et R3 peuvent communiquer entre eux, au travers du réseau IPv4 !