Preferuj połączenia przychodzące IPv4 niż IPv6

11

Prowadzimy serwis społecznościowy / lokalny, który korzysta z geolokalizacji adresu IP użytkowników. Problem polega na tym, że w przypadku IPv6 geolokalizacja jest nieco bardziej spottier niż w przypadku IPv4.

Czy istnieje sposób, aby preferować połączenia przychodzące zamiast IPv6 na hoście Ubuntu z nginx? Konfiguracja wygląda następująco:

server {
    listen 80 default_server;
    listen [::]:80 ipv6only=off default_server;
}
Dan Dascalescu
źródło

Odpowiedzi:

23

Preferencje IPv6 / IPv4 są określane przez inicjatora połączenia, tj. Przeglądarkę internetową. Reguły wyboru adresu są zdefiniowane w RFC 6724 . Można je zastąpić, ale użytkownik dokonuje ponownej konfiguracji systemu operacyjnego.

Jedynym sposobem zmuszenia kogoś do korzystania z IPv4 jest w ogóle nie oferowanie IPv6. Oczywiście nie jest to praktyczne rozwiązanie nawet w perspektywie średnioterminowej ...

Wróćmy więc do pierwotnego problemu: Geolokalizacja dla IPv6 jest „dość ostrzejsza niż w przypadku IPv4”.

Częściowo zależy to bardzo od tego, skąd masz dane geolokalizacyjne. Na przykład Maxmind podaje mój adres IPv6 tylko jako „Stany Zjednoczone” bez żadnego miasta i interesujący zestaw współrzędnych , podczas gdy Google przynajmniej poprawnie identyfikuje obszar metropolitalny, do którego są jeszcze około 50 mil. Zarówno Maxmind, jak i Google pozwalają na zgłaszanie poprawek, a przynajmniej dla Maxmind każdy może to zrobić dla dowolnego adresu IP.

Nie spodziewałbym się, że ta sytuacja będzie trwać bardzo długo. W miarę wzrostu wykorzystania IPv6 użytkownicy takich usług geolokalizacyjnych będą wymagać większej dokładności adresów IPv6 i będą musieli je ostatecznie dostarczyć, przynajmniej dla klientów płacących, aby ci klienci nie poszli gdzie indziej.

W międzyczasie powinieneś mieć pewność, że Twoja aplikacja ma inne sposoby lokalizowania użytkowników. Jeśli się zalogują, możesz przeczytać ich istniejące konto, aby uzyskać wskazówki co do ich lokalizacji. Możesz poprosić użytkownika o wyraźne wybranie kraju. I tak dalej...

Inną rzeczą, którą możesz zrobić, jest udostępnienie subdomeny tylko IPv4 i subdomeny IPv6 witryny, z których każda strona będzie się ładować. Następnie możesz skorelować je po stronie klienta i przesłać raport do serwera. Nieprzypadkowo Maxmind już to robi na swojej stronie internetowej.

Michael Hampton
źródło
12
Oczekuję, że geolokalizacja przez IP pójdzie drogą dinozaura. Najlepsze, na co powinieneś mieć nadzieję, to rozdzielczość kontynentu, szczególnie gdy handel blokami v4 zyskuje większą przyczepność.
Jim B
4
To, co naprawdę doprowadza biedaka do szaleństwa, to wszystkie firmy, które otrzymują bloki IPv4 od AFRINIC, ale tak naprawdę nie są w Afryce. Kilka z nich zauważyłem już na wolności.
Michael Hampton
1
Tak, widziałem to samo. Widziałem demo doctrackingowe zjeżdżające z torów z powodu wymiany bloku.
Jim B
15

Takie preferencje można wyrazić za pomocą rekordów SRV. Niestety nie są obsługiwane przez HTTP. Pozostaje więc sytuacja, w której sam klient dokonuje wyboru między IPv4 a IPv6.

Wielu klientów korzysta z czasu przejścia w obie strony SYN + SYN-ACK, aby zdecydować, którego z nich użyć. Spowalniając wysyłanie pakietu SYN-ACK na IPv6, możesz sprawić, że większość klientów woli IPv4. Ale celowe spowalnianie witryny to straszne podejście.

Zamiast tego cofnę się o krok i spojrzę na problem. Chcesz lepszych danych geolokalizacyjnych. Za każdym razem, gdy odwiedzający uzyskuje dostęp do Twojej witryny, natychmiast poznajesz jeden z jego adresów IP. To, czy będzie to adres IPv4, czy IPv6, zależy od tego, która przeglądarka woli komunikować się z serwerem.

Na swojej stronie możesz skorzystać z żądania AJAX, aby poznać inny adres IP. W przypadku klientów używających IPv4 wyślij żądanie AJAX do domeny tylko IPv6, w przypadku klientów używających IPv6 wyślij żądanie AJAX do domeny tylko IPv4.

Gdy tylko żądanie AJAX dotrze na serwer, znasz zarówno adresy IPv4, jak i IPv6 użytkownika. Znajomość tej korespondencji pozwoli ci lepiej wykonywać geolokalizację niż tylko jedna z nich.

Często zdarzają się przypadki, w których żądanie AJAX nigdy nie dociera na serwer. Dla tych użytkowników będziesz musiał wykonać geolokalizację, jak najlepiej możesz zrobić na podstawie tylko jednego adresu IP. Ale dopóki odpowiedź na to żądanie AJAX nie jest używana do niczego po stronie klienta, użytkownik nawet nie zauważy tych nieudanych żądań AJAX. Tak więc żądania AJAX nie spowodują zauważalnego spowolnienia lub niewłaściwego zachowania.

kasperd
źródło
2
To wydaje się być bardzo pomysłowym i łatwym do wdrożenia rozwiązaniem.
Dan Dascalescu