Как загрузить список из 500 доменов на mikrotik, чтоб он их преобразовал в IP-адреса? Как заставить Mikrotik резолвить домены по wildcard? Как поднять Shadowsocks\VLESS на ROS? Никак Я задался этими вопросами, достал hAP ac lite из шкафа и посмотрел, на что способна ROS 7 в конце 2023 года. Потестил всем известные способы, а также попробовал запихать много доменов в address-lists. UPD 13.12.2023 Стало известно о способе добавления домена в DNS static и складывание зарезолвенных IP-адресов в address list. При этом можно использовать wildcard. Подробности под заголовком "Список доменов в DNS static, wildcard". Для начала вам нужен туннель, в который будет направляться трафик так или иначе заблокированных ресурсов. По настройке туннелей в ROS много мануалов. Я просто приведу пример настройки WG, именно по нему нормальный ман нелегко найти. Хотя сложного ничего тут нет. В address нужно указать IP-адрес с подсетью (пример 10.7.0.2/24), в network подсеть (пример 10.7.0.0). Обязательно нужно задать параметр persistent-keepalive, без него туннель не поднимется. Проверить, что трафик ходит через интерфейс Ещё можно глянуть, что значения Rx и Tx ненулевые в WireGuard - Peers Теперь можно настраивать списки и маршрутизацию. Какие способы обхода блокировок известны на текущий день для RouterOS? Есть два сервиса, которые предоставляют услугу анонса заблокированных IP-адресов и подсетей: https://antifilter.download/ https://antifilter.network/ Первый возник в 2018, второй в 2019 году. Создатели antifilter.network не особо запаривались с неймингом, но запарились с реализацией сервиса. Оба имеют списки: Все IP-адреса, блокируемые РКН Их суммаризация для сокращения количества префиксов Блокируемые подсети Чем отличаются? У antifilter.download есть список community. Он создаётся из резолвинга доменов, которые добавили пользователи сервиса У antifilter.network есть прикольная фича по выбору списков, не прибегая к фильтрации префиксов на роутере У antifilter.network есть список с суммаризацией от /32 до /23 маски antifilter.network имеет много других списков У обоих проектов есть чаты, где вы можете задать свой вопрос. Настроим получение префиксов из списка subent+ipsum+community от antifilter.download. Эти списки отдаются по умолчанию. Благодарю @talifan за конфиг для ROS 7. Требуется подставить переменные: YOUR_AS - ваша рандомная AS. Число в диапазоне 64512-65543, кроме 65432 IP - ваш внешний IP-адрес для того, чтобы не пересекаться с другими пользователями INTERFACE - имя VPN интерфейса, через который необходимо пустить трафик Проверить, что префиксы пришли, можно командой Значения prefix-count и messages должны быть не равны нулю. Либо через winbox\веб-интерфейс. Routing - BGP - Sessions, у поднятой сессии раздел Stats.  Делайте трассировку с клиента роутера до заблокированного ресурса, маршрут должен проходить через туннель. Небольшое пояснение перед следующим абзацем. У antifilter.download есть community список, который составляют сами пользователи. Также в BGP существует понятие community, применятся для маркировки части префиксов. В рассматриваемом контексте используется для разделения и использования разных списков. Не запутайтесь. По умолчанию отдаются вместе subnet, ipsum и community списки. Чтоб получать только список community, необходимо отредактировать filter rule: Остальные BGP community можно посмотреть на сайте в разделе ЧаВо - "Какие комьюнити используются в BGP-фиде?". В случае фильтрации будут прилетать все префиксы, но активны будут только из выбранного community. Посмотреть можно в ip - route Dab - active, те, что используются для маршрутизации DbI - inactive, те, что отфильтровались и для маршрутизации не используются Если ваш провайдер блокирует BGP, можно сделать маршрут через VPN для связи с сервисом. Информация взята из статьи@Furriest, автора antifilter.download. Настройка получения префиксов с antifilter.network очень похожа. Основная информация находится на странице https://antifilter.network/bgp. На этой же странице выбирайте списки, которые вам нужны, проходите reCAPTCHA и нажимаете Применить. Теперь к вашему IP-адресу и указанной там AS привязана отдача только выбранных списков. Хитро и очень прикольно сделано. Настройка такая же, как для antifilter.download, отличаются только Remote Address, Remote AS и вашей AS. А router-id должен содержать IP-адрес, на который вы применили настройки. Эти настройки берутся с их страницы BGP. Фильтровать по community тут не нужно, поэтому правило фильтрации просто с accept;. С настроенной BGP сессией на роутере, после нажатия на кнопку Применить уже через несколько секунд прилетают выбранные маршруты. Делайте трассировку с клиента роутера до заблокированного ресурса, маршрут должен проходить через туннель. Routing - BGP - Connection, кнопка Disable у поднятого конекшена Главная проблема - это суммаризация. Она нужна, чтобы не было сотен тысяч адресов в Routes. Но в этом случае в туннель также улетают некоторые не заблокированные ресурсы. И это может быть проблемой. Разберём два примера, и что с этим делать. У меня habr.com резолвится в 178.248.237.68. Этот IP-адрес из подсети 178.248.236.0/23, которая присутствует во всех трёх списках с суммаризацией. В качестве туннеля используется WG, сайт идёт через туннель и не открывается. Соединение отваливается по таймауту, tcpdump показывает, что IP-адрес 178.248.237.68 на запрос к нему отдаёт пару пакетов по HTTPS протоколу. Дело в том, что эта подсеть принадлежит компании Qrator Labs, которая предоставляет DDOS-защиту. Что-то не нравится какой-то из их систем. В этом случае решение подсказал @olegon-ru. Дело в MSS у WireGuard. Правится следующим правилом: Таким образом продолжаем ходить на Хабр через туннель, ничего страшного, только поломаем немного Хабру аналитику. Без правки MSS история такая же. Потому что Леруа лежит тоже за Qrator Labs. После правки MSS сайт открывается и вещает: Тут очевидно: надо выкинуть эту подсеть из роута. Пример с фильтрацией одного префикса для BGP. Правим routes - filter - rule для BGP меняем поле rule: Для исключения двух подсетей используется логический оператор OR. Тут вторая подсеть как раз та, в которой находится Хабр: В процессе тестов я обнаружил, что фильтрация на сервисе настроена, скорее всего, по спискам подсетей известных ДЦ. Ситуация, описанная выше, была с известным европейским ДЦ. А когда я использовал, видимо, свежий и "не запаленный" американский IP-адрес, то оба сайта открылись через VPN без проблем. Сайт Леруа не смутил американский IP-адрес, а для Хабра не понадобился костыль с правкой MSS для WG. На обоих сервисах рядом со списками ip.lst упомянуто "Использовать с осторожностью". Ради теста я решил помучать мой hAP lite ac. От 130548 префикса в routes ему стало плохо. Если по какой-то причине вы не используйте BGP, то списки можно выкачивать скриптом и загружать в Address Lists. Но в нашем случае списки, которые можно получить по BGP, лучше получать по BGP. По BGP они добавляются в routes. А скрипт кладёт их в address-lists. Дело в том, что address-list + mangle потребляет больше ресурсов, чем routes. Но этот метод тоже рабочий, и поэтому его тоже рассмотрим. Тут логика стандартная: есть список адресов, весь трафик, который идёт к IP-адресам из этого списка мы маркируем и весь маркированный трафик отправляется в туннель. Начнём с формирования списка, списки будем брать у antifilter.network. Для выкачки списков нужен скрипт. На официальном форуме Mikrotik гуру скриптов для ROS уже 4 года вылизывают скрипт для скачивания больших списков. Его и возьмём. Будем использовать списки ipsmart и subnet. Для каждого списка свой address-list. Если будете использовать другие списки, то задавайте их в $update url. Помещаем его в System - Scripts - Add new. Сам скрипт вставляется в поле source. Policy: read, write, test. Сразу запустим Run Script. Проверить, что адреса добавляются можно в Firewall - Address Lists. Добавим в крон System - Scheduler - Add new. Policy такие же, как у скрипта Interval - раз во сколько времени. Например, раз в 23 часа: 23:00:00. On Event - имя скрипта, которое задали при создании скрипта. Одной командой: Создаём таблицу, маршрут в туннель для этой таблицы и два правила маркировки для двух списков. Нужно подставить вместо $INTERFACE имя вашего VPN интерфейса. Делайте трассировку с клиента, маршрут должен проходить через туннель. Просто выключить mangle правило. ip - firewall - mangle, кнопка Disable для созданного выше правила. Переходим к самому интересному. Я достал Mikrotik из шкафа именного для этого. Встроенный в ROS резолвинг доменов и добавление их IP-адресов в списки реализован просто добавлением в address-lists нужного домена. Добавляйте домен, он сразу резолвится и появляется в этом списке. Звучит неплохо, но есть парочка проблем. Это хорошо работает на 5, 10, 20 доменах, но если число доменов переваливает примерно за сотню, то начинаются тормоза. Это может быть как просто от большого списка без настроенного правила mangle, ну а с ним роутеру точно будет плохо. Возьмём список с ~500 доменами и с помощью sed сформируем команды для добавления этих доменов в address-list. Предупреждаю, вашему роутеру, скорее всего, станет плохо. Если хотите повторить, не делайте это на проде. Перед этим списком добавим команду Я протестировал это пару десятков раз и результат добавления 500 доменов бывает разным. Тестировал ROS с дефолтными настройками. Бывает, что сразу всё виснет, включая консоль. А бывает, что на первый взгляд всё окей, но чуть потыкав, замечал большие лаги. И после зачистки списка всё встаёт на свои места. Если вам потребуется удалить все записи во всех списках Или удалить все записи только в одном списке. Пример с vpn-domains При попытке удаления списков часто выдаёт ошибку no such item (4). Бывает нужно повторить несколько раз, а бывает, помогает только рестарт роутера. Сначала я подумал: "у меня просто роутер почти самой младшей модели". По моим опытам это не зависит от мощности железа. Я потестировал на виртуальной машине c ROS, дав ей 4 Ryzen 5 5600U ядра и гигабайт оперативной памяти. Закинув туда те же 500 доменов. Результат был такой же. Но я заметил, что на формирование самого списка IP-адресов из доменов влияет DNS сервер, который использует роутер. На некоторых DNS-серверах список формировался со скрипом, на некоторых быстрее. Видимо, тут дело в лимитах на запросы. Или может дело в ограчении 1Мбит/с для ROS Cloud без лицензии. Но помимо моих экспериментов, один человек поделился своим опытом: hAP ac2 при сотне доменов роутер нагревался и сам рестартился. Если не хотите экспериментировать со своим роутером, я показываю, что происходит в этом случае на видео, ссылка вначале. Могу предположить, что просто такова реализация. В официальной документации не нашёл рекомендаций по количеству доменов в списках. Я не понимаю, почему про это никто не пишет. Вообще не увидел нигде упоминаний, что будет с парой сотней доменов в address-lists. К этому же можно прийти, решая проблему с суммаризацией. Помимо этого, есть ещё парочка проблем: Он умеет резолвить только субдомены, это ставит в выгодное положение на фоне того же Dnsmasq (работает только по wildcard). В случае когда основного домена не должно быть в списках, а субдомен нужен. Но, с другой стороны, это проблема, вам нужно задать все субдомены ресурса. Для маленьких ресурсов несложно собрать, а для больших, у которых они могут быть динамическими и зависят от локации запроса, это проблема. ROS сама резолвит эти домены. Во-первых, мы тут не можем сделать wildcard и встречается с первой проблемой, во-вторых, ROS опирается на TTL DNS-записи. В случае если TTL 8 часов, запись будет обновляться раз в 8 часов, а бывает, TTL ставят около нуля, и роутер будет постоянно обновлять записи. И это никак не настраивается. Даже если бы не было проблем с формированием списка IP-адресов и mangle правило каким-то чудом работало бы быстро, то всё равно упираешься в проблемы описанные выше. Таким образом, использовать большое количество доменов в Address list плохая затея. Что можно взять из встроенного функционала резолвинга ROS? Добавить в Address-lists самые необходимые домены. Скорее даже ресурсы, которых нет в предоставляемых списках подсетей или они резолвятся у вас по-другому. Остановиться, когда роутеру станет плохо. В случае, если уже используется обход по Address List, добавить ещё один magle В случае использования BGP, то же самое что для других списков, только подставьте своё имя списка в $LIST: Таким образом, лучшее решение для Mikrotik, к которому я пришёл - это использовать BGP + mangle по доменам. Костыли основаны на том, что вы используйте DNS-сервер не ROS, а поднятый где-то у себя. Он, тем или иным образом, добавляет IP-адреса в Address-list или routes через BGP по списку доменов. Вот для примера статья про добавление через BGP: Обход блокировок РКН с помощью DNSTap и BGP Что ещё можно придумать? OpenWrt как виртуальная машина на роутере с DNS сервером и каким-то скриптом внутри Можно поставить DNS сервер в docker на роутере, если ваш роутер имеет ARM архитектуру Можно по USB подключить какой-нибудь zero PI и развернуть это на нём. Я ничего из этого не реализовывал. Если вдруг вы, да, будет интересно почитать про ваш опыт. Благодаря Юрию Ряполову @xen85, стало известно ещё об одном способе добавления IP-адресов доменов в address-list. Большое спасибо ему за это открытие. В версии 7.5 было добавлена следующая фича Не обращайте внимание на CLI only, в последующих версиях это появилось и в веб-интерфейсе и в winbox. Это реализация по подобию Dnsmasq+ipset. Добавляем домен в /ip/dns/static Теперь IP-адреса домена и его субдоменов при резолвинге будут складываться в address-list vpn-domains. В type должен быть FWD и обязательно к какому DNS-серверу перенаправлять запрос. Параметр match-subdomain добавляет IP-адреса субдоменов указанного домена в address-list. IP-адреса в address-list будет жить, пока живёт запись в /ip/dns/cache, а там она живёт, пока не истечёт её TTL. Mikrotik hAP ac lite нормально вывез 555 доменов в static. Нагрузки на роутер при этом не добавилось. Тут есть проблема, что обязательно надо куда-то перенаправлять DNS запрос. Нельзя просто без перенаправления складывать в address-list. Ещё нельзя использовать вместе с DoH: Currently DoH is not compatible with FWD type static entries, in order to utilize FWD entries, DoH must not be configured. Таким образом, если ваш провайдер блокирует/подменяет DNS-запросы можно: Перенаправлять DNS-запросы в туннель. Нужен настроенный резолвер на IP-адресе гейта VPN-сервера или в его подсети. Использовать отдельный DNS-сервер, который развёрнут рядом с роутером. Если кто-то это автоматизирует, дайте знать, добавлю ваш код сюда. Без автоматизации можно сформировать список. Пример для добавления: Удаления: Подставьте свой DNS-сервер вместо 8.8.8.8. Дальше все запросы к зарезолвенным IP-адресам направляются в туннель также с помощью mangle по примеру выше. В Dnsmasq такая фича была добавлена 10 лет назад в версии 2.66. Будем надеется, что разработчики ROS сделают ещё один type, который будет обращаться к локальному резолверу без forwarding. И тогда будет совсем хорошо. В ROS7 есть поддержка DoH, настраивается в IP - DNS. Необходимо просто указать DoH сервер. Например, https://1.1.1.1/dns-query. Mikrotik не поддерживает комбайны XRay и Sing-box. Поэтому в этом случае вижу два с половиной пути решения: Если вы организация, можете предоставить IP-адреса ваших VPN-серверов куда-то там и забыть о такой проблеме. Цепочка серверов. Как мы знаем, VPN-протоколы не блокируются, если пакет идёт к российскому IP-адресу, поэтому можно поднять WG на российском сервере и уже с него перенаправлять трафик до сервера с нероссийским IP-адресом. Либо вообще использовать для этих целей сервер рядом с Mikrotik, который также будет на своей стороне перенаправлять трафик в туннель, который маскируется под HTTPS. Мне кто-то писал про разворачивание XRay/Sing-box в docker прям на Mikrotik. Опять же, нужен роутер с ARM процессором. Для меня это выглядит странно и ненадёжно, но может, я ошибаюсь. С другой стороны, есть вероятность, что вам это не понадобится в ближайшем году. Или покрайней мере хватит SSTP, пока системно не научатся его блочить. Статья по настройке BGP на Mikrotik от автора antifilter.download Статья по настройке BGP для OpenWrt Хотите использовать большие списки доменов и Shadowsocks/VLESS/etc прямо на роутере? Рекомендую посмотреть в сторону реализации этого на OpenWrt. Если у вас есть какой-то опыт по любому из пунктов статьи - будет интересно почитать. Особенно про списки доменов. Материалы про VPN и точечный обход блокировок, которые не дотягивают до полноценной статьи, публикую в моём телеграм-канале.