Как я могу отфильтровать выходные данные из пинга многоадресной рассылки по всем узлам, чтобы в выходном файле каждый IP-адрес появлялся только один раз?

  1. Если новое устройство присоединяется к сети, оно записывается в файл с отметкой времени присоединения.
  2. Если устройство покидает сеть, оно удаляется из этого файла.
  3. В конце выходной файл показывает текущие доступные устройства в сети с отметкой времени присоединения
     ping6 -I eth1 ip6-allnodes 
        PING ip6-allnodes(ip6-allnodes) from fe80::aaaa:aaaa:aaaa:aaaa eth1: 56 data bytes
        64 bytes from fe80::aaaa:aaaa:aaaa:aaaa: icmp_seq=1 ttl=64 time=0.018 ms
        64 bytes from fe80::bbbb:bbbb:bbbb:bbbb: icmp_seq=1 ttl=64 time=0.490 ms (DUP!)
        64 bytes from fe80::cccc:cccc:cccc:cccc: icmp_seq=1 ttl=64 time=0.739 ms (DUP!)
        64 bytes from fe80::aaaa:aaaa:aaaa:aaaa: icmp_seq=2 ttl=64 time=0.037 ms
        64 bytes from fe80::bbbb:bbbb:bbbb:bbbb: icmp_seq=2 ttl=64 time=0.513 ms (DUP!)
        64 bytes from fe80::cccc:cccc:cccc:cccc: icmp_seq=2 ttl=64 time=0.674 ms (DUP!)
        64 bytes from fe80::dddd:dddd:dddd:dddd: icmp_seq=2 ttl=64 time=228 ms (DUP!)
        64 bytes from fe80::aaaa:aaaa:aaaa:aaaa: icmp_seq=3 ttl=64 time=0.033 ms
        64 bytes from fe80::bbbb:bbbb:bbbb:bbbb: icmp_seq=3 ttl=64 time=0.460 ms (DUP!)
        64 bytes from fe80::cccc:cccc:cccc:cccc: icmp_seq=3 ttl=64 time=0.611 ms (DUP!)
        64 bytes from fe80::aaaa:aaaa:aaaa:aaaa: icmp_seq=4 ttl=64 time=0.045 ms
        64 bytes from fe80::bbbb:bbbb:bbbb:bbbb: icmp_seq=4 ttl=64 time=0.485 ms (DUP!)
        64 bytes from fe80::cccc:cccc:cccc:cccc: icmp_seq=4 ttl=64 time=0.609 ms (DUP!)
        64 bytes from fe80::aaaa:aaaa:aaaa:aaaa: icmp_seq=5 ttl=64 time=0.035 ms
        64 bytes from fe80::bbbb:bbbb:bbbb:bbbb: icmp_seq=5 ttl=64 time=0.518 ms (DUP!)
        64 bytes from fe80::cccc:cccc:cccc:cccc: icmp_seq=5 ttl=64 time=0.580 ms (DUP!)
        64 bytes from fe80::eeee:eeee:eeee:eeee: icmp_seq=5 ttl=255 time=201 ms (DUP!)
        64 bytes from fe80::dddd:dddd:dddd:dddd: icmp_seq=5 ttl=64 time=237 ms (DUP!)
        64 bytes from fe80::aaaa:aaaa:aaaa:aaaa: icmp_seq=6 ttl=64 time=0.032 ms
        64 bytes from fe80::bbbb:bbbb:bbbb:bbbb: icmp_seq=6 ttl=64 time=0.508 ms (DUP!)
        64 bytes from fe80::cccc:cccc:cccc:cccc: icmp_seq=6 ttl=64 time=0.540 ms (DUP!)
        64 bytes from fe80::aaaa:aaaa:aaaa:aaaa: icmp_seq=7 ttl=64 time=0.038 ms
        64 bytes from fe80::bbbb:bbbb:bbbb:bbbb: icmp_seq=7 ttl=64 time=0.550 ms (DUP!)
        64 bytes from fe80::cccc:cccc:cccc:cccc: icmp_seq=7 ttl=64 time=0.640 ms (DUP!)
        64 bytes from fe80::dddd:dddd:dddd:dddd: icmp_seq=7 ttl=64 time=76.6 ms (DUP!)
        ip6-allnodes ping statistics ---
        7 packets transmitted, 7 received, +18 duplicates, 0% packet loss, time 6020ms
        rtt min/avg/max/mdev = 0.018/30.086/237.386/72.776 ms

2 ответа2

1

Пинг не подходит для этого. Каждое устройство отвечает только один раз, даже если оно имеет несколько адресов. И наличие нескольких адресов нормально в IPv6.

Попробуй НДПМон. Его цель - отслеживать события обнаружения соседей. Он может регистрироваться при первом появлении адреса IPv6, при изменении его MAC-адреса и т.д.

1

Та же идея, что и у Sander, другой инструмент (команда монитора [iproute2] [1])

$ ip -6 monitor all
[ROUTE][NEIGH]fdcc:216f:1d2c::24 dev eth0 lladdr 00:1a:92:7f:ea:3e REACHABLE
...

Как получить все доступные маршрутизаторы и узлы в одно и то же время, немного сложновато. Таблицы соседей и маршрутов устарели довольно быстро по причине, которая не означает, что прыжки исчезли. Это просто удобный способ, позволяющий узлам появляться и исчезать в любое время без дальнейших сообщений о присоединении / выходе.

Сказав это, вы должны посмотреть, как в целом работает многоадресная рассылка, по крайней мере на некоторых коммутаторах cisco (те, что с обнаружением многоадресного прослушивателя, MLD) вы можете получить прямой доступ к таблицам многоадресной рассылки, поэтому ваш вопрос перефразируется так: кто присоединился к ff0x::1 группа.

Теоретически, ядро Linux также хранит эту информацию, что можно увидеть в:

$ ip -6 maddr
inet6 ff02::1:ffeb:ea92
inet6 ff02::1:ff00:16 users 3
inet6 ff02::1

к сожалению, я не знаю, как составить список участников.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .