我有一个可能的 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。
但是,如果您实际上只想获取实际邻居的列表(类似于arp
IPv4),那么还有一种更简单的方法。使用邻居发现协议 (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