Один из сайтов нашей компании стал слишком долго отвечать на http
запросы. Команда top
показывала 100% загрузку по всем ядрам процессами nginx. Лог доступа к веб-серверу был буквально забит запросами вроде:
47.95.9.207 - - [10/Feb/2019:17:14:19 +0000] "GET / HTTP/1.1" 200 16363 "https://xn--80aaao1abwipfgfp.xn--p1ai/" "98a009751d36fdd18070aad5e7e58ca5; verifying pingback from 92.53.65.22"
209.182.253.170 - - [10/Feb/2019:17:11:19 +0000] "GET / HTTP/1.1" 200 0 "https://xn--80aaao1abwipfgfp.xn--p1ai/" "WordPress/4.9.9; http://209.182.253.170; verifying pingback from 92.53.65.22"
Количество запросов с разных ip адресов превышало 50-60 в секунду. Сайт краснодарсайт.рф на каждый ответ тратил более 20 секунд — практически был мертвым. Каждый запрос содержал verifying pingback в поле user-agent.
Простое и в тоже время эффективное решение: ipset
. Во всех дистрибутивах Linux, как правило, присутствует в репозиториях, устанавливается:
apt|yum install ipset
Далее выполняем команды:
ipset -N ddos iphash
iptables -A INPUT -m set --match-set ddos src -j DROP
while true; do tail -100 /var/log/nginx/access.log | sort | grep pingback | uniq -c | awk '{print $2}' | xargs -tl -I _ ipset -A ddos _; sleep 20; done
… — /var/log/nginx/access.log = путь к access логу веб-сервера.
За час работы фильтра в его базу попало более 10 000 адресов, с которых шла атака:
root@web4:~# ipset -L | wc -l
10413