v0.11.3 — pilot
Pre-releaseSusanin 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 \
cmd="/usr/local/bin/susanin setup" \
no-sh \
timeout=300
Пример начала:
Project: Susanin
Router: 172.31.254.1:8728
Auth: auto-provisioned local agent
Connecting...
Authenticated.
После этого Susanin проверит LAN и покажет подходящие tunnel interfaces.
Пример:
Choose the VPN/tunnel interface where blocked traffic should go:
1) wg-awg-proxy type=wg running
Selection:
Введите номер.
Например:
1
Что делает setup
После выбора туннеля Susanin:
- проверяет LAN;
- определяет IP-сети LAN;
- проверяет tunnel interface;
- ищет подходящую routing table;
- если возможно — использует существующую;
- генерирует RouterOS scripts;
- рассчитывает fingerprints;
- создаёт временные validator scripts;
- заставляет сам RouterOS проверить syntax;
- удаляет validator objects;
- создаёт production data-plane disabled;
- проверяет созданные объекты;
- включает всё только в самом конце;
- сохраняет выбранный VPN/routing table.
Чистая установка
На чистом RouterOS Susanin должен увидеть:
Managed legacy-compatible objects present: 0/16
и выполнить fresh install.
Пример успешного результата:
=== SUSANIN FRESH INSTALL v0.11.3 ===
Preflight: validating generated RouterOS source...
PASS auto-awg-health
PASS auto-awg-fast
PASS auto-awg-detect
PASS auto-awg-judge
Creating production scripts...
Creating safety and routing mangle rules disabled...
Creating schedulers disabled...
Committing data-plane...
Fresh install result: SUCCESS
scripts=4
schedulers=4
mangle=8
safety=3
data-plane started
Что создаётся в RouterOS
Scripts
auto-awg-health
auto-awg-fast
auto-awg-detect
auto-awg-judge
Schedulers
auto-awg-health
auto-awg-fast
auto-awg-detect
auto-awg-judge
Интервалы:
health 3s
fast 1s
detect 2s
judge 1s
Mangle
Создаётся 8 основных adaptive routing rules:
AUTO-AWG: L2 mark confirmed
AUTO-AWG: L1 mark test
AUTO-AWG: L2 mark confirmed UDP
AUTO-AWG: L1 mark test UDP
AUTO-AWG: L2 route confirmed
AUTO-AWG: L1 route test
AUTO-AWG: router DNS UDP via tunnel
AUTO-AWG: router DNS TCP via tunnel
Также создаются 3 safety rules SUSANIN:.
Проверка после установки
Status
/container/shell susanin-controller \
cmd="/usr/local/bin/susanin status" \
no-sh \
timeout=60
Нормальное состояние:
Summary: scripts=4/4 schedulers=4/4 mangle=8
Installation state: detected
Structural reconciliation
Проверить конфигурацию без изменений:
/container/shell susanin-controller \
cmd="/usr/local/bin/susanin apply --dry-run" \
no-sh \
timeout=60
Для полностью синхронизированной установки:
KEEP=16 CREATE=0 UPDATE=0 BLOCKERS=0
Result: IN SYNC structurally.
Эта команда read-only.
Discovery
Посмотреть, что Susanin видит на роутере:
/container/shell susanin-controller \
cmd="/usr/local/bin/susanin discover" \
no-sh \
timeout=60
Пример:
RouterOS: 7.23.3
Architecture: arm64
LAN interface-list 'LAN' members:
bridge-LAN
LAN addresses:
bridge-LAN 192.168.1.1/24 network=192.168.1.0
Potential tunnel/egress interfaces:
wg-awg-proxy type=wg running=true
Renderer
Проверить генерацию RouterOS scripts:
/container/shell susanin-controller \
cmd="/usr/local/bin/susanin render" \
no-sh \
timeout=60
Ожидается:
Generator state: READY
и fingerprints четырёх scripts.
Fresh-install dry-run
Проверить, что Susanin собирается создать:
/container/shell susanin-controller \
cmd="/usr/local/bin/susanin install --dry-run" \
no-sh \
timeout=60
На чистой установке ожидается примерно:
Managed legacy-compatible objects present: 0/16
Susanin fresh-install support objects present: 0/4
Would create transactionally:
4 generated scripts
4 schedulers
8 AUTO-AWG compatibility mangle rules
3 SUSANIN private-network safety bypass rules
Result: READY FOR FRESH INSTALL.
Как смотреть логи
Live adaptive routing logs
/log print follow-only where message~"AUTO-AWG:"
Возможные события:
AUTO-AWG: FAST ...
AUTO-AWG: SOFT ...
AUTO-AWG: CONFIRMED ...
AUTO-AWG: tunnel DOWN ...
AUTO-AWG: tunnel UP ...
Логи bootstrap/controller
/log print where message~"SUSANIN:"
При нормальном bootstrap можно увидеть:
SUSANIN: container queued for extraction
SUSANIN: controller bootstrap finished; helper cleanup queued
Dynamic cache
Посмотреть все Susanin address lists:
/ip firewall address-list print where list~"auto_awg_"
Основные TCP lists:
auto_awg_watch_tcp
auto_awg_test_tcp
auto_awg_ok_tcp
auto_awg_cooldown_tcp
UDP:
auto_awg_watch_udp
auto_awg_test_udp
auto_awg_ok_udp
auto_awg_cooldown_udp
Дополнительно:
auto_awg_health_fail
TCP и UDP обучаются отдельно
Один и тот же IP может одновременно иметь:
TCP → DIRECT
UDP → VPN
или наоборот.
Это нормальное состояние.
Причина — разные протоколы могут фильтроваться по-разному.
Особенно это важно для:
TCP/443
UDP/443
QUIC
TTL cache
Подтверждённые направления не записываются навсегда.
Они имеют TTL и автоматически очищаются.
Confirmed cache живёт примерно:
~6 часов
Таким образом Susanin не превращается в очередную вечную базу IP.
Как работает обучение
Упрощённый алгоритм:
CLIENT
↓
DIRECT
↓
connection tracking
↓
есть признаки проблемы?
│
├─ нет → DIRECT
│
└─ да
↓
WATCH/TEST
↓
следующая попытка через VPN
↓
появился нормальный ответ?
│
├─ да
│ ↓
│ CONFIRMED
│ ↓
│ временно использовать VPN
│
└─ нет
↓
COOLDOWN
↓
оставить DIRECT
FAST
auto-awg-fast работает примерно раз в секунду.
Он ищет быстрые признаки проблемного соединения.
Цель FAST — быстро заметить явные сбои, не дожидаясь долгой эвристики.
SOFT / DETECT
auto-awg-detect работает примерно раз в 2 секунды.
Он ищет менее очевидные признаки:
- зависшее соединение;
- отсутствие нормального прогресса;
- подозрительное состояние connection tracking.
JUDGE
auto-awg-judge оценивает результат теста через VPN.
Если через туннель соединение ожило:
CONFIRMED
Если VPN не помог:
COOLDOWN
Susanin не должен бесконечно гонять бесполезное направление через VPN.
HEALTH
auto-awg-health проверяет состояние туннеля.
Главный принцип:
FAIL OPEN
Если VPN умер, Susanin не должен положить интернет вместе с ним.
Упрощённо:
VPN DOWN
↓
adaptive routing rules выключаются
↓
трафик возвращается в DIRECT
После восстановления:
VPN UP
↓
recovery
↓
adaptive routing возвращается
Как посмотреть schedulers
/system scheduler print where name~"auto-awg-"
Нормально:
auto-awg-health
auto-awg-fast
auto-awg-detect
auto-awg-judge
RUN-COUNT должен расти.
Как посмотреть scripts
/system script print where name~"auto-awg-"
Как посмотреть mangle
/ip firewall mangle print where comment~"^AUTO-AWG:"
Safety rules:
/ip firewall mangle print where comment~"^SUSANIN:"
Как посмотреть controller
/container print detail where name="susanin-controller"
Нормально:
R
tag="0.11.3"
arch="arm64"
После reboot
Controller настроен:
start-on-boot=yes
После перезагрузки MikroTik:
/container print where name="susanin-controller"
Должен снова появиться:
R
Проверяем schedulers:
/system scheduler print where name~"auto-awg-"
Потом:
/container/shell susanin-controller \
cmd="/usr/local/bin/susanin status" \
no-sh \
timeout=60
Note
Dynamic learned cache после reboot может начинать обучение заново.
Это нормально.
Обновление Susanin
Перед обновлением рекомендуется сделать backup.
Новая версия обычно поставляется снова двумя файлами:
susanin.tar
install.rsc
Замените старые файлы в MikroTik Files.
Проверьте новый script:
/import file-name=install.rsc verbose=yes dry-run
После успешной проверки:
/import file-name=install.rsc verbose=yes
Bootstrap заменит controller на target version.
После запуска:
/container print detail where name="susanin-controller"
Затем:
/container/shell susanin-controller \
cmd="/usr/local/bin/susanin status" \
no-sh \
timeout=60
И:
/container/shell susanin-controller \
cmd="/usr/local/bin/susanin apply --dry-run" \
no-sh \
timeout=60
Удаление
Полное удаление Susanin
Скачайте:
uninstall.rsc
Загрузите в Files и выполните:
/import file-name=uninstall.rsc
Этот вариант предназначен для удаления Susanin controller и data-plane.
Перед удалением рекомендуется backup.
Удалить только controller
Если RouterOS data-plane нужно оставить:
uninstall-controller.rsc
После загрузки:
/import file-name=uninstall-controller.rsc
Data-plane продолжит работать непосредственно в RouterOS.
Это возможно потому, что runtime forwarding не зависит от постоянной работы control-plane container.
Архитектура
Susanin разделён на две части.
┌──────────────────────────────┐
│ Susanin container │
│ CONTROL PLANE │
│ │
│ discovery │
│ setup │
│ renderer │
│ validate │
│ install │
│ status │
│ reconciliation │
└──────────────┬───────────────┘
│
│ RouterOS API
▼
┌──────────────────────────────┐
│ RouterOS │
│ DATA PLANE │
│ │
│ scripts │
│ schedulers │
│ connection tracking │
│ address-lists │
│ mangle │
│ routing table │
│ tunnel │
└──────────────────────────────┘
Пользовательский трафик не проходит через Susanin container.
Container используется как control-plane.
Forwarding остаётся в RouterOS.
Почему data-plane находится в RouterOS
RouterOS уже умеет:
- connection tracking;
- mangle;
- routing-mark;
- address-list timeout;
- schedulers;
- scripts;
- интерфейсы;
- FIB.
Поэтому нет смысла проксировать весь пользовательский трафик через отдельный container.
Susanin container только:
устанавливает
проверяет
генерирует
управляет
диагностирует
Credentialless bootstrap
Пользователю не требуется вводить:
RouterOS username
RouterOS password
Router IP
API password
config.env
Bootstrap самостоятельно создаёт внутреннюю machine identity.
Secret
Для susanin-agent генерируется случайный пароль длиной 48 символов.
Он записывается локально в:
susanin-secrets/routeros_password
и монтируется в container как:
/run/secrets/routeros_password
Пароль:
- не передаётся через environment variables;
- не передаётся в command args;
- не требуется от пользователя.
Restricted RouterOS agent
Создаётся отдельный пользователь/group:
susanin-agent
Он предназначен только для внутреннего controller.
Доступ ограничивается адресом:
172.31.254.2/32
Используемые права ограничены задачами Susanin.
RouterOS API
Controller подключается:
172.31.254.2
↓
172.31.254.1:8728
Bootstrap гарантирует возможность подключения Susanin controller к RouterOS API и создаёт узкое firewall-разрешение для этого внутреннего канала.
Если на API уже были разрешены другие доверенные адреса, bootstrap старается не ломать существующий доступ.
Временные elevated helpers
Для bootstrap на короткое время создаётся служебный RouterOS worker с повышенными правами.
После успешного запуска controller создаётся one-shot cleanup.
В результате временные:
susanin-bootstrap-worker
susanin-bootstrap-cleanup
не должны оставаться после завершённого bootstrap.
Проверка:
/system scheduler print where name~"susanin-bootstrap-"
/system script print where name~"susanin-bootstrap-"
После успешной установки вывод должен быть пустым.
Transactional fresh install
Susanin не должен создавать половину data-plane и оставлять роутер в непонятном состоянии.
Поддерживаются три основных состояния.
0/16
ничего нет
Susanin может выполнить fresh install.
16/16
полная существующая установка
Susanin не создаёт дубликаты.
Частичное состояние
Например:
7/16
Susanin должен блокировать автоматическую установку вместо попытки угадать намерения администратора.
Validation
Перед commit production scripts создаются временные validator objects.
Сам RouterOS проверяет их syntax.
После проверки validator objects удаляются.
Только если все четыре scripts валидны, fresh install продолжается.
Fingerprints v0.11.3
Для протестированной конфигурации использовались следующие generated script fingerprints:
auto-awg-health
bytes=3356
fnv1a64=24fc884bbe4473dc
auto-awg-fast
bytes=4780
fnv1a64=17f96c5f8c6b94de
auto-awg-detect
bytes=7387
fnv1a64=af897abaf3841a18
auto-awg-judge
bytes=5965
fnv1a64=737624f7c52ad08a
Fingerprints позволяют Susanin сравнивать RouterOS scripts со своим desired state.
Реальный баг RouterOS API, найденный во время разработки
Во время fresh-install тестирования обнаружилась проблема не в RouterOS routing, а в нашем C API client.
RouterOS API может вернуть:
!empty
!done
для пустого результата.
Первоначально Susanin ошибочно считал:
!empty
концом команды.
Из-за этого:
!done
оставался в TCP stream и принимался за ответ следующей команды.
Получалась рассинхронизация API stream.
Пример:
command A
↓
!empty
!done
старый client остановился на !empty
command B
↓
client читает оставшийся !done от A
↓
думает, что B уже закончилась
В результате standalone render мог работать, а install --dry-run после серии пустых inventory queries внезапно переставал видеть LAN.
В v0.11.3 исправлено:
завершением RouterOS API command считается только !done
Это один из реальных примеров того, почему проект пока имеет статус pilot.
Другой найденный нюанс RouterOS
При bootstrap выяснилось, что запись secret-файла непосредственно из /import на тестовом RouterOS могла давать zero-byte file.
Поэтому bootstrap архитектура была изменена:
/import
↓
устанавливает worker
↓
worker запускается как normal RouterOS script
↓
генерирует secret
↓
записывает
↓
read-back verification
↓
только потом меняет пароль agent
Пароль agent не меняется, если secret не удалось корректно записать и прочитать обратно.
Fail-open
Один из главных принципов Susanin:
сломался VPN ≠ сломался интернет
Если tunnel health падает:
adaptive VPN routing
↓
disabled
↓
DIRECT
При восстановлении:
tunnel UP
↓
recovery
↓
adaptive routing снова включается
NAT
Если для выбранного VPN уже существует активный подходящий masquerade, Susanin старается использовать существующий NAT вместо создания дубликата.
На тестовой установке fresh install показал:
tunnel NAT=EXISTING
DNS
Data-plane также содержит RouterOS output rules для DNS через выбранную routing table:
AUTO-AWG: router DNS UDP via tunnel
AUTO-AWG: router DNS TCP via tunnel
Что уже реально протестировано
На реальном ARM64 MikroTik с RouterOS 7.23.3 проверено:
- credentialless bootstrap;
- bootstrap при изначально выключенном RouterOS API;
- автоматическое включение API;
- restricted internal agent;
- secret generation;
- secret write/read-back verification;
- container extraction;
- automatic container start;
- cleanup elevated bootstrap helpers;
- discovery RouterOS version;
- discovery ARM64;
- LAN interface-list discovery;
- LAN IPv4 discovery;
- tunnel discovery;
- выбор VPN;
- automatic routing table detection;
- generated RouterOS scripts;
- script validation средствами RouterOS;
- clean install
0/16 → 16/16; - transactional commit;
- 4 production scripts;
- 4 schedulers;
- 8 adaptive mangle rules;
- 3 Susanin safety rules;
- existing tunnel NAT detection;
- TCP adaptive learning;
- UDP adaptive learning;
- protocol-specific caches;
- fail-open в DIRECT;
- recovery после VPN return;
- reboot MikroTik;
- automatic controller start;
- automatic scheduler start;
- learned cache rebuild;
- structural reconciliation;
KEEP=16 CREATE=0 UPDATE=0 BLOCKERS=0;- отсутствие bootstrap helpers после установки.
Что пока НЕ считается нормально протестированным
Проект пока не следует считать production-ready.
Требуют дополнительных тестов:
- другие ARM64 MikroTik;
- разные RouterOS 7.x;
- multi-WAN;
- multi-VRF;
- сложная policy routing;
- нестандартные firewall layouts;
- несколько одновременно используемых VPN;
- большие LAN;
- IPv6;
- длительная работа неделями и месяцами;
- высокая интенсивность connection tracking;
- нестандартные VPN interface types;
- corner cases RouterOS API.
Возможны false-positive
Susanin использует эвристику.
Это означает:
подозрительное соединение
не всегда означает:
блокировка
Susanin может попробовать VPN там, где проблема была вызвана другой причиной.
Поэтому используется TEST/JUDGE/COOLDOWN, а не немедленное постоянное перенаправление.
Возможны false-negative
Susanin также может не определить некоторые виды фильтрации.
Особенно если connection tracking выглядит нормально, но проблема находится выше сетевого уровня.
Алгоритмы ещё будут корректироваться.
Чего Susanin не делает
Susanin:
- не анализирует содержимое HTTPS;
- не расшифровывает TLS;
- не читает пароли;
- не анализирует payload;
- не ведёт DNS blacklist;
- не использует заранее подготовленную базу сайтов;
- не является DPI;
- не является VPN server;
- не является VPN client;
- не отправляет telemetry наружу.
Если controller не запускается
/container print detail where name="susanin-controller"
Логи:
/log print where message~"SUSANIN:"
Также:
/interface veth print detail where name="veth-susanin"
/ip address print detail where interface="bridge-susanin"
Если Susanin не подключается к API
Проверить:
/ip service print detail where name="api"
API не должен иметь X.
Firewall:
/ip firewall filter print detail where comment="SUSANIN: allow controller API"
Controller:
/container print detail where name="susanin-controller"
Если LAN не обнаруживается
/interface list member print detail where list="LAN"
/ip address print detail
И:
/container/shell susanin-controller \
cmd="/usr/local/bin/susanin discover" \
no-sh \
timeout=60
Если VPN не появляется в setup
Проверьте сам interface:
/interface print detail
WireGuard:
/interface wireguard print detail
VPN должен быть:
running
disabled=false
Если routing table не находится
/routing table print
/ip route print detail
Susanin пытается автоматически определить таблицу по выбранному egress.
Если однозначной существующей таблицы нет, в некоторых сценариях Susanin может подготовить отдельную таблицу.
Проверка health
Статус:
/container/shell susanin-controller \
cmd="/usr/local/bin/susanin status" \
no-sh \
timeout=60
Логи:
/log print where message~"AUTO-AWG:"
Полезный общий диагностический набор
Если создаёте Issue, приложите вывод без секретов:
/system resource print
/system package print
/system device-mode print
/interface list member print detail where list="LAN"
/ip address print detail
/interface print detail
/routing table print
/ip route print detail
/container print detail where name="susanin-controller"
/system scheduler print where name~"auto-awg-"
/ip firewall mangle print where comment~"^AUTO-AWG:|^SUSANIN:"
Susanin:
/container/shell susanin-controller \
cmd="/usr/local/bin/susanin discover" \
no-sh \
timeout=60
/container/shell susanin-controller \
cmd="/usr/local/bin/susanin status" \
no-sh \
timeout=60
/container/shell susanin-controller \
cmd="/usr/local/bin/susanin apply --dry-run" \
no-sh \
timeout=60
Не публикуйте:
- private keys;
- VPN credentials;
- пароли;
- sensitive exports;
show-sensitive;- содержимое secret-файлов.
Issues
Баги, результаты тестирования и предложения:
https://github.com/Fiark/susanin/issues
Особенно интересны тесты:
- на других ARM64 MikroTik;
- на других RouterOS 7.23.x;
- с обычным WireGuard;
- с AmneziaWG через proxy;
- с другими route-based tunnels.
SHA256
Для проверки загруженных файлов скачайте:
SHA256SUMS
На Linux:
sha256sum -c SHA256SUMSПроверять нужно файлы Release, а не заново собранные локальные образы.
Исходный код
Репозиторий:
https://github.com/Fiark/susanin
Основные каталоги:
src/
templates/
bootstrap/
tools/
docs/
.github/workflows/
Язык
Control-plane написан на:
C11
Сборка проверяется с:
-Wall
-Wextra
-Wpedantic
-Werror
CI
GitHub Actions проверяет:
- сборку C11;
- strict compiler warnings;
- secret hygiene scan;
- Docker smoke build.
Release pipeline
Для тегов:
v*
GitHub Actions автоматически:
- собирает ARM64 container image;
- создаёт
susanin.tar; - добавляет bootstrap scripts;
- рассчитывает SHA256;
- создаёт pilot pre-release.
Лицензия
Susanin распространяется под:
MIT License
Статус проекта
На текущий момент:
PUBLIC
PILOT
EXPERIMENTAL
ARM64
RouterOS 7.23.3 reference test
Susanin уже прошёл настоящий clean-install и reboot-test на реальном MikroTik, но это не означает production-ready.
Главная цель первой публичной версии — получить больше реальных тестов.
Короткая установка для тех, кто уже всё прочитал
Сделайте backup.
Скачайте:
susanin.tar
install.rsc
Загрузите в Files.
Проверка:
/import file-name=install.rsc verbose=yes dry-run
Установка:
/import file-name=install.rsc verbose=yes
Ждём:
/container print where name="susanin-controller"
до:
R
Setup:
/container/shell susanin-controller \
cmd="/usr/local/bin/susanin setup" \
no-sh \
timeout=300
Выбираем VPN.
Проверяем:
/container/shell susanin-controller \
cmd="/usr/local/bin/susanin status" \
no-sh \
timeout=60
И:
/container/shell susanin-controller \
cmd="/usr/local/bin/susanin apply --dry-run" \
no-sh \
timeout=60
Нормально:
KEEP=16 CREATE=0 UPDATE=0 BLOCKERS=0
Result: IN SYNC structurally.
Live logs:
/log print follow-only where message~"AUTO-AWG:"
Спасибо
Спасибо автору:
timbrs/amneziawg-mikrotik-c
https://github.com/timbrs/amneziawg-mikrotik-c
и его статье:
https://habr.com/ru/articles/1002824/
Без этого проекта Susanin, скорее всего, не появился бы в таком виде.
И спасибо всем, кто решит рискнуть и проверить этот пилот на своём ARM64 MikroTik.
Пожалуйста, сначала сделайте backup. 🙂