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

11

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

L'image montre la façon de procéder:

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

Mes questions sont:

  • Comment puis-je créer une adresse IPv6 à partir d'un MAC en utilisant awkou sed?
  • OU existe-t-il une commande qui me donne l'adresse IPv6 de liaison locale pour un MAC spécifique (quelque chose comme ça createIPv6 myMAC)?
Nidal
la source
J'ai reformulé un peu votre question (en attente d'examen). Les adresses IPv6 ne sont pas extraites des adresses MAC, mais créées. Et ici, vous ne vous occupez que de la partie identifiant d'interface (les 64 derniers bits) d'une adresse IPv6. Mais je ne suis pas sûr: voulez-vous uniquement l'identifiant d'interface ou une adresse IPv6 complète? Veuillez rééditer, si je ne vous ai pas bien compris.
Dubu
@Dubu, Merci d'avoir édité, je veux l'adresse IPv6 entière.
Nidal

Réponses:

10

Si vous souhaitez créer une adresse IPv6 entière à partir d'un MAC (et d'un préfixe donné), vous pouvez utiliser l'excellent ipv6calcoutil de Peter Bieringer.

La commande suivante crée une adresse IPv6 de liaison locale ( fe80::préfixe) à 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 de côté et laisser la commande 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 distributions Debian, se ipv6calctrouve dans le référentiel principal.

Dubu
la source
4

De l' entrée 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ée en EUI-64 64 bits en insérant FF: FE au milieu: 00: 0C: 29: FF: FE: 0C: 47: D5.

Donc, remplacer le troisième :par :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:

Convertissez cela en bits:

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

devrait se traduire par les bits 00000000 00001100 00101001 11111111 11111110 00001100 01000111 11010101ne laissant que le retournement du bit numéro 7.

HBruijn
la source
1
que diriez-vous d'inverser le 7-ème bit!
Nidal
Ah le bit U / L, bon point!
HBruijn
3
#! /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:])
Martin Wilck
la source
0

Vous pouvez créer une fonction bash (et la placer dans votre ~/.bashrc) qui utilise IFSpour diviser l'adresse MAC en 6 groupes séparés par deux-points et les assemble. Vous devrez également retourner le 7e bit le plus significatif, c'est-à-dire le bit 1 du premier octet:

mac_to_ipv6_ll() {
    IFS=':'; set $1; unset IFS
    echo "fe80::$(printf %02x $((0x$1 ^ 2)))$2:${3}ff:fe$4:$5$6"
}

Exemple d'utilisation:

$ mac_to_ipv6_ll 12:34:56:78:90:12
fe80::1034:56ff:fe78:9012
rubo77
la source
0

Je dois féliciter @ rubo77 ci-dessus pour une réponse pure-shell (sauf si vous comptez printf) ci-dessus, que je cherchais.

Cela ajoute un peu de sed à:

(a) supprimer tous les zéros non significatifs dans chaque bloc de 16 bits; et

(b) élider tout autre bloc entièrement nul au début de l'IID

... selon les conventions courantes pour la brièveté des adresses.

mac_to_eui64() {
 IFS=':'; set $1; unset IFS
 echo "fe80::$(printf %x $((0x$1 ^ 2)))$2:${3}ff:fe$4:$5$6" |
  sed -E 's/:0+/:/g; s/:{3,}/::/; s/:$/:0/'
}

Notez que si vous souhaitez le réutiliser pour d'autres préfixes (arbitraires), ce que vous pourriez, car EUI-64 peut être utilisé dans n'importe quelle portée (bien qu'il soit conseillé de ne pas l'utiliser pour des adresses globales pour des raisons de confidentialité), vous auriez besoin d'un script sed plus alambiqué. C'est parce que le fe80::préfixe contient déjà trois morceaux zéro (élidés au double-colon) adjacents au début de l'IID. Ainsi, même si le premier morceau de l'IID est entièrement composé de zéros (c'est-à-dire si le MAC a commencé par 02:00), il serait également élidé. Le format EUI-64 ne laisse qu'un autre morceau qui pourrait être tout à fait zéro - le dernier - que le script ci-dessus ajoute en un seul zéro. D'autres préfixes peuvent nécessiter que l'un laisse un seul zéro entre deux deux-points.

Headbank
la source
Vous avez raison, merci - je suis retourné et j'ai laissé seul l'amende de @ rubo77 et j'ai printffait les trucs supplémentaires dans sed à la place.
Headbank