Интернет

Как остановить нашествие ботов на сайт. Настройка Cloudflare

16.08.2023

Боты, создающие бесполезную нагрузку для сайта — одна из актуальных проблем для владельцев веб-ресурсов. Раньше в основном их нашествие было связано с DDoS-атаками. Мне приходилось с этим сталкиваться ещё в 00-е.

После того, как представители Яндексе открыто заявили в 2010-е, что теперь не только количество и качество ссылочной массы играет роль в позиции сайта в выдаче по запросам, но и поведенческие факторы, начались различные накрутки ботами. На сайт, который надо поднять в выдаче, заказывают ботов, которые будут, изображая пользователей, долго смотреть этот ресурс, прокручивая страницы. На сайтах же конкурентов, которых надо опустить в выдаче, боты, наоборот, быстро прекращают просмотр, давая сигнал через Яндекс.Метрику, код которой теперь установлен на многих ресурсах в Рунете, что сайт некачественный и не нравится пользователям.

Но даже если ваш сайт далёк от высокий позиций по коммерческим запросам и мало раскручен, всё равно туда может заходить множество ботов, таким образом они нагуливают историю, «прогреваются». Если они сразу отправятся на нужные ресурсы для накрутки — это будет подозрительно для Яндекса, вот они и бродят по чужим сайтам, имитируя серфинг сети пользователями.

Как видите из графика, на сайт пришло несколько волн ботов за полгода. Пик был на новогодние праздники. После того, как я настроил фильтрацию трафика через сервис Cloudflare, произошло резкое падение таких заходов. Их останавливают на подлёте. К майским праздникам большинство ботов отсеилось.

По мере того, как мой сайт попадал периодически по разным запросам в первую десятку выдачи Яндекса, доля роботов на нём росла и в один из дней я заметил, что их, согласно Яндекс.Метрике уже 88,5%. В этот момент я уже понял, что надо с этим что-то делать: нагрузка на хостинг растёт, статистика искажается

В итоге я решил заняться настройкой фильтрации ботов с помощью сервиса Cloudflare.com. Ранее я слышал много страшилок про этот сервис. Например, что на бесплатном тарифе один ip даёт множеству сайтов и если один из них заблокирует Роскомнадзор, то и твой сайт заблокируется. Или что «с водой можно выплеснуть ребёнка» и заблокировать доступ реальным пользователям. Но, учитывая, что другие варианты мне не подошли, я решил всё-таки попробовать воспользоваться бесплатным тарифом этого сервиса. Количество ботов в статистике резко уменьшилось. Дальше видно будет, пока сервис свою функцию выполняет.

Настроить фильтрацию трафика через Cloudflare несложно. Сначала там нужно зарегистрироваться. Процесс регистрации обычный для интернет-сервисов — надо указать свой е-майл (который будет вашим логином) и пароль.

Дальше надо добавить ваш сайт в Cloudflare. Русского языка среди доступных языков в сервисе нет, но я сделал скриншоты нужных страниц на английском, чтобы было понятно, как делать настройки. Красными стрелками отметил элементы, куда надо нажимать.

Войдя в свой аккаунт Cloudflare, нажимаем на главной странице кнопку «Add a site».

На следующем экране надо указать в поле домен своего сайта и нажать «Continue».

На третьем экране нужно прокрутить страницу вниз, выбрать тариф Free (если вы не готовы платить), кликнув по нему и затем нажать на «Continue».

На последнем, четвёртом экране, вам выведут название серверов, которые вы должны будете указать в своей панели управления доменом у регистратора в поле DNS-СЕРВЕРЫ (или каком-то аналогичном), заменив те, что вам дал ваш хостер. Подробнее о том, как зарегистрировать домен и купить хостинг расказано в другой статье. Если вы регистрировали домен через хостера и он не дал вам доступ в панель управления, то пишите ему, чтобы поменял NS. После того, как изменения сделаны, нажмите на кнопку «Check nameservers» в своём аккаунте Cloudflare на экране, скриншот которого приведён выше.

Даже на бесплатном тарифе можно добавить несколько сайтов в аккаунт. Но если у вас много ресурсов, то лучше завести несколько аккаунтов, а не добавлять все сайты в один. Если что-то с вашим аккаунтов случится, то вам не придётся срочно перебрасывать кучу сайтов на другой.

