5

IPアドレス(IPv4またはIPv6)がアプリケーションを実行しているマシンと同じサブネット上にあるかどうかを判断するコードを持っている人はいますか?IPv4でこれを行うコードの例を数多く見てきましたが、IPv6をサポートするコードは見つかりません。

編集:

v4とv6のすべての違いを理解しているかどうかわからないので、ここでもう少し質問します。インターネットクライアントとイントラネットクライアントの両方にサービスを提供するアプリケーションがあります。つまり、サーバーと同じ物理ネットワーク上にクライアントがあります。そのため、クライアント間にルーターがある場合とない場合があります。IPv4では、クライアントのIPアドレスをサーバーのIPアドレスとサブネットと照合することでこれを判断できるため、サーバーのIPとサブネットマスクがそれぞれ次のようになります。

192.168.123.15 255.255.255.0

そして、サーバーは192.168.123.100からクライアント要求を受信します。クライアントとサーバーの間にルーターがないことを知っています。ただし、サーバーが192.168.1.100またはおそらく67.7.23.4からクライアント要求を受信した場合、それらのクライアントとサーバーの間にルーターが存在することを知っています。.Netでは、クライアントとサーバーのIPアドレス(v4とv6の両方)を収集できますが、IPv6サブネットマスクが見つかりません。

.Netでこの情報を収集する方法はありますか、それとも私が誤解しているIPv4とIPv6の間にいくつかの違いがありますか?

x2を編集:

私はこれをMS接続サイトに投稿して、彼らが取り組んでいるものかどうか、またはUnicastIPAddressInformationクラスにIPv6Maskプロパティを追加していない理由があるかどうかを確認しました。

https://connect.microsoft.com/VisualStudio/feedback/details/643031/unicastipaddressinformation-class-has-no-ipv6mask-property

同じ頃、MSDNフォーラムにも同じ質問を投稿しました。1800以上のビューであり、単一の返信ではありません。これに興味があるのは私だけではないと思います。

http://social.msdn.microsoft.com/Forums/en-US/netfxnetcom/thread/dd30e161-9be5-4d70-97c0-22e2756ce953

4

4 に答える 4

3

フレームワークにこれを行う方法があるようには見えません。最も正確な方法はルートルックアップを実行することですが、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ルートテーブルを解析するためのコードをいくつか作成し、ここに投稿しました。この質問で提起された難しい問題はまだ解決されていませんが、正しい方向への一歩です。

于 2011-02-11T04:03:28.063 に答える
3

IPv6のIPv4ネットワークマスクに道徳的に相当するものは、プレフィックス長と呼ばれます。(実際、IPv4でもネットワークマスクではなくプレフィックス長について話したいのですが、まだメモを受け取っていない人もいます。)

IPv4を思い付かないIPv6の追加の問題は、デフォルトのルーターがホストからのルーター要請クエリに応答することにより、リンク上での存在をアドバタイズすることです。ホストは、この方法で見つけたすべてのデフォルトルーターのリストと、有効で優先されるライフタイムを保持します。ルーターは、デフォルトルーターとして機能するゼロ、1つ以上のプレフィックスをアドバタイズすることもでき、ホストは、これらのリストを、関連するルーター、および個々の有効な有効期間とともに保持します。

各プレフィックスには、アドバタイズメントに2つの補助ビットAとLがあり、プレフィックスリストに追加されると、ホストによって合体されます。A = 1ビットは、ホストがそのプレフィックスを持つインターフェイスアドレスを自動的に自己構成できるかどうかを示します。一方、A = 0は、ホストがDHCPv6を介してまたは手動でそのプレフィックスを持つアドレスを取得する必要があることを意味します。L = 1ビットは、プレフィックスが「オンリンク」であることを示し、ホストは近隣探索(IPv6でARPに相当)を使用してネットワークを介して直接送信できます。一方、L = 0は、プレフィックスが「オフリンク」であることを示します。ホストは、そのプレフィックスのすべてのトラフィックをデフォルトルーターに送信する必要があります。

簡単に言うと、IPv6アドレスが「リンク上」にあることを知りたい場合は、IPv6プレフィックスリストを調べて、それぞれをアドレスと比較し、Lビットを調べてリンク上にあることを確認する必要があります。プレフィックス。残念ながら、私はプレフィックスリストを見るBSDシステムの方法しか知りませんsysctl(ICMPV6CTL_ND6_PRLIST, ...)。そのためにMSFTがC#開発者に利用可能にしたものがあるかどうかは本当にわかりません。

はい、これは完全な答えではないことを理解しています。悲しいかな。

于 2011-02-11T23:33:02.147 に答える
2

私はipv6プレフィックスを見つけようとしてwmiドキュメントを調べていましたが、それを見つけるのにも苦労しています。ただし、IPv4用の作業コードがあります。

そのネットワークセグメントのプレフィックスは/64であると安全に想定できると思います。これを行うと、各アドレスの最初の8バイトを比較できます。多くの場合、アプリケーションを実行している個々のローカルネットワークは/ 64になります。ポイントツーポイントリンクでさえ、2つしか使用されていなくても、完全な/64範囲が与えられることがよくあります。

于 2011-02-14T12:33:37.877 に答える
1

99%の場合、これは簡単です。IPv6のすべてのサブネットは/64プレフィックスであるため、プレフィックスの左端の64ビットが同一である場合、それらは同じサブネット内にあります。

現在、一部の人々が奇妙なことをして、より長いプレフィックスを持つサブネットを作成しているのは事実ですが、これの大部分は、/ 126を使用して2つのエンドポイントに番号を付け、/64を含む/64を予約するポイントツーポイント回線を扱っています。 /126。サーバーが関与していないため、アプリケーションがこの状況に遭遇することはありません。

/64以外のサブネットサイズをサポートする正当な理由はありません。

于 2011-02-16T22:21:15.023 に答える