«Защита от DDoS включена» — эта строка есть в каждом прайс-листе хостинга, и у каждого провайдера она означает своё. В этой статье мы объясняем, что делает наша защита и в каком порядке всё происходит во время атаки, чего она стоит вам в задержке (в обычном режиме — ничего) и какой класс атак не может поглотить за вас ни одна защита на уровне сети.
Обнаружение: sFlow на границе сети
Каждый пограничный маршрутизатор в наших шести локациях экспортирует выборочные записи о потоках на коллектор на той же площадке. Коллектор ведёт для каждого адреса назначения базовый профиль (пакеты в секунду, биты в секунду и состав протоколов) и сравнивает с ним последние несколько секунд. Адрес, трафик на который вырастает на порядок и по форме напоминает атаку, например миллионы UDP-пакетов от десятков тысяч источников или поток SYN-пакетов такой интенсивности, какой не создаёт ни один легитимный сервис, помечается в течение двух–четырёх секунд после начала флуда.
Сэмплирование означает, что коллектор видит один пакет из нескольких тысяч: этого достаточно, чтобы распознать объёмную атаку, но недостаточно, чтобы заметить медленную атаку прикладного уровня. К этому ограничению мы вернёмся в конце.
Перенаправление: переезжает атакуемый префикс, остальные остаются на месте
Когда адрес помечен, коллектор анонсирует его /32 (или /128) в маршрутизацию площадки с next hop, указывающим на кластер очистки. Путь меняется только у этого адреса; все остальные серверы на том же хосте, в той же стойке или в той же /24 сохраняют обычный маршрут. Перенаправление требует одного BGP-обновления внутри площадки, поэтому от обнаружения до начала очистки обычно проходит меньше десяти секунд.
Трафик, адресованный помеченному адресу, теперь попадает в кластер очистки — набор серверов с фильтрами на базе DPDK, мощность которых заметно превышает совокупный транзит площадки. Сначала фильтры отсекают атаку по сигнатурам (источники амплификации, некорректные пакеты, подменённые диапазоны адресов), затем по поведению (лимиты по источникам, SYN cookies, проверка TCP-рукопожатия), а то, что осталось, пересылают на исходный сервер по внутренней сети. Ваш сервер видит очищенный остаток с сохранёнными исходными адресами.
Что значит «всегда включено» для вашей задержки
Это значит, что до обнаружения атаки в тракте трафика (inline) ничего нет. В обычном режиме пакеты идут напрямую от пограничного маршрутизатора к вашему серверу; кластера очистки на этом пути нет, поэтому нет ни лишнего хопа, ни дополнительной задержки, ни прокси, переписывающего ваши заголовки. Во время атаки лишний хоп через кластер добавляет внутри площадки несколько сотен микросекунд. Это вся цена защиты в задержке, и вы платите её только пока вас атакуют.
Альтернативная схема, при которой весь трафик всегда проходит через фильтр, не даёт никакой дополнительной защиты и при этом постоянно добавляет всем немного задержки. Мы так не делаем.
Мощность и откуда она берётся
Каждая узловая площадка (Франкфурт, Нью-Йорк, Сингапур) располагает мощностью очистки, превышающей суммарный транзит и пиринг, поэтому атака, забивающая аплинки, останавливается раньше, чем успевает их забить. Атаки крупнее транзита отдельной площадки — причина, по которой у нас несколько аплинков с независимыми путями, а самые крупные флуды гасятся собственной защитой наших вышестоящих операторов (её они предоставляют по подписанному контракту) ещё до того, как доходят до нас. Малые площадки (Амстердам, Хельсинки, Лос-Анджелес) перенаправляют атакуемые префиксы на ближайший узел по нашей магистрали.
Мы не публикуем единую цифру в терабитах, потому что она была бы верна лишь для одного вида атаки. Важна другая цифра: за последние двенадцать месяцев ни одна атака на клиента не привела к измеримым потерям у клиентов той же площадки, которые не были целью. В этом и состоит обещание: проблемы соседа остаются проблемами соседа.
Возврат в штатный режим
Когда коллектор видит, что атакующий трафик в течение нескольких минут вернулся к базовому уровню, он отзывает перенаправление, и адрес возвращается на прямой путь. При повторных атаках на тот же адрес перенаправление сохраняется дольше (до нескольких часов), чтобы избежать «флаппинга». Состояние видно в панели на вкладке Сеть вашего сервера и в журнале событий, там же указана зафиксированная пиковая скорость.
Что мы не можем поглотить за вас
Флуд седьмого уровня (L7) — это несколько тысяч корректно сформированных HTTPS-запросов в секунду к ресурсоёмкому эндпоинту вашего собственного приложения, от настоящих браузеров или от ботнета, который грамотно говорит по TLS. Для сети это выглядит как обычный трафик, для вашего приложения — как очень напряжённый день, а процессор или база данных ложатся раньше, чем счётчик пакетов пересекает какой-либо порог. Сетевая защита не отличает такие запросы от запросов настоящих клиентов, и мы тоже не смогли бы, не расшифровывая ваш трафик, а мы этого не делаем.
Защита от этого живёт в вашем стеке:
- Ограничение частоты запросов для каждого клиента в nginx или Caddy (
limit_reqили плагин rate-limit для Caddy) с более жёстким лимитом для эндпоинтов входа и поиска. - Кэширование всего, что можно кэшировать, чтобы атака попадала в кэш, а не в приложение.
- CDN или WAF перед origin-сервером, если вам нужны страницы-проверки (challenge) и оценка ботов; не публикуйте IP-адрес origin в DNS, чтобы атакующий не мог обойти защиту.
- Лимиты соединений и таймауты, настроенные так, чтобы атаки медленными запросами не могли занять все воркеры.
Мы с радостью поможем с любым из этих пунктов в тикете, а сервер, который атакуют на уровне L7, никогда не попадает за это в null-route; ему просто нужна защита на уровне приложения, настроить которую можете только вы.
Правила в одном месте
- Обнаружение за секунды, перенаправление только атакуемого адреса, очистка на той же площадке.
- Задержки нет, пока вас не атакуют; несколько сотен микросекунд, пока атака идёт.
- Без ограничений по числу атак и их длительности: это часть каждого тарифа, а не платное дополнение.
- Мы никогда не отправляем клиента в null-route из-за того, что его атакуют. Null-route применяется при исходящих злоупотреблениях — это другая история, о которой рассказано в нашей статье о политике abuse.
