Настраиваем CloudFlare для фильтрации ботов
В этой статьей рассмотрим детальную настройку сервиса CloudFlare для защиты сайта от всевозможных роботов, ботов, парсеров.
Все мы знаем, что утро начинается не с кофе. Утро 4 августа для меня началось с сообщения:
Немного поразмыслив, вспомнил про мануал от Артёма Акулова, где он рассказывает, как фильтрует 99% ботов (включая ПФ ботов) с помощью несложной настройки CloudFlare (дальше CF) и сервиса AntiBot - рекомендую к прочтению.
Перечитав пост, понял что там не хватает крайне важных деталей, а именно самих настроек CF. Есть описание, что они должны делать, но нет самих переменных.
На мой запрос Артём так и не ответил, поэтому начал воссоздавать те самые правила самостоятельно.
Кого фильтруем?
Сразу хочу оговориться, нет смысла использовать все правила. Да, они будут крайне эффективны, но усложнят жизнь и обычным пользователям, поэтому к выбору нужных фильтров подходите с умом.
- Пользователей из ненужных стран - подойдет, если у вас небольшой региональный коммерческий проект и зарубежного трафика там быть недолжно. Сомневаюсь, что бетон из Балашихи может быть интересен бразильцам.
- Всех, кто приходит с IPV6 и без HTTPS заставляем разгадать каптчу:
- Блокируем по списку юзерагентов различные сервисы-анализаторы, мониторинги и парсеры;
- Отправляем на JS проверку всех, кто обращается по протоколу ниже HTTP/2 и прямые заходы. Многие спайдеры вроде Screaming Frog работают именно на протоколах HTTP1, тем самым мы можем на уровне CF запретить любой парсинг сайта;
Видео инструкция по настройке
Начинаем настройку
Я не буду расписывать как добавить сайт в CF, будем считать что вы разобрались.
Заходим в раздел Security - WAF
Жмём на кнопку Creat firewall rules
Всего нам доступны 5 правил, но в рамках одного правила мы можем комбинировать несколько фильтров, если они подразумевают одно и тоже действие. Всего предусмотрено 5 действий:
- Block— блокировка доступа.
- Challenge (CAPTCHA)— включение проверки с помощью Google reCAPTCHA.
- JS Challenge— показ межстраничного уведомления как при включении режима I’m Under Attack.
- Bypass— отключение проверки.
- Allow — полный доступ.
Дальше мы начинаем создавать фильтры. Обратите внимание, что ВАЖЕН ПОРЯДОК СОЗДАНИЯ. Чем раньше создано правило, тем оно приоритетнее. Приоритет можно менять перетаскиванием:
Дополнительные условия
And — правило сработает, когда оба условия соблюдаются.
Or — правило сработает, когда соблюдается хотя бы одно условие.
Как легко добавлять правила
Настройки можно вбивать вручную, либо использовать поле "Edit expression"
Открываем доступ хорошим ботам
В первую очередь открываем доступ хорошим ботам. Обратите внимание, что отдельной настройкой надо пустить Mail.ru, CF, как и многие другие не считают его хорошим.
Правило: (cf.client.bot) or (http.user_agent contains "Mail.RU_Bot")
Действие: Allow
Закрываем доступ из всех стран, кроме ...
Полезно, если вы уверены, что трафика из других стран у вас нет. Проверить можно с помощью Яндекс.Метрики в разделе Аудитория - География;
Логика фильтра следующая: Если страна не "Россия", то заблокировать
Правило: (ip.geoip.country ne "RU" and ip.geoip.country ne "BY" and ip.geoip.country ne "KZ")
Действие: Block
Показываем капчу всем, кто ломится по IPV6 или HTTP
Важно! Необходимо включить принудительный редирект с HTTP на HTTPS:
SSL/TLS - Edge Certificates - Always Use HTTPS
Правило: (ip.src in {::/0}) or (not ssl)
Действие: LEGACY CAPTCHA
JS проверка для прямых заходов и обращений с протоколом ниже HTTP/2
В данном правиле фильтруем всех, кто использует HTTP 1 и HTTP 1.1 протоколы. Чаще всего это боты. Тут же фильтруем ПФ ботов, которые прогревают профили через прямые заходы на различные сайты.
Начало прогрева профилей через ваш сайт выглядит примерно так:
Запрещаем доступ всем, кто не HTTP2 протокол, говноботы, ддос-боты и прочее непотребство идет в основном по HTTP/1.0 и HTTP/1.1
Правило: (not http.request.version in {"HTTP/2" "HTTP/3" "SPDY/3.1"}) or (http.referer eq "")
Действие: Block или JS challenge.
Блокируем краулеры
Краулеры, парсеры и прочие проверяльщики создают бешенную нагрузку на крупных ресурсах. Можно их отсекать еще на подлёте. Актуальные юзерагенты взяты отсюда и адаптированы под CF. Опционально можно запретить доступ для сохранения данных в вебархиве с помощью блокировки юзерагента ia_archiver
Необходимо будет создать два отдельных правила, потому что в одно не помещается блокировка всех юзерагентов, поэтому код настройки в двух частях.
Правило 1:
(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 "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") or (http.user_agent contains "MegaIndex")
Правило 2:
(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 "Titan") 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
Проверяем корректность правил
Проверить корректность правил можно двумя способами.
Первый способ
- Следим за отчётом CF
- Мониторим системы аналитики и контролируем отклонения.
Второй способ
- Меняем страну через VPN и пробуем попасть на сайт. Если блок работает - вас не пустит;
- С помощью сервиса Bertal.ru меняем юзерагент и пробуем отправить запрос на сайт, тут же проверяем фильтрацию HTTP трафика.
- Если включен фильтр на прямой трафик - пробуем просто зайти по прямому адресу.
Заключение
Для подготовки материала использовал источники:
- https://wmsn.biz/m.php?p=143697
- https://highload.today/cloudflare-ddos/#7
- https://g-soft.info/articles/1307/cloudflare-blokirovka-dostupa-k-saytu-s-opredelennyh-stran/
- https://byroot.ru/153-blokirovka-ipv6-cherez-cloudflare.html
- https://seo-zona.ru/badbot
- https://vc.ru/seo/359664-voskreshaem-internet-magazin-avtozapchastey-i-delaem-20-mln-rubley-na-seo-trafike
Спасибо за мануал, хорошее дело. Но пара спорных моментов:
а) А точно стоит выстраивать всю эту оборону на сайте не под атакой? Это ж дело такое, когда с водой можно и ребенка выплеснуть. Скажем, известен инцидент, когда сайт влетел под фильтры, и несмотря на правки яндексоиды их не принимали - потому что не видели. Оказалось, что доступно 2 зеркала - одно по ipv4, другое - ipv6. Яндексоиды и их бот ходили по ipv6, и исправлений не видели. Да и поисковые боты используют http2 совсем даже не всегда, и так можно подсократить процессы сканирования, и без того уже дохловатые в рамках всего интернета.
б) Список блокируемых ботов и парсеров я бы сильно проредил. Это не стоит копипастить, это стоит подбирать по проекту индивидуально.
Спасибо, как всегда замечания по делу.
а) В самом начале уточняю что в видео, что в статье, что использовать все правила не стоит, а выборочно под проект.
б) Имеет место быть, список нужно собирать по логам сервера для конкретного проекта
А зачем блокировать IPV6? Вы хотите еще больше затормозить переход на этот протокол?
Вот для этого
Ну, а сколько реальных людей в рамках РФ ходят по ipv6? Процентов 5-7 наберется? А теперь учтём, что цена проксей на этом протоколе - в разы дешевле ipv4, да и свои прокси поднять на ipv6 легче лёгкого. Вот и получается, что для многих сайтов, где и без того под 80% всего мизерного трафа - боты, блок ipv6 в минус никак не сыграет вообще, только в плюс.
Сомневаюсь что статья на VC затормозит переход на IPv6, при этом в данный момент живых пользователей на этом протоколе - минимум
...получается, если бот будет использовать user-agent маил. ru, тогда на сайте автора проблем у него не будет..