マルチキャスト ping6 からすべてのノードへの出力をフィルタリングして、到達可能なすべての IPv6 デバイスを一度に取得するにはどうすればよいでしょうか?

マルチキャスト ping6 からすべてのノードへの出力をフィルタリングして、到達可能なすべての IPv6 デバイスを一度に取得するにはどうすればよいでしょうか?

すべてのノードへのマルチキャスト ping からの出力をフィルターして、出力ファイルにすべての IP が 1 回だけ表示されるようにするにはどうすればよいですか?

  1. 新しいデバイスがネットワークに参加すると、参加タイムスタンプがファイルに書き込まれます。
  2. デバイスがネットワークから離れると、そのファイルから削除されます。
  3. 最後に、出力ファイルには、ネットワーク内の現在到達可能なデバイスと参加タイムスタンプが表示されます。
     ping6 -I eth1 ip6-全ノード
        PING ip6-allnodes(ip6-allnodes) from fe80::aaaa:aaaa:aaaa:aaaa eth1: 56 データ バイト
        fe80::aaaa:aaaa:aaaa:aaaa からの 64 バイト: icmp_seq=1 ttl=64 time=0.018 ms
        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 time=0.037 ms
        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 time=0.033 ms
        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 time=0.045 ms
        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 time=0.035 ms
        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 time=0.032 ms
        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 からの 64 バイト: icmp_seq=7 ttl=64 time=0.038 ms
        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 からの 64 バイト: icmp_seq=7 ttl=64 time=76.6 ms (DUP!)
        ip6-allnodes ping 統計 ---
        送信パケット 7 個、受信パケット 7 個、重複パケット 18 個以上、パケット損失 0%、時間 6020 ミリ秒
        rtt 最小/平均/最大/平均偏差 = 0.018/30.086/237.386/72.776 ミリ秒

答え1

Ping はこれに適したツールではありません。各デバイスは、複数のアドレスを持っていても、1 回しか応答しません。また、IPv6 では複数のアドレスを持つことは普通です。

試すNDPモンその目的は、近隣探索イベントを追跡することです。IPv6 アドレスが最初に出現したとき、その MAC アドレスが変更されたときなどをログに記録できます。

答え2

Sanderと同じ考え方だが、ツールが異なる([iproute2][1]のmonitorコマンド)

$ 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

残念ながら、参加者を明示的にリストする方法は知りません。

関連情報