Элементы защиты от DDOS посредством nginx + ipfw
Недавно у меня на хостинге появился сайтик на WordPress, уж не знаю чем он так полюбился кому, но стал замечать, что регулярно идет к нему POST запрос на wp-admin.php с разных адресов - видимо пароли подбирают или еще что-то. Это создавало ненужную нагрузку на сервер (в моем случае не критичную, но все же).
Озадачился решением проблемы. Гугление дало вариант, который мне понравился.
Итак, в конфигурации хоста (я, после тестирования добавил во все хосты) в секции location прописываем простые правила:
location / {
# Если юзер-агент пустой - нам такой пользователь не нужен
# записываем его IP в специальный лог и возвращаем 404
if ($http_user_agent = "") {
access_log /var/log/nginx-ban.log IP;
return 404;
}
set $add 1;
set $ban "";
if ($http_referer = "" ) {set $ban $ban$add;}
if ($request_method = POST ) {set $ban $ban$add;}
# Если страница откуда обращаются пустая и метод POST
# записываем его IP в специальный лог и возвращаем 404
if ($ban = 11 ) {
access_log /var/log/nginx-ban.log IP;
return 404;
}
В данном случае nginx у меня работает как фронтэнд к apache.
Теперь в нужном месте (правильное построение правил ipfw выходит за рамки этой заметки) правил ipfw прописываем простенькое правило:
ipfw add NNNN deny ip from table(1) to any
Теперь наша задача переносить IP из лога "неблагонадежных" сформированного nginx в таблицу 1 фаервола. У меня это делает простенький shell скрипт, запускающийся по крону каждые 2 минуты:
#!/bin/sh
# Читаем лог и выбираем только уникальные адреса
cat /var/log/nginx-ban.log | sort | uniq | while read ip; do
# По циклу заносим выбранные адреса в таблицу
ipfw table 1 add $ip
done
# Очищаем лог
echo '' > /var/log/nginx-ban.log
Все. Такими простыми мерами мы несколько уменьшаем вероятность DDOS атаки на наш сервер. Конечно это всего лишь один маленький элемент, но степень защиты уже выше. С помощью очень простых средств.