- PVSM.RU - https://www.pvsm.ru -
В этой статье я хочу описать проблему с которой я столкнулся будучи пользователем существующих списков заблокированных ресурсов, шаги к решению и результаты работы. Статья в меньшей степени практическая и в большей теоретическая, поэтому для практической пользы можете сразу переходить к разделу 3. Результат.
Решение проблемы было начато в рамках проекта Demhack 8 [1], и хочется выразить благодарность организаторам за поддержку.
Проблема
Путь к решению
Результат
Начну с основы всего - списка РКН, в нём на момент этой публикации содержится 621750 домен (793 386 URL по данным Роскомсвободы [2]). Этот список пополняется с 2012 года и содержит мягко говоря не только ценные нам ресурсы, но и то, что следует фильтровать такому органу как РКН. Из объема списка как следствие идёт и сложность формирования списков для обхода блокировок, у Antifilter.download [3] это списки IP адресов содержащие около 10000 подсетей /24 и более (либо около 155000 префиксов из резолвинга), у Antifilter.network [4] - 26000 подсетей от /32 до /23 (либо 140000 префиксов из резолвинга). Мой основной интерес это роутеры, которые могут использовать суммаризованные списки IP адресов, что приводит к проблемам в виде того что сайта типа mosoblgaz.ru (91.215.42.46) , speedtest.net (151.101.66.219) находятся на публичных хостингах и будучи суммаризованными по маске при точечной маршрутизации начинают работать через VPN, как и многие другие ресурсы попавшие в этот диапазон, из-за одного двух-адресов списка РКН, что совершенно не нужно.
Начав изучение списка РКН мне было интересно, из-за каких ресурсов из списка пострадали приведенные в примере mosoblgaz.ru и speedtest.net и это например:
Мособлгаз


Speedtest.net

Из чего следует вопрос, а действительно ли нам нужны все эти заблокированные адреса и домены?
Мой ответ - нет, и вот почему:
Как писал @Furriest [5]в своей статье [6] (ему особая благодарность за помощь с BGP):
При этом по сути в черном списке РКН 99% ресурсов - никому не нужный трэш типа стопятисотого зеркала очередного онлайн-казино.
В процессе подготовки этого материала я пришёл к похожих цифрам и убедился в тезисе, что для того чтобы эффективно обходить блокировки нельзя опираться только на реестр РКН, а его содержимое использовать ограниченно. Я пришёл к следующей схеме формирования списков:

Очищать список доменов РКН решено по следующей схеме:

