CrowdSec + MikroTik: баню сканеров прямо на роутере
У домашнего сервера с белым IP есть один неизбежный спутник — бесконечный поток сканеров, которые круглые сутки долбятся во все порты. Мне не нравилась идея пускать их до сервисов, поэтому я сделал так, чтобы атакующий умирал на самом краю сети — на роутере, ещё до того, как доберётся куда-либо.
Как это работает
Связка из трёх частей, и все они — свои:
- MikroTik шлёт логи дропов файрвола (и access-лог реверс-прокси) в CrowdSec;
- CrowdSec по сценариям ловит сканы портов, брут и веб-атаки, а ещё тянет глобальную репутацию (community-блоклист);
- самописный баунсер на Python раскладывает атакующих по
address-list, которые роутер дропает на WAN.
Фильтрация на самом краю: сканер, который вчера час стучался в порты, теперь отсекается за секунды — молча, бесплатно и без участия сервера.
Что получилось интересного
Баунсер вышел маленьким, но аккуратным: TTL банов живёт через нативный
timeout RouterOS (баны само-выпадают даже если баунсер умер),
состояние сверяется с реальным содержимым роутера (дрейф чинится сам),
а отдельный sentinel-маркер переживает ребут роутера. Большой community-список
вынесен в отдельный процесс, чтобы не «голодить» быстрый локальный цикл.
Сверху — наблюдаемость (Prometheus + Grafana) и пуш-алерты в телефон через ntfy, если детект вдруг замолчит. Всё своё, без единого внешнего сервиса, которому надо доверять свои логи.
Статьи и код
Я расписал всё подробно — от первой строчки в логе до графиков и алертов — в цикле статей и выложил готовый обезличенный репозиторий «бери и запускай»:
- 📖 Цикл статей на forum.samohosting.ru (5 частей: локальный детект → community → веб-детект → мониторинг → алерты);
- 🐙 Репозиторий на GitHub — баунсер, конфиги, compose, всё под MIT.
Изначально делал под себя, а потом решил поделиться — в этом и весь смысл open-source. Поднимайте, ломайте, переделывайте под свою сеть.