Skip to content

Releases: Fiark/susanin

Release list

v0.11.3 — pilot

v0.11.3 — pilot Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 29 Aug 03:13

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.

Он автоматически:

  1. создаёт controller VETH;
  2. создаёт изолированный bridge;
  3. назначает внутреннюю сеть;
  4. создаёт restricted RouterOS user/group;
  5. генерирует случайный machine password;
  6. записывает secret в локальный файл;
  7. проверяет, что secret корректно записан;
  8. синхронизирует пароль RouterOS agent;
  9. включает RouterOS API;
  10. разрешает controller подключаться к API;
  11. создаёт mounts;
  12. распаковывает container image;
  13. запускает susanin-controller;
  14. удаляет временные 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 \
...
Read more