На этом этапе я брал список доменов у Antifilter.download [7] и фильтровал по ключевым словам, исходники алгоритма доступны здесь [8] (step 1) , при желании весь процесс можно повторить самостоятельно (если разберетесь в моём говнокоде)
На момент написания исполнения проекта файл domains.lst содержал 577829 доменных имён, на этом этапе мы отфильтровываем 101990 доменных имён (при правильных ключевых словах думаю можно и больше) - таким образом в списке пока 475839 доменных имён
Переходим к Этапу 2
На этом этапе (step 2 в исходниках) проверялось два основных критерия -
Доступность сайта по одному из способов - ping, http, https
Является ли сайт зеркалом - возвращает ли он ответ HTTP 301, если возвращает, то игнорируется лишь перенаправления на самого себя (например http://www.facebook.com [9] перенаправляет на https://www.facebook.com [10] , это не зеркало)
По итогам этой проверки отфильтровались 281307 доменов и осталось 194532 домена
3-ий этап (step 3 в исходниках) был самым ресурсозатратным, по сути похож на первый, но на этом этапе нужно отфильтровать в том числе припаркованные домены и сайты с нормальными доменами, но бесполезным содержимым
По итогам этого этапа осталось 41598 доменов
Из-за высокой ресурсозатратности процедуры из 3 этапов (в основном 2 и 3) проводить её на регулярной основе затруднительно, а пополнять списки актуальной информацией необходимо и тут на помощь приходят данные от Open Observatory of Network Interference (OONI) которые регулярно публикуют [11] данные по блокировкам во всём мире.
На 4 Этапе ( step 4) будет формироваться список заблокированных доменов на основе данных OONI - в коде берется выборка за неделю и обрабатывается согласно схеме ниже
Далее переходим к финальному 5 этапу:
На финальном этапе (папка step 5) нужно создать общий список доменов из отфильтрованного списка РКН, списка OONI и списка community (в котором хранятся домены не заблокированные РКН, но которые хотелось бы открывать через VPN типа netflix.com) с удалением дубликатов - на выходе получаем список из 42662 доменов (на 13.10.2024) включая домены Discord. На этом можно было бы и закончить, но для практического использования так же необходимы IP адреса, т.к. зачастую маршрутизация осуществляется на 3 уровне модели OSI, тогда как большинство блокировок на более высоких уровнях.
Чтобы правильно определить IP адреса доменов и правильно их суммаризовать необходимо не только использовать DNS записи по конкретному домену, но и иметь ввиду что некоторые домены типа Facebook.com используют тысячи IP адресов, которые не отражены в DNS записях основных доменов, а значит нужно обращаться к данным из автономных подсетей (ASN), но суммирование адресов по ASN возможно не для всех доменов, иначе возможны ситуации описанные в начале статьи. Я учитывал следующие пункты, я определил их как правила:
Списки подсетей из ASN можно использовать только для ASN которые соответствуют домену (например тот же facebook.com и его AS32934, facebook не является и шансы попадания туда посторонних ресурсов минимальны)
Для доменов находящихся в ASN хостингов можно использовать только DNS записи, например тот же Speedtest.net который относится к AS54113 от Fastly, Fastly это
Резолвинг списков по записям DNS осуществлялся отдельно, после чего создавался единый список IP в котором исключались дубликаты и на последнем этапе добавлялись подсети из справочника ASN и происходила суммаризация по маске, но не больше чем /28. В итоговом списке IP адресов на 13.10.24 - 23434 IP адреса включая IP адреса серверов Discord, что более чем пригодно для использования на роутерах.
А что в итоге?
В итоге получились списки (доступные в репозитории [13]):
актуальных заблокированных доменов в количестве - 42662 домена
список IP адресов полученных из резолвинга - 23434 IP адреса
Которые в т.ч. используются для сборки списков V2Fly, Xray - geoip.dat [14] и geosite.dat [15],
Sing-box - geoip.db [16], geosite.db [17]
В тестовом режиме запущен BGP Сервер - 165.22.127.207 (номер автономной системы AS 65412) где раздаётся список ipsum.lst [18] - о том как настраивать - на OpenWRT (Linux) [19] и Mikrotik [20]
В итоге получился список доменов в котором осталось 6.2% записей от изначальных в списках РКН (и можно фильтровать ещё) + есть актуальный и оперативный способ их пополнять, не только на основе данных РКН, но и на основе независимого источника (YouTube до сих пор нет в списках РКН, а блокировки есть)
Отвечая на вопрос "Если в списке РКН так много мусора, почему бы вообще от него не отказаться?" - В списке РКН много мусора, но есть и довольно ценные ресурсы о существовании которых многие из нас не вкурсе, и которые вряд ли попадут в списки созданные с нуля, а в списке РКН они есть
В ближайших планах сделать автоматическую сборку на основе GitHub Actions и вылавливать ошибки - резолвинг пришлось делать с 0, поэтому возможно ошибки.
Спасибо что читаете, переходите на GitHub [13] и ставьте отметки репозиторию, оставляйте обратную связь и предлагайте домены для community.lst.
Надеюсь что кому-то из коллег, в частности: Antifilter.download, Antifilter.network, @ValdikSS [21]могут пригодится эти наработки в их проектах.
Автор: Andrevich
Источник [22]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/youtube-2/399308
Ссылки в тексте:
[1] Demhack 8: https://habr.com/ru/companies/roskomsvoboda/articles/809709/
[2] Роскомсвободы: https://reestr.rublacklist.net/ru/?status=1&gov=all&date_start=&date_end=
[3] Antifilter.download: https://antifilter.download/
[4] Antifilter.network: https://antifilter.network/
[5] @Furriest: https://www.pvsm.ru/users/furriest
[6] своей статье: https://habr.com/ru/articles/663130/
[7] список доменов у Antifilter.download: https://antifilter.download/list/domains.lst
[8] здесь: https://github.com/1andrevich/Re-filter-lists/tree/main/src
[9] http://www.facebook.com: http://www.facebook.com
[10] https://www.facebook.com: https://www.facebook.com
[11] публикуют: https://explorer.ooni.org/ru/chart/mat?test_name=web_connectivity&axis_x=measurement_start_day&since=2024-09-14&until=2024-10-14&time_grain=day
[12] хостингом: https://www.reg.ru/?rlink=reflink-717
[13] репозитории: https://github.com/1andrevich/Re-filter-lists
[14] geoip.dat: https://github.com/1andrevich/Re-filter-lists/releases/latest/download/geoip.dat
[15] geosite.dat: https://github.com/1andrevich/Re-filter-lists/releases/latest/download/geosite.dat
[16] geoip.db: https://github.com/1andrevich/Re-filter-lists/releases/latest/download/geoip.db
[17] geosite.db: https://github.com/1andrevich/Re-filter-lists/releases/latest/download/geosite.db
[18] ipsum.lst: https://github.com/1andrevich/Re-filter-lists/releases/latest/download/ipsum.lst
[19] OpenWRT (Linux): https://habr.com/ru/articles/743572/
[20] Mikrotik: https://habr.com/ru/articles/594551/
[21] @ValdikSS: https://www.pvsm.ru/users/valdikss
[22] Источник: https://habr.com/ru/articles/850292/?utm_source=habrahabr&utm_medium=rss&utm_campaign=850292
Нажмите здесь для печати.