Come usare la shell per derivare un indirizzo IPv6 da un indirizzo MAC?


11

Sappiamo che possiamo usare l'indirizzo MAC per creare un identificatore di interfaccia, ad esempio per un indirizzo IPv6 locale di collegamento che dovrebbe essere univoco nella rete.

L'immagine mostra il modo per farlo:

Crea identificativo di interfaccia dall'indirizzo MAC

Le mie domande sono:

  • Come posso creare un indirizzo IPv6 da un MAC usando awko sed?
  • O c'è qualche comando che mi dà l'indirizzo IPv6 link-local per un MAC specifico (qualcosa del genere createIPv6 myMAC)?

Ho riformulato un po 'la tua domanda (in attesa di revisione). Gli indirizzi IPv6 non vengono estratti dagli indirizzi MAC, ma creati. E qui hai a che fare solo con la parte identificativa dell'interfaccia (l'ultimo 64 bit) di un indirizzo IPv6. Ma non sono sicuro: vuoi solo l'identificatore di interfaccia o un intero indirizzo IPv6? Ti preghiamo di modificare nuovamente, se non ti ho capito bene.
Dubu,

@Dubu, grazie per la modifica, voglio l'intero indirizzo IPv6.
Nidal,

Risposte:


10

Se si desidera creare un intero indirizzo IPv6 da un MAC (e un determinato prefisso), è possibile utilizzare l'eccellente ipv6calcstrumento di Peter Bieringer.

Il seguente comando crea un indirizzo IPv6 locale ( fe80::prefisso) da un indirizzo MAC:

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

Puoi lasciare la maggior parte delle opzioni e lasciare che il comando indovina cosa fare:

$ 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

Per le distribuzioni Debian, ipv6calcè nel repository principale.


4

Dalla voce Wikipedia IPv6 una descrizione più testuale:

Un identificatore di interfaccia a 64 bit deriva più comunemente dal suo indirizzo MAC a 48 bit.

Un indirizzo MAC 00: 0C: 29: 0C: 47: D5 viene trasformato in un EUI-64 a 64 bit inserendo FF: FE nel mezzo: 00: 0C: 29: FF: FE: 0C: 47: D5.

Quindi sostituire il terzo :con :FF:FE:dovrebbe fare il trucco:

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

Non ho idea se quella sintassi sia specifica per GNU sed.


Lavori in corso:

Converti questo in bit:

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

dovrebbe comportare che i bit 00000000 00001100 00101001 11111111 11111110 00001100 01000111 11010101lascino solo il lancio del bit numero 7.


1
che dire di invertire il 7 ° bit!
Nidal,

Ah il bit U / L, buon punto!
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

È possibile creare una funzione bash (e inserirla nel proprio ~/.bashrc) che utilizza IFSper dividere l'indirizzo MAC in 6 gruppi separati da due punti e assemblarli. Dovrai anche capovolgere il settimo bit più significativo, ovvero il bit 1 del primo byte:

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

Esempio di utilizzo:

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

0

Devo dare i miei complimenti a @ rubo77 sopra per una risposta pure-shell (a meno che tu non conti printf) sopra, che stavo cercando.

Questo aggiunge un po 'di sed a:

(a) elide qualsiasi zero iniziale in ogni blocco a 16 bit; e

(b) elide ogni ulteriore pezzo zero a zero all'inizio dell'IID

... come da convenzioni comuni per brevità di indirizzo.

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

Si noti che se si desidera riutilizzare questo per altri prefissi (arbitrari), che è possibile poiché EUI-64 può essere utilizzato in qualsiasi ambito (anche se si consiglia di non utilizzarlo per indirizzi globali per motivi di privacy), è necessario script sed più contorto. Questo perché il fe80::prefisso contiene già tre blocchi zero (eletti al doppio punto) adiacenti all'inizio dell'IID. Pertanto, anche se il primo blocco dell'IID è azzerato (ovvero, se il MAC inizia con 02:00), verrebbe eluso anche. Il formato EUI-64 lascia solo un ulteriore pezzo che potrebbe essere tutto zero - l'ultimo - che lo script sopra aggiunge come singolo zero. Altri prefissi potrebbero richiedere uno per lasciare un singolo zero tra due punti.


Hai ragione, grazie - Sono tornato e ho lasciato @ rubo77 da printfsolo e ho fatto le cose aggiuntive in sed.
Headbank
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.