Столкнулся с ситуацией, когда интернет-магазин на 1С-Битрикс работающий на VPS в битрикс окружении начал жестко тормозить. С помощью мониторинга (у меня установлен на этом сервере zabbix и есть мониторинг от хостера) единственную аномалию, которую обнаружил — сильно подрос исходящий трафик с сервера. При этом нагрузка на процессор, жесткий диск осталась в пределах обычной нормы, когда ничего не тормозит. Единственное, что пришло на ум — кто то парсит (а парсить было что ценного, да еще и довольно нагрузные страницы в огромном количестве).
Но я не системный администратор и не особо разбираюсь в администрировании вебсерверов. Поэтому начал искать команды, которые мне помогут определить засранца, которыми и хочу поделиться.
Для начала, я пытался в логах nginx найти IP адреса с которых было много обращений. В логах апача все IP 127.0.0.1 (видимо из за связки с nginx). Вот команда, которая сортирует все IP адреса лога nginx по количеству совпадений.
1 |
# less /var/log/nginx/default_access.log | cut -d' ' -f1 | uniq -c | sort -g |
В целом команда работает, но мне она ничего не дала, я там не увидел никакие IP адреса с большим количеством обращений к сайту. Да и вообще, это разбирается лог за день, а надо бы вообще за последний час, а как это сделать — я не нашел.
Далее решил, что видимо парсят в большое количество проксиков и поэтому не смогу я их так определить. Вроде как можно поставить специальное ПО для мониторинга, но я не нашел доступной инструкции для Centos по этому вопросу.
На помощь пришла мысль, что надо просто посмотреть сколько соединений в данный момент на порту https. Для этого есть команды (одна для http, другая для https).
1 2 3 |
# netstat -an | grep :80 | grep ESTABLISHED | wc -l # netstat -an | grep :443 | grep ESTABLISHED | wc -l |
Соединений оказалось не так и много (меньше 100), значит никаких кучи проксиков нет. И тут пришла на помощь команда, показывающая сколько соединений с каждого IP адреса.
1 |
# netstat -ntu | awk '{print $5}'| cut -d: -f1 | sort | uniq -c | sort -nr | more |
И так уж свезло, что там был всего 1 IP адрес (не 127.0.0.1 — это от апача) который имел в районе 60 соединений, остальные максимум 4 соединения. Вот этот IP я проверил в whois, на удивление он был из города, в котором находилась компания, чей сайт. И благополучно забанил его. Нагрузку как рукой сняло.
UPDATE 21/06/2023: Команда для группировки IP адресов по количеству обращений к сайту за определенную дату:
1 |
# grep '21/Jun/2023' /var/log/nginx/access.log | awk -F ' ' '{print $1}' | sort | uniq -c | sort -rn | more |
Вывод: надо настраивать fail2ban.
PS. Прошу прощения, если есть неточности, правьте в комментах, я не специалист в этой области, мог многое напутать. И буду признателен за подсказки полезных против парсеров и брутфорсеров утилит.
Cheers!