Project 08Бета 1.0.0

ScanGuard

Security · Monitoring · Telegram Bot · Self-hosted

ScanGuard следит за логами nginx, Caddy и SSH, находит сканеры и присылает в Telegram карточку: страна, хост, ASN, провайдер и теги. Под карточкой кнопки «Забанить» и «Скип». Есть админ-панель прямо в боте, свои правила для проверок РКН и ГРЧЦ, белый список и автобан. Ставится одной командой на VPS, открытый код под MIT.

Версия1.0.0
СистемаLinux с systemd, Python 3.9+
Архив0,0 МБ
SHA-2565b4306b479f95c13c896b494866dcf65cfc499043b109401ba5c4357372208bb

Что умеет ScanGuard

Один небольшой сервис на Python и бот в Telegram. Он работает на вашем сервере, а геоданные запрашивает только по IP сканеров.

Логи в реальном времени

Читает access-логи nginx, JSON-логи Caddy и события SSH из auth.log, secure или journald. Переживает ротацию логов и отсутствие файла.

Скоринг запросов

Пути сканеров (.env, .git, wp-login, phpmyadmin), боты по User-Agent (zgrab, masscan, nuclei), ответы 4xx и подбор паролей SSH дают очки. Алерт приходит, когда IP набрал порог за окно времени.

Расшифровка IP

Страна и город, хост (rDNS), ASN, провайдер, организация и теги: хостинг или дата-центр, прокси или VPN, мобильная сеть.

Бан в один клик

Кнопка «Забанить» вызывает ufw, nftables, iptables или вашу команду, например fail2ban. Баны хранятся в базе и восстанавливаются после перезагрузки для nft и iptables.

Админ-панель в Telegram

Команда /menu: статистика за 24 часа, 7 и 30 дней, списки банов и пропущенных, проверка любого IP, настройки порога и окна кнопками, автобан, пауза, управление админами.

Метка РКН и ГРЧЦ

Вы задаёте свои CIDR, ASN и ключевые слова. Запрос с адреса из CIDR даёт алерт сразу, без порога. Официального списка проверок у РКН нет, поэтому правила добавляете вы.

Защита от самобана

Приватные адреса, IP самого сервера, ваш SSH-адрес на момент установки и белый список никогда не банятся и не алертятся.

Без спама

Не больше 20 алертов в минуту, пауза между алертами по одному IP, кэш геоданных. Скрытые алерты считаются и добавляются в следующую карточку.

Как считаются очки

Очки по одному IP суммируются в окне времени (по умолчанию 5 минут). Порог по умолчанию 5, его можно менять в боте.

СигналОчкиПример
Путь сканера3GET /.env, /wp-login.php, /phpmyadmin/
Плохой User-Agent2zgrab, masscan, nuclei, sqlmap
Ответ 400, 401, 403, 404, 405 или 4441Запрос несуществующей страницы
Пустой User-Agent1Запрос без заголовка
Неудачный вход по SSH1Failed password, Invalid user
Ошибка согласования SSH2Unable to negotiate
Адрес из ваших РКН-CIDRсразу алертЛюбой запрос с подсети из правил

Установка на VPS

От токена бота до первой карточки в Telegram. Установщик задаёт два вопроса: токен и ваш Telegram ID. Остальное он определяет сам и показывает для подтверждения.

Что понадобится

  • VPS с Linux и systemd: Ubuntu, Debian, RHEL-семейство, Arch или Alpine. Нужен Python 3.9 и новее, установщик поставит его сам.
  • Доступ по SSH под root (или sudo -i). Установщик создаёт службу, конфиг в /etc/scanguard и команду scanguard.
  • Бот от @BotFather и ваш числовой Telegram ID (подскажет @userinfobot).
  • Хотя бы один источник: access-лог nginx, JSON-лог Caddy или SSH-лог. Для банов нужен ufw, nftables или iptables.

Какой у вас сценарий?

