如何过滤对所有节点的多播 ping 的输出,以便在输出文件中每个 IP 只出现一次?
- 如果有新设备加入网络,其信息将写入带有加入时间戳的文件中。
- 如果设备离开网络,它将被从该文件中删除。
- 最后,输出文件显示了网络中当前可访问的设备以及加入的时间戳
ping6 -I eth1 ip6-所有节点 从 fe80::aaaa:aaaa:aaaa:aaaa eth1 PING ip6-allnodes(ip6-allnodes):56 个数据字节 来自 fe80::aaaa:aaaa:aaaa:aaaa: icmp_seq=1 ttl=64 时间=0.018 毫秒 来自 fe80::bbbb:bbbb:bbbb:bbbb 的 64 字节:icmp_seq=1 ttl=64 time=0.490 ms(DUP!) 来自 fe80::cccc:cccc:cccc:cccc: 64 字节:icmp_seq=1 ttl=64 time=0.739 ms(DUP!) 来自 fe80::aaaa:aaaa:aaaa:aaaa: 64 字节:icmp_seq=2 ttl=64 时间=0.037 毫秒 来自 fe80::bbbb:bbbb:bbbb:bbbb 的 64 字节:icmp_seq=2 ttl=64 time=0.513 ms(DUP!) 来自 fe80::cccc:cccc:cccc:cccc: 64 字节:icmp_seq=2 ttl=64 time=0.674 ms(DUP!) 来自 fe80::dddd:dddd:dddd:dddd: 的 64 字节:icmp_seq=2 ttl=64 time=228 ms(DUP!) 来自 fe80::aaaa:aaaa:aaaa:aaaa: 64 字节:icmp_seq=3 ttl=64 时间=0.033 毫秒 来自 fe80::bbbb:bbbb:bbbb:bbbb 的 64 字节:icmp_seq=3 ttl=64 time=0.460 ms(DUP!) 来自 fe80::cccc:cccc:cccc:cccc: 64 字节:icmp_seq=3 ttl=64 time=0.611 ms(DUP!) 来自 fe80::aaaa:aaaa:aaaa:aaaa: 64 字节:icmp_seq=4 ttl=64 时间=0.045 毫秒 来自 fe80::bbbb:bbbb:bbbb:bbbb 的 64 字节:icmp_seq=4 ttl=64 time=0.485 ms(DUP!) 来自 fe80::cccc:cccc:cccc:cccc: 64 字节:icmp_seq=4 ttl=64 time=0.609 ms(DUP!) 来自 fe80::aaaa:aaaa:aaaa:aaaa: 64 字节:icmp_seq=5 ttl=64 时间=0.035 毫秒 来自 fe80::bbbb:bbbb:bbbb:bbbb 的 64 字节:icmp_seq=5 ttl=64 time=0.518 ms(DUP!) 来自 fe80::cccc:cccc:cccc:cccc: 64 字节:icmp_seq=5 ttl=64 time=0.580 ms(DUP!) 来自 fe80::eeee:eeee:eeee:eeee: 64 字节:icmp_seq=5 ttl=255 time=201 ms(DUP!) 来自 fe80::dddd:dddd:dddd:dddd: 的 64 字节:icmp_seq=5 ttl=64 time=237 ms(DUP!) 来自 fe80::aaaa:aaaa:aaaa:aaaa: 64 字节:icmp_seq=6 ttl=64 时间=0.032 毫秒 来自 fe80::bbbb:bbbb:bbbb:bbbb 的 64 字节:icmp_seq=6 ttl=64 time=0.508 ms(DUP!) 来自 fe80::cccc:cccc:cccc:cccc: 64 字节:icmp_seq=6 ttl=64 time=0.540 ms(DUP!) 来自 fe80::aaaa:aaaa:aaaa:aaaa: icmp_seq=7 ttl=64 时间=0.038 毫秒 来自 fe80::bbbb:bbbb:bbbb:bbbb 的 64 字节:icmp_seq=7 ttl=64 time=0.550 ms(DUP!) 来自 fe80::cccc:cccc:cccc:cccc: 64 字节:icmp_seq=7 ttl=64 time=0.640 ms(DUP!) 来自 fe80::dddd:dddd:dddd:dddd:dddd 的 64 字节:icmp_seq=7 ttl=64 time=76.6 ms(DUP!) ip6-allnodes ping 统计 --- 已发送 7 个数据包,已接收 7 个数据包,+18 个重复数据包,0% 数据包丢失,耗时 6020 毫秒 rtt 最小值/平均值/最大值/mdev = 0.018/30.086/237.386/72.776 毫秒
答案1
Ping 不是解决此问题的合适工具。每个设备仅响应一次,即使它有多个地址也是如此。而在 IPv6 中,有多个地址是正常的。
尝试尼日尔。其目的是跟踪邻居发现事件。它可以记录 IPv6 地址首次出现的时间、其 MAC 地址何时更改等。
答案2
与 Sander 的想法相同,但工具不同([iproute2][1] 的监控命令)
$ ip -6 monitor all
[ROUTE][NEIGH]fdcc:216f:1d2c::24 dev eth0 lladdr 00:1a:92:7f:ea:3e REACHABLE
...
然而,如何同时获取所有可访问的路由器和节点却有点棘手。邻居和路由表会因为某种原因而很快变得陈旧,但这并不意味着跳数已经消失。这只是一种方便的方式,允许节点随时出现和消失,而无需进一步加入/离开消息。
话虽如此,您应该研究一下多播的一般工作原理,至少在某些思科交换机(具有多播侦听器发现,MLD 的交换机)上,您可以直接访问多播表,因此您的问题可以改写为:谁加入了该ff0x::1
组。
理论上,Linux 内核也保存了这些信息,如下所示:
$ ip -6 maddr
inet6 ff02::1:ffeb:ea92
inet6 ff02::1:ff00:16 users 3
inet6 ff02::1
不幸的是我不知道如何明确列出加入者。