Я где-то писал, как можно блокировать ip-адреса с помощью nginx. Я смотрел адреса, которые имеют больше всего запросов за время ротации лога, вручную смотрел к каким страницам идёт соединение и если это были админки WordPress или Joomla, добавлял их в чёрный список и отдавал ошибку.
Автоматизировать это я решил самописным скриптом.
Скрипт анализирует лог, выделяет ip-адреса, которые более 3000 раз обращались к админке WordPress и Joomla и если этих ip-адресов ещё нет в чёрном списке, то добавляет их туда.
Скрипт запускается каждый час кроном.
Создаём файл скрипта:
# vim /etc/nginx/blockips.sh
#!/bin/bash
# Nginx block ip more than 3k connections to WordPress and Joomla admin panels
# v0.1 29.06.2014
# v0.2 30.06.2014
# IP's > 3000 connections to WordPress and Joomla admin panels
command=$(cat /var/log/nginx/access.log | \
grep "administrator\|wp-login" | \
cut -f1 -d " " | \
sort | \
uniq -c | \
sort -n | \
awk '{ if ($1 > 2999) print $2}')
# Add new ip's to database
for word in $command; do
# Is that ip already in database?
grep $word /etc/nginx/blockips.conf > /dev/null
if (( $? ));
then
sed -i "s/allow all;/deny $word;\nallow all;/" /etc/nginx/blockips.conf
fi
done
exit 0
Делаем скрипт исполняемым:
# chmod +x /etc/nginx/blockips.sh
Создаём файл, в котором будут храниться "плохие" ip-адреса:
# vim /etc/nginx/blockips.conf
allow all;
Адреса можно добавлять вручную, главное чтобы они находились перед allow all; формат файла такой:
deny ip_1;
deny ip_2;
...
allow all;
Подключаем этот файл в конфиг nginx (секция http):
# vim /etc/nginx/nginx.conf
http{
Автоматизировать это я решил самописным скриптом.
Скрипт анализирует лог, выделяет ip-адреса, которые более 3000 раз обращались к админке WordPress и Joomla и если этих ip-адресов ещё нет в чёрном списке, то добавляет их туда.
Скрипт запускается каждый час кроном.
Создаём файл скрипта:
# vim /etc/nginx/blockips.sh
#!/bin/bash
# Nginx block ip more than 3k connections to WordPress and Joomla admin panels
# v0.1 29.06.2014
# v0.2 30.06.2014
# IP's > 3000 connections to WordPress and Joomla admin panels
command=$(cat /var/log/nginx/access.log | \
grep "administrator\|wp-login" | \
cut -f1 -d " " | \
sort | \
uniq -c | \
sort -n | \
awk '{ if ($1 > 2999) print $2}')
# Add new ip's to database
for word in $command; do
# Is that ip already in database?
grep $word /etc/nginx/blockips.conf > /dev/null
if (( $? ));
then
sed -i "s/allow all;/deny $word;\nallow all;/" /etc/nginx/blockips.conf
fi
done
exit 0
Делаем скрипт исполняемым:
# chmod +x /etc/nginx/blockips.sh
Создаём файл, в котором будут храниться "плохие" ip-адреса:
# vim /etc/nginx/blockips.conf
allow all;
Адреса можно добавлять вручную, главное чтобы они находились перед allow all; формат файла такой:
deny ip_1;
deny ip_2;
...
allow all;
Подключаем этот файл в конфиг nginx (секция http):
# vim /etc/nginx/nginx.conf
http{
...
include blockips.conf
}
Добавляем скрипт в cron:
# crontab -e
...
Добавляем скрипт в cron:
# crontab -e
...
* * * * * /etc/nginx/blockips.sh
0 */1 * * * /usr/bin/service nginx restart
0 */1 * * * /usr/bin/service nginx restart
3 комментария:
При таком подходе остается нагрузка на nginx, лишнии записи в логе.
Сразу бы в iptables.
Да и конфиг nginx, разве не надо перечитывать каждый раз после добавления новых адресов?
>Да и конфиг nginx, разве не надо перечитывать каждый раз после добавления новых адресов?
Да, надо
В репозитории github описано, как пользоваться скриптом.
Отправить комментарий