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)がルーティングテーブルエントリ(ネットワーク/ネットマスク)に含まれていることを確認し、その場合はパスを印刷したいと思います。
その場合は、次のようにします。
たとえば、google.comのipv6アドレスを取得します。
host -t aaaa
すべてのipv6パスのリストを取得します。たとえば
ip -6 route show
。各ipv6パスについて、google.comのipv6アドレスがネットワークとネットマスクに含まれていることを確認してください。
Perlモジュールには、IPアドレスがネットワークブロック(またはネットワークブロックの配列)にあることを確認する機能が Net::CIDR
あります。これはipv4アドレスとipv6アドレスの両方で機能します。 DNSルックアップを実行するモジュールもあり、おそらくさまざまなルーター/ルーティングデーモンからルーティングテーブルを取得するモジュールもあります。 Perlには、できるだけほぼすべてのタスクを実行できるモジュール(または2つまたは12個)があります。それにもかかわらず、出力から必要なものを抽出するのは簡単です。cidrlookup()
perl
Net::DNS
ip -6 route show
注:宛先IPを含むネットワーク/マスクのルーティングテーブルに特定のルートが存在する一致のみを探します。もちろん、「デフォルト」ルートにはすべてのIPが含まれます。
を使用したくない場合は、perl
以下もあります。libcidr。自分で書くことはそれほど難しくありません(または誰かがすでに書いたかもしれません)。