Анализ access_log сервера Apache и бан DDOS

Со временем на работающий web сервер начинает сыпаться большое число запросов с подозрительных адресов, находящихся, например, в Китае, Австралии и т.д., хотя контент сайта на русском. Иногда доходит до 10-20 запросов в секунду.

Для прекращения этого безобразия написал скрипт, который анализирует лог-файл web-сервера Apache, находит наиболее активные адреса и банит их подсетями вида 203.160.52.0/24. Подсети класса А и B решил не трогать, чтобы не закрыть что-нибудь нужное.

#!/bin/bash
#переходим в каталог со скриптом
cd /home/dmitry/mybash/toban
#берем 300 последних строк, находим интересующую нас странику, на которую нападают, находим в них адреса, сортируем, удаляем дубликаты, отрезаем конец до точки (подсеть класса Ц), пишем в файл ips (команда ниже в одну строку, тут не влезла)
less /var/log/apache2/access_log | tail -n 300 | grep WORD |cut -d «-» -f1 | sort | uniq | rev | sed -r ‘s/^[^.]+//’ | rev | uniq > ips
#берем 300 последних строк, находим страницу, находим адреса, сорпируем их и пишем всех в файл ipsfull
less /var/log/apache2/access_log | tail -n 300 | grep WORD | cut -d «-» -f1 | sort > ipsfull
#удаляем из поиска наш обратный интерфейс на всякий случай
sed -i «/127.0.0./d» ips
#удаляем служебный файл, который мы создадим ниже
rm counts
#запускаем цикл чтения подсетей
cat ips | while read ip

do
#переменной count присваиваем количество нахождения подсети из цикла в файле с общими адресами
count=`less ipsfull | grep $ip | wc -l`
#если сеть попалась больше 15 раз, то делаем:
if [ $count -gt 15 ]

then
#дописываем значение до вразумительного 203.160.52.0/24
ip=$ip»0/24″
#информируем админа в консоли об адресе
echo $ip
#выводим в логфайл
echo $ip >> counts
#выводим в логфайл
echo $count >> counts
#проверяем, есть ли подозреваемая сеть в правилах iptables
result=`iptables -L`

true=`echo $result | grep $ip`
#если ее там нет, добавляем ее в правило Запрет доступа всей подсети к 80 порту
if [ -z «$true» ]

then

iptables -A INPUT -p tcp -s $ip —dport 80 -j DROP

echo «no address in iptables, added»

else
#если ее она там есть, то говорим об этом и заканчиваем скрипт
echo «address already in iptables»;

fi

fi

done

Для настройки скрипта можно править параметр Количество попаданий адреса в последних Количествах строк, чтобы подогнать скрипт под себя. Ну и расположение скрипта тоже смотрите, какая директория у меня из шапки.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.