Точечная маршрутизация на Mikrotik: BGP и Address lists + Mangle.Для обхода блокировок в том числе и Ютуба
- Как загрузить список из 500 доменов на mikrotik, чтоб он их преобразовал в IP-адреса?
- Как заставить Mikrotik резолвить домены по wildcard?
- Как поднять Shadowsocks\VLESS на ROS?
Я задался этими вопросами, достал hAP ac lite из шкафа и посмотрел, на что способна ROS 7 в конце 2024 года. Поместил всем известные способы, а также попробовал запихать много доменов в address-lists. Также я собрал все актуальные способы обхода блокировки с подробными инструкциями тут
Настройка WireGuard в ROS 7
Для начала вам нужен туннель, в который будет направляться трафик для определённых ресурсов. По настройке туннелей в ROS много мануалов. Я просто приведу пример настройки WG, именно по нему нормальный ман нелегко найти. Хотя сложного ничего тут нет.
В address нужно указать IP-адрес с подсетью (пример 10.7.0.2/24), в network подсеть (пример 10.7.0.0).
Обязательно нужно задать параметр persistent-keepalive, без него туннель не поднимется.
Проверить, что трафик ходит через интерфейс
Ещё можно глянуть, что значения Rx и Tx ненулевые в WireGuard - Peers
Теперь можно настраивать списки и маршрутизацию.
Какие способы перенаправления трафика известны на текущий день для RouterOS?
BGP. Классика для Mikrotik
Есть два сервиса, которые предоставляют услугу анонса заблокированных IP-адресов и подсетей
Они это делают, чтоб вы могли их заблокировать на роутере. Но для учебных целей их можно направить в туннель.
Первый возник в 2018, второй в 2019 году. Создатели antifilter.network не особо запаривались с неймингом, но запарились с реализацией сервиса.
Оба имеют списки:
- Все IP-адреса, который надо заблокировать
- Их суммаризация для сокращения количества префиксов
- Блокируемые подсети
Чем отличаются?
- У antifilter.download есть список community. Он создаётся из резолвинга доменов, которые добавили пользователи сервиса
- У antifilter.network есть прикольная фича по выбору списков, не прибегая к фильтрации префиксов на роутере
- У antifilter.network есть список с суммаризацией от /32 до /23 маски
- antifilter.network имеет много других списков
У обоих проектов есть чаты, где вы можете задать свой вопрос.
Antifilter.download
Настроим получение префиксов из списка subent+ipsum+community от antifilter.download. Эти списки отдаются по умолчанию.
Требуется подставить переменные:
- 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 для связи с сервисом.
Antifilter.network
Настройка получения префиксов с antifilter.network очень похожа.
Основная информация находится на странице https://antifilter.network/bgp.
На этой же странице выбирайте списки, которые вам нужны, проходите reCAPTCHA и нажимаете Применить. Теперь к вашему IP-адресу и указанной там AS привязана отдача только выбранных списков. Хитро и очень прикольно сделано.
Настройка такая же, как для antifilter.download, отличаются только Remote Address, Remote AS и вашей AS. А router-id должен содержать IP-адрес, на который вы применили настройки. Эти настройки берутся с их страницы BGP. Фильтровать по community тут не нужно, поэтому правило фильтрации просто с accept;.
С настроенной BGP сессией на роутере, после нажатия на кнопку Применить уже через несколько секунд прилетают выбранные маршруты.
Делайте трассировку с клиента роутера до необходимого ресурса, маршрут должен проходить через туннель.
Как выключить роутинг при mangle+address-list?
Routing - BGP - Connection, кнопка Disable у поднятого конекшена
Мой опыт с BGP и подводные камни
Главная проблема - это суммаризация. Она нужна, чтобы не было сотен тысяч адресов в Routes. Но в этом случае в туннель также улетают некоторые не заблокированные ресурсы. И это может быть проблемой. Разберём два примера, и что с этим делать.
Таким образом, при блокировке у себя на роутере этих префиксов, вы заблокируете многое другое.
Пример первый. Сайт leroymerlin.ru
Без правки MSS история такая же. Потому что Леруа лежит тоже за Qrator Labs. После правки MSS сайт открывается и вещает:
Тут очевидно: надо выкинуть эту подсеть из роута.
Пример с фильтрацией одного префикса для BGP. Правим routes - filter - rule для BGP меняем поле rule:
Для исключения двух подсетей используется логический оператор OR.
В процессе тестов я обнаружил, что фильтрация на сервисе настроена, скорее всего, по спискам подсетей известных ДЦ. Ситуация, описанная выше, была с известным европейским ДЦ. А когда я использовал, видимо, свежий и "не запаленный" американский IP-адрес, то оба сайта открылись через VPN без проблем. Сайт Леруа не смутил американский IP-адрес, а для Хабра не понадобился костыль с правкой MSS для WG.
Может, без суммаризации тогда?
На обоих сервисах рядом со списками ip.lst упомянуто "Использовать с осторожностью". Ради теста я решил помучать мой hAP lite ac. От 130548 префикса в routes ему стало плохо.
Выкачка списков IP-адресов и подсетей в Address List
Если по какой-то причине вы не используйте 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+address-list?
Просто выключить mangle правило. ip - firewall - mangle, кнопка Disable для созданного выше правила.
Список доменов в Address lists
Переходим к самому интересному. Я достал Mikrotik из шкафа именного для этого. Встроенный в ROS резолвинг доменов и добавление их IP-адресов в списки реализован просто добавлением в address-lists нужного домена.
Добавляйте домен, он сразу резолвится и появляется в этом списке. Звучит неплохо, но есть парочка проблем.
Это хорошо работает на 5, 10, 20 доменах, но если число доменов переваливает примерно за сотню, то начинаются тормоза. Это может быть как просто от большого списка без настроенного правила mangle, ну а с ним роутеру точно будет плохо.
Возьмём список с ~500 доменами и с помощью sed сформируем команды для добавления этих доменов в address-list.
Чисто для тестов, возьмём список с ~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
Что можно взять из встроенного функционала резолвинга ROS?
Добавить в Address-lists самые необходимые домены. Скорее даже ресурсы, которых нет в предоставляемых списках подсетей или они резолвятся у вас по-другому.
Остановиться, когда роутеру станет плохо.
В случае, если уже используется реализация роутинга по Address List, добавить ещё один magle
В случае использования BGP, то же самое что для других списков, только подставьте своё имя списка в $LIST:
Таким образом, лучшее решение для Mikrotik, к которому я пришёл - это использовать BGP + mangle по доменам.
Костыли
Костыли основаны на том, что вы используйте DNS-сервер не ROS, а поднятый где-то у себя. Он, тем или иным образом, добавляет IP-адреса в Address-list или routes через BGP по списку
Что ещё можно придумать?
- OpenWrt как виртуальная машина на роутере с DNS сервером и каким-то скриптом внутри
- Можно поставить DNS сервер в docker на роутере, если ваш роутер имеет ARM архитектуру
- Можно по USB подключить какой-нибудь zero PI и развернуть это на нём.
Я ничего из этого не реализовывал. Если вдруг вы, да, будет интересно почитать про ваш опыт
Список доменов в DNS static, wildcard. Добавлено в ROS 7.5
Cтало известно ещё об одном способе добавления 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 по примеру выше.
Провайдер вмешивается в DNS трафик
В ROS7 есть поддержка DoH, настраивается в IP - DNS. Необходимо просто указать DoH сервер. Например, https://1.1.1.1/dns-query.
Блокировка VPN-протоколов и Mikrotik
Mikrotik не поддерживает комбайны XRay и Sing-box. Поэтому в этом случае вижу два с половиной пути решения:
- Если вы организация, можете предоставить IP-адреса ваших VPN-серверов куда-то там и забыть о такой проблеме.
- Цепочка серверов. Как мы знаем, VPN-протоколы не блокируются, если пакет идёт к российскому IP-адресу, поэтому можно поднять WG на российском сервере и уже с него перенаправлять трафик до сервера с нероссийским IP-адресом. Либо вообще использовать для этих целей сервер рядом с Mikrotik, который также будет на своей стороне перенаправлять трафик в туннель, который маскируется под HTTPS.
- Мне кто-то писал про разворачивание XRay/Sing-box в docker прям на Mikrotik. Опять же, нужен роутер с ARM процессором. Для меня это выглядит странно и ненадёжно, но может, я ошибаюсь.
С другой стороны, есть вероятность, что вам это не понадобится в ближайшем году. Или покрайней мере хватит SSTP.
Хотите использовать большие списки доменов и Shadowsocks/VLESS/etc прямо на роутере? Рекомендую посмотреть в сторону реализации этого на OpenWrt.
Если у вас есть какой-то опыт по любому из пунктов статьи - будет интересно почитать. Особенно про списки доменов.
Все актуальные способы и подробные инструкции для разных устройств начиная от мобилки заканчивая Smart TV собрал тут