
Зачем нужен C2 на малинке: краткий контекст
Command and Control сервер — это центральная точка управления сетевой инфраструктурой, позволяющая отправлять команды на удалённые машины и собирать данные об их состоянии. Обычно такие системы разворачивают на мощных серверах, но оказывается, что для локальной сети или небольшого парка устройств можно обойтись и Raspberry Pi. За счёт низкого энергопотребления и компактности «малинка» идеально подходит для домашней лаборатории или микросервисной архитектуры.
Выбираем софт: что установить на Pi
Первое решение — выбрать фреймворк. Я остановился на сочетании Node.js и Express.js для быстрого развёртывания HTTP API, но вы можете использовать Python с Flask или Go с Gin — всё зависит от ваших предпочтений.
Также потребуется:
- SQLite или PostgreSQL для хранения информации об агентах
- Redis как брокер сообщений для асинхронной обработки команд
- PM2 или systemd для управления процессами
- Nginx в качестве reverse proxy
Главное преимущество этого стека — его экономичность по памяти. Pi с 4 ГБ ОЗУ легко справляется с обработкой команд от десятков агентов одновременно.
Пошаговое развёртывание за вечер
Шаг 1: Подготовка окружения (15 минут)
Устанавливаем последнюю версию Raspberry Pi OS (preferably Lite для экономии ресурсов):
- Обновляем систему:
sudo apt update && sudo apt upgrade -y - Устанавливаем Node.js 18+ через NodeSource репозиторий
- Устанавливаем git, curl и nano для конфигурирования
Шаг 2: Создание базовой структуры проекта (20 минут)
Создаём папку проекта и инициализируем npm-проект:
- Создаём файл package.json с зависимостями: express, sqlite3, axios, uuid
- Устанавливаем зависимости через npm install
- Создаём структуру папок: /src, /config, /routes, /models
Базовая архитектура: Express сервер слушает на портах 3000 (API) и 8080 (агенты), Redis работает на 6379 для кеширования команд.
Шаг 3: Реализация ядра C2 (30 минут)
Основной функционал включает три endpoint’а:
- POST /api/register — регистрация нового агента с уникальным ID
- GET /api/command/:agent_id — получение очереди команд для агента
- POST /api/report/:agent_id — приём результатов выполнения команд
Для каждого агента храним: уникальный идентификатор, последнее время активности, версию клиента и статус. Команды сохраняются в SQLite с полем выполнения и результатом.
Шаг 4: Веб-интерфейс управления (25 минут)
Создаём простой HTML dashboard с использованием Bootstrap. На нём отображаются:
- Список всех активных агентов в реальном времени
- История команд и их статусы
- Форма для отправки новой команды выбранным агентам
- Логирование всех действий
Для обновления в реальном времени используем простой fetch-loop с интервалом 2 секунды (нагрузка минимальна даже на слабом Pi).
Шаг 5: Безопасность и автозапуск (15 минут)
Создаём systemd-сервис для автоматического запуска приложения при перезагрузке. Добавляем базовую аутентификацию через API-ключи, которые хранятся в переменных окружения. Для production рекомендуется использовать OAuth2, но для домашней лаборатории достаточно.
Настраиваем Nginx как reverse proxy для защиты от прямого доступа к Node.js процессу и ограничения rate limit’ов.
Практические советы из реального опыта
Мониторинг нагрузки. Используйте htop и iotop для отслеживания использования ЦП и диска. Pi часто упирается в I/O при работе с SQLite — если нагрузка велика, мигрируйте на PostgreSQL.
Логирование. Настройте систему логирования через winston или bunyan. Файлы логов имеют тенденцию расти быстро, поэтому используйте логротацию.
Сетевая безопасность. Запускайте C2 только в изолированной сети, используйте VPN для удалённого доступа. Никогда не открывайте порты напрямую в интернет без шифрования.
Масштабирование. При количестве агентов больше 100 рассмотрите использование очереди сообщений (RabbitMQ) и горизонтального масштабирования на несколько Pi или переход на более мощное оборудование.
Чеклист проверки перед боевым использованием
Перед тем как развернуть систему в production, убедитесь:
- Все зависимости установлены и актуальны
- Системный сервис стартует при перезагрузке
- Логирование и мониторинг включены
- Резервные копии БД создаются автоматически (cron скрипт)
- API endpoints защищены аутентификацией
- HTTPS/TLS настроены для внешних подключений
- Проведено нагрузочное тестирование минимум на 50 одновременных агентов
- Документирована процедура восстановления после сбоев
Результаты и выводы
За один вечер я развернул полностью функциональную систему управления агентами, потребившую всего 400 строк кода на Node.js. Raspberry Pi справляется с нагрузкой от 30-40 активных клиентов без каких-либо проблем, потребляя при этом менее 3 ватт электроэнергии.
Такое решение идеально подходит для домашней лаборатории, обучения или прототипирования инфраструктуры управления. Если требуется масштабировать дальше, перейти на «настоящие» серверы будет несложно — архитектура остаётся той же, меняется только оборудование.
Код проекта я разместил на GitHub в публичном репозитории с MIT лицензией — можете использовать как отправную точку для своих экспериментов.
morfix.ru