В этой статье я хочу описать проблему с которой я столкнулся будучи пользователем существующих списков заблокированных ресурсов, шаги к решению и результаты работы. Статья в меньшей степени практическая и в большей теоретическая, поэтому для практической пользы можете сразу переходить к разделу 3. Результат.

Решение проблемы было начато в рамках проекта Demhack 8, и хочется выразить благодарность организаторам за поддержку.

  1. Проблема

  2. Путь к решению

  3. Результат

1. Проблема

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

2. Путь к решению

Начав изучение списка РКН мне было интересно, из-за каких ресурсов из списка пострадали приведенные в примере mosoblgaz.ru и speedtest.net и это например:

Мособлгаз

Speedtest.net

Из чего следует вопрос, а действительно ли нам нужны все эти заблокированные адреса и домены?

Мой ответ - нет, и вот почему:

Как писал @Furriestв своей статье (ему особая благодарность за помощь с BGP):

При этом по сути в черном списке РКН 99% ресурсов - никому не нужный трэш типа стопятисотого зеркала очередного онлайн-казино.

В процессе подготовки этого материала я пришёл к похожих цифрам и убедился в тезисе, что для того чтобы эффективно обходить блокировки нельзя опираться только на реестр РКН, а его содержимое использовать ограниченно. Я пришёл к следующей схеме формирования списков:

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

Этап 1 - Фильтрация доменных имён по словарю

На этом этапе я брал список доменов у Antifilter.download и фильтровал по ключевым словам, исходники алгоритма доступны здесь (step 1) , при желании весь процесс можно повторить самостоятельно (если разберетесь в моём говнокоде)

На момент написания исполнения проекта файл domains.lst содержал 577829 доменных имён, на этом этапе мы отфильтровываем 101990 доменных имён (при правильных ключевых словах думаю можно и больше) - таким образом в списке пока 475839 доменных имён

Переходим к Этапу 2

Этап 2 - проверка доступности ресурса

На этом этапе (step 2 в исходниках) проверялось два основных критерия -

  • Доступность сайта по одному из способов - ping, http, https

  • Является ли сайт зеркалом - возвращает ли он ответ HTTP 301, если возвращает, то игнорируется лишь перенаправления на самого себя (например http://www.facebook.com перенаправляет на https://www.facebook.com , это не зеркало)

По итогам этой проверки отфильтровались 281307 доменов и осталось 194532 домена

Этап 3 - проверка содержимого главной страницы по тегам

3-ий этап (step 3 в исходниках) был самым ресурсозатратным, по сути похож на первый, но на этом этапе нужно отфильтровать в том числе припаркованные домены и сайты с нормальными доменами, но бесполезным содержимым

По итогам этого этапа осталось 41598 доменов

Из-за высокой ресурсозатратности процедуры из 3 этапов (в основном 2 и 3) проводить её на регулярной основе затруднительно, а пополнять списки актуальной информацией необходимо и тут на помощь приходят данные от Open Observatory of Network Interference (OONI) которые регулярно публикуют данные по блокировкам во всём мире.

На 4 Этапе ( step 4) будет формироваться список заблокированных доменов на основе данных OONI - в коде берется выборка за неделю и обрабатывается согласно схеме ниже

Схема формирования ooni_domains.lst
Схема формирования ooni_domains.lst

Далее переходим к финальному 5 этапу:

Этап 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 это хостинг, а значит суммаризация по крупным маскам типа /24 может иметь печальные последствия

Резолвинг списков по записям DNS осуществлялся отдельно, после чего создавался единый список IP в котором исключались дубликаты и на последнем этапе добавлялись подсети из справочника ASN и происходила суммаризация по маске, но не больше чем /28. В итоговом списке IP адресов на 13.10.24 - 23434 IP адреса включая IP адреса серверов Discord, что более чем пригодно для использования на роутерах.

3. Результат

А что в итоге?

В итоге получились списки (доступные в репозитории):

  • актуальных заблокированных доменов в количестве - 42662 домена

  • список IP адресов полученных из резолвинга - 23434 IP адреса

Которые в т.ч. используются для сборки списков V2Fly, Xray - geoip.dat и geosite.dat,

Sing-box - geoip.db, geosite.db

В тестовом режиме запущен BGP Сервер - 165.22.127.207 (номер автономной системы AS 65412) где раздаётся список ipsum.lst - о том как настраивать - на OpenWRT (Linux) и Mikrotik

В итоге получился список доменов в котором осталось 6.2% записей от изначальных в списках РКН (и можно фильтровать ещё) + есть актуальный и оперативный способ их пополнять, не только на основе данных РКН, но и на основе независимого источника (YouTube до сих пор нет в списках РКН, а блокировки есть)

Отвечая на вопрос "Если в списке РКН так много мусора, почему бы вообще от него не отказаться?" - В списке РКН много мусора, но есть и довольно ценные ресурсы о существовании которых многие из нас не вкурсе, и которые вряд ли попадут в списки созданные с нуля, а в списке РКН они есть

В ближайших планах сделать автоматическую сборку на основе GitHub Actions и вылавливать ошибки - резолвинг пришлось делать с 0, поэтому возможно ошибки.

Спасибо что читаете, переходите на GitHub и ставьте отметки репозиторию, оставляйте обратную связь и предлагайте домены для community.lst.

Надеюсь что кому-то из коллег, в частности: Antifilter.download, Antifilter.network, @ValdikSSмогут пригодится эти наработки в их проектах.

Комментарии (2)


  1. PetyaUmniy
    13.10.2024 15:23

    Годнота! С нетерпением жду когда будут автоматически выкладываться отфильтрованные списки url'ов.
    Я роучу через прозрачный nginx по sni_name. Расстраиваюсь от того что приходится держать в нем целую кучу бестолковых и давно неактуальных записей жрущих память.


    1. dartraiden
      13.10.2024 15:23

      Как вариант, можно поднять на домашнем роутере nfqws и указать, чтобы он сам пополнял список заблокированных ресурсов. Т.е. при первом столкновении с таким ресурсом он понимает, что ресурс блокируется, добавляет его в список и дальше уже всегда "дурит" трафик, адресованный ресурсу.

      Таким образом, обход блокировок применяется лишь к ресурсам, которые пользователь реально хочет посетить, силы не отвлекаются ни на зеркала казино, ни даже на заблокированные домены, которые пользователь не посещает. Бонусом это позволяет обходить и непубличные блокировки а-ля YouTube/Discord, поскольку способ не полагается на какие-либо публичные списки.

      Минус: невозможно попасть на сайты, которые сами со своей стороны блокируют доступ россиянам, но таких сайтов несравнимо меньше.