После того, как вы зарегистрировали домен, то вместо вашего сайта вы можете увидеть экран с ошибкой: «Циклическое перенаправление на странице. При соединении с … произошла ошибка. Эта проблема может возникать при отключении или запрещении принятия кук».

Подобная ситуация возникает из-за настроек SSL/TLS в Cloudflare, а точнее из-за режима шифрования. Дело в том, что в Cloudflare по умолчанию устанавливается режим Flexible mode, т. е. гибкий режим шифрования SSL/TLS.

Трафик между клиентом и Cloudflare будет шифроваться с помощью https соединения, а для трафика между Cloudflare и вашим сервером будет использовано обычное http соединение.

Если у вас на сервере настроено перенаправление http трафика на https (а у меня как раз это было сделано и был установлен сертификат Let’s Encrypt), то возникает бесконечный цикл перенаправлений https -> http -> https -> http …

Чтобы исправить эту ошибку заходим в раздел SSL/TLS, далее в его подраздел Overview в своём аккаунте Cloudflare. Выбираем Full (если на стороне хостинга установлен бесплатный сертификат) или Full (strict) (если сертификат платный). Можно оставить вариант Flexible, но в таком случае надо будет в панели управления хостингом и на вашем сайте отключить все способы переадресации сайта на HTTPS и сайт будет доступен только по HTTP. Я выбрал вариант Full, т.к. уже давно перевёл свой сайт на HTTPS и пользуюсь только бесплатными сертификатами.

Есть ещё один такой нюанс, по правилам получения популярного бесплатного сертификата Let’s Encrypt, срок действия которого 90 дней, нельзя его выпустить, если подключен сервис типа Cloudflare. Таким образом его автопродления не будет.

Обратившись за консультацией к техподдержке своего хостера, я получил совет просто отключать сервис Cloudflare, когда создаёшь для своего сайта сертификат Let’s Encrypt, а потом снова его включать. Но как я вижу сейчас, в этом нет необходимости, т. к. если ты подключён к сервису Cloudflare, то тебе автоматом для сайта дают сертификат GTS CA 1P5 от Google Trust Services LLC, срок действия которого тоже 90 дней, после чего наступает автопродление. Поэтому не надо совершать лишних движений и следить, когда у твоего сайта кончается сертификат, чтобы его вручную перевыпустить.

Теперь можно приступать к настройке фильтрации ботов в сервисе Cloudflare. Это делается с помощью правил. Для бесплатного тарифа можно установить пять правил, но в рамках одного правила можно комбинировать несколько фильтров, если они подразумевают одно и тоже действие.

Выбирайте те правила, которые для вас актуальны. У моего сайта была проблема с прямым заходом ботов по интернет-протоколу IPv6.

Заходим в пункт меню Security и дальше в его подпункт WAF. Далее жмём кнопку «Create rule». Создав правило, его можно редактировать или удалить, для этого нужно нажать три точки справа от него, чтобы появилось меню. Также правило можно на время отключить, нажав на зелёный ползунок. Чтобы снова включить, необходимо снова кликнуть по этому ползунку.

Выше страница, где создаются правила. Название можете дать любое. Чтобы ввести текст правила, нажмите на «Edit expression» и добавьте его текст в активизировавшееся серое окошко Expression Preview. Тексты правил приведены чуть ниже. Затем нажмите на появившуюся в том же месте надпись «Use expression builder», чтобы текст правила сохранился в поле.

Можно добавлять пункты правила и через окошки.

And — правило сработает, когда оба условия соблюдаются.

Or — правило сработает, когда соблюдается хотя бы одно условие.

В пункте «Choose action» выберите необходимое действие:

Block — блокировка доступа.

Challenge (CAPTCHA) — включение проверки с помощью Google reCAPTCHA.

JS Challenge — показ межстраничного уведомления как при включении режима I’m Under Attack.

Bypass — отключение проверки.

Allow  — полный доступ.

Кнопка «Deploy» активирует правило, а «Save as Draft» сохраняет как черновик.

Важен порядок создания правил. Чем раньше создано правило, тем оно приоритетнее. Таким образом если два правила противоречат друг другу, работать будет то, что выше в списке. Приоритет можно менять перетаскиванием. Для этого нужно нажать на два ряда точек слева и не отпуская кнопки мышки перетащить строчку с правилом выше или ниже.

