如何过滤从多播 ping6 到所有节点的输出,以便在某一时刻获取所有可访问的 IPv6 设备?

如何过滤从多播 ping6 到所有节点的输出,以便在某一时刻获取所有可访问的 IPv6 设备?

如何过滤对所有节点的多播 ping 的输出,以便在输出文件中每个 IP 只出现一次?

  1. 如果有新设备加入网络,其信息将写入带有加入时间戳的文件中。
  2. 如果设备离开网络,它将被从该文件中删除。
  3. 最后,输出文件显示了网络中当前可访问的设备以及加入的时间戳
     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

不幸的是我不知道如何明确列出加入者。

相关内容