¿Cómo usar Shell para derivar una dirección IPv6 de una dirección MAC?


11

Sabemos que podemos usar la dirección MAC para crear un identificador de interfaz, por ejemplo, para una dirección IPv6 de enlace local que debería ser única en la red.

La imagen muestra la forma de hacer esto:

Crear identificador de interfaz desde la dirección MAC

Mis preguntas son:

  • ¿Cómo puedo crear una dirección IPv6 desde un MAC usando awko sed?
  • ¿O hay algún comando que me dé la dirección IPv6 local de enlace para un MAC específico (algo así createIPv6 myMAC)?

Reformé un poco su pregunta (pendiente de revisión). Las direcciones IPv6 no se extraen de las direcciones MAC, sino que se crean. Y aquí solo trata con la parte del identificador de interfaz (los últimos 64 bits) de una dirección IPv6. Pero no estoy seguro: ¿solo desea el identificador de interfaz o una dirección IPv6 completa? Vuelva a editar, si no le entendí correctamente.
Dubu

@Dubu, gracias por editar, quiero la dirección IPv6 completa.
Nidal

Respuestas:


10

Si desea crear una dirección IPv6 completa desde un MAC (y un prefijo dado), puede usar la excelente ipv6calcherramienta de Peter Bieringer.

El siguiente comando crea una dirección IPv6 de enlace local ( fe80::prefijo) a partir de una dirección MAC:

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

Puede dejar de lado la mayoría de las opciones y dejar que el comando adivine qué hacer:

$ 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 las distribuciones de Debian, ipv6calcestá en el repositorio principal.


4

De la entrada de Wikipedia de IPv6, una descripción más textual:

Un identificador de interfaz de 64 bits se deriva más comúnmente de su dirección MAC de 48 bits.

Una dirección MAC 00: 0C: 29: 0C: 47: D5 se convierte en un EUI-64 de 64 bits insertando FF: FE en el medio: 00: 0C: 29: FF: FE: 0C: 47: D5.

Por lo tanto, reemplazar el tercero :con :FF:FE:debería hacer el truco:

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

No tengo idea si esa sintaxis es específica de GNU sed.


Trabajo en progreso:

Convierta eso en bits:

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

debería dar como resultado que los bits 00000000 00001100 00101001 11111111 11111110 00001100 01000111 11010101dejen solo el giro del bit número 7.


1
¿Qué hay de revertir el séptimo bit?
Nidal

Ah el bit U / L, buen 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

Puede crear una función bash (y colocarla en su ~/.bashrc) que se usa IFSpara dividir la dirección MAC en 6 grupos separados por dos puntos y ensamblarlos. También deberá voltear el séptimo bit más significativo, es decir, el bit 1 del primer byte:

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

Ejemplo de uso:

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

0

Debo felicitar a @ rubo77 arriba por una respuesta de caparazón puro (a menos que cuentes con printf) arriba, que estaba buscando.

Esto agrega un poco de sed a:

(a) eliminar cualquier cero inicial en cada fragmento de 16 bits; y

(b) elimine cualquier fragmento adicional de cero al comienzo del IID

... según convenciones comunes para la brevedad de la dirección.

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

Tenga en cuenta que si desea reutilizar esto para otros prefijos (arbitrarios), lo que podría hacer ya que EUI-64 puede usarse en cualquier ámbito (aunque se recomienda no usarlo para direcciones globales por razones de privacidad), necesitaría un poco guión sed más complicado. Esto se debe a que el fe80::prefijo ya contiene tres pedazos cero (eluidos al doble punto) adyacentes al inicio del IID. Por lo tanto, incluso si el primer fragmento del IID son todos ceros (es decir, si el MAC comenzó con 02:00), también se eliminaría. El formato EUI-64 solo deja un fragmento adicional que podría ser todo cero, el último, que el script anterior agrega nuevamente como un solo cero. Otros prefijos pueden requerir que uno deje un solo cero entre dos puntos.


Tienes razón, gracias. Regresé y dejé a @ rubo77 bien printfsolo e hice las cosas adicionales en sed.
Headbank
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.