Releases: Fiark/susanin
Release list
v0.11.3 — pilot
Susanin v0.11.3 — pilot release
Susanin — экспериментальная система адаптивной маршрутизации через уже существующий VPN-туннель для MikroTik RouterOS.
Вместо ручного ведения списков доменов и IP Susanin наблюдает за поведением соединений в RouterOS connection tracking, замечает подозрительные сбои при DIRECT-доступе, повторно проверяет направление через выбранный VPN и временно запоминает рабочий путь.
Идея максимально простая:
обычный DIRECT
↓
соединение выглядит сломанным
↓
Susanin временно пробует VPN
↓
через VPN заработало?
├─ да → запомнить VPN для этого IP/протокола
└─ нет → оставить DIRECT
TCP и UDP обучаются раздельно.
Warning
PILOT / EXPERIMENTAL
Susanin находится в очень раннем пилотном состоянии.
Проект активно создаёт и изменяет RouterOS scripts, schedulers, mangle rules и dynamic address lists.
Перед установкой обязательно сделайте backup MikroTik.
На данный момент публичная сборка ориентирована только на ARM64.
Основная тестовая платформа:
MikroTik ARM64
RouterOS 7.23.3
Проект пока не протестирован на большом количестве моделей и сложных конфигураций.
False-positive и false-negative решения возможны.
Главное
Susanin не является VPN-клиентом.
Он не создаёт за вас:
- AmneziaWG;
- WireGuard;
- OpenVPN;
- другой VPN.
У вас уже должен существовать рабочий route-based VPN/tunnel interface в RouterOS.
Susanin только решает:
DIRECT или VPN?
для конкретных направлений на основании реального поведения соединений.
Почему появился Susanin
До этого я маршрутизировал нужные сайты через VPN классическим способом:
домен
↓
DNS
↓
address-list
↓
mangle
↓
VPN
Сначала это нормально работает.
Потом появляются:
- CDN;
- десятки IP у одного сервиса;
- изменение подсетей;
- QUIC;
- отдельное поведение TCP и UDP;
- временные блокировки;
- новые домены;
- старые IP;
- ручное обслуживание списков.
В какой-то момент мне просто надоело постоянно добавлять домены и IP.
Возник вопрос:
А что если не пытаться заранее знать, какой сайт заблокирован, а смотреть на поведение самого соединения?
Так появился Susanin.
Почему «Сусанин»
Название — небольшая самоирония.
Проект не имеет заранее подготовленной карты блокировок.
Он оказывается в лесу из:
IP
CDN
TCP
UDP
QUIC
таймаутов
фильтрации
DIRECT
VPN
connection tracking
и пытается найти рабочую дорогу экспериментально.
Иногда сначала идёт не туда.
Но если другой путь заработал — временно его запоминает.
Вдохновение
Очень сильным толчком для появления Susanin стал проект:
timbrs/amneziawg-mikrotik-c
https://github.com/timbrs/amneziawg-mikrotik-c
и подробная статья автора:
«Наконец-то: AmneziaWG в Mikrotik»
https://habr.com/ru/articles/1002824/
Этот проект показал мне очень практичный подход:
не пытаться заменить всё, что RouterOS уже умеет хорошо, а добавить только недостающий слой.
amneziawg-mikrotik-c решил для меня проблему использования AmneziaWG на MikroTik.
После этого мне окончательно надоело вручную кормить MikroTik списками доменов/IP, и появилась идея сделать следующий слой — автоматический выбор маршрута.
Susanin не является частью amneziawg-mikrotik-c и решает другую задачу, но именно этот проект стал одним из главных источников вдохновения.
О разработке
Я сетевой инженер и специалист по информационной безопасности, а не профессиональный разработчик C.
Я этого не скрываю.
При разработке Susanin активно использовался ChatGPT:
- для разработки C11 control-plane;
- RouterOS scripts;
- анализа RouterOS API;
- code review;
- поиска ошибок;
- анализа логов;
- проектирования bootstrap;
- подготовки документации.
Это намеренно указано публично.
При этом проект не ограничивался генерацией кода.
Susanin итеративно проверялся на реальном MikroTik:
написали
↓
собрали
↓
залили на роутер
↓
сломали
↓
посмотрели RouterOS
↓
нашли причину
↓
исправили
↓
повторили
В процессе были найдены как ошибки Susanin, так и неожиданные особенности RouterOS.
Что требуется
Перед установкой должны быть выполнены следующие условия.
MikroTik
- архитектура ARM64;
- RouterOS 7.23.x;
- установлен пакет
container; - запуск контейнеров разрешён в
device-mode.
LAN
Должен существовать RouterOS interface-list:
LAN
LAN bridge/interface должен входить в этот список.
На LAN должен быть IPv4-адрес.
Например:
interface-list: LAN
member: bridge-LAN
address: 192.168.1.1/24
VPN
Должен уже существовать рабочий route-based VPN interface.
Например:
wg-awg-proxy
Это только пример.
Имя вашего туннеля может быть другим.
Файлы Release
Для обычной установки нужны только:
susanin.tar
install.rsc
Дополнительно:
SHA256SUMS
uninstall.rsc
uninstall-controller.rsc
Назначение:
| Файл | Назначение |
|---|---|
susanin.tar |
ARM64 container image Susanin |
install.rsc |
credentialless bootstrap |
SHA256SUMS |
контрольные SHA256 |
uninstall.rsc |
полное удаление Susanin |
uninstall-controller.rsc |
удалить controller, но оставить data-plane |
0. Сделайте backup
Перед установкой:
/system backup save name=before-susanin
/export file=before-susanin
Убедитесь, что backup действительно появился:
/file print where name~"before-susanin"
1. Проверьте архитектуру
/system resource print
Нужно:
architecture-name: arm64
Если архитектура другая — эту пилотную сборку устанавливать не следует.
2. Проверьте RouterOS
/system resource print
Основная протестированная версия:
7.23.3
3. Проверьте пакет container
/system package print where name="container"
Пакет должен быть установлен и включён.
4. Проверьте device-mode
/system device-mode print
Контейнеры должны быть разрешены.
Если container=no, включите container mode согласно официальной документации MikroTik.
Изменение device-mode может потребовать физического подтверждения на устройстве.
5. Проверьте LAN
/interface list member print detail where list="LAN"
Должен отображаться ваш LAN interface/bridge.
Например:
list=LAN interface=bridge-LAN
Теперь:
/ip address print detail
На LAN должен находиться IPv4-адрес.
Например:
address=192.168.1.1/24
interface=bridge-LAN
6. Проверьте VPN
VPN должен быть уже настроен и реально работать.
Для WireGuard:
/interface wireguard print detail
Также полезно посмотреть таблицы:
/routing table print
и маршруты:
/ip route print detail
Susanin во время setup покажет подходящие route-based tunnel interfaces.
7. Скачайте Susanin
Внизу этой страницы в Assets скачайте:
susanin.tar
install.rsc
Загрузите оба файла в корень Files MikroTik через:
- WinBox;
- WebFig;
- SCP.
После загрузки:
/file print where name="susanin.tar"
/file print where name="install.rsc"
Оба файла должны отображаться.
8. Проверка install.rsc
Перед настоящей установкой:
/import file-name=install.rsc verbose=yes dry-run
В конце ожидается:
No syntax errors found in the import file
dry-run не устанавливает Susanin.
9. Установка bootstrap
Теперь:
/import file-name=install.rsc verbose=yes
Bootstrap работает без запроса пользовательского API login/password.
Он автоматически:
- создаёт controller VETH;
- создаёт изолированный bridge;
- назначает внутреннюю сеть;
- создаёт restricted RouterOS user/group;
- генерирует случайный machine password;
- записывает secret в локальный файл;
- проверяет, что secret корректно записан;
- синхронизирует пароль RouterOS agent;
- включает RouterOS API;
- разрешает controller подключаться к API;
- создаёт mounts;
- распаковывает container image;
- запускает
susanin-controller; - удаляет временные bootstrap helpers после успешного старта.
Внутренняя controller-сеть
Susanin использует:
172.31.254.0/30
RouterOS:
172.31.254.1
Container:
172.31.254.2
Объекты:
bridge-susanin
veth-susanin
10. Дождитесь запуска container
/container print where name="susanin-controller"
Сначала контейнер может быть:
E
то есть extraction.
Потом:
S
и затем:
R
Нужен:
R = RUNNING
Подробнее:
/container print detail where name="susanin-controller"
Для этого Release ожидается:
name="susanin-controller"
tag="0.11.3"
arch="arm64"
root-dir=/susanin-controller-v0113
11. Проверьте API
Bootstrap должен самостоятельно включить RouterOS API.
Проверка:
/ip service print detail where name="api"
У API не должно быть флага:
X
Controller использует внутренний адрес:
172.31.254.2
Также создаётся firewall rule:
/ip firewall filter print detail where comment="SUSANIN: allow controller API"
12. Первый запуск Susanin
Когда susanin-controller имеет флаг R:
/container/shell susanin-controller \
...