
Пользовательский бот и защита от DDoS для небольших HTTP-сервисов
Пользовательский слой обмана, который превращает DDoS-атаки и злоупотребления ботами в пустую трату усилий.
Net Ward располагается перед вашим HTTP-сервисом в качестве обратного прокси. Настоящий трафик проходит через него без изменений. Известные пробы и флуды получают безвредные зеркальные ответы, которые сжигают усилия ботов и никогда не достигают вашего приложения — без хуков ядра, без полезных нагрузок, без ответных мер, по принципу fail-open.
Создано и поддерживается Dragon Lady — github.com/Dragon-Lady · X: @answerislove2 Независимый исследователь безопасности, отслеживающий активные кампании по атакам на цепочки поставок и злоупотреблению ботами в реальном мире.
Сайт: dragon-lady.github.io/netward-standalone
python -m pip install --upgrade "netward>=0.4.12"
python -m netward --config example_config.json
Версия 0.4.12 или новее является рекомендуемой базовой версией для новых установок и обновлений. Более старые выпуски остаются доступными для воспроизводимости; новым развёртываниям следует использовать текущий выпуск.
Или из исходного кода:
git clone https://github.com/Dragon-Lady/netward-standalone
cd netward-standalone
pip install -e .
Net Ward прослушивает listen_address и перенаправляет чистый трафик на upstream_target.
Скопируйте пример конфигурации и отредактируйте целевой upstream:
cp example_config.json config.json
Перед запуском Net Ward укажите в upstream_target реальный HTTP-сервис. Если upstream недоступен, несовпавшие запросы возвращают ответ зеркала по умолчанию вместо раскрытия сырой ошибки прокси.
Обязательные поля:
| Поле | Значение |
|---|---|
node_id | Стабильное имя для этого экземпляра Net Ward |
upstream_target | Защищаемый HTTP-сервис |
listen_address | Хост и порт, к которым привязывается Net Ward |
Необязательные поля управляют интенсивностью зеркалирования, локальным хранилищем, заполнителями mesh, каналами оповещений, тайм-аутами upstream и хранением журнала проб. Совпадение с шаблоном или начало флуда запросов записывает оповещение в SQLite. Оповещения дедуплицируются по типу, источнику и шаблону в течение пяти минут. Пустой список alert_channels отправляет в stdout; выберите любую комбинацию stdout, email, slack и ntfy для явной доставки. Исходящая доставка выполняется в фоне и повторяет попытки для неудачных каналов. Недавние недоставленные оповещения повторяются при запуске.
Email требует alert_email, alert_smtp_host и alert_smtp_from. Задайте alert_smtp_port и alert_smtp_security (starttls, ssl или none); none допускается только для SMTP-сервера на loopback. Если требуется аутентификация, задайте alert_smtp_username и alert_smtp_password_env как имя переменной окружения, содержащей пароль. Slack требует alert_slack_webhook. ntfy требует alert_ntfy_topic (тема на ntfy.sh или полный URL темы на собственном сервере); для защищённой темы задайте alert_ntfy_token_env как имя переменной окружения, содержащей её bearer-токен. HTTP-назначения должны использовать HTTPS, кроме loopback. alert_timeout_secs по умолчанию равен пяти секундам. Net Ward проверяет запрошенные назначения при запуске и сохраняет квитанции об успешной доставке в таблице alerts. Сообщения оповещений содержат IP-адрес источника, ID шаблона и классификацию; они не включают сырые тела запросов или заголовки.
| Необязательное поле | По умолчанию | Значение |
|---|---|---|
upstream_timeout_total | 10 | Бюджет всего запроса для вызова upstream, в секундах |
upstream_timeout_connect | 3 | Тайм-аут подключения (DNS + TCP + TLS), в секундах |
upstream_timeout_sock_read | 5 | Время простоя между чтениями из сокета upstream, в секундах |
upstream_max_concurrency | 64 | Одновременные запросы к upstream |
upstream_max_body_bytes | 8388608 | Макс. буферизуемое тело ответа upstream (8 MiB). Тела большего размера fail-open переходят к зеркалу по умолчанию |
probe_retention_secs | 604800 | TTL журнала проб (7 дней) |
probe_max_rows | 10000 | Макс. число строк журнала проб после очистки при записи |
alert_timeout_secs | 5 | Тайм-аут на канал для исходящей доставки оповещений, в секундах |
python -m netward --config config.json
Пример топологии:
| Компонент | Адрес |
|---|---|
| Net Ward | 127.0.0.1:8080 |
| Upstream-приложение | http://127.0.0.1:9000 |
| Хранилище | netward.db |
Направьте балансировщик нагрузки или веб-сервер на Net Ward. По возможности оставляйте upstream-приложение доступным только с хоста или из доверенной сети.
Устанавливайте listen_address в 0.0.0.0:<port> только если вы намеренно хотите, чтобы Net Ward был доступен за пределами localhost.
В Linux/macOS следите, чтобы storage_path не был доступен на запись всем пользователям. Пример: chmod 600 netward.db, или chmod 644 netward.db только если вам намеренно нужен доступ на чтение для мониторинга.
Net Ward непрерывно выдерживает заявленную ёмкость на одну машину, но пулы памяти среды выполнения Python могут сохранять состояние рабочего набора после продолжительной высокой нагрузки. Операторам, запускающим Net Ward при непрерывном интенсивном трафике, следует отслеживать использование ресурсов процессом и периодически перезапускать демон, например еженедельно или когда RSS превышает базовый уровень в 2 раза. В v0.5 это руководство будет уточнено на основе отзывов операторов и локальных наблюдений при тестировании, а не автоматической телеметрии.
Чистый запрос должен доходить до upstream:
curl -i http://127.0.0.1:8080/
Известный пробник должен быть зеркалирован:
curl -i http://127.0.0.1:8080/wp-admin/
Проверка WordPress возвращает поддельную страницу входа. Вышестоящий сервис не получает запрос.
С приведённой выше примерной топологией успешный первый запуск должен выглядеть так:
127.0.0.1:9000.127.0.0.1:8080./ через Net Ward и убедитесь, что возвращается ответ вышестоящего сервиса./wp-admin/ через Net Ward и убедитесь, что вместо этого возвращается зеркальный ответ.Ожидаемый результат: обычный трафик доходит до вышестоящего приложения, а известная проверка обрабатывается слоем зеркалирования Net Ward. Это простейший сигнал того, что путь через прокси, сопоставление с шаблоном и зеркальный ответ работают.
Установите или обновите встроенный набор шаблонов вендоров:
python -m netward.cli --db netward.db install-patterns
python -m netward.cli --db netward.db install-patterns --force
Список активных шаблонов: