Боты бывают разные, одни сканируют наш сайт для индексации в поисковых системах, другие ищут на нашем сайте уязвимости или сканируют его в своих интересах. Первые нужны и важны, а вот вторые в лучшем случае создают лишнюю нагрузку на сервер. А если зловредные боты, например, найдут незащищенную форму обратной связи, то вы получите целую пачку рекламных сообщений.
Если вы обнаружили вредоносных ботов, чтобы защититься, заблокируйте их в NGINX. Пример запроса из логов NGINX:
193.70.81.116 - - [26/Feb/2025:14:31:47 +0700] "GET /example_page/ HTTP/1.1" 200 1154 "-" "Mozilla/5.0 (compatible; Somebot/v1.4.8; http://somebot.com/)" "-"
каждая строка содержит набор следующих данных:193.70.81.116
— IP адрес клиента[26/Feb/2025:14:31:47 +0700]
— дата/время запросаGET
— тип запроса/example_page/
— запрашиваемая страницаHTTP/1.1
— протокол200
— код ответа1154
— объем переданных данных"Mozilla/5.0 (compatible; Somebot/v1.4.8; http://somebot.com/)"
— агент
В большинстве случаев у нас два варианта — блокировка ботов по IP и по агенту. Если создатели бота не имеют злого умысла, они обычно подписывают своего бота, давая ему уникальный агент, с названием бота. По этому названию мы и сможем его заблокировать. В качестве примера могу привести бота от Facebook. У создателей нет цели навредить вашему сайту, но их бот сканирует сайты настолько агрессивно, что способен перегрузить даже средние по ресурсам хосты.
Если же бот никак не подписан, то заблокировать его можно только по IP. Это мало эффективно, если действует ботнет, но с отдельными ботами это достаточная защита.
В нашей конфигурации NGINX есть отдельный файл настроек для нашего домена. Можно записать пару блокировок прямо в него, но когда таких записей станет много, файл перестанет быть читаемым. Давайте создадим отдельный файл, в который будем записывать плохих ботов и добавим его в основной конфиг.vi /etc/nginx/blocklist.conf
#Блокировка по IP
deny 193.70.81.116;
#Блокировка по user agent
if ($http_user_agent ~ (Somebot|Anotherbot|Badbot) ) {
return 403;
}
В первом случае все максимально просто, мы указываем конкретный адрес. Можно так же блокировать целые подсети, но с этим нужно быть осторожнее, чтобы не заблокировать лишнее. В случае с агентом, мы ищем в названии слова из скобок и если одно из них встречается, сервер отвечает на запрос отказом.
Теперь с помощью include добавим blocklist.conf в файл конфигурации основного домена в блок server к другим include.vi /etc/nginx/conf.d/waky.ru.conf
server {
...
include /etc/nginx/default.d/*.conf;
include /etc/nginx/conf.d/blocklist.conf;
...
}
Проверяем конфигурацию и перезапускаем NGINX:
[root@waky ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@waky ~]# nginx -s reload
Теперь все запросы от данного IP или от агента с подобным названием будут получать запрет на доступ от NGINX. В логах это будет отображено 403 кодом ответа.