質問

IPv6ネットワーキングでは、IPv6_V6onlyフラグは、ソケットがIPv6のみを使用することを保証するために使用されます。多くのOSでは、IPv6_v6onlyはデフォルトでは設定されていませんが、一部のOS(Windows 7)では、デフォルトで設定されています。

私の質問は、この旗を紹介する動機は何でしたか? IPv4-to-IPV6マッピングについて問題を引き起こしているため、人々はそれを無効にする方法が必要でしたか?誰かがIPv4-to-IPv6マッピングを使用したくない場合、IPv4-Mapped IPv6アドレスを単純に指定できないように思えます。ここに何が欠けていますか?

役に立ちましたか?

解決

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

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

他のヒント

すべてのIPv6有能なプラットフォームがデュアルスタックソケットをサポートしているわけではないため、問題は、IPv6互換性を最大化する必要があるアプリケーションがどのようにしてデュアルスタックがサポートされているか、そうでない場合に分離されていることを知っているかどうかになりますか?唯一の普遍的な答えは、IPv6_v6onlyです。

IPv6_v6onlyを無視するアプリケーションまたはデュアルスタックの有能なIPスタックが存在する前に書かれているアプリケーションは、IPv6デュアルスタックソケットがIPv4ソケットのバインディングを防ぐために、DualStack環境でV4に隔てられてバインディングされる可能性があります。また、アプリケーションは、プロトコルまたはアプリケーションレベルに対処する懸念またはIPアクセスコントロールのために、IPv6を超えるIPv4を期待していない場合があります。

これまたは同様の状況により、Ms et alがデフォルトになるように促された可能性が最も高いのは、0がデフォルトであると宣言していると宣言しています。 1理論的には逆方向の互換性を最大化します。具体的には、Windows XP/2003はデュアルスタックソケットをサポートしていません。

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

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

Allow 192.0.2.4
Deny all

IPv4で実行されます。これで、誰かがIPv6を使用してマシンで実行し、一部のパラメーターに応じて、IPv4リクエストはIPv6ソケットで受け入れられ、:: 192.0.2.4としてマッピングされ、最初のACLと一致しなくなりました。突然、アクセスが拒否されます。

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

Linuxの場合、IPv4ソケットとIPv6ソケットの両方に耳を傾けるサービスを書くとき 同じ サービスポート、たとえばポート2001、SetSockopt(S、SOL_IPV6、IPv6_V6only、&One、Sizeof(1))に電話する必要があります。 IPv6ソケット。そうでない場合、IPv4ソケットのbind()操作は「既に使用中のアドレス」で失敗します。

(不十分に指名された)「IPv4マップ」アドレスを使用して、構成されていないシステム、または不良スタックを回避するために、または十分に構成されたシステムでさえ、厄介な量のバグプルーフが必要になる場合があります。開発者は、このフラグを使用して、APIのこの部分を利用しないことにより、アプリケーションをより安全にすることをお勧めします。

見る: http://ipv6samurais.com/ipv6samurais/openbsd-audit/draft-cmetz-v6ops-v4mapp-api-harmful-01.txt

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

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

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

IPv6が優先されると予想されるため、順序は間違っていると考えるでしょう。しかし、最初にデュアルスタックを試みても :: そして、IPv4のみ 0.0.0.0, 、サーバーは引き続き2回目の呼び出しのエラーを報告します。

私は個人的に、デュアルスタックソケットのアイデア全体を間違いと考えています。私のプロジェクトでは、常に明示的に設定したいと思います IPV6_V6ONLY それを避けるために。一部の人々はどうやらそれを良い考えだと思っていましたが、その場合、私はおそらく明示的に安全ではないでしょう IPV6_V6ONLY そして翻訳します NULL 直接 0.0.0.0 バイパスします getaddrinfo() 機構。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top