Элементы защиты от 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 атаки на наш сервер. Конечно это всего лишь один маленький элемент, но степень защиты уже выше. С помощью очень простых средств.