Mobile IPv6 avec Cisco et Fedora

Récemment, j’ai eu l’occasion de travailler sur la fonctionnalité Mobile IPv6.
Cette fonction du protocole IPv6 permet d’assigner une adresse IP à un noeud du réseau, et de faire en sorte que cette adresse IP soit toujours utilisable lorsque le noeud change de réseau.

Par exemple, je vais assigner une adresse IP à mon ordinateur portable dans l’espace d’adressage fourni par mon FAI pour ma connexion ADSL.
Lorsque je vais à l’université, on pourra toujours me joindre à cette adresse, au lieu de devoir utiliser l’adresse fournie par l’université.

Le but de cet article n’est pas d’aborder la partie théorique, mais de mettre en place une configuration avec un routeur Cisco et un noeud mobile sous Linux.

Mobile IPv6 est défini dans la RFC6275 : Mobility Support in IPV6.

Un peu de vocabulaire

Pour bien comprendre les explications qui vont suivre, il est nécessaire de connaître l’ensemble des termes utilisés dans Mobile IPv6.

Schéma représentant les différents éléments utilisé pour MIPv6

  • home network : Le réseau auquel appartient le mobile node.
  • home address (HoA) : Une adresse assignée à un mobile node, utilisée comme adresse permanent. Elle appartient à la plage d’adresse du home network.
  • mobile node (MN) : Le noeud qui va se déplacer entre plusieurs réseaux, et va changer son point d’attache d’un lien vers un autre. Il sera toujours joignable par sa home address.
  • home agent (HA) : Le routeur dans le home network qui gére la transmission des paquets jusqu’au mobile node.
  • care-of address (CoA) : Une adresse associée au mobile node lorsqu’il visite un réseau étranger.
  • correspondent node (CN) : Un noeud avec lequel le mobile node communique.

Architecture

Architecture

J’ai effectué l’ensemble de la configuration derrière une Freebox, Free fournissant 8 blocs /64.
Cela m’a permis de relier l’ensemble de mon réseau à Internet, vous pouvez aussi réaliser ceci sans que votre réseau soit raccordé à Internet.

Le routeur est un Cisco 1811 qui a 8 ports LAN et 2 ports WAN.
J’ai configuré 2 VLAN, dans lesquels se déplacera le mobile node.

Configuration de base du routeur

Pour commencer, il faut se connecter au routeur à l’aide du port console. La première étape consiste à identifier le routeur en lui donnant un nom :

1
2
router(config)#hostname router
router(config)#ip domain-name emilienkenler.net

Il est alors possible d’activer le SSH pour pouvoir se connecter à distance :

1
2
3
4
5
6
7
8
9
10
11
12
13
router(config)#ip ssh rsa keypair-name sshkey
router(config)#crypto key generate rsa usage-keys label sshkeys \
modulus 2048
router(config)#ip ssh version 1
router(config)#ip ssh logging events
router(config)#ip ssh time-out 60
router(config)#ip ssh authentication-retries 5
router(config)#service password-encryption
router(config)#enable secret sr04
router(config)#username sr04 password 0 sr04
router(config)#line vty 0 4
router(config-line)#login local
router(config-line)#transport input ssh

Note: Le protocole SSH ne semble pas fonctionner en version 2 : le client affiche “Invalid modulus length”. La version 1 est donc forcée.

Il est maintenant possible d’activer l’IPv6 et l’auto-configuration sur l’interface raccordée à la Freebox, dans le but de récupérer une adresse dans le réseau géré par la Freebox :

1
2
3
4
5
6
7
router(config)#ipv6 unicast-routing
router(config)#int FastEthernet 0
router(config-if)#ipv6 enable
router(config-if)#ipv6 address autoconfig default
router#show ipv6 route
S ::/0 [2/0]
via FE80::224:D4FF:FE9A:18E0, FastEthernet0

La commande suivante permet de vérifier qu’une adresse a bien été assignée :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
router#sh ipv6 interface FastEthernet 0
IPv6 is enabled, link-local address is FE80::5A8D:9FF:FE14:8900
No Virtual link-local address(es):
Stateless address autoconfig enabled
Global unicast address(es):
2A01:E35:8A38:6870:5A8D:9FF:FE14:8900, subnet is 2A01:E35:8A38:6870::/64 [EUI/CAL/PRE]
valid lifetime 86004 preferred lifetime 86004
Joined group address(es):
FF02::1
FF02::2
FF02::1:FF14:8900
MTU is 1500 bytes
ICMP error messages limited to one every 100 milliseconds
ICMP redirects are enabled
ICMP unreachables are sent
ND DAD is enabled, number of DAD attempts: 1
ND reachable time is 30000 milliseconds (using 18502)
ND advertised reachable time is 0 (unspecified)
ND advertised retransmit interval is 0 (unspecified)
ND router advertisements are sent every 200 seconds
ND router advertisements live for 1800 seconds
ND advertised default router preference is Medium
Hosts use stateless autoconfig for addresses.

