Comment utiliser shell pour dériver une adresse IPv6 d'une adresse MAC?

Nous soaps que nous pouvons utiliser l'adresse MAC pour créer un identifiant d'interface, par exemple pour une adresse IPv6 link-local qui devrait être unique dans le réseau.

L'image montre la façon de le faire:

Créer un identifiant d'interface à partir de l'adresse MAC

Mes questions sont les suivantes:

  • Comment puis-je créer une adresse IPv6 à partir d'un MAC en utilisant awk ou sed ?
  • OU createIPv6 myMAC il une command qui me donne l'adresse IPv6 link-local pour un MAC spécifique (quelque chose comme ça createIPv6 myMAC )?

Si vous voulez créer une adresse IPv6 complète à partir d'un MAC (et d'un préfixe donné), vous pouvez utiliser l'excellent outil ipv6calc de Peter Bieringer.

La command suivante crée une adresse IPv6 link-local ( fe80:: prefix) à partir d'une adresse MAC:

 $ ipv6calc --action prefixmac2ipv6 --in prefix+mac --out ipv6addr fe80:: 00:21:5b:f7:25:1b fe80::221:5bff:fef7:251b 

Vous pouvez laisser la plupart des options et laisser la command deviner quoi faire:

 $ ipv6calc --in prefix+mac fe80:: 00:21:5b:f7:25:1b No action type specified, try autodetection...found type: prefixmac2ipv6 fe80::221:5bff:fef7:251b 

Pour les dissortingbutions Debian, ipv6calc est dans le référentiel principal.

De l' input Wikipedia IPv6 une description plus textuelle:

Un identifiant d'interface 64 bits est le plus souvent dérivé de son adresse MAC 48 bits.

Une adresse MAC 00: 0C: 29: 0C: 47: D5 est transformé en un 64-bit EUI-64 en insérant FF: FE au milieu: 00: 0C: 29: FF: FE: 0C: 47: D5.

Donc en remplaçant le troisième : avec :FF:FE: devrait faire l'affaire:

 echo 00:0C:29:0C:47:D5 | sed s/:/:FF:FE:/3 00:0C:29:FF:FE:0C:47:D5 

Aucune idée si cette syntaxe est spécifique à GNU sed.


Travail en cours:

Convertir en bits:

 for HEX in $(tr ":" " " <<< 00:0C:29:FF:FE:0C:47:D5) do printf "%08d " $(bc <<< "ibase=16;obase=2;$HEX") done 

les bits 00000000 00001100 00101001 11111111 11111110 00001100 01000111 11010101 en ne laissant que le basculement du bit numéro 7.

 #! /usr/bin/env python import sys n=[int(x, 16) for x in sys.argv[1].split(":")] print "fe80::%02x%02x:%02xff:fe%02x:%02x%02x" % tuple([n[0]^2]+n[1:])