フレームワークにこれを行う方法があるようには見えません。最も正確な方法はルートルックアップを実行することですが、C#でそれを実行するための良い方法はわかりません。(Linuxでは、/sbin/ip -6 route get <ipv6-addr>
どのルートが返されるかを確認します。)Windowsでこれを行うには、ネイティブ呼び出しを見つける必要があります。コマンドラインアプリケーションが表示されません。
最良の方法は、の出力を解析することかもしれませんnetsh interface ipv6 show route verbose
。/ 128以外のプレフィックスを探し、それらに対して最長のプレフィックス一致を行うことができます。(まあ、/ 128を押すと、それはボックスに割り当てられたアドレスです)
ネイバーテーブルを確認することもできます。(netsh interface ipv6 show neighbors
)ですが、最近そのホストと話をしていない場合は、探しているエントリが含まれていない可能性があります。
考慮する必要があるその他の潜在的な問題:
- リンクローカルアドレス(fe80 :: / 10)(およびマルチキャスト、ループバック、および指定なし-テーブル内のすべて)
- IPv6では、割り当てられたアドレスがオンリンクプレフィックスを意味しないという事実。プレフィックステーブルは別です。Windowsでこれをテストする方法は明確ではありませんが、
netsh interface ipv6 show siteprefixes
役立つ可能性があります。Windowsは実際にはこれを標準が期待するよりもIPv4のように扱う可能性があるようです。
編集:ネイバーテーブルをチェックすることが、これを行うための最も抵抗の少ないパスになるようです。イントラネットからの接続を受け入れてから、向きを変えてネイバーテーブルを確認する場合、ネイバーがローカルである場合は、テーブルに存在することを合理的に保証できます。ネイバーテーブルを確認する場合は、LANインターフェイスのネイバーテーブルのみを確認するように注意してください。(多くのWindowsシステムにデフォルトでインストールされているISATAPインターフェイスは、IPv4インターネット全体をリンクローカルの「サブネット」として公開します。)
繰り返しになりますが、IPv6アドレスには「ネットマスク」の概念がありません。これは、リンク上のプレフィックステーブルがアドレス割り当てとは別のものであるためです。ただし、サーバーがどこかにある場合は、/ 64上にあることを99%確信できます。(注意が必要ですが、それ自体がトンネルエンドポイントである場合、6in4トンネルに割り当てられたより長いプレフィックスが表示されることがあります)したがって、迅速でダーティなアルゴリズムは次のようになります。
- 最初の64ビットが0であるすべてのアドレスを無視します(ローカルループバック)
- ff00 :: / 8(マルチキャスト)に一致するすべてのアドレスを無視します
- アドレスがfe80::/ 10と一致する場合、それはインターフェイスローカルです。ISATAPインターフェイスを有効にしている場合、「link-local」は「IPv4インターネット全体への自動トンネル」を意味するため、これには注意してください。(良くありません。)したがって、LANインターフェイスからのものであることが確実でない限り、リンクローカルアドレスを信頼しないのが最善かもしれません。(ルーティングできません)
- (ここで複雑な部分)アドレスがネイバーであるかどうかを判別します。(ネイバールックアップ)ハックアンドスラッシュソリューションは、システムで構成されているすべてのIPv6アドレス(ステートレスアドレス自動構成、DHCPv6、または決定できる場合は静的で自動構成)をチェックし、最初の64ビットをチェックすることです。サーバー上(ファンキーなトンネルが/ 64以外のプレフィックスで設定されていない場合)これはまれなケースでバグになります。これは、オンリンクプレフィックステーブルを確認しない限り、アドレスが実際にオンリンクであるかどうかを確認できないためです。 。(Windowsには概念がありません。ルートテーブルに格納されているようです。)イーサネットインターフェイスでルーターアドバタイズメントを送信するように構成できるほとんどのネットワークデバイスは、常に/64プレフィックスをアドバタイズします。パケットがLANインターフェイスに着信したことを確認できれば、これがバグになる可能性はさらに低くなります。
編集2
IPv6ルートテーブルを解析するためのコードをいくつか作成し、ここに投稿しました。この質問で提起された難しい問題はまだ解決されていませんが、正しい方向への一歩です。