Jak używać powłoki do uzyskiwania adresu IPv6 z adresu MAC?


11

Wiemy, że możemy użyć adresu MAC do utworzenia identyfikatora interfejsu, np. Dla lokalnego adresu IPv6 łącza, który powinien być unikalny w sieci.

Obraz pokazuje sposób na zrobienie tego:

Utwórz identyfikator interfejsu z adresu MAC

Moje pytania to:

  • Jak mogę utworzyć adres IPv6 z MAC za pomocą awklub sed?
  • LUB czy jest jakieś polecenie, które daje mi adres IPv6 lokalnego łącza dla określonego MAC (coś takiego createIPv6 myMAC)?

Przeredagowałem nieco twoje pytanie (w oczekiwaniu na sprawdzenie). Adresy IPv6 nie są pobierane z adresów MAC, ale tworzone. I tutaj masz do czynienia tylko z częścią identyfikatora interfejsu (ostatnie 64 bity) adresu IPv6. Ale nie jestem pewien: czy chcesz tylko identyfikator interfejsu czy cały adres IPv6? Proszę ponownie edytować, jeśli nie zrozumiałem cię poprawnie.
Dubu,

@Dubu, dziękuję za edycję, chcę cały adres IPv6.
Nidal

Odpowiedzi:


10

Jeśli chcesz utworzyć cały adres IPv6 z MAC (i danego prefiksu), możesz skorzystać z doskonałego ipv6calcnarzędzia Petera Bieringera.

Następujące polecenie tworzy lokalny adres IPv6 ( fe80::prefiks) lokalnie dla łącza na podstawie adresu MAC:

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

Możesz pozostawić większość opcji z dala, a polecenie zgadnie, co zrobić:

$ 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

W przypadku dystrybucji Debian ipv6calcznajduje się w głównym repozytorium.


4

Z wpisu w Wikipedii IPv6 znajduje się bardziej tekstowy opis:

64-bitowy identyfikator interfejsu najczęściej pochodzi z 48-bitowego adresu MAC.

Adres MAC 00: 0C: 29: 0C: 47: D5 zamienia się w 64-bitowy EUI-64, wstawiając FF: FE w środku: 00: 0C: 29: FF: FE: 0C: 47: D5.

Więc zastąpienie trzecią :ze :FF:FE:powinno załatwić sprawę:

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

Nie mam pojęcia, czy ta składnia jest specyficzna dla GNU sed.


Praca w toku:

Konwertuj to na bity:

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

powinno spowodować, że bity 00000000 00001100 00101001 11111111 11111110 00001100 01000111 11010101pozostawiają tylko przerzucanie bitu 7.


1
co powiesz na odwrócenie siódmego bitu!
Nidal

Ach bit U / L, dobra uwaga!
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

Możesz utworzyć funkcję bash (i umieścić ją w swojej ~/.bashrc), która używa IFSdo podzielenia adresu MAC na 6 grup oddzielonych dwukropkami i ich złożenia. Musisz także przerzucić siódmy najbardziej znaczący bit, tj. Bit 1 pierwszego bajtu:

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

Przykład użycia:

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

0

Muszę wyrazić uznanie dla @ rubo77 powyżej za czystą powłokę (chyba że liczysz printf) powyżej, której szukałem.

To dodaje trochę sed do:

(a) pomija wszelkie początkowe zera w każdym 16-bitowym fragmencie; i

(b) uchyla wszelkie dalsze całkowicie zerowe fragmenty na początku IID

... zgodnie ze wspólnymi konwencjami dotyczącymi zwięzłości adresów.

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

Pamiętaj, że jeśli chcesz zmienić przeznaczenie na inne (dowolne) prefiksy, które możesz, ponieważ EUI-64 może być używany w dowolnym zakresie (chociaż zaleca się, aby nie używać go do adresów globalnych ze względu na prywatność), potrzebujesz nieco bardziej skomplikowany skrypt sed. Dzieje się tak, ponieważ fe80::prefiks zawiera już trzy fragmenty zerowe (umieszczone w podwójnym dwukropku) przylegające do początku IID. Tak więc, nawet jeśli pierwsza część IID ma wszystkie zera (to znaczy, jeśli MAC zaczął się od 02:00), również by się pomknęła. Format EUI-64 pozostawia tylko jeden kolejny fragment, który może być zerowy - ostatni - który powyższy skrypt dodaje ponownie jako pojedyncze zero. Inne prefiksy mogą wymagać pozostawienia jednego zera między dwoma dwukropkami.


Masz rację, dziękuję - wróciłem i zostawiłem grzywnę @ rubo77 printfsam i zrobiłem dodatkowe rzeczy w sed.
Headbank
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.