Выберите сценарий, и лишние шаги будут приглушены. Без выбора показаны все шаги.

  1. 01

    Создайте бота и узнайте свой ID

    В Telegram откройте @BotFather, отправьте /newbot и сохраните токен. Свой числовой ID покажет @userinfobot. Он понадобится установщику: только этот пользователь сможет управлять ботом.

    Токен даёт полный доступ к боту. Не публикуйте его и не вставляйте в чаты. Если он утёк, отзовите его в @BotFather командой /revoke.

  2. 02

    Подключитесь к серверу

    Зайдите на VPS по SSH под root. Если вы вошли обычным пользователем, перейдите в root командой sudo -i и запускайте установку уже оттуда.

    ssh root@IP_СЕРВЕРА
  3. 03

    Установите одной командой Сценарий «Быстро, с вопросами»

    Команда скачивает бандл, сверяет SHA-256 и запускает установщик. Он проверит токен через Telegram, найдёт логи nginx, Caddy и SSH, выберет фаервол (ufw, nft или iptables) и добавит ваш текущий SSH-адрес в белый список.

    bash <(curl -Ls https://1344.pl/downloads/scanguard/get.sh)
  4. 04

    Передайте токен и ID переменными Сценарий «Без вопросов»

    Тот же установщик, но без вопросов. Необязательные переменные: NGINX_LOGS, CADDY_LOGS, SSH_LOGS, BAN_BACKEND (ufw, nft, iptables, custom), WHITELIST, THRESHOLD.

    BOT_TOKEN=123456:ABC... ADMIN_IDS=111111111 bash <(curl -Ls https://1344.pl/downloads/scanguard/get.sh) --yes

    Несколько админов передаются через запятую: ADMIN_IDS=111,222.

  5. 05

    Скачайте бандл и запустите установщик Сценарий «Из архива»

    Скачайте архив по кнопке выше, сверьте контрольную сумму, распакуйте и просмотрите код. Затем запустите install.sh: он копирует проект в /opt/scanguard, создаёт виртуальное окружение и службу.

    sha256sum scanguard-*-all.tar.gz tar xzf scanguard-*-all.tar.gz && cd scanguard-* bash install.sh

    0,0 МБ · SHA-256 5b4306b479f95c13c896b494866dcf65cfc499043b109401ba5c4357372208bb

  6. 06

    Включите JSON-лог в Caddy

    Если вы используете Caddy, добавьте в Caddyfile запись access-лога в формате JSON и перезагрузите Caddy. Для nginx ничего менять не нужно: подойдёт стандартный формат combined.

    log { output file /var/log/caddy/access.log format json }

    Если сервер стоит за Cloudflare или другим прокси, настройте в nginx реальный IP клиента (real_ip_header), иначе бот увидит адрес прокси.

  7. 07

    Откройте бота и проверьте

    После установки бот пришлёт вам сообщение «ScanGuard запущен». Отправьте ему /menu: откроется панель со статистикой, списками и настройками. Для проверки командой /check 8.8.8.8 можно посмотреть карточку любого IP.

  8. 08

    Управляйте службой с сервера

    Установщик добавляет команду scanguard. Конфиг лежит в /etc/scanguard/scanguard.env, база в /var/lib/scanguard, код в /opt/scanguard.

    scanguard status scanguard logs scanguard config scanguard update scanguard uninstall

    Порог, окно, автобан и источники меняются прямо в боте: /menu, затем Настройки. Значения из бота в базе важнее значений из конфига.

Состояние проекта

Версия 1.0.0 — бета. Мы отдельно отмечаем, что уже проверено, а что ещё нет.

ОбластьСтатус
Разбор логов nginx, Caddy и SSH, скоринг, правила РКН, белый список и статистика: 11 автоматических тестовТесты проходят
Бот и админ-панель с настоящим токеном Telegram: алерты, кнопки бана и скипа, спискиПроверено в тестовом запуске
Установщик get.sh и install.sh на реальном VPSЕщё не прогонялся на сервере
Баны через ufw, nftables и iptables, восстановление после перезагрузкиКоманды написаны, на сервере не проверялись
SSH-события из journald и JSON-логи Caddy на реальных логахПроверено только на тестовых строках

Вопросы об установке и работе

Telegram-бот для администратора VPS. Он читает логи nginx, Caddy и SSH, находит сканеры и присылает карточку с расшифровкой IP: страна, хост, ASN, провайдер, теги. Под карточкой кнопки «Забанить», «Скип» и «В белый список». Работает на вашем сервере, открытый код под лицензией MIT.

Подключитесь к VPS по SSH под root и выполните одну команду: bash <(curl -Ls https://1344.pl/downloads/scanguard/get.sh). Установщик спросит токен бота и ваш Telegram ID, найдёт логи и фаервол, создаст службу и запустит её. После этого напишите боту /menu.

Токен выдаёт @BotFather после команды /newbot. Числовой ID покажет бот @userinfobot. Установщик проверяет токен запросом к Telegram, поэтому неверный токен он не примет.

Ставит Python, venv, git и curl через пакетный менеджер системы, копирует проект в /opt/scanguard и ставит зависимости в виртуальное окружение. Записывает конфиг в /etc/scanguard/scanguard.env с правами 600, создаёт службу systemd scanguard и команду scanguard. Ваш SSH-адрес он добавляет в белый список, чтобы вы не забанили себя.

Да. Передайте токен и ID переменными и добавьте ключ --yes: BOT_TOKEN=... ADMIN_IDS=... bash <(curl -Ls https://1344.pl/downloads/scanguard/get.sh) --yes. Это удобно для скриптов и для нескольких серверов.

На Linux с systemd: Ubuntu, Debian, Fedora, RHEL-семейство, Arch и Alpine. Нужен Python 3.9 и новее. Установщик рассчитан на эти системы, но на реальном сервере пока не прогонялся, поэтому о проблемах сообщайте.

nginx читается в стандартном формате combined (/var/log/nginx/access.log). Для Caddy нужен JSON-лог: добавьте в Caddyfile блок log с output file и format json. SSH читается из /var/log/auth.log или /var/log/secure, а если файла нет, из journald. Пути можно изменить в /etc/scanguard/scanguard.env.

Через ufw, nftables или iptables, на выбор при установке. Можно задать свою команду, например fail2ban-client set sshd banip {ip}. Бан закрывает все порты для этого IP. Для nft и iptables бот восстанавливает баны из базы после перезагрузки сервера.

Нет. Приватные и локальные адреса, IP самого сервера, ваш SSH-адрес на момент установки и всё из белого списка бот не банит и не показывает в алертах. Белый список пополняется кнопкой под карточкой или в меню.

Вы добавляете в боте свои CIDR, ASN и ключевые слова (меню «РКН-правила»). Запрос с адреса из CIDR даёт алерт сразу. Совпадение по ASN или слову в названии провайдера добавляет метку «РКН/ГРЧЦ» в карточку. Официального публичного списка адресов проверок нет, поэтому диапазоны вы подбираете сами по своим логам.

Выполните scanguard status и scanguard logs. Частые причины: неверный токен или ID в /etc/scanguard/scanguard.env, вы не нажали /start у бота, в настройках выключен нужный источник, пути к логам указаны неверно, либо мониторинг стоит на паузе. После правки конфига выполните scanguard restart.

Бот общается с Telegram, чтобы присылать вам сообщения. Для расшифровки IP он отправляет адрес сканера на ip-api.com по HTTP, лимит бесплатного плана 45 запросов в минуту. Остальное остаётся на вашем сервере. Логи и содержимое запросов никуда не отправляются.

Да, но у каждого сервера своя установка и свой бот. Один токен нельзя использовать на двух серверах: Telegram позволяет только одному процессу получать сообщения. Создайте по боту на сервер у @BotFather и укажите свой ID для каждого.

Владельцы указываются при установке (ADMIN_IDS). Дополнительных админов владелец добавляет в боте: /menu, «Админы», «Добавить админа», затем числовой Telegram ID. Остальные пользователи бота игнорируются.

Выполните scanguard update. Команда скачивает свежий бандл с 1344.pl, проверяет SHA-256, обновляет код и перезапускает службу. Конфиг и база сохраняются.

Команда scanguard uninstall останавливает службу и удаляет код и команду. Конфиг, базу и таблицу nft она удаляет только после вашего подтверждения. Правила ufw и iptables, добавленные ботом, остаются: снимите их вручную, если нужно.

MIT. Исходный код входит в архив, который вы скачиваете, и вы можете просмотреть его перед установкой.

1344 PROJECT

Другие проекты

01 Бета · Windows

Desktop Software · Music · Open Development

Satoru Player

Настольный музыкальный компаньон: показывает, что вы слушаете, в Discord Rich Presence.

02 Работает

Web Development · Infrastructure · Digital Solutions

WebTime.PL

Веб-разработка и цифровая инфраструктура: сайты, интерфейсы, домены, серверы и поддержка.

03 Релиз-кандидат 0.5.1

Infrastructure · Network Management · Self-hosted

1344 Network Panel

Панель управления VPS и VPN-инфраструктурой: серверы по SSH, пользователи, ссылки, маршрутизация Xray.

04 Бот запущен

Telegram Bot · Access Keys · Community

FreeNet 1344

Telegram-бот, который бесплатно выдаёт ключи доступа для WDTT, qWDTT, PWDTT и iOS VK Turn Proxy за подписку на канал.

05 Открытый код, GPL-3.0

Client · sing-box · Xray · Community project

qThrone

Клиент sing-box и Xray для компьютера и Android с поддержкой qWDTT, CSQTT, olcRTC, OpenFlux, DNSTT, SlipStream, MasterDNS и S3 Bypass.

06 Форум онлайн

Community · Forum · Web

ForumDom

Русскоязычный форум на собственном движке: разделы и темы, профили, личные сообщения, подписки и модерация.

07 Сервис онлайн

Infrastructure · DNS · Free Service

SEMQKA Domains

Бесплатные поддомены на semqka.xyz с редактором DNS и DuckDNS-совместимым обновлением IP.

09 Сервис онлайн

Infrastructure · DNS · Free Service

1344 DNS

Публичный зашифрованный DNS (DoH и DoT) с DNSSEC, без логов и с подменой для выбранных сервисов.