Linuxルーティングテーブルの宛先への*すべて* IPパスのリスト

Linuxルーティングテーブルの宛先への*すべて* IPパスのリスト

ip route get 2607:f8b0:4005:804::200eに到達できる最高の(最も長いプレフィックス)パスが表示されますが、google.com表示されません。みんな私をそこに連れて行くことができる道。

今はを使用していますip -6 route show | grep 2607:f8b0:。これにより正しいパスが印刷されますが、/32 の他のすべてのパスも印刷されます。

より良い方法が必要です。

答え1

Linuxでは、プレフィックスに一致するすべてのパスを一覧表示する簡単な方法があります。

ip -6 route list match 2607:f8b0:4005:804::200e table all

これにより、すべてのテーブルの指定された宛先への可能なすべてのパスが一覧表示されます(特定のパスがない場合はデフォルトパスを含む)。明らかに、これはIPv4にも当てはまります。

PS:私の答えが遅すぎたことを知っていて、おそらくすでに自分で考えていたかもしれません。それにもかかわらず、この質問をした人なら誰でも役に立ちます:)

答え2

私の説明が正しい場合は、特定のipv6アドレス(google.com)がルーティングテーブルエントリ(ネットワーク/ネットマスク)に含まれていることを確認し、その場合はパスを印刷したいと思います。

その場合は、次のようにします。

  1. たとえば、google.comのipv6アドレスを取得します。host -t aaaa

  2. すべてのipv6パスのリストを取得します。たとえばip -6 route show

  3. 各ipv6パスについて、google.comのipv6アドレスがネットワークとネットマスクに含まれていることを確認してください。

Perlモジュールには、IPアドレスがネットワークブロック(またはネットワークブロックの配列)にあることを確認する機能が Net::CIDRあります。これはipv4アドレスとipv6アドレスの両方で機能します。 DNSルックアップを実行するモジュールもあり、おそらくさまざまなルーター/ルーティングデーモンからルーティングテーブルを取得するモジュールもあります。 Perlには、できるだけほぼすべてのタスクを実行できるモジュール(または2つまたは12個)があります。それにもかかわらず、出力から必要なものを抽出するのは簡単です。cidrlookup()perlNet::DNSip -6 route show

注:宛先IPを含むネットワーク/マスクのルーティングテーブルに特定のルートが存在する一致のみを探します。もちろん、「デフォルト」ルートにはすべてのIPが含まれます。

を使用したくない場合は、perl以下もあります。libcidr。自分で書くことはそれほど難しくありません(または誰かがすでに書いたかもしれません)。

関連情報