pesquisa ajustando endereço ipv6 para endereço MAC em vizinhos

0

Eu tenho uma lista de possíveis endereços IP convertidos endereços MAC convertidos, que poderiam ser encontrados na saída de

ping6 ff02::1%wlan0

possíveis endereços mac são, por exemplo:

66:70:02:75:80:fe, 64:70:02:74:80:fe, 66:70:02:74:80:ff

cada um deles levaria a um endereço ip6 Link-local começando com fe80:: e inserindo FF:FE no meio

então 66:70:02:75:80:fe levaria a fe80::6670:2ff:fe75:80fe

Eu gostaria de criar um script que forneça o endereço LinkLocal correspondente para uma lista de endereços MAC como:

$ find-in-macs 66:70:02:75:80:fe 64:70:02:74:80:fe 66:70:02:74:80:ff

e a saída:

matching IP6: fe80::6670:2ff:fe75:80fe

esse script find-in-macs poderia ser assim:

#!/bin/bash
mac_to_ipv6 () {
  IFS=':'; set $1; unset IFS
  ipv6_address="fe80::$(printf %02x $((0x$1 ^ 2)))$2:${3}ff:fe$4:$5$6"
  echo $ipv6_address
}


for i do
    echo checking $i
    ping6 ff02::1%wlan0|grep mac_to_ipv6 $i
done
    
por rubo77 14.06.2013 / 00:40

2 respostas

0

Com suas dicas, consegui terminar o script:

#!/bin/bash

mac_to_ipv6 () {
  IFS=':'; set $1; unset IFS
  ipv6_address="fe80::$(printf %02x $((0x$1 ^ 2)))$2:${3}ff:fe$4:$5$6"
  echo $ipv6_address
}
echo "Next MAC with ^C"
for i do
  echo
  echo checking for  $i = $(mac_to_ipv6 $i)
  echo 
  ping6 ff02::1%wlan0 | head -n 1000 | grep $(mac_to_ipv6 $i)
done

veja: link

    
por 14.06.2013 / 15:20
3

Em primeiro lugar, você não precisa apenas dividir o MAC e inserir ff: fe, você também precisa inverter o 7º bit para representar corretamente um endereço universal / local.

Este script irá formatar corretamente um endereço IPv6 local de link com base em um endereço ether, incluindo a redução de zeros à esquerda.

#!/bin/bash

IFS=':'; set $1; unset IFS
printf "fe80::%x:%x:%x:%x\n" $(( 0x${1}${2} ^ 0x200 )) 0x${3}ff 0xfe${4} 0x${5}${6}

Exemplo de inversão de bits e redução de zero:

$ ether_to_ipv6 00:00:00:00:00:00
fe80::200:ff:fe00:0
$ ether_to_ipv6 11:11:11:11:11:11
fe80::1311:11ff:fe11:1111

Lembre-se também de que não é tecnicamente garantido que um link tenha um endereço que corresponda a esse algoritmo. Se houver uma colisão (maliciosa ou não), um novo endereço deve ser escolhido por um ou ambos. Implementações podem se comportar diferentemente de como isso é realmente tratado, então YMMV.

No entanto, se tudo o que você realmente está tentando fazer é obter uma lista de seus vizinhos reais (semelhante a arp no IPv4), então existe uma maneira mais fácil. Use o protocolo de descoberta de vizinho (ndp).

Linux:

ip -6 neigh show

Solaris:

netstat -pf inet6

Mac OS X, AIX, * BSD:

ndp -a

JunOS, IOS, Vyatta:

show ipv6 neighbors

Cada um desses comandos mostrará uma lista de todos os vizinhos IPv6 ativos usando o ndp nativo.

    
por 14.06.2013 / 09:06