搜索邻居中 MAC 地址的合适 ipv6 地址

搜索邻居中 MAC 地址的合适 ipv6 地址

我有一个可能的 ip6 地址转换为 MAC 地址的列表,可以在输出中找到

ping6 ff02::1%wlan0

可能的 MAC 地址例如:

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

它们中的每一个都会导致一个以 开头fe80::并插入FF:FE到中间的链路本地 ip6 地址

所以66:70:02:75:80:fe会导致fe80::6670:2ff:fe75:80fe

我想创建一个脚本,为 MAC 地址列表提供匹配的 LinkLocal 地址,例如:

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

和输出:

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

该脚本find-in-macs可能如下所示:

#!/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

答案1

首先,您不仅需要拆分 MAC 并插入 ff:fe,还需要翻转第 7 位以正确表示通用/本地地址。

该脚本将根据以太地址正确格式化链路本地 IPv6 地址,包括减少前导零。

#!/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}

位翻转和归零示例:

$ 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

另请记住,从技术上讲,不能保证链接具有与该算法匹配的地址。如果发生冲突(恶意或其他方式),一方或双方必须选择一个新地址。实现方式可能会有所不同实际上处理了,所以 YMMV。

但是,如果您实际上只想获取实际邻居的列表(类似于arpIPv4),那么还有一种更简单的方法。使用邻居发现协议 (ndp)。

Linux:

ip -6 neigh show

索拉里斯:

netstat -pf inet6

Mac OS X、AIX、*BSD:

ndp -a

JunOS、IOS、Vyatta:

show ipv6 neighbors

这些命令中的每一个都将显示使用本机 ndp 的所有实时 IPv6 邻居的列表。

答案2

有了你的提示,我可以完成脚本:

#!/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

看:http://freifunk.in-kiel.de/wiki/Firmware#IPv6_Adresse_des_Routers

相关内容