Два слова, два противоположных поведения
Когда приходит флуд, хост может сделать одно из двух, и индустрия продаёт оба варианта под названием «защита от DDoS». Первый — поглощение: трафик затягивается в scrubbing-слой выше по потоку от вашего сервера, атакующие пакеты отбрасываются там же, легитимные пакеты идут дальше, и ваш сервис остаётся доступным на всём протяжении атаки. Второй — blackholing — также называемый null-routing, или RTBH согласно RFC 5635, — когда ваш IP-адрес выводится из таблицы маршрутизации, так что до него вообще ничего не доходит. Флуд перестаёт попадать в дата-центр. Как и ваши пользователи, ваш мониторинг и ваша SSH-сессия. Атакующий получает ровно тот результат, за который заплатил.
Оба варианта — реальная инженерия, и ни один из них не является обманом сам по себе. Blackholing существует потому, что поглощение крупного флуда стоит реальных денег — транзит тарифицируется, scrubbing-мощности закупаются и разворачиваются заранее, — и бюджетный хост, ставящий одного клиента на null-route ради того, чтобы четыреста остальных остались онлайн, принимает вполне защитимое решение. Хитрость — в местоимении. «Защита от DDoS» верна в обоих случаях; разница в том, чей сервис на самом деле защищают. Читайте каждую тарифную карточку, держа этот вопрос в голове.
| Реакция | Трафик атаки | Ваш сервис | Обычно описывается как |
|---|---|---|---|
| Scrubbing / поглощение | Фильтруется выше по потоку, отбрасывается на edge | Остаётся онлайн, обычно без заметных изменений | «Постоянная митигация», «anycast scrubbing» |
| Blackhole / null-route | Отбрасывается вместе с вашим легитимным трафиком | Офлайн на всё время атаки — обычно 1–24 h | «Защита до X Gbps», «временная приостановка IP» |
| Только rate-limit на edge | Частично отбрасывается, частично случайно | Деградация — реальные пользователи видят потери пакетов | «Базовая защита включена» |
| Ничего (решает оператор) | Доходит до стойки, пока апстрим не заблокирует префикс через blackhole | Офлайн, как и ваши соседи по стойке | «Доступна защита от DDoS» |
Читаем мелкий шрифт до оплаты
Формулировки выдают всё сами. «Защита до 10 Gbps» — это потолок, и следующее предложение — то, что про трафик сверх лимита, — и есть пункт про null-route. «Защищённый IP доступен как дополнение» означает, что адрес, который вы получаете по умолчанию, не защищён. «Per-incident» означает, что счёт придёт уже после атаки. «Fair use», привязанное к митигации, означает квоту атак в месяц, после которой вы остаётесь один на один с проблемой. Ни одна из этих формулировок не ложь — их просто пишут так, чтобы их пробежали глазами не задумываясь.
Конкретный, публично задокументированный пример — потому что это официальная политика, а не слухи: BuyVM продаёт отфильтрованные от DDoS адреса как отдельное дополнение за $3/month за IP, а нефильтрованные адреса уходят на null-route на время атаки. Мы описываем это почти без комментариев на нашей странице сравнения с BuyVM, потому что дешёвый нефильтрованный IP — вполне разумный продукт, если вы знаете, что именно покупаете. Провальный сценарий — узнать об этом в 03:00, когда против вас работает booter.
Четыре вопроса, которые стоит задать пресейл-отделу до первого счёта. Какова ёмкость митигации — и это суммарная цифра или доступная в одной точке присутствия? «Сеть на 2 Tbps», которая сходится в одном scrubbing-центре, имеет всего одну трубу, которую можно заполнить. Митигация включена в тариф или это дополнение? Есть ли плата за инцидент или месячная квота митигированных событий? При каком пороге вы отправляете на null-route и на какой срок? Хост, отвечающий на последний вопрос цифрой, стоит больше, чем тот, что отвечает прилагательными.
Три уровня — и почему именно уровень определяет, кто может это исправить
L3/L4 объёмные атаки. SYN-флуды, UDP-флуды, отражение и амплификация через открытые сервисы NTP, DNS, memcached, CLDAP и SSDP. Атакующий тратит немного полосы у себя и получает обратно кратно больше, направленное на вас. Это проблема пропускной способности и pps, и она принципиально нерешаема на вашем сервере: к моменту, когда ваше ядро могло бы отбросить пакет, труба, по которой он идёт, уже забита. Здесь вас не спасёт ничего в nftables. Спасает только ёмкость выше вас по потоку.
L4 — исчерпание состояний. SYN-, ACK- и флуды соединений, рассчитанные не на то, чтобы забить трубу, а на то, чтобы забить таблицу — SYN backlog ядра, таблицу conntrack, accept-очередь вашего приложения. Полоса при этом может быть тривиальной: пары сотен Mbps хватит, чтобы положить ненастроенный сервер, пока график на стороне хоста будет выглядеть как тихий день. Этот уровень — действительно наполовину ваша зона ответственности: он переживаем с tcp_syncookies, разумно выставленным nf_conntrack_max и лимитами по источнику, и не переживаем без них.
L7 — уровень приложения. HTTP-флуды из по отдельности валидных запросов — реальные TLS-рукопожатия, правдоподобные строки User-Agent, иногда настоящие браузеры — нацеленные на то, что на вашем сайте дорого стоит: поиск, логин, корзину, страницу листинга, завязанную на базу данных. Класс атак HTTP/2 Rapid Reset показал, как мало мегабит для этого нужно, когда каждый запрос обходится серверу дороже, чем клиенту. Scrubbing-устройство не видит содержимого TLS-сессии, которую само не терминирует, поэтому этот уровень закрывается либо правилами на edge, либо вашим собственным reverse proxy — но никогда сырой объёмной ёмкостью.
| Уровень | Типичная атака | Типичный размер | Где это нужно остановить | Можно исправить на вашем сервере? |
|---|---|---|---|---|
| L3/L4 объёмная | UDP-флуд, амплификация DNS/NTP/memcached | 5 Gbps – 1+ Tbps | Выше по потоку, на edge | Нет — труба забивается раньше |
| L4, исчерпание состояний | SYN/ACK-флуд, исчерпание conntrack | 0.1 – 10 Gbps | Edge плюс настройка ядра | Частично — syncookies, размер conntrack |
| L7, уровень приложения | Флуд HTTP(S)-запросов, slow POST, Rapid Reset | Часто меньше 1 Gbps | Правила на edge или ваш reverse proxy | Да — rate-limit, challenge, кэш |
Насколько велика реальная атака — если честно?
Примерно девять атак из десяти, долетающих до небольшого оффшорного сервера, приходят от booter или stresser — сервиса по подписке за $10–30 в месяц, перепродающего ёмкость амплификации по минутам. Они выдают что-то между 5 и 50 Gbps всплесками по несколько минут, и именно с этим на практике сталкивается Minecraft-сервер, сеть IRC, Tor-релей, форум с обиженным экс-модератором или лобби в соревновательной игре. Этот диапазон полностью переживаем — и его же полностью достаточно, чтобы положить незащищённый VPS за $5.
Следующая ступень — 100–400 Gbps от арендованного ботнета — это то, что прилетает, когда у кого-то есть конкретная обида и бюджет. Против мелких целей это редкость, против гемблинга, стриминга и adult-проектов — рутина. Выше находятся рекордные события, о которых отчитываются крупные вендоры митигации, — теперь это уже многие терабиты в секунду и сотни миллионов запросов в секунду; обычный публичный ориентир — квартальные данные на Cloudflare Radar. Вы почти наверняка не являетесь целью подобной атаки.
Но пострадать от такой атаки вы всё равно можете — и этого не пишут ни на одной тарифной карточке: сопутствующий ущерб распространяется по префиксу. Если хост делает blackholing с гранулярностью /24 — а многие так и делают, потому что это наименьший префикс, который большинство операторов примут для RTBH, — то атака на один адрес в вашей подсети кладёт все адреса в ней. Ваш аптайм зависит от врагов совершенно постороннего человека. Именно запас ёмкости избавляет от необходимости когда-либо принимать это решение.
Наши собственные цифры — для ориентира, а не для хвастовства: 1 Tbps anycast-scrubbing на L3/L4, распределённых по четырём точкам присутствия, каждая из которых способна в одиночку поглотить около 300 Gbps, с автоматическим детектированием за две секунды. Самое крупное событие, которое мы поглотили для клиента, было выше 600 Gbps против игрового сервера, и соединения игроков не оборвались. Архитектура подробно описана на странице о сети.
Включено, per-incident или квота — коммерческая модель имеет значение
Митигацию продают тремя способами, и счета у них получаются очень разные. Включено: стоимость заложена в тариф, и атака никак не меняет то, что вы платите. Per-incident: с вас берут плату за каждое митигированное событие, иногда — за час митигации. Квота: определённое число событий в месяц или пункт про «fair use», позволяющий хосту самому решать, когда с вас достаточно.
Модель per-incident — не разводка. Отфильтровываемый трафик всё равно проходит через транзит хоста, прежде чем его отбросят, а транзит тарифицируется по 95-му перцентилю или по законтрактованной ставке — затяжная кампания против одного клиента становится реальной строкой в чьём-то счёте. Проблема не в справедливости, а в предсказуемости: при двухнедельной кампании хост с моделью per-incident превращает атаку на вас в счёт для вас — это вторая атака, только с дополнительными шагами. Уточните, какая модель применяется, до того, как это станет вам жизненно необходимо знать.
Наша позиция, сформулированная прямо, чтобы её можно было проверить: защита включена по умолчанию на каждом тарифе — от Starter за $8.50 до Citadel за $299.50, без opt-in, без платы за инцидент, без месячной квоты и без пункта про «fair use», привязанного к митигации. Это одна и та же фабрика — что на самом дешёвом VPS, что на самом крупном выделенном сервере, см. тарифы VPS и уровни выделенных серверов. С тарифом масштабируется аплинк и опциональный набор правил L7, а не сам факт того, защищены вы или нет.
Рассеивание через anycast — и почему скорость детектирования важнее заявленной ёмкости
У одного scrubbing-центра есть жёсткий потолок: транзит в это единственное здание. У него есть и цена в виде задержки, потому что во время митигации весь трафик сначала тащат именно туда, — поэтому у некоторых хостов заметно растёт задержка для европейских пользователей в момент начала атаки, и остаётся такой до её окончания.
Anycast меняет арифметику ещё до того, как в дело вступает железо. Один и тот же префикс анонсируется из каждой точки присутствия, поэтому глобально распределённый ботнет разбивается по этим точкам одной лишь топологией интернета: атака на 600 Gbps, идущая отовсюду, приходит как примерно 150 Gbps в четырёх местах, а не 600 Gbps в одном. Основную работу делает само рассеивание; scrubbing-оборудованию остаётся обработать лишь то, что осталось после того, как география уже всё поделила.
Скорость детектирования — недооцененная цифра. Митигация, включающаяся за две секунды, незаметна для TCP-сессии; митигация, включающаяся за шестьдесят секунд, срабатывает уже после того, как ваши пользователи дважды перезагрузили страницу и ушли, а игровое лобби опустело. Если хост называет ёмкость, но не время детектирования, спросите вторую цифру — именно она решает, заметят ли вообще что-то ваши пользователи.
Если вы приходите со своим префиксом, blackholing превращается в скальпель у вас в руках, а не в то, что делают с вами. Наши BGP-community покрывают депреференс по отдельному оператору (cs:100:carrier), региональный prepend (cs:200:region) и выборочный blackhole (cs:666:prefix), так что вы можете отправить на null-route один адрес под атакой, пока остальная часть вашей аллокации продолжает работать. Вот это — blackholing, применённый правильно: хирургически точно, кратко и по вашему собственному решению.
Оффшорное осложнение: US-прокси спереди сводит на нет весь смысл
Стандартный совет на любом форуме — «просто поставьте за Cloudflare, бесплатного тарифа хватит». Для обычного сайта это хороший совет. Но если вы выбрали оффшорный хостинг по юрисдикционным причинам, этот совет тихо возвращает всё, от чего вы уходили: компания, зарегистрированная в США, теперь терминирует ваш TLS и видит ваш открытый трафик, принимает жалобы на злоупотребления и авторские права и действует по ним согласно собственной политике, ведёт аккаунт, привязанный к email и обычно к способу оплаты, и может получить американское судебное требование. То, что ваш хостинг игнорирует уведомление DMCA, стоит очень мало, если ваш CDN его исполняет — механика описана в разборе DMCA-ignored, а юрисдикционные риски — в гиде по 14 Eyes.
Прокси также не скрывает ваш origin-сервер, если вы не ограничите его файрволом только префиксами прокси — и не будете поддерживать это постоянно. Но даже тогда адрес утекает через историю пассивного DNS, через логи certificate transparency, если origin когда-либо отвечал по TLS на собственное имя, через почту, отправленную напрямую с сервера, через старую A-запись, которую забыли удалить, и через любую страницу ошибки, эхом выдающую собственный hostname сервера. Прямые обращения к origin — вот как «защищённые» сайты всё равно кладут. Плейбук анонимного хостинга разбирает всю поверхность утечки целиком.
Если нужен слой прокси без юрисдикционной цены, разворачивайте его сами: второй небольшой инстанс в той же или совместимой юрисдикции, терминирующий TLS под вашим собственным ключом, при этом файрвол origin-сервера принимает только этот адрес и ничего больше. Вы сохраняете кэширование и фильтрацию запросов, и в цепочку доверия не входит никакая третья сторона. Обе машины стоят за одной и той же scrubbing-фабрикой, так что прокси не становится новой мягкой мишенью.
Что по-прежнему остаётся вашей задачей — на самом сервере
Scrubbing выше по потоку защищает трубу. Он не настраивает ваше ядро, а диапазон исчерпания состояний — это как раз то место, где ненастроенный сервер умирает от атаки, которую сеть едва зарегистрировала. Короткий список, в порядке отдачи: включите net.ipv4.tcp_syncookies и увеличьте net.ipv4.tcp_max_syn_backlog (параметры описаны в справочнике ip-sysctl ядра); выставьте nf_conntrack_max под реально ожидаемое число соединений, либо используйте notrack для высокоинтенсивного UDP-трафика игр, чтобы таблица вообще не задействовалась; добавьте лимиты по источнику в nftables, а не рассчитывайте, что edge сработает хирургически точно.
На стороне приложения limit_req и limit_conn в nginx ничего не стоят и останавливают большинство L7-флудов, специально не замаскированных под человека. Кэшируйте всё, что можно кэшировать, потому что лучшая цель для атакующего — всегда та единственная страница, которую вы генерируете из базы данных при каждом запросе. Держите SSH и любую панель управления вне адреса, обслуживающего публичную нагрузку, либо за allowlist.
Одно направление, о котором часто забывают: не станьте отражателем сами. Открытый DNS-резолвер, ненастроенный демон NTP или доступный извне memcached на вашем сервере делает вас частью чужой атаки амплификации, а к исходящим злоупотреблениям относятся куда жёстче, чем к входящим — заявленное время реакции в нашем AUP — это null-route и приостановка в течение двух часов. Входящий флуд — это то, что происходит с вами; исходящий флуд — это то, за что отвечаете вы сами.
Чек-лист, который стоит пройти до покупки
Девять вопросов — в порядке, который быстрее всего отсеивает хостов. Какова ёмкость митигации, и это на точку присутствия или суммарно? Она включена в цену тарифа или продаётся отдельно за IP? Есть ли плата за инцидент или месячная квота митигированных событий? Какова задержка детектирования? Доступна ли вообще фильтрация L7 и на каких тарифах? При каком пороге и на какой срок вы отправляете на null-route, и сообщают ли вам об этом? Меняет ли митигация мою маршрутизацию или задержку, пока она активна? Защищён ли адрес, который я получаю по умолчанию? И — вопрос, который почти никто не задаёт, — что сохраняется о моём трафике, пока идёт митигация?
Этот последний вопрос важен на этом рынке больше, чем где-либо ещё. Scrubbing означает, что кто-то выше по потоку смотрит на ваши пакеты. Спросите, что переживает событие атаки. Наш ответ — и он не меняется во время атаки: детектирование работает на агрегированных счётчиках на edge — пакеты и биты в секунду, по префиксу, — а не на сохранённых записях по отдельным потокам, и постоянная позиция «никакого netflow, никакого PCAP и никакого зеркалирования NIC», опубликованная в политике конфиденциальности, действует во время митигации ровно так же, как и в любое другое время. Хост, который не может на это ответить, тем самым вам кое-что сообщает.
Если ответы получились скудными, есть дешёвый запасной вариант: купите один месяц самого младшего тарифа, направьте на него зонд мониторинга и прямо спросите поддержку, что происходит, когда сервер получает удар. Здесь нет контракта и нет платы за установку, так что хост, уклоняющийся от письменного ответа, обойдётся вам в $8.50, чтобы это выяснить. Разверните Starter или почитайте VPS против выделенного сервера, если нагрузка достаточно велика, чтобы ответ на этот вопрос менял выбор тарифа.