Правила для фильтрации ботов.

Lобавьте готовый текст в окошко Espression Preview, активировав его, как уже говорилось выше и выберите указанное действие, сохранив в конце правило кнопкой «Deploy».

Правило 1. Одобрение доступа нужным ботам

Может потребоваться разрешить доступ нужным ботам. К примеру, бота Mail.ru сервис Cloudflare по умолчанию блокирует, считая его плохим. Учитывая, что из поиска Mail.ru хоть и мало, но всё-таки посетители приходят, ему можно разрешить доступ.

Правило: (cf.client.bot) or (http.user_agent contains «Mail.RU_Bot»)

Действие: Allow

Если у вас перестал работать какой-то функционал на сайте после подключения сервиса Cloudflare из-за того, что блокируется доступ, например, для какой-то статистики, то надо добавить название или ip бота в исключение.

Правило 2. Капча всем, кто заходит по IPV6 или HTTP

Правило: (ip.src in {::/0}) or (not ssl)

Действие: LEGACY CAPTCHA

Чтобы это правило работало, необходимо включить принудительный редирект с HTTP на HTTPS. Для этого заходим в пункт меню SSL/TLS в подпункт Edge Certificates и там нажимаем на ползунок «Always Use HTTPS», чтобы он из серого стал зелёным, активировав режим.

Правило 3. Проверка или блокировка прямых заходов и обращений с протоколом ниже HTTP/2

Плохие боты, включая ддос-ботов, обычно заходят на сайт по протоколам HTTP/1.0 и HTTP/1.1. В данном правиле фильтруем всех, кто использует эти протоколы, а не HTTP2. Также же фильтруем ботов, которые используются для накрутки поведенческих факторов, о чём говорилось в начале статьи. Они раскручивают свои профили часто через прямые заходы на различные сайты.

Правило: (not http.request.version in {«HTTP/2» «HTTP/3» «SPDY/3.1»}) or (http.referer eq «»)

Действие: Block или JS challenge.

Можете заблокировать (Block) или включить проверку (JS challenge). Я выбрал второй вариант, хотя какое-то количество ботов всё-таки дожидается загрузки страницы, тем не менее таким образом вы не заблокируете доступ реальным пользователям.

Правила 4 и 5. Блокируем ненужные парсеры и поисковые роботы

Поисковые роботы и парсеры создают лишнюю нагрузку на сайт, поэтому лучше ненужные из них блокировать.

Ниже список роботов для блокировки не слишком свежий. Добавляйте те, которые актуальны, убирая тех, которые уже не работают. Например, вместо поискового бота уже почившей в бозе поисковой системы Aport можно добавить в список блокировки юзерагента Вебархива ia_archiver

Необходимо будет создать два отдельных правила, потому что у Cloudflare есть ограничение по количеству знаков и в одно правило не помещается блокировка всех перечисленных ниже юзерагентов.

