Como usar o shell para derivar um endereço IPv6 de um endereço MAC?

10

Sabemos que podemos usar o endereço MAC para criar um identificador de interface, por exemplo para um endereço IPv6 de conexão local que deve ser exclusivo na Rede.

A imagem mostra a maneira de fazer isso:

Minhas perguntas são:

  • Como posso criar um endereço IPv6 de um MAC usando awk ou sed ?
  • OU existe algum comando que me forneça o endereço IPv6 de link local para um MAC específico (algo parecido com isso createIPv6 myMAC )?
por Networker 12.06.2014 / 00:10

3 respostas

9

Se você quiser criar um endereço IPv6 inteiro a partir de um MAC (e um determinado prefixo), você pode usar a excelente ferramenta ipv6calc de Peter Bieringer.

O comando a seguir cria um endereço IPv6 de link local ( fe80:: prefix) a partir de um endereço MAC:

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

Você pode deixar a maioria das opções de distância e deixar o comando adivinhar o que fazer:

$ 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

Para distribuições Debian, ipv6calc está no repositório principal.

    
por 12.06.2014 / 09:45
4

Na entrada IPv6 Wikipedia , uma descrição mais textual:

A 64-bit interface identifier is most commonly derived from its 48-bit MAC address.

A MAC address 00:0C:29:0C:47:D5 is turned into a 64-bit EUI-64 by inserting FF:FE in the middle: 00:0C:29:FF:FE:0C:47:D5.

Então, substituir o terceiro : por :FF:FE: deve funcionar:

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

Não faço ideia se essa sintaxe é específica para o GNU sed.

Trabalho em andamento:

Converta isso em bits:

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

deve resultar nos bits 00000000 00001100 00101001 11111111 11111110 00001100 01000111 11010101 deixando apenas a inversão do bit número 7.

    
por 12.06.2014 / 00:51
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:])
    
por 09.07.2015 / 20:25