L’adresse du routeur est donc 2a01:e35:8a38:6870:5a8d:9ff:fe14:8900.
Pour éviter de devoir taper cette adresse à chaque connexion, j’ai créé une entrée DNS de type AAAA avec le nom router.emilienkenler.net :

1
router.emilienkenler.net. 3600 IN AAAA 2a01:e35:8a38:6870:5a8d:9ff:fe14:8900

Au sein de l’interface de la Freebox, il est possible de demander le routage de certains réseau vers une adresse qui se trouve derrière celle-ci.
Le routeur est alors appelé le Next Hop : c’est le point de passage suivant pour tous les paquets adressés à ce sous-réseau.
Ceci va nous permettre d’accéder à chacun des réseaux que nous utilisons pour la démonstration depuis Internet.

Dans notre cas, le réseau par défaut de la Freebox est 2a01:e35:8a38:6870::/64.
Dans l’interface de la Freebox, on accède donc au menu Paramètres de la Freebox > Mode avancé > Configuration IPv6, puis on configure les sous-réseaux qui seront utilisés par le projet pour les faire pointer vers le routeur :

Configuration de la Freebox

La configuration initiale est maintenant terminée et la console peut être débranchée.

Comme SSH2 ne fonctionne pas, il faut bien penser à forcer la version 1 du protocole pour se connecter au routeur :

1
ssh -6 -1 sr04@router.emilienkenler.net

Mise en place de l’auto-configuration IPv6

Nous allons utiliser le sous-réseau 2a01:e35:8a38:6875::/64 pour tester la mise en place de l’auto-configuration au niveau du routeur.

Comme il a été délégué au routeur dans la configuration de la Freebox, celle-ci ne l’annonce plus.
Nous pouvons donc configurer ce sous-réseau sur l’interface WAN puis vérifier que les clients connectés au niveau de la Freebox parviennent toujours à le rejoindre.

La configuration se fait ainsi :

1
2
3
4
router(config)#int FastEthernet 0
router(config-if)#ipv6 enable
router(config-if)#ipv6 address 2a01:e35:8a38:6875::/64 eui-64
router(config-if)#ipv6 nd prefix 2a01:e35:8a38:6875::/64

La configuration de l’interface montre que celle-ci a déjà récupéré une adresse dans ce sous-réseau :

1
2
3
4
5
6
7
router#sh ipv6 interface FastEthernet 0
FastEthernet0 is up, line protocol is up
IPv6 is enabled, link-local address is FE80::5A8D:9FF:FE14:8900
No Virtual link-local address(es):
Global unicast address(es):
2A01:E35:8A38:6870:5A8D:9FF:FE14:8900, subnet is 2A01:E35:8A38:6870::/64
2A01:E35:8A38:6875:5A8D:9FF:FE14:8900, subnet is 2A01:E35:8A38:6875::/64 [EUI]

Configuration des VLAN

Afin de séparer les réseaux domicile et mobile entre les différents ports du switch, nous allons utiliser deux VLAN.

Le VLAN2 est utilisé pour le réseau mère.
Il est accessible sur les ports 2 et 3 du switch :

1
2
3
4
5
6
7
8
9
10
router(config)#vlan 2
router(config-vlan)#name VLAN2
router(config)#interface FastEthernet 2
router(config-if)#switchport mode access
router(config-if)#switchport access vlan 2
router(config)#interface FastEthernet 3
router(config-if)#switchport mode access
router(config-if)#switchport access vlan 2

Il faut ensuite indiquer l’adresse du sous-réseau correspondant à l’interface et activer l’auto-configuration.

1
2
3
4
5
6
router(config)#interface vlan 2
router(config-if)#ipv6 enable
router(config-if)#ipv6 address 2a01:e35:8a38:6872::/64 eui-64
router(config-if)#ipv6 nd ra interval 20
router(config-if)#ipv6 nd advertisement-interval
router(config-if)#ipv6 nd prefix 2a01:e35:8a38:6872::/64

Une configuration similaire est appliquée pour le VLAN3, qui est utilisé pour le réseau mobile sur les ports 4 et 5 :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
router(config)#vlan 3
router(config-vlan)#name VLAN3
router(config)#interface FastEthernet 4
router(config-if)#switchport mode access
router(config-if)#switchport access vlan 3
router(config)#interface FastEthernet 5
router(config-if)#switchport mode access
router(config-if)#switchport access vlan 3
router(config)#interface vlan 3
router(config-if)#ipv6 enable
router(config-if)#ipv6 address 2a01:e35:8a38:6873::/64 eui-64
router(config-if)#ipv6 nd ra interval 20
router(config-if)#ipv6 nd advertisement-interval
router(config-if)#ipv6 nd prefix 2a01:e35:8a38:6873::/64