Правило 4: (http.user_agent contains «Abonti») or (http.user_agent contains «AspiegelBot») or (http.user_agent contains «aggregator») or (http.user_agent contains «AhrefsBot») or (http.user_agent contains «Aport») or (http.user_agent contains «asterias») or (http.user_agent contains «Baiduspider») or (http.user_agent contains «BDCbot») or (http.user_agent contains «bidswitchbot») or (http.user_agent contains «Birubot») or (http.user_agent contains «BLEXBot») or (http.user_agent contains «BUbiNG») or (http.user_agent contains «BuiltBotTough») or (http.user_agent contains «Bullseye») or (http.user_agent contains «BunnySlippers») or (http.user_agent contains «Butterfly») or (http.user_agent contains «ca-crawler») or (http.user_agent contains «CamontSpider») or (http.user_agent contains «CCBot») or (http.user_agent contains «Cegbfeieh») or (http.user_agent contains «CheeseBot») or (http.user_agent contains «CherryPicker») or (http.user_agent contains «coccoc») or (http.user_agent contains «CopyRightCheck») or (http.user_agent contains «cosmos») or (http.user_agent contains «crawler») or (http.user_agent contains «Crescent») or (http.user_agent contains «CyotekWebCopy/1.7») or (http.user_agent contains «CyotekHTTP/2.0») or (http.user_agent contains «DataForSeoBot») or (http.user_agent contains «DeuSu») or (http.user_agent contains «discobot») or (http.user_agent contains «DittoSpyder») or (http.user_agent contains «DnyzBot») or (http.user_agent contains «DomainCrawler») or (http.user_agent contains «DotBot») or (http.user_agent contains «Download Ninja») or (http.user_agent contains «EasouSpider») or (http.user_agent contains «EmailCollector») or (http.user_agent contains «EmailSiphon») or (http.user_agent contains «EmailWolf») or (http.user_agent contains «EroCrawler») or (http.user_agent contains «Exabot») or (http.user_agent contains «ExtractorPro») or (http.user_agent contains «Ezooms») or (http.user_agent contains «FairShare») or (http.user_agent contains «Fasterfox») or (http.user_agent contains «FeedBooster») or (http.user_agent contains «Foobot») or (http.user_agent contains «Genieo») or (http.user_agent contains «GetIntent Crawler») or (http.user_agent contains «Gigabot») or (http.user_agent contains «gold crawler») or (http.user_agent contains «GPTBot») or (http.user_agent contains «GrapeshotCrawler») or (http.user_agent contains «grub-client») or (http.user_agent contains «Harvest») or (http.user_agent contains «hloader») or (http.user_agent contains «httplib») or (http.user_agent contains «HTTrack») or (http.user_agent contains «humanlinks») or (http.user_agent contains «HybridBot») or (http.user_agent contains «ia_archiver») or (http.user_agent contains «ieautodiscovery») or (http.user_agent contains «Incutio») or (http.user_agent contains «InfoNaviRobot») or (http.user_agent contains «InternetSeer») or (http.user_agent contains «IstellaBot») or (http.user_agent contains «Java») or (http.user_agent contains «Java/1.») or (http.user_agent contains «JamesBOT») or (http.user_agent contains «JennyBot») or (http.user_agent contains «JS-Kit») or (http.user_agent contains «k2spider») or (http.user_agent contains «Kenjin Spider») or (http.user_agent contains «Keyword Density/0.9») or (http.user_agent contains «kmSearchBot») or (http.user_agent contains «larbin») or (http.user_agent contains «LexiBot») or (http.user_agent contains «libWeb») or (http.user_agent contains «libwww») or (http.user_agent contains «Linguee») or (http.user_agent contains «LinkExchanger») or (http.user_agent contains «LinkextractorPro») or (http.user_agent contains «linko») or (http.user_agent contains «LinkScan/8.1a Unix») or (http.user_agent contains «LinkWalker») or (http.user_agent contains «LinkpadBot») or (http.user_agent contains «lmspider») or (http.user_agent contains «LNSpiderguy») or (http.user_agent contains «ltx71») or (http.user_agent contains «lwp-trivial») or (http.user_agent contains «lwp-trivial») or (http.user_agent contains «magpie») or (http.user_agent contains «Mata Hari») or (http.user_agent contains «MaxPointCrawler»)

Действие: Block

Правило 5: (http.user_agent contains «MegaIndex») or (http.user_agent contains «memoryBot») or (http.user_agent contains «Microsoft URL Control») or (http.user_agent contains «MIIxpc») or (http.user_agent contains «Mippin») or (http.user_agent contains «Missigua Locator») or (http.user_agent contains «Mister PiX») or (http.user_agent contains «MJ12bot») or (http.user_agent contains «MLBot») or (http.user_agent contains «moget») or (http.user_agent contains «MSIECrawler») or (http.user_agent contains «msnbot») or (http.user_agent contains «msnbot-media») or (http.user_agent contains «NetAnts») or (http.user_agent contains «NICErsPRO») or (http.user_agent contains «Niki-Bot») or (http.user_agent contains «NjuiceBot») or (http.user_agent contains «NPBot») or (http.user_agent contains «Nutch») or (http.user_agent contains «Offline Explorer») or (http.user_agent contains «OLEcrawler») or (http.user_agent contains «Openfind») or (http.user_agent contains «panscient.com») or (http.user_agent contains «PostRank») or (http.user_agent contains «ProPowerBot/2.14») or (http.user_agent contains «PetalBot») or (http.user_agent contains «ProWebWalker») or (http.user_agent contains «ptd-crawler») or (http.user_agent contains «Purebot») or (http.user_agent contains «PycURL») or (http.user_agent contains «python-rcontainsuests») or (http.user_agent contains «Python-urllib») or (http.user_agent contains «QueryN Metasearch») or (http.user_agent contains «RepoMonkey») or (http.user_agent contains «Riddler») or (http.user_agent contains «RMA») or (http.user_agent contains «Scrapy») or (http.user_agent contains «SemrushBot») or (http.user_agent contains «serf») or (http.user_agent contains «SeznamBot») or (http.user_agent contains «SISTRIX») or (http.user_agent contains «SiteBot») or (http.user_agent contains «sitecheck.Internetseer.com») or (http.user_agent contains «SiteSnagger») or (http.user_agent contains «Serpstat») or (http.user_agent contains «Slurp») or (http.user_agent contains «SnapPreviewBot») or (http.user_agent contains «Sogou») or (http.user_agent contains «Soup») or (http.user_agent contains «SpankBot») or (http.user_agent contains «spanner») or (http.user_agent contains «spbot») or (http.user_agent contains «Spinn3r») or (http.user_agent contains «SpyFu») or (http.user_agent contains «suggybot») or (http.user_agent contains «SurveyBot») or (http.user_agent contains «suzuran») or (http.user_agent contains «SWeb») or (http.user_agent contains «Szukacz/1.4») or (http.user_agent contains «Teleport») or (http.user_agent contains «Telesoft») or (http.user_agent contains «The Intraformant») or (http.user_agent contains «TheNomad») or (http.user_agent contains «TightTwatBot») or (http.user_agent contains «toCrawl/UrlDispatcher») or (http.user_agent contains «True_Robot») or (http.user_agent contains «ttCrawler») or (http.user_agent contains «turingos») or (http.user_agent contains «TurnitinBot») or (http.user_agent contains «UbiCrawler») or (http.user_agent contains «UnisterBot») or (http.user_agent contains «Unknown») or (http.user_agent contains «uptime files») or (http.user_agent contains «URLy Warning») or (http.user_agent contains «User-Agent») or (http.user_agent contains «VCI») or (http.user_agent contains «Vedma») or (http.user_agent contains «Voyager») or (http.user_agent contains «WBSearchBot») or (http.user_agent contains «Web Downloader/6.9») or (http.user_agent contains «Web Image Collector») or (http.user_agent contains «WebAuto») or (http.user_agent contains «WebBandit») or (http.user_agent contains «WebCopier») or (http.user_agent contains «WebEnhancer») or (http.user_agent contains «WebmasterWorldForumBot») or (http.user_agent contains «WebReaper») or (http.user_agent contains «WebSauger») or (http.user_agent contains «Website Quester») or (http.user_agent contains «Webster Pro») or (http.user_agent contains «WebStripper») or (http.user_agent contains «WebZip») or (http.user_agent contains «Wotbox») or (http.user_agent contains «wsr-agent») or (http.user_agent contains «WWW-Collector-E») or (http.user_agent contains «Yeti»)

Действие: Block

Правило 6. Блокировка пользователей из других стран

Если вам нужен трафик только из каких-то определённых стран, то можно заблокировать доступ из других. Например, с помощью правила ниже можно разрешить доступ только пользователям с ip из России, Белоруссии и Казахстана. По аналогии можете сделать и с другими странами.

Правило: (ip.geoip.country ne «RU» and ip.geoip.country ne «BY» and ip.geoip.country ne «KZ»)

Действие: Block

Я это правило не применяю, но оно может быть актуально, например, при нашествии ботов из Китая, осуществляющих DDoS-атаку, или ваши услуги привязаны к конкретной стране, а из других стран идёт существенный трафик, который создаёт ненужную нагрузку на хостинг.

Чтобы проверить корректность работы фильтрации трафика, следите за отчётом в Cloudflare на странице с вашими правилами, а также через свои системы аналитики (Яндекс.Метрику или Гугл Аналитику, а также монитор нагрузки в панели хостера).

Стоит помнить, что ботоводы постоянно совершенствуют своих роботов и способы накрутки. Так, например, я видел примеры на скриншотах, когда армия ботов заходила на сайт не напрямую, как у меня, а по ссылке на каком-то ресурсе, например, в социальных сетях Дзен и Вконтакте. Если вы оказались в такой ситуации, надо будет указанные выше правила модернизировать, настраивая фильтрацию трафика с ресурсов, откуда заходят боты.