23

IPv6 ネットワークでは、IPV6_V6ONLY フラグを使用して、ソケットが IPv6 のみを使用し、特に IPv4 から IPv6 へのマッピングがそのソケットに使用されないようにします。多くの OS では IPV6_V6ONLY はデフォルトで設定されていませんが、一部の OS (Windows 7 など) ではデフォルトで設定されています。

私の質問は、このフラグを導入した動機は何ですか? IPv4 から IPv6 へのマッピングに問題があり、それを無効にする方法が必要だったのでしょうか? IPv4 から IPv6 へのマッピングを使用したくない場合、IPv4 にマッピングされた IPv6 アドレスを指定することはできないように思えます。ここで何が欠けていますか?

4

7 に答える 7

12

すべてのIPv6対応プラットフォームがデュアルスタックソケットをサポートしているわけではないため、IPv6の互換性を最大化する必要があるアプリケーションは、デュアルスタックがサポートされていることをどのように認識しているか、サポートされていない場合は個別にバインドするかが問題になります。唯一の普遍的な答えはIPV6_V6ONLYです。

IPV6_V6ONLYを無視するアプリケーション、またはデュアルスタック対応のIPスタックが存在する前に作成されたアプリケーションは、IPv6デュアルスタックソケットがIPv4にバインドしてIPv4ソケットのバインドを妨げるため、デュアルスタック環境でV4への個別のバインドが失敗する場合があります。また、プロトコルまたはアプリケーションレベルのアドレス指定の問題、またはIPアクセス制御のために、アプリケーションがIPv4overIPv6を予期していない場合もあります。

この状況または同様の状況により、RFC3493が0をデフォルトとして宣言している場合でも、MSetalはデフォルトで1になっている可能性があります。1は、理論的には下位互換性を最大化します。具体的には、Windows XP/2003はデュアルスタックソケットをサポートしていません。

残念ながら、正しく動作するために下位層の情報を渡す必要があるアプリケーションも不足していません。したがって、このオプションは、要件と既存のコードベースに最適なIPv4/IPv6互換性戦略を計画する場合に非常に役立ちます。

于 2010-05-10T16:41:39.990 に答える
4

最も頻繁に言及される理由は、サーバーに何らかの形式の ACL (アクセス制御リスト) がある場合です。たとえば、次のようなルールを持つサーバーを想像してください。

Allow 192.0.2.4
Deny all

IPv4 で動作します。現在、誰かが IPv6 を搭載したマシンで実行すると、いくつかのパラメーターに応じて、IPv4 要求が IPv6 ソケットで受け入れられ、::192.0.2.4 としてマップされ、最初の ACL と一致しなくなります。突然、アクセスが拒否されます。

アプリケーションで (IPV6_V6ONLY を使用して) 明示的であることは、オペレーティング システムのデフォルトが何であれ、問題を解決します。

于 2010-05-09T17:04:16.830 に答える
3

なぜデフォルトになるのかわかりません。しかし、デフォルトが何であれ、それは私が常に明示的に置くフラグの種類です.

そもそもなぜそれが存在するのかについては、既存のIPv4のみのサーバーを維持し、新しいサーバーを同じポートでIPv6接続のみで実行できると思います。または、新しいサーバーがクライアントを古いサーバーに単純にプロキシして、IPv6 機能を古いサービスに簡単かつ簡単に追加できるようにすることもできます。

于 2010-04-22T19:32:24.700 に答える
3

Linux の場合、IPv4 と IPv6 の両方のソケットを同じサービス ポート (ポート 2001 など) でリッスンするサービスを作成する場合は、setsockopt(s, SOL_IPV6, IPV6_V6ONLY, &one, sizeof(one)); を呼び出す必要があります。IPv6 ソケットで。そうしないと、IPv4 ソケットの bind() 操作が失敗し、「アドレスは既に使用されています」というメッセージが表示されます。

于 2013-03-28T16:16:38.403 に答える
1

(あまり名前が付けられていない) 「IPv4 マップ」アドレスを使用して、構成が不十分なシステムや悪いスタックを回避したり、適切に構成されたシステムでさえ、面倒な量のバグプルーフが必要になる可能性がある、もっともらしい方法があります。開発者は、このフラグを使用して、API のこの部分を利用しないことでアプリケーションをより安全にすることができます。

参照: http://ipv6samurais.com/ipv6samurais/openbsd-audit/draft-cmetz-v6ops-v4mapped-api-harmful-01.txt

于 2012-04-25T00:50:36.813 に答える
0

FTPのデータチャネルなど、ネットワークアドレスを会話に含めるプロトコルを想像してみてください。IPv6を使用する場合、IPv6アドレスを送信します。受信者がIPv4にマップされたアドレスである場合、そのアドレスに接続する方法はありません。

于 2010-05-02T10:18:51.953 に答える
0

行動の二重性が問題となる非常に一般的な例が 1 つあります。フラグ付きの標準getaddrinfo()呼び出しは、ノード名パラメーターを渡す可能性を提供し、リッスンするアドレスのリストを返します。nodenameには NULL 文字列形式の特別な値が受け入れられ、ワイルドカード アドレスをリッスンすることを意味します。AI_PASSIVE

一部のシステム0.0.0.0::は、この順序で返されます。デュアルスタック ソケットがデフォルトで有効になっていて、 socket を設定していない場合IPV6_V6ONLY、サーバーは0.0.0.0デュアルスタックに接続してから接続に失敗するため::、(1) IPv4 でのみ動作し、(2) エラーが報告されます。

IPv6が優先されると予想されるため、順序が間違っていると考えます。ただし、最初に dual-stack::を試行してから IPv4-only を試行しても0.0.0.0、サーバーは 2 回目の呼び出しでエラーを報告します。

個人的には、デュアルスタック ソケットというアイデア全体が間違いだと考えています。私のプロジェクトでは、IPV6_V6ONLYそれを避けるために常に明示的に設定したいと思います。一部の人々は明らかにそれを良いアイデアと見なしていましたが、その場合はおそらく明示的に設定を解除し、メカニズムをバイパスすることに直接IPV6_V6ONLY変換します.NULL0.0.0.0getaddrinfo()

于 2015-10-12T10:25:31.673 に答える