web-dev-qa-db-ja.com

IPv6よりもIPv4着信接続を優先する

私たちは、ユーザーのIPを地理的に特定することから利益を得るソーシャル/ローカルサービスを実行しています。問題は、IPv6の場合、地理位置情報がIPv4の場合よりもかなり目立つことです。

Nginxを備えたUbuntuホストで、IPv6経由の着信接続を優先する方法はありますか?設定は次のようになります。

server {
    listen 80 default_server;
    listen [::]:80 ipv6only=off default_server;
}
11
Dan Dascalescu

IPv6/IPv4設定は、接続の開始者、つまりWebブラウザによって決定されます。アドレス選択規則は RFC 6724 で定義されています。これらは上書きできますが、それはユーザーがオペレーティングシステムを再構成することによってのみ可能です。

IPv4を使用するように強制できる唯一の方法は、IPv6をまったく提供しないことです。明らかに、これは中期的にも実用的な解決策ではありません...

それでは、元の問題に戻りましょう。IPv6の位置情報は「IPv4の場合よりもかなり優れています」。

これは、地理位置情報データをどこで取得するかに大きく依存しています。たとえば、Maxmindは、IPv6アドレスを都市なしで「米国」としてのみ提供します 興味深い座標のセット 。一方、Googleは少なくとも50マイル離れた大都市圏を少なくとも正しく識別します。 MaxmindとGoogleはどちらも修正の報告を許可し、少なくともMaxmind 誰でもこれを行うことができます すべてのIPアドレスに対して。

この状況が長く続くとは思いません。 IPv6の使用が拡大し続けるにつれて、そのような地理位置情報サービスのユーザーはIPv6アドレスに対してより高い精度を要求し、少なくとも有料の顧客に対しては、それらの顧客が他の場所に行かないように、最終的にそれを提供する必要があります。

それまでの間、アプリケーションにユーザーを特定する他の方法があることを確認してください。彼らがログインした場合、あなたは彼らの場所についての手がかりについて既存のアカウントを読むことができます。ユーザーに国を明示的に選択するよう依頼することができます。等々...

他にできることの1つは、WebサイトのIPv4のみのサブドメインとIPv6のみのサブドメインを提供することです。それぞれのページがロードを試みます。次に、クライアント側を関連付けて、サーバーにレポートを返すことができます。偶然ではありませんが、Maxmindはすでに独自のWebサイトでこれを行っています。

23
Michael Hampton

このような設定は、SRVレコードを使用して表現できます。残念ながら、それらはHTTPではサポートされていません。したがって、クライアントだけがIPv4とIPv6のどちらかを選択している状況が残ります。

多くのクライアントは、SYN + SYN-ACKの往復時間を使用して、どちらを使用するかを決定します。したがって、IPv6でのSYN-ACKパケットの送信を遅くすることで、ほとんどのクライアントにIPv4を優先させることができます。しかし、サイトを故意に遅くすることは恐ろしいアプローチです。

代わりに、一歩下がって問題を調べます。より良い地理位置情報データが必要です。訪問者があなたのサイトにアクセスするたびに、あなたはすぐに彼らのIPアドレスの1つを知るようになります。それがIPv4とIPv6のどちらのアドレスになるかは、ブラウザがサーバーとの通信にどちらを好むかによって異なります。

ページ内では、AJAXリクエストを使用して別のIPアドレスを知ることができます。IPv4を使用しているクライアントの場合、IPv6のみにAJAXリクエストを送信しますドメイン、IPv6を使用するクライアントの場合、AJAXリクエストをIPv4のみのドメインに送信します。

AJAX=リクエストがサーバーに到着するとすぐに、ユーザーのIPv4とIPv6の両方のアドレスがわかります。この対応を知ることで、1つだけを知るよりもジオロケーションを行うことができます。二。

AJAXリクエストがサーバーに到着しない場合がよくあります。これらのユーザーの場合、1つのIPアドレスのみに基づいて最善を尽くすことができるため、ジオロケーションを行う必要があります。ただし、その返信AJAXリクエストはクライアント側では何も使用されないため、ユーザーは失敗したリクエストに気づくこともありませんAJAXリクエストです。そのため、スローダウンや不安定な動作はAJAXリクエストによって引き起こされます。

15
kasperd