Configuration de Mobile IPv6 sur le routeur

Afin que les clients puissent utiliser Mobile IPv6 sur les VLAN, le routeur va jouer le rôle de home agent :

1
2
3
4
router(config)#interface vlan 2
router(config-if)#ipv6 mobile home-agent
router(config)#interface vlan 3
router(config-if)#ipv6 mobile home-agent

Quatre commandes sont disponibles pour afficher des détails sur Mobile IPv6 une fois qu’il est activé :

1
2
3
4
router#sh ipv6 mobile globals
router#sh ipv6 mobile home-agent
router#sh ipv6 mobile binding
router#sh ipv6 mobile traffic

Notre routeur est maintenant configuré et prêt à être utilisé avec Mobile IPv6.

Configuration du Mobile Node

Il existe plusieurs implémentations de Mobile IPv6 sous Linux.

J’ai choisi UMIP (Universal Mobile IP for Linux), qui est une implémentation de la RFC6275.

UMIP nécessite le support du noyau pour pouvoir fonctionner. Sous Fedora, ce support est disponible nativement et le paquet mipv6-daemon peut être installé directement :

1
yum install mipv6-daemon

On peut alors créer le fichier de configuration /etc/mip6d.conf, qui spécifie que le client joue ici le rôle de mobile mode, ainsi que l’adresse du réseau mère et du home agent :

/etc/mip6d.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
NodeConfig MN;
DebugLevel 10;
OptimisticHandoff enabled;
DoRouteOptimizationMN disabled;
MnMaxHaBindingLife 60;
Interface "em1" {
MnIfPreference 1;
}
MnHomeLink "em1" {
HomeAgentAddress 2A01:E35:8A38:6872:5A8D:9FF:FE14:8900;
HomeAddress 2A01:E35:8A38:6872::1/64;
}

Il faut ensuite redémarrer le démon pour prendre en compte cette configuration :

1
systemctl restart mip6d.service

Il faut aussi stopper firewalld pour laisser passer certains paquets nécessaires à MIPv6 :

1
systemctl stop firewalld.service

Expérimentation

Maintenant que tout est configuré, on peut réaliser la démonstration.
L’objectif est de connecter un client dans le réseau mère, puis de le connecter dans le réseau mobile et de vérifier qu’il est toujours joignable sur son adresse d’origine.
Pour vérifier cela, on utilisera un tiers qui envoie des ping vers l’adresse dans le réseau mère.
Le tiers pourra se trouver dans un réseau quelconque.

Une première remarque importante à faire concerne la gestion de l’état des interfaces VLAN par le routeur.

Conformément à une note sur le site de Cisco, une interface VLAN n’est disponible que si au moins un périphérique est connecté à une interface dans ce VLAN.

Ainsi, si le client mobile de test est le seul périphérique connecté au switch et qu’on le branche sur un port du VLAN mobile, les ports 2 et 3 ne sont pas connectés.
Le switch va alors désactiver le VLAN2 et passer l’interface à l’état up/down au lieu de up/up.

Si on regarde l’état du Mobile IPv6 sur le routeur dans ces conditions, on constate effectivement qu’aucune adresse n’est détectée sur l’interface VLAN2 :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
router#sh ipv6 mobile home-agent
Home Agent information for Vlan2
Configured:
FE80::5A8D:9FF:FE14:8900
preference 0 lifetime 1800
No global addresses within prefix
No Discovered Home Agents
Home Agent information for Vlan3
Configured:
FE80::5A8D:9FF:FE14:8900
preference 0 lifetime 1800
global address 2A01:E35:8A38:6873:5A8D:9FF:FE14:8900/64
No Discovered Home Agents

Il faut donc veiller à laisser un périphérique connecté en permanence dans le réseau mère.

Vous pouvez tester en utilisant les étapes suivantes :

  • Activation de l’interface sur le mobile node;
  • Démarrage de mip6d sur le mobile node;
  • Ping du correspondent node vers le mobile node en continu;
  • Le mobile node est débranché du VLAN2 et branché sur le VLAN3;
  • Le ping doit toujours fonctionner.

Résumé

Nous avons pu mettre en place une configuration qui permet à un noeud de se déplacer entre plusieurs réseaux, en conservant son adresse IP et sans couper ses connexions (le temps de changement de réseau doit être inférieur au délai du timeout de la connexion TCP).