Только разрешённые HTTP‑методы проходят: блокируем шумные запросы Nginx 405/444
\nВо время работы с веб‑приложением, наблюдая за логами, иногда встречаются такие моменты.
\n- \n
- Я думал, что использую только
GET / POST / PUT / DELETE\n - В логах появляется неизвестный метод \n
Например, в логах может появиться PROPFIND – метод WebDAV. Приложение, конечно, отреагирует как «неподдерживаемый метод», но важно то, что происходит.
Нужно ли заставлять серьёзное приложение обрабатывать лишний шум?\nОтвет обычно «нет». Поэтому удобно позволять только нужные методы, а остальные блокировать на уровне Nginx.
\n\n
Почему стоит блокировать на Nginx
\nБлокировать можно и на уровне приложения, но к тому моменту запрос уже пришёл, и уже возникли расходы.
\n- \n
- Вход в WSGI/ASGI \n
- Запуск некоторых middleware/логирования/аутентификации \n
- Загрязнение логов приложения «настоящими» проблемами \n
- При росте трафика накапливается лишняя нагрузка \n
Если блокировать на Nginx:
\n- \n
- Сразу завершаем на первом уровне → минимальные расходы \n
- Логи приложения остаются чистыми → упрощается эксплуатация \n
- Уменьшается поверхность атаки → лишние методы просто не видны \n
В одном предложении:
\n\n\nПриложение создаёт продукт, а Nginx играет роль стража.
\n
\n
Необычные методы в логах обычно не «нормальный» трафик
\nМетоды вроде PROPFIND – типичный пример.
- \n
- Сканирование, чтобы проверить, включён ли WebDAV \n
- Если по ошибке открыты
PUT/MKCOL, пытаются перейти к следующему шагу \n - Иногда видны паттерны с пустым User‑Agent или «плохим» HTTP/1.0 \n
Главный вывод:
\nЕсли наш сервис не использует этот метод, то вероятность того, что это нормальный трафик, почти нулевая. Поэтому нет смысла отправлять запрос в приложение и отвечать дружелюбно.
\n\n
Стратегия проста: работа по списку разрешённых
\n
Принцип – «открыть только то, что нужно, и закрыть всё остальное».
\n- \n
- Статические страницы/ресурсы: обычно достаточно
GET,HEAD\n - API: ограничиваем
POST/PUT/PATCH/DELETEтолько нужными эндпоинтами \n
И все остальные методы (например, PROPFIND, MKCOL, LOCK и т.д.)\nесли мы их не используем, блокируем полностью – это самый удобный способ управления.
\n
405 против 444: какой ответ использовать
\nЕсть два основных способа блокировки.
\n1) 405 Method Not Allowed
\n- \n
- Стандартный и понятный \n
- Сообщает клиенту, что метод недоступен \n
2) 444 (Nginx‑специфичный: закрыть соединение без ответа)
\n- \n
- Полностью разрывает соединение \n
- Не даёт подсказок сканерам/ботам \n
- В эксплуатации тихий и чистый подход («убираем шум») \n
На практике часто применяют так:
\n- \n
- Для «неполезных» методов в открытом вебе – 444 \n
- Для клиентских ошибок, где пользователь может ошибиться – 405 \n
\n
Пример конфигурации Nginx: «разрешить только нужные методы» – два шаблона
\nНиже приведены готовые примеры, которые можно сразу копировать.
\nШаблон A) Базовый: только GET/HEAD, API – дополнительные методы
\nserver {\n # ... listen/server_name и т.д. ...\n\n # 1) Базовый: веб/статические – только GET/HEAD\n location / {\n if ($request_method !~ ^(GET|HEAD)$) { return 444; } # или 405\n proxy_pass http://app;\n }\n\n # 2) API: разрешаем нужные методы\n location /api/ {\n if ($request_method !~ ^(GET|HEAD|POST|PUT|PATCH|DELETE|OPTIONS)$) { return 444; }\n proxy_pass http://app;\n }\n}\n\n- \n
/обычно обслуживает только страницы, поэтомуGET/HEADдостаточно. \n/api/может потребоватьOPTIONSиз‑за CORS. \n
Шаблон B) «Блокируем только подозрительные методы» (легкое начало)
\nlocation / {\n if ($request_method ~ ^(PROPFIND|PROPPATCH|MKCOL|COPY|MOVE|LOCK|UNLOCK)$) { return 444; }\n proxy_pass http://app;\n}\n\n- \n
- Убирает шумные методы, которые обычно видны в логах. \n
- В долгосрочной перспективе лучше использовать Allowlist (шаблон A). \n
\n\nПримечание: хотя в Nginx часто предупреждают о злоупотреблении
\nif, простые условия сreturnшироко применяются в практике. Если нужна более строгая реализация, можно использоватьlimit_except.
\n
Вывод: «Разрешить только нужные» упрощает эксплуатацию
\nКлючевые моменты:
\n- \n
- Необычные методы почти всегда не «нормальный» трафик \n
- Отправка в приложение создаёт лишние расходы и загрязняет логи \n
- Блокируем всё, кроме разрешённых методов, на уровне Nginx (405/444) \n
Применив один из этих шаблонов, вы получите:
\n- \n
- Меньше нагрузки на приложение \n
- Чистые логи \n
- Упрощённую эксплуатацию \n