Wie verwende ich eine Shell, um eine IPv6-Adresse von einer MAC-Adresse abzuleiten?


11

Wir wissen, dass wir die MAC-Adresse verwenden können, um eine Schnittstellenkennung zu erstellen, z. B. für eine verbindungslokale IPv6-Adresse, die im Netzwerk eindeutig sein sollte.

Das Bild zeigt den Weg dazu:

Erstellen Sie eine Schnittstellenkennung aus der MAC-Adresse

Meine Fragen sind:

  • Wie kann ich mit awkoder eine IPv6-Adresse von einem MAC erstellen sed?
  • ODER gibt es einen Befehl, der mir die verbindungslokale IPv6-Adresse für einen bestimmten MAC gibt (so ähnlich createIPv6 myMAC)?

Ich habe Ihre Frage ein wenig umformuliert (ausstehende Überprüfung). IPv6-Adressen werden nicht aus MAC-Adressen extrahiert , sondern erstellt. Und hier beschäftigen Sie sich nur mit dem Schnittstellenkennungsteil (dem letzten 64-Bit) einer IPv6-Adresse. Aber ich bin mir nicht sicher: Möchten Sie nur die Schnittstellenkennung oder eine ganze IPv6-Adresse? Bitte erneut bearbeiten, wenn ich Sie nicht richtig verstanden habe.
Dubu

@ Dubu, Danke für die Bearbeitung, ich möchte die gesamte IPv6-Adresse.
Nidal

Antworten:


10

Wenn Sie eine ganze IPv6-Adresse aus einem MAC (und einem bestimmten Präfix) erstellen möchten, können Sie das hervorragende ipv6calcTool von Peter Bieringer verwenden.

Der folgende Befehl erstellt eine verbindungslokale IPv6-Adresse ( fe80::Präfix) aus einer MAC-Adresse:

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

Sie können die meisten Optionen weglassen und den Befehl raten lassen, was zu tun ist:

$ 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

Für Debian-Distributionen ipv6calcbefindet sich im Haupt-Repository.


4

Aus dem IPv6-Wikipedia- Eintrag eine ausführlichere Beschreibung:

Eine 64-Bit-Schnittstellenkennung wird am häufigsten von ihrer 48-Bit-MAC-Adresse abgeleitet.

Eine MAC-Adresse 00: 0C: 29: 0C: 47: D5 wird durch Einfügen von FF: FE in die Mitte: 00: 0C: 29: FF: FE: 0C: 47: D5 in eine 64-Bit-EUI-64 umgewandelt.

Das Ersetzen des dritten :durch :FF:FE:sollte also den Trick tun:

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

Keine Ahnung, ob diese Syntax spezifisch für GNU sed ist.


In Arbeit:

Konvertieren Sie das in Bits:

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

sollte dazu führen, dass die Bits 00000000 00001100 00101001 11111111 11111110 00001100 01000111 11010101nur das Umdrehen von Bit Nummer 7 lassen.


1
Was ist mit dem 7. Bit umkehren?
Nidal

Ah das U / L-Bit, guter Punkt!
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:])

0

Sie können eine Bash-Funktion erstellen (und in Ihre platzieren ~/.bashrc), mit IFSder die MAC-Adresse in 6 durch Doppelpunkte getrennte Gruppen aufgeteilt und zusammengesetzt wird. Sie müssen auch das 7. höchstwertige Bit umdrehen, dh Bit 1 des ersten Bytes:

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

Anwendungsbeispiel:

$ mac_to_ipv6_ll 12:34:56:78:90:12
fe80::1034:56ff:fe78:9012

0

Ich muss @ rubo77 oben ein Lob aussprechen, um eine reine Shell-Antwort (es sei denn, Sie zählen printf) oben zu erhalten, die ich gesucht habe.

Dies fügt ein wenig Sed hinzu zu:

(a) Eliminieren aller führenden Nullen in jedem 16-Bit-Block; und

(b) zu Beginn der IID weitere Null-Null-Stücke entfernen

... gemäß den üblichen Konventionen für die Kürze der Adressen.

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/'
}

Wenn Sie dies für andere (willkürliche) Präfixe verwenden möchten, die Sie möglicherweise verwenden, da EUI-64 in jedem Bereich verwendet werden kann (obwohl empfohlen wird, es aus Datenschutzgründen nicht für globale Adressen zu verwenden), benötigen Sie ein geringfügiges Präfix verschlungener sed script. fe80::Dies liegt daran, dass das Präfix bereits drei Null-Chunks (elidiert zum Doppelpunkt) neben dem Start der IID enthält. Selbst wenn der erste Block der IID aus Nullen besteht ( 02:00dh wenn der MAC mit beginnt), würde er ebenfalls entfernt. Das EUI-64-Format lässt nur einen weiteren Block übrig, der ganz Null sein kann - den letzten -, den das obige Skript als einzelne Null wieder hinzufügt. Bei anderen Präfixen muss möglicherweise eine einzige Null zwischen zwei Doppelpunkten stehen.


Du hast recht, danke - ich bin zurückgegangen und habe @ rubo77's Geldstrafe printfalleine gelassen und stattdessen die zusätzlichen Sachen in sed gemacht.
Headbank
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.