Веб-форум на базе Django, который я поддерживаю, в последнее время часто подвергался DDOS-атакам на уровне приложений. По сути, похоже, что на домашнюю страницу попадает HTTP-поток, заставляющий сервер выполнять большое количество внутренних запросов и загружать различные файлы для создания страницы. Пик потока составляет ~ 4000 запросов в минуту (типичная пропускная способность составляет около 500 об / мин), что приводит к отключению моего сервера.
Мой веб-сервер - это nginx, служащий обратным прокси для сервера приложений Gunicorn.
Я еще не использовал параметры безопасности Gunicorn: limit_request_line
, limit_request_fields
, limit_request_field_size
). Но у меня есть nginx fail2ban установлен, и в моем jail.local
для предотвращения HTTP-флуда:
[nginx-postflood]
enabled = true
filter = nginx-postflood
port = http,https
logpath = /var/log/nginx/access.log
findtime = 60
maxretry = 13
bantime = 300
[nginx-getflood]
enabled = true
filter = nginx-getflood
port = http,https
logpath = /var/log/nginx/access.log
findtime = 5
maxretry = 6
bantime = 600
Этот параметр не помог, и я не могу понять, почему. Когда я его тестирую, я могу заблокировать свой IP, так что он определенно работает. Возможно, в HTTP-потоке IP-адреса были рандомизированы.
Какую тактику я могу использовать для предотвращения такого рода DDOS на уровне приложений? Будучи новичком, я до сих пор ломаю голову над всем этим. Мы очень ценим помощь экспертов!
В итоге я справился с этим на уровне nginx. Я добавил следующее в http {
в nginx.conf
:
limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;
limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=7r/s;
limit_conn_status 403;
limit_req_status 403;
А затем в файле виртуального хоста server {
блок (вне любого location {
блоки):
limit_conn conn_limit_per_ip 10;
limit_req zone=req_limit_per_ip burst=5 nodelay;
Пока эта конфигурация у меня работает нормально.
Примечание. Работает для DoS, но не уверен, насколько надежно он выдержит DDoS. Надеюсь, эксперт сможет вмешаться.