Preferir conexões de entrada IPv4 sobre IPv6

11

Executamos um serviço social / local que se beneficia da geolocalização do IP dos usuários. O problema é que, com o IPv6, a localização geográfica é um pouco mais esparsa do que com o IPv4.

Existe uma maneira de preferir conexões de entrada sobre IPv6, em um host Ubuntu com nginx? A configuração é assim:

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

Respostas:

23

A preferência IPv6 / IPv4 é determinada pelo iniciador de uma conexão, ou seja, o navegador da web. As regras de seleção de endereço são definidas na RFC 6724 . Embora eles possam ser substituídos, é apenas pelo usuário que reconfigura seu sistema operacional.

A única maneira de forçar alguém a usar o IPv4 é não oferecer IPv6. Obviamente, essa não é uma solução prática, mesmo a médio prazo ...

Então, voltemos ao problema original: a localização geográfica para IPv6 é "um pouco mais esparsa do que com IPv4".

Em parte, isso depende muito de onde você obtém seus dados de geolocalização. Maxmind, por exemplo, apenas fornece meu endereço IPv6 como "Estados Unidos", sem cidade alguma e um conjunto interessante de coordenadas , enquanto o Google pelo menos identifica corretamente a área metropolitana em que estão a cerca de 80 quilômetros de distância. Tanto o Maxmind quanto o Google permitem correções de relatórios e, pelo menos para o Maxmind, qualquer pessoa pode fazer isso para qualquer endereço IP.

Eu não esperaria que essa situação durasse muito tempo. À medida que o uso do IPv6 continua a se expandir, os usuários desses serviços de geolocalização exigirão maior precisão para os endereços IPv6 e terão que entregá-lo eventualmente, pelo menos para os clientes pagantes, para que esses clientes não fiquem em outro lugar.

Enquanto isso, você deve ter certeza de que seu aplicativo tem outras maneiras de localizar usuários. Se eles efetuaram login, você pode ler a conta existente para obter pistas sobre sua localização. Você pode pedir ao usuário para selecionar explicitamente um país. E assim por diante...

Outra coisa que você pode fazer é fornecer um subdomínio somente IPv4 e um subdomínio somente IPv6 do seu site, cada um dos quais suas páginas tentam carregar. Você pode correlacioná-los do lado do cliente e reportar de volta ao servidor. Não por coincidência, a Maxmind já está fazendo isso em seu próprio site.

Michael Hampton
fonte
12
Espero que a geolocalização via IP siga o caminho do dinossauro. O melhor que você deve esperar é uma resolução do continente, especialmente quando as negociações em bloco v4 obtêm mais tração.
Jim B
4
O que realmente vai enlouquecer o pobre rapaz é todas as empresas que estão recebendo blocos IPv4 da AFRINIC, mas na verdade não estão na África. Eu já vi alguns deles na natureza.
Michael Hampton
1
Sim, eu já vi o mesmo. Vi uma demonstração de doctracking sair dos trilhos devido a um bloco negociado.
Jim B
15

Tais preferências podem ser expressas usando registros SRV. Infelizmente, esses não são suportados pelo HTTP. Portanto, você fica com uma situação em que o cliente sozinho está fazendo a escolha entre IPv4 e IPv6.

Muitos clientes usam o tempo de ida e volta do SYN + SYN-ACK para decidir qual dos dois usar. Portanto, diminuindo a velocidade do envio de um pacote SYN-ACK no IPv6, você pode fazer com que a maioria dos clientes prefira o IPv4. Mas desacelerar deliberadamente o site é uma abordagem terrível.

Em vez disso, eu daria um passo atrás e analisaria o problema. Você deseja melhores dados de localização geográfica. Cada vez que um visitante acessa seu site, você imediatamente conhece um de seus endereços IP. Se esse será um endereço IPv4 ou IPv6, depende do navegador que ele prefere para se comunicar com seu servidor.

Dentro da sua página, você pode fazer uso de uma solicitação AJAX para conhecer outro endereço IP. Para clientes que usam IPv4, envie a solicitação AJAX para um domínio somente IPv6, para clientes que usam IPv6, enviem a solicitação AJAX para um domínio somente IPv4.

Assim que a solicitação AJAX chegar ao servidor, você conhecerá os endereços IPv4 e IPv6 do usuário. Conhecer essa correspondência permitirá que você faça a geolocalização melhor do que você poderia saber, conhecendo apenas uma das duas.

Você verá frequentemente casos em que a solicitação AJAX nunca chega ao servidor. Para esses usuários, você precisará fazer a geolocalização, da melhor maneira possível, com base em apenas um endereço IP. Mas, desde que a resposta a essa solicitação AJAX não seja usada para nada no lado do cliente, o usuário nem notará as solicitações AJAX com falha. Portanto, nenhuma desaceleração percebida ou comportamento irregular será causado pelas solicitações do AJAX.

Kasperd
fonte
2
Parece uma solução muito engenhosa e fácil de implementar.
Dan Dascalescu