ValdikSS / blockcheck

Russian ISP blocking type checker NOTE: NOT WORKING CURRENTLY. ВНИМАНИЕ: НЕ РАБОТАЕТ НА ТЕКУЩИЙ МОМЕНТ
MIT License
1.37k stars 144 forks source link

Определять IPv6 тунель #55

Closed nshopik closed 7 years ago

nshopik commented 7 years ago

Не производить проверку IPv6 если будет обнаружен не нативный IPv6. Достаточно сравнить автономную систему IPv4 и IPv6 если они не совпадают отключать IPv6 проверки.

Планирую прислать позже патч

ValdikSS commented 7 years ago

Задумывался о таком. Нужно еще отключать IPv6, если обнаружен Teredo (2001::/32) и 6to4 (2002::/16)

nshopik commented 7 years ago

К внешним зависимостям как относитесь? Было бы конечно проще вытянуть https://pypi.python.org/pypi/ipwhois чтобы не писать свой RDAP парсер для того чтобы вытягивать принадлежность сети к ASN потом. И заодно использовать более свежие данные из RIR для других частей кода где это ввиде хака

ValdikSS commented 7 years ago

Не знаю, насколько надежно проверять AS. Могут быть у провайдера разные AS для IPv4 и IPv6? Может, лучше проверять страну, или вовсе ограничиться проверкой на Teredo и 6to4? На сервер редко приходят отчеты с не-провайдерским и не-Teredo IPv6. Думаю, люди запускают программу с --no-report или отключают туннель.

IPv6 поддерживают только тесты DNS и HTTP. Проверка сертификата HTTPS и обхода DPI работает только по IPv4 (см. #52)

К внешним зависимостям как относитесь?

Нормально, если они pure python.

nshopik commented 7 years ago

Не знаю, насколько надежно проверять AS. Могут быть у провайдера разные AS для IPv4 и IPv6?

Надежно 100%, разные ASN для разных address family не дает никаких фич. Тем кому нужны разные ASN в пределах оператора все равно используют IPv4/IPv6 локальной AS, это банально удобное и проще.

Может, лучше проверять страну, или вовсе ограничиться проверкой на Teredo и 6to4? На сервер редко приходят отчеты с не-провайдерским и не-Teredo IPv6. Думаю, люди запускают программу с --no-report или отключают туннель.

Teredo и 6to4 и не выбирает адреса в браузерах chrome/firefox, только если удаленный сервер находиться в той же подсети, ввиду приоритетов выбора source адреса https://tools.ietf.org/html/rfc6724#section-2.1

      Prefix        Precedence Label
      ::1/128               50     0
      ::/0                  40     1
      ::ffff:0:0/96         35     4
      2002::/16             30     2
      2001::/32              5     5
      fc00::/7               3    13
      ::/96                  1     3
      fec0::/10              1    11
      3ffe::/16              1    12

В любом случае их легко определять и отключать при необходимости

ValdikSS commented 7 years ago

Надежно 100%

Нашел тест, где у человека разные ASN для IPv4 и IPv6, но IPv6, с большой долей вероятности, провайдерский.

IP: 109.167.200.0/24, IPv6: 2a02:2510:2:2:a617::/48, провайдер: WestCall Ltd./ ВестКолл Домашние сети

109.167.192.0/18 AS25408 2a02:2510::/32 AS44068

Teredo и 6to4 и не выбирает адреса в браузерах chrome/firefox

Blockcheck не полагается на getaddrinfo, а получает A и AAAA-записи через Google DNS-over-HTTPS API, затем тестирует IPv4 и IPv6 отдельно, открывая сокет на IP-адрес. Мне приходят результаты тестирования с Teredo-адресами, и сейчас программа их воспринимает, будто это обычный рабочий IPv6-адрес.

ValdikSS commented 7 years ago

В догонку: IP: 95.28.188.xxx, IPv6: 2001:67c:2b8c:xxxx:xxxx:xxxx:xxxx:xxxx, провайдер: JSC Beeline-Samara/ Билайн

2001:67c:2b8c::/48 AS33842 95.28.188.0/24 AS8402

nshopik commented 7 years ago

Нашел тест, где у человека разные ASN для IPv4 и IPv6, но IPv6, с большой долей вероятности, провайдерский.

IP: 109.167.200.0/24, IPv6: 2a02:2510:2:2:a617::/48, провайдер: WestCall Ltd./ ВестКолл Домашние сети

Две разные автономки никак не связанные с друг с другом, у них даже взаимоотношений нет судя по транзиту. Разные ASN имеет смысл когда у тебя есть sub-ASN (купил сеть допустим) и ты ей даешь IPv6 адреса из своей ASN (или наоборот) основной, но тогда бы это было видно в bgp (анонсы были бы за первой AS). И я точно знаю что у ВестКолл IPv6 даже близко не в продакшене для конечных юзеров.

Можно PTMU проверять, но это только зря время тратить

Второй приведенный пример, это тунель, я знаю 100% потому что мой.

Blockcheck не полагается на getaddrinfo, а получает A и AAAA-записи через Google DNS-over-HTTPS API, затем тестирует IPv4 и IPv6 отдельно, открывая сокет на IP-адрес. Мне приходят результаты тестирования с Teredo-адресами, и сейчас программа их воспринимает, будто это обычный рабочий IPv6-адрес.

Да я в этом контексте не подумал, надо конечно добавить список игнорируемых сетей

ValdikSS commented 7 years ago

В таком случае, могу только предположить, что у человека два провайдера: IPv4 от одного, IPv6 от другого.

Делайте, если хотите. Только сделайте опцию --force-ipv6.

nshopik commented 7 years ago

Как я уже выше сказал у него может быть обычный IPv6inIPv4 туннель. Попробую сделать

nshopik commented 7 years ago

ASN будем печатать текстом? юзеру может быть и не к чему, а для статистики удобно наврное было бы чтобы сравнить

nshopik commented 7 years ago

https://github.com/ValdikSS/blockcheck/commit/28c7b12762d74a1c4d0bb068157c0686bf253e47