Préférez les connexions entrantes IPv4 à IPv6

11

Nous gérons un service social / local qui bénéficie de la géolocalisation de l'IP des utilisateurs. Le problème est qu'avec IPv6, la géolocalisation est un peu plus irrégulière qu'avec IPv4.

Existe-t-il un moyen de préférer les connexions entrantes à IPv6, sur un hôte Ubuntu avec nginx? La configuration ressemble à ceci:

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

Réponses:

23

La préférence IPv6 / IPv4 est déterminée par l'initiateur d'une connexion, c'est-à-dire le navigateur Web. Les règles de sélection d'adresse sont définies dans la RFC 6724 . Bien que ceux-ci puissent être remplacés, ce n'est que par l'utilisateur qui reconfigure leur système d'exploitation.

La seule façon de forcer quelqu'un à utiliser IPv4 est de ne pas proposer IPv6 du tout. Ce n'est évidemment pas une solution pratique même à moyen terme ...

Revenons donc au problème d'origine: la géolocalisation pour IPv6 est "un peu plus irrégulière qu'avec IPv4".

Cela dépend en partie de l'endroit où vous obtenez vos données de géolocalisation. Maxmind, par exemple, ne donne mon adresse IPv6 que "États-Unis" sans aucune ville et un ensemble intéressant de coordonnées , tandis que Google identifie au moins correctement la zone métropolitaine à environ 50 miles de distance. Maxmind et Google permettent de signaler les corrections, et au moins pour Maxmind, n'importe qui peut le faire pour n'importe quelle adresse IP.

Je ne m'attendrais pas à ce que cette situation dure très longtemps. Alors que l'utilisation d'IPv6 continue de se développer, les utilisateurs de ces services de géolocalisation exigeront une plus grande précision pour les adresses IPv6, et ils devront éventuellement la fournir, au moins pour les clients payants, de peur que ces clients n'aillent ailleurs.

En attendant, vous devez vous assurer que votre application dispose d'autres moyens pour localiser les utilisateurs. S'ils se sont connectés, vous pouvez lire leur compte existant pour obtenir des indices sur leur emplacement. Vous pouvez demander à l'utilisateur de sélectionner explicitement un pays. Etc...

Une autre chose que vous pouvez faire est de fournir un sous-domaine IPv4 uniquement et un sous-domaine IPv6 uniquement de votre site Web, chacun de vos pages tentant de se charger. Vous pouvez ensuite les corréler côté client et faire rapport au serveur. Ce n'est pas par hasard que Maxmind le fait déjà sur son propre site Web.

Michael Hampton
la source
12
Je m'attends à ce que la géolocalisation via IP fasse le chemin du dinosaure. Le mieux que vous puissiez espérer est une résolution continentale, surtout lorsque le trading de blocs v4 obtient plus de traction.
Jim B
4
Ce qui va vraiment rendre le pauvre fou, c'est toutes les entreprises qui obtiennent des blocs IPv4 d'AFRINIC mais qui ne sont pas réellement en Afrique. J'en ai déjà repéré quelques-uns à l'état sauvage.
Michael Hampton
1
Ouais, j'ai vu la même chose. J'ai vu une démonstration de doctracking dérailler à cause d'un bloc échangé.
Jim B
15

Ces préférences peuvent être exprimées à l'aide d'enregistrements SRV. Malheureusement, ceux-ci ne sont pas pris en charge pour HTTP. Il vous reste donc une situation où le client seul fait le choix entre IPv4 et IPv6.

De nombreux clients utilisent le temps d'aller-retour de SYN + SYN-ACK pour décider lequel des deux utiliser. Ainsi, en ralentissant l'envoi d'un paquet SYN-ACK sur IPv6, vous pouvez faire en sorte que la plupart des clients préfèrent IPv4. Mais ralentir délibérément votre site est une approche terrible.

Au lieu de cela, je prendrais du recul et j'examinerais le problème. Vous voulez de meilleures données de géolocalisation. Chaque fois qu'un visiteur accède à votre site, vous découvrez immédiatement l'une de ses adresses IP. Que ce soit une adresse IPv4 ou IPv6 dépend de ce que leur navigateur préfère pour communiquer avec votre serveur.

À l'intérieur de votre page, vous pouvez utiliser une demande AJAX pour connaître une autre adresse IP. Pour les clients utilisant IPv4, envoyez la demande AJAX à un domaine IPv6 uniquement, pour les clients utilisant IPv6, envoyez la demande AJAX à un domaine IPv4 uniquement.

Dès que la demande AJAX arrive sur le serveur, vous connaissez à la fois les adresses IPv4 et IPv6 de l'utilisateur. Connaître cette correspondance vous permettra de faire une géolocalisation mieux que vous ne pourriez le faire en ne connaissant qu'un seul des deux.

Vous verrez souvent des cas où la demande AJAX n'arrive jamais sur le serveur. Pour ces utilisateurs, vous devrez faire de la géolocalisation comme vous pouvez le mieux en fonction d'une seule adresse IP. Mais tant que la réponse à cette demande AJAX n'est utilisée pour rien du côté client, l'utilisateur ne remarquera même pas ces demandes AJAX en échec. Ainsi, aucun ralentissement ou comportement erratique perçu ne sera causé par les requêtes AJAX.

kasperd
la source
2
Cela semble être une solution très ingénieuse et facile à mettre en œuvre.
Dan Dascalescu