Сайт на этом домене у меня работает уже около 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. Да ну и фиг с ними.
И не только боты. Полезный блок. Я правда наткнулся на админские записи, и прежде всего интересуют именно они
А почему бы не заблокировать просто по user agent? И не надо ничего городить.
User-agent'а очень легко поменять, или прописать такой же как у настоящего браузера. Поэтому, просто по агенту отфильтровать можно только самых тупых ботов.