Блокировка по IP: почему против ботов она почти не работает и кого задевает
Закрыть адрес из лога — самое очевидное действие и одно из самых бесполезных. Бот меняет адрес за минуту, а за одним адресом мобильного оператора сидят сотни людей. Разбираем, когда блок по IP всё-таки уместен и как не задеть своих.
7 мин чтения
Нашли в логе адрес, который за час сделал восемь тысяч запросов,
дописали deny в конфигурацию nginx, перезагрузили. Через десять минут
те же запросы идут с другого адреса. А через неделю менеджер пересылает
письмо покупателя: «С телефона ваш сайт не открывается, с рабочего
компьютера открывается». Оба события — последствия одной и той же
строки в конфигурации.
Блокировка по IP исходит из того, что адрес — это примерно один человек или одна программа. Пятнадцать лет назад это было почти правдой. Сегодня обе половины этого допущения неверны.
Один адрес — это не один человек
Мобильные сети и CGNAT
Адресов IPv4 на всех давно не хватает, и операторы связи выкручиваются так: абонентам выдают внутренние адреса, а в интернет выпускают через общий шлюз. Это называется CGNAT, операторский NAT. Снаружи сотни, а то и тысячи абонентов выглядят как один адрес. Сегодня за ним жители одного района, завтра оператор перераспределит пулы, и за тем же адресом окажутся другие люди.
Мобильный интернет почти весь устроен именно так. Всё больше и домашних провайдеров делают то же самое. Закрыв такой адрес, вы закрываете сайт для всех абонентов оператора, которые в эту минуту за ним сидят. Они не напишут в поддержку: увидят ошибку и уйдут к конкуренту.
Офисы, университеты, общественный Wi-Fi
Сорок сотрудников офиса, общежитие, кафе, аэропорт — один внешний адрес. Если кто-то из них запустил расширение браузера, которое часто обращается к сайтам, частота с адреса вырастет у всех сразу.
IPv6
С IPv6 обратная проблема. Абоненту выдают не адрес, а целый диапазон, и адрес устройства в нём регулярно меняется ради приватности. Закрыть один адрес IPv6 бесполезно, человек получит соседний. Закрыть диапазон /64 — это обычно одна квартира, а /48 — сеть целой организации.
Один бот — это не один адрес
Домашние прокси
Резидентные прокси — пулы из миллионов адресов обычных абонентов: роутеры, телефоны, компьютеры, на которых стоит приложение, тайком торгующее их каналом. Аренда стоит недорого, адрес меняется на каждый запрос или раз в несколько минут. Для блокировки по IP такой бот невидим: каждый его адрес появляется у вас один раз. А закрытый вами адрес через час обслуживает обычного человека, которому не повезло с приложением.
Так выглядел рой, который вечером 19 октября пришёл на несколько
подключённых к нам сайтов из Германии: сотни адресов, по одному запросу
с каждого, обрезанная строка браузера, ни заголовка Accept-Language,
ни Accept-Encoding. Ни один адрес не повторялся, банить было нечего.
Ловится такой рой по рисунку: одинаковая строка браузера с сотен
адресов и отсутствие заголовков, которые настоящий браузер шлёт всегда.
Облака
Новый виртуальный сервер в облаке поднимается за минуту, и вместе с ним бот получает новый адрес. Старый адрес возвращается в пул и через неделю достаётся кому-то другому, иногда вполне честному сервису. Чёрный список, который копился полгода, наполовину состоит из адресов, которые давно принадлежат не тем, кто их заслужил.
Кого задевает блок адреса
Покупателей на мобильном интернете — о них уже сказано.
Людей за VPN. Многие держат его включённым постоянно, и выходят они в интернет через адреса дата-центров, те же, что у ботов.
Ваши же службы. На сайте с 1С-Битриксом обмен с 1С поначалу выглядел как перебор паролей: частые обращения к странице авторизации обмена. Закрой владелец этот адрес по логу, обмен бы остановился. Скрипт по cron с чужого хостинга, запускавший wget, тоже выглядит в логе как бот. Его адрес надо не блокировать, а внести в белый список.
Роботов, без которых сайт не работает. Робот Яндекс Директа на одном магазине напольных покрытий делал около 10,8 тыс. запросов в сутки к тяжёлой странице. По частоте — идеальный кандидат на бан, но если его закрыть, Директ сочтёт сайт недоступным. Поисковые роботы тоже ходят часто, и диапазон Яндекса или Google в чёрном списке — это выпадение из выдачи.
Когда блокировка адреса всё-таки уместна
Не всегда она бесполезна. Есть случаи, где это правильный инструмент.
Конкретный сканер. Адрес из облака, который неделями перебирает /.env,
/.git/config и wp-login.php. Это не общий адрес, за ним не сидят
люди, и закрыть его в файрволе дешевле, чем каждый раз отвечать ему из
PHP.
Автоматический список для файрвола со строгими условиями. Такой список должен собираться не из всех подозрительных, а только из тех, кто раз за разом оказывался программой, исключать общие адреса и сети поисковиков и сам забывать адрес, когда тот затихает. Как устроен наш — в статье «Список для файрвола и fail2ban».
Закрытый раздел для узкого круга. Если в панель управления заходят только из офиса, разумнее разрешить вход с адреса офиса, чем запрещать всех остальных по одному. Цена ошибки здесь низкая: тот, кого не пустили, знает, кому позвонить.
Временная мера во время атаки. Закрыть сеть на сутки, а потом вернуть. Любой блок адреса должен иметь срок, бессрочный бан — это мина, которая сработает на ком-нибудь через год.
Как это решено в BotBan
Общие адреса жёстко не блокируются на уровне движка: операторский NAT, сети мобильных операторов России и СНГ, CDN, частные диапазоны. Какой бы балл ни набрал такой посетитель и даже если владелец сам внёс адрес в чёрный список, он получает проверку браузера, а не отказ. Человек проходит её сам, программа без браузера — нет.
Сеть в чёрном списке не может быть шире /20 для IPv4 и /48 для IPv6 и не может быть служебным или операторским диапазоном: это проверяется при сохранении. Подтверждённый поисковый робот проходит даже из чёрного списка. Частота с одного адреса сама по себе даёт максимум проверку, и только при переходе на страницу: корзина и формы за общим адресом продолжают работать. Решение принимается по паре «адрес и строка браузера» с учётом десятков признаков, а не по адресу.
Лимит запросов с одного адреса, который владелец включает сам, общие адреса тоже не задевает. Не ограничивается и адрес, с которого за час пришло пять и больше разных браузеров: так выглядят офис или прокси, а не одна программа. Даже автооткат, который снимает блокировку при ошибке правила, считает долю заблокированных не по адресам, а по сетям: много адресов одной сети обычно оказываются одним участником — пулом прокси или облаком.
В список для файрвола, кроме записей вашего чёрного списка, попадают только адреса, которые за сутки не меньше трёх раз блокировались за явные признаки автоматизации: сканер, библиотека вместо браузера, поиск секретов, ловушка. Мобильных сетей, NAT, CDN, сетей поисковиков и адресов, с которых за последние сутки приходил кто-то похожий на человека, в нём не бывает. Через двое суток тишины адрес уходит из списка сам. Подробнее о том, кого мы не трогаем ни при каких условиях, — на странице «Кого не трогаем».
Что делать вместо ручного бана
- Прежде чем закрыть адрес, проверьте его: кому принадлежит сеть, не мобильный ли это оператор, не поисковый ли робот.
- Внесите свои службы в белый список: сервер 1С, cron, CRM, мониторинги.
- Смотрите на поведение и рисунок, а не на адрес: темп, порядок обхода, заголовки, одинаковую строку браузера с сотен адресов.
- Если всё же закрываете адрес, ставьте срок и не закрывайте сети шире, чем нужно.
- Повторяющихся явных ботов отдайте файрволу автоматически, по списку со строгими условиями, а не руками.
Похожая логика работает и с географией: закрытая страна задевает больше людей, чем ботов, — об этом статья о блокировке по странам.
Решение по теме
Термины из статьи
Как это настроить в BotBan
Читайте также
- Аналог Cloudflare в России для защиты от ботов: что BotBan заменяет, а что нет Cloudflare — это пять разных продуктов под одним именем. Разбираем по одному, что из них закрывает BotBan, что закрывает хостинг, а что в России вообще не заменяется.
- «Проверяем ваш браузер»: что это за страница и почему человек её почти не видит Полсекунды, пока браузер решает задачу, — и вы на сайте. Разбираем, что именно происходит и почему это надёжнее картинок со светофорами.
- yclid, gclid и другие метки кликов: как по ним находить ботов в рекламном трафике Метку клика ставит рекламная система, а не вы. Поэтому она надёжнее UTM и позволяет точно сказать, сколько оплаченных переходов сделали программы.