Избавляюсь от «левых» ботов

Сайт на этом домене у меня работает уже около 10 лет. В последние пару лет я стал более-менее активно фиксировать происходящее вокруг меня и выкладывать это в блог. И поэтому, стало интересно, читает ли мои записи кто-то тут кроме меня :). Чтобы это выяснить, надо глядеть и анализировать логи посещений. И вот при просмотре логов выяснилось много интересного.
Хотя сайт у меня и небольшой, его регулярно выкачивают какие-то боты. Речь не о яндексе и гугле. У некоторых из них есть идентификаторы, типа MJ12bot, AhrefsBot, SemrushBot, SurdotlyBot, SiteExplorer, SafeDNSBot. Кроме того, хотя на сайтах у них заявлено, что они регулярно читают robots.txt и следуют ограничениям из него — в реальности оказалось, что на ограничения из robots.txt реагирует один из десяти ботов. Также, по сайту постоянно шарятся какие-то боты в поисках уязвимостей и прочая нечисть. Сначала я думал сделать ограничение на доступ по анализу строки юзер-агента. Но по размышлении отказался от этого. Ничего не мешает этим ботам при каждом запросе прописывать новую строку юзер-агента, и все мои старания по фильтрации будут напрасными. Поэтому, мочить воробьёв я решил атомными бомбами, квадратно-гнездовым методом, а именно — по спискам сетей, ещё на подлете, с помощью nginx.

Вот например пара записей из лога. По ним видно, что обращения делались с адресов 217.182.87.62 и 34.203.208.181:

1
2
<strong>217.182.87.62 - - [06/Jun/2017:06:16:55 +0300] "GET / HTTP/1.1" 200 12833 "-" "python-requests/2.17.3" "-"
34.203.208.181 - - [07/Jun/2017:07:25:02 +0300] "GET / HTTP/1.1" 200 12833 "-" "Java/1.8.0_121" "-"</strong>

Далее, идём на такой замечательный сайт как http://ipinfo.io/. Ежели сделать на сайте запрос по адресу 217.182.87.62, то мы увидим, что этот адрес принадлежит сети 'OVH SAS', автономная система AS16276. Идём дальше по ссылке http://ipinfo.io/AS16276 и видим, что этой конторе выделено 2,102,528 адресов, и ежели теперь на странице кликнуть по 'Show all 83 IP address blocks' мы увидим полный список сетей этой автономной системы. Часть из этих адресов делегирована другим организациям, но мне в общем-то всё равно — я не жду посетителей на сайт из Франции. Ну а далее ловкость рук и никакого мошенничества. Выделяю список IPv4 адресов и вставляю в файл, например, OVH.txt. Содержимое файла должно выглядеть как-то так:

103.5.12.0/22   2 Rue Kellermann        1,024
137.74.0.0/16   OVH SAS         65,536
139.99.0.0/17   OVH Singapore PTE. LTD  32,768
139.99.128.0/17         OVH Australia PTY LTD   32,768
142.4.192.0/19  OVH Hosting, Inc.       8,192
144.217.0.0/16  OVH Hosting, Inc.       65,536
147.135.0.0/17  OVH US LLC      32,768
...

Затем, в командной строке к этому файлу применяю простейший скрипт:

cat OVH.txt | awk {'print $1"\t\t1;"'} > OVH.conf

В результате его выполнения, в файле OVH.conf будет следующее содержимое:

103.5.12.0/22           1;
137.74.0.0/16           1;
139.99.0.0/17           1;
139.99.128.0/17         1;
142.4.192.0/19          1;
144.217.0.0/16          1;
147.135.0.0/17          1;
...

Теперь, полученный файл OVH.conf надо скопировать в каталог где находится конфигурационный файл nginx'а, и внести некоторые изменения в его конфигурацию. В секции http надо добавить следующее:

http {
...
     geo $musor {
           default       0;
           #OVH
           include /etc/nginx/OVH.conf;
     }
...
}

А в секции с конфигурацией сайта, мы уже принимаем решение, что делать с запросом с этих адресов, пропустить или унитазировать:

server {
     server_name   some.domain;
...
     if ($musor) {
            #здесь надо раскомментировать что-то одно
            #return 403;
            #return 404;
            #rewrite     ^/(.*)$ https://some1.domain/;
            break;
     }
...
}

Для редиректа надо указывать какой-либо домен отличный от того, что указан в директиве server_name, иначе, будет циклический редирект.
На сегодняшний день, в результате ковровых бомбардировок, полный список заблокированных адресов следующих провайдеров, получился таким:
Amazon.conf
Dataweb.conf
DO.conf
FirstVDS.conf
Hetzner.conf
Leaseweb.conf
Mediacom.conf
Newdream.conf
OnlineSAS.conf
OVH.conf
SoftL.conf
Из-за блокировки хетцнера и лизвеба наверняка при доступе к сайту обломаются те, кто сидят через VPN. Да ну и фиг с ними.

Categories: UNIX
Tags: botnginxweb
admin:

View Comments (3)

  • И не только боты. Полезный блок. Я правда наткнулся на админские записи, и прежде всего интересуют именно они

  • А почему бы не заблокировать просто по user agent? И не надо ничего городить.

    • User-agent'а очень легко поменять, или прописать такой же как у настоящего браузера. Поэтому, просто по агенту отфильтровать можно только самых тупых ботов.

Related Post