Защита от DDoS и баны

Защита от DDoS ограничивает, как часто один посетитель может обращаться к сайту. Посетитель, превысивший лимит, получает 404 и по умолчанию временный бан. Так отсекаются флуд, агрессивные парсеры и программы подбора паролей, которые шлют поток запросов с одного или нескольких адресов.

Включается она в настройках сайта: вкладка Дополнительно, Защита от DDoS.

Настройки

Настройка По умолчанию Диапазон Значение
Макс. запросов 150 от 1 до 100 000 Сколько запросов может сделать один посетитель…
за секунд 10 от 1 до 3600 …за столько секунд
Бан, минут 5 от 0 до 10 080 (7 дней) Сколько времени посетитель, превысивший лимит, остаётся забанен. 0: без бана, отклоняются только запросы сверх лимита
IP в белом списке пусто Белый список

Ставьте лимит с запасом. Одна страница с картинками, скриптами и шрифтами сразу даёт десятки запросов, а человек, который быстро открыл несколько страниц, должен оставаться далеко от лимита. Значение по умолчанию, 150 за 10 секунд, подходит большинству сайтов.

Как считается лимит

Лимит работает как «ведро токенов» (token bucket). Каждый посетитель начинает с полным ведром в 150 токенов (лимит), каждый запрос забирает один, а ведро равномерно наполняется в течение окна: при значениях по умолчанию 15 токенов в секунду. Посетитель может разом отправить до 150 запросов и дальше идти со скоростью 15 запросов в секунду, не получив ни одного отказа. Ведро пустеет только у клиента, который всё время запрашивает чаще.

Когда ведро пусто:

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

Своя страница блокировки тем, кто превысил лимит или забанен, не показывается, они всегда получают простой 404: отдавать страницу на каждый запрос флуда обошлось бы дороже самого флуда.

Посетители с IPv6

Посетитель с IPv4 считается и банится по своему адресу. Посетитель с IPv6 считается и банится по своей сети /64, потому что один абонент обычно распоряжается целой /64 и иначе мог бы обойти бан, сменив адрес. В списке забаненных IP такой посетитель отображается как 2001:db8:1:2::/64.

Баны

Баны действуют в пределах сайта: посетитель, забаненный на одном сайте, по-прежнему может открывать другие ваши сайты. Баны выдаются лимитом запросов и Bot Fight Mode (пробы, атаки в URL, поддельные краулеры, путь-ловушка, сканирование путей, у каждого своё время бана). Забаненные посетители блокируются, пока включена защита от DDoS или Bot Fight Mode.

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

Одновременно хранится не больше 50 000 банов на все сайты. Если крупная распределённая атака заполнит этот объём, самые старые баны сайта, у которого их больше всего, снимаются досрочно, чтобы освободить место, а в журнал пишется предупреждение (не чаще раза в час). Досрочно разбаненный адрес снова начинает с полного ведра и опять получает бан, если продолжает атаковать.

Белый список

В поле IP в белом списке перечисляются адреса и сети (по одному на строке, например 198.51.100.7 или 10.0.0.0/8), которых защита сайта никогда не касается.

Адрес из списка освобождается от:

  • лимита запросов и банов,
  • всего Bot Fight Mode, включая обнаружение сканирования,
  • гео-блокировки: стран, сетей и языка браузера,
  • штрафа за слишком долго выполняющиеся шаблоны .htaccess.

Это действует, даже когда сам лимит запросов выключен: белый список относится ко всей защите сайта.

Он не освобождает от:

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

Канонические формы

Записи читаются строго и хранятся в одной канонической форме, поэтому один и тот же адрес не может встретиться дважды: 1.2.3.4/32 хранится как 1.2.3.4, FE80::1 как fe80::1, а дубликаты удаляются. Неправильная запись вроде 1.2.3.4/ отклоняется как ошибка, поэтому её никогда не прочитают как /0, то есть весь интернет.

Записи, сохранённые старыми версиями, которые ещё можно прочитать (198.51.100.0/ 24, 1.2.3.4/), исправляются при запуске панели и при импорте настроек; записи, которые прочитать нельзя, удаляются. И то и другое записывается в журнал.

Разрешить всех

0.0.0.0/0 (все адреса IPv4) и ::/0 (все адреса IPv6) принимаются, потому что иногда вы имеете в виду именно это. При сохранении панель предупреждает, что такая запись выключает для этого семейства адресов все правила защиты сайта, в том числе лимит запросов.

За Cloudflare и другими прокси

За прокси все запросы приходят с адресов самого прокси. Лимит считал бы всех посетителей одним, и единственный бан закрыл бы сайт для всех.

Для Cloudflare включите За Cloudflare в настройках сайта, и лимит будет считаться по каждому реальному посетителю. Если забыть это сделать, WardPane заметит, что запросы идут от Cloudflare, и банить его адреса не станет: каждый сервер Cloudflare получит десятикратный лимит сайта, а в журнал запишется предупреждение.

Адресов других прокси и CDN WardPane не знает, поэтому для сайта за таким прокси защиту от DDoS не включайте.