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

Для пользователя разницы почти нет: ошибка соединения, бесконечная загрузка или заглушка. Но для маршрутизатора это разные сценарии, которым могут понадобиться разные выходные узлы.

Мы сделали открытый проект RU Route Lists. Он разделяет такие ресурсы по категориям, проверяет данные и каждые три часа публикует обновлённые списки для sing-box, Mihomo и собственной VPN-инфраструктуры.

Репозиторий: https://github.com/jutsu-dev/ru-route-lists

Дальше расскажу, почему мы не стали отправлять весь трафик через VPN, как устроено автоматическое обновление и какие проверки выполняются перед публикацией.

Почему не стоит направлять через VPN весь трафик

Полная маршрутизация через VPN проще в настройке, но у неё есть очевидные минусы:

  • растёт задержка даже для доступных ресурсов;

  • увеличивается нагрузка на VPN-сервер;

  • расходуется лишний трафик;

  • могут перестать работать банки и локальные сервисы;

  • сайты с антифродом могут начать запрашивать дополнительные проверки;

  • нельзя назначить разные страны выхода для разных сервисов.

Раздельная маршрутизация работает точнее.

Ресурсы, доступ к которым ограничен внутри России, можно направить через VPN. Зарубежные сервисы, не принимающие российские IP, — через иностранный выход. Всё остальное продолжит работать напрямую.

Проблема в том, что домены и IP-адреса постоянно меняются. Обновлять конфигурацию вручную неудобно, а однажды забытый список быстро превращается в археологический экспонат.

Какие списки публикуются

В каждом выпуске RU Route Lists находятся четыре файла.

rkn-domains.lst — домены ресурсов, ограниченных в России.

rkn-ipsets.lst — связанные с ними IP-адреса и CIDR.

foreign-geoblock-domains.lst — домены зарубежных сервисов, ограничивающих подключения с российских IP.

foreign-geoblock-ipsets.lst — IP-адреса и CIDR таких сервисов.

На момент подготовки статьи актуальная сборка содержала:

  • 1 196 334 домена в категории ограниченных ресурсов;

  • 55 097 записей IP/CIDR в этой же категории;

  • 522 домена зарубежных сервисов с геоограничениями;

  • 1 504 записи IP/CIDR для зарубежного геоблока.

Это снимок одной сборки, а не постоянная статистика. Актуальные значения находятся в файле manifest.json последнего релиза.

Исходные данные берутся из открытого проекта RussiaFancyLists:

https://github.com/Noktomezo/RussiaFancyLists

RU Route Lists добавляет проверку входных данных, стабильные ссылки для скачивания, контрольные суммы, архив и установщик для Linux.

Зачем разделять домены и IP-адреса

Доменное правило обычно точнее. Оно направляет через нужный маршрут конкретный сервис.

IP-адрес может принадлежать общей инфраструктуре Cloudflare, AWS, Akamai или другого CDN. Если направить через VPN слишком широкий диапазон, вместе с нужным ресурсом туда могут уйти десятки несвязанных сайтов.

Поэтому основная рекомендация проекта простая: сначала использовать доменные списки, а IP/CIDR подключать только при необходимости.

Категории ограничений тоже разделены намеренно. Для ресурса из первой категории достаточно доступного VPN-узла. Для зарубежного геоблока нужен выход с IP другой страны. Если смешать всё в один файл, управлять маршрутами и диагностировать проблемы станет сложнее.

Почему списки не хранятся в Git

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

Поэтому Git хранит только код, конфигурации и документацию. Списки публикуются в постоянном GitHub Release с тегом latest.

GitHub Actions выполняет пять действий:

  1. Загружает свежие данные.

  2. Проверяет формат и количество записей.

  3. Создаёт манифест и контрольные суммы.

  4. Собирает ZIP-архив.

  5. Заменяет файлы в релизе latest.

Ссылка для автоматического скачивания остаётся постоянной:

https://github.com/jutsu-dev/ru-route-lists/releases/download/latest/rkn-domains.lst

Конфигурацию клиента не приходится менять после каждого обновления.

Проверка данных перед обновлением

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

Обновляющий скрипт выполняет следующие проверки:

  • принимает данные только по HTTPS;

  • ограничивает время подключения и загрузки;

  • повторяет запрос после временной сетевой ошибки;

  • отклоняет пустые файлы;

  • проверяет минимальное количество записей;

  • ищет некорректные строки в доменных и CIDR-списках;

  • отклоняет подозрительное уменьшение установленного списка более чем вдвое;

  • блокирует одновременный запуск нескольких обновлений;

  • заменяет файлы атомарно только после успешной проверки.

Если обновление завершается ошибкой, старая рабочая версия остаётся на месте.

Для каждого выпуска дополнительно создаются:

  • manifest.json с датой сборки, количеством записей, размером и SHA-256;

  • SHA256SUMS для проверки файлов;

  • ru-route-lists-latest.zip с полным комплектом;

  • отдельные файлы .lst для автоматической загрузки.

Установка на Linux

Клонируем репозиторий и запускаем установщик:

git clone https://github.com/jutsu-dev/ru-route-lists.git
cd ru-route-lists
sudo ./install.sh

После установки списки будут находиться в каталоге:

/var/lib/ru-route-lists

Проверяем состояние таймера и журнал обновлений:

systemctl status ru-route-lists.timer
journalctl -u ru-route-lists.service --since today
ls -lh /var/lib/ru-route-lists

Для удаления обновляющего скрипта и systemd units используется команда:

sudo ./install.sh --uninstall

Установщик намеренно не удаляет уже загруженные списки. Пользовательские данные остаются в /var/lib/ru-route-lists.

Использование с sing-box

Для sing-box 1.14+ можно подключить готовые бинарные rule sets источника.

{
  "route": {
    "rule_set": [
      {
        "tag": "rkn",
        "type": "remote",
        "format": "binary",
        "url": "https://raw.githubusercontent.com/Noktomezo/RussiaFancyLists/main/lists/blacklist-sing-box/domains/full-sld.srs",
        "update_interval": "3h"
      },
      {
        "tag": "foreign-geoblock",
        "type": "remote",
        "format": "binary",
        "url": "https://raw.githubusercontent.com/Noktomezo/RussiaFancyLists/main/lists/geoblock-sing-box/domains/full-sld.srs",
        "update_interval": "3h"
      }
    ],
    "rules": [
      {
        "rule_set": ["rkn", "foreign-geoblock"],
        "action": "route",
        "outbound": "proxy"
      }
    ]
  }
}

Это фрагмент, а не полная конфигурация. Тег proxy должен соответствовать outbound в конкретной установке.

Использование с Mihomo

Mihomo поддерживает удалённые rule providers в формате MRS.

rule-providers:
  rkn:
    type: http
    behavior: domain
    format: mrs
    url: https://raw.githubusercontent.com/Noktomezo/RussiaFancyLists/main/lists/blacklist-mihomo/domains/full-sld.mrs
    path: ./ruleset/rkn.mrs
    interval: 10800

  foreign-geoblock:
    type: http
    behavior: domain
    format: mrs
    url: https://raw.githubusercontent.com/Noktomezo/RussiaFancyLists/main/lists/geoblock-mihomo/domains/full-sld.mrs
    path: ./ruleset/foreign-geoblock.mrs
    interval: 10800

rules:
  - RULE-SET,rkn,PROXY
  - RULE-SET,foreign-geoblock,PROXY
  - MATCH,DIRECT

В примере обе категории используют группу PROXY. При необходимости их можно направить через разные группы или выходные узлы.

Ограничения проекта

RU Route Lists не является официальным реестром и не определяет юридический статус ресурсов.

В списках могут встречаться устаревшие записи, ложные срабатывания и пропуски. Доступность сайта зависит не только от домена или IP-адреса, но и от провайдера, DNS, протокола, SNI, DPI и региона.

Проект также не разворачивает VPN-сервер и не выбирает страну выхода. Он решает более узкую задачу: предоставляет обновляемые данные для маршрутизации и безопасный механизм их доставки.

Особенно осторожно стоит работать с IP-списками. Общая инфраструктура CDN делает их эффективным, но достаточно грубым инструментом.

Почему проект стал открытым

Изначально эти списки понадобились нам для собственной VPN-инфраструктуры. Но задача типовая: с ней сталкиваются администраторы домашних серверов, разработчики прокси-клиентов, владельцы роутеров и небольшие VPN-проекты.

Поэтому код опубликован под лицензией MIT. В репозитории есть документация на русском и английском языках, шаблоны issues, правила участия и отдельное указание лицензии исходного набора данных.

Нам особенно полезны:

  • проверяемые сообщения о ложных срабатываниях;

  • информация о пропущенных доменах;

  • конфигурации для других маршрутизаторов;

  • предложения по дополнительной валидации;

  • исправления установщика и документации.

Репозиторий проекта:

https://github.com/jutsu-dev/ru-route-lists

Последний выпуск:

https://github.com/jutsu-dev/ru-route-lists/releases/tag/latest

Если проект оказался полезным, можно поставить звезду. Если нашли ошибку, лучше создать issue — для развития проекта это ещё полезнее.