{{tag>Услуги "Услуга 8" "Услуга 10" "DDoS защита"}}
====== Защита от DDoS атак: UDP, SYN, HTTP flood======
{{indexmenu_n>12}}
СКАТ фильтрует атакующий трафик до того, как он достигнет защищаемого сайта или IP клиента. Поддерживается защита от трёх типов атак:
^ Атака ^ Механизм защиты ^ Как подключается ^
| [[#защита_от_syn_flood|SYN flood]] | SYN PROXY: СКАТ сам отвечает на SYN и открывает сессию с сайтом только после подтверждения клиентом | Услуга 10, параметры ''syncf_*'' |
| [[#защита_от_udp_flood|UDP flood]] | Отбрасывание протоколов, неактуальных для защищаемого сайта или IP клиента | Фильтр протоколов (''protocols.dscp'') |
| [[#защита_от_http_flood|HTTP flood]] | При превышении порога — перенаправление на страничку с CAPTCHA, прошедшие проверку попадают в белый список | Услуга 10, параметры ''ddos_*''; белый список — услуга 8 |
Защиту от SYN flood и HTTP flood можно настроить через GUI: [[dpi:dpi_components:dpiui:user_guide:ssg_control_section:services#защита_от_ddos|Инструкция]], или через CLI (см. [[#управление_услугой|Управление услугой]]).
===== Защита от SYN flood =====
Атака SYN flood вызывает повышенный расход ресурсов атакуемой системы: на каждый входящий SYN-пакет система должна зарезервировать ресурсы в памяти либо сгенерировать SYN+ACK-ответ с криптографической cookie, выполнить поиск в таблицах сессий и т. п. Отказ в обслуживании наступает при потоке 100 000–500 000 пакетов в секунду, тогда как даже гигабитный канал позволяет направить на сайт до 1,5 млн пакетов в секунду.
СКАТ защищает от SYN flood так:
- обнаруживает атаку по превышению заданного порога неподтверждённых клиентом SYN-запросов;
- самостоятельно, вместо защищаемого сайта, отвечает на SYN-запросы (механизм SYN PROXY);
- устанавливает TCP-сессию с защищаемым сайтом после подтверждения запроса клиентом.
==== Параметры защиты ====
Режим защиты (по умолчанию ''0''):
* ''0'' — защита выключена;
* ''1'' — активируется автоматически;
* ''2'' — включена всегда.
syncf_protection=1
Процент неподтверждённых клиентом запросов, при котором защита автоматически активируется (по умолчанию ''5'', можно менять online):
syncf_unconfirmed_percent=30
Порог количества SYN в секунду (без подтверждения), при котором считается, что всё нормально (по умолчанию ''50''):
syncf_threshold=50
Логирование срабатывания защиты (по умолчанию ''0''):
* ''0'' — нет;
* ''1'' — логировать переключения защиты on/off.
syncf_trace=1
Интервал проверки количества SYN и подтверждённых SYN, мс (по умолчанию ''100''):
syncf_check_tmout=100
Интервал мониторинга ответа на SYN+ACK, сформированный СКАТ, с (по умолчанию ''60''):
syncf_tracking_packs_time=60
Защищаемые порты указываются в ''/etc/dpi/fastdpi.conf'' (по умолчанию ''80'', можно менять online). Настройка общая для всех защищаемых сайтов:
syncf_ports=80:443
===== Защита от UDP flood =====
Атака обычно выполняется короткими/фрагментированными UDP-пакетами с высоким PPS, на сборку и анализ которых атакуемая платформа вынуждена тратить много ресурсов.
Защита осуществляется отбрасыванием неактуального набора протоколов для защищаемого сайта или IP клиента. Конфигурирование фильтра протоколов описано в опции [[dpi:dpi_options:opt_priority:priority_config|Назначение приоритетов]].
Для типового веб-сайта актуальны только HTTP и HTTPS, поэтому конфигурация выглядит так:
http cs0
https cs0
default drop
Конвертируйте подготовленный файл во внутренний формат и загрузите в DPI:
cat my_dscp.txt|lst2dscp protocols.dscp
mv protocols.dscp /etc/dpi/protocols.dscp
service fastdpi reload
Аналогично можно защищаться от атак типа DNS/NTP amplification, при которых входящий канал забивается трафиком сверх его ёмкости. Действие такой защиты ограничено возможностями оператора по предоставлению дополнительной канальной ёмкости. При её превышении потребуется аренда дополнительных каналов или перенаправление трафика на специализированные сервисы защиты.
===== Защита от HTTP flood =====
При HTTP flood ботнет имитирует действия легитимных пользователей, обычно выбирая наиболее ресурсоёмкие запросы к сайту. За счёт большого числа участвующих компьютеров это приводит к отказу в обслуживании. Для отсева ботов СКАТ использует страничку с CAPTCHA.
Принцип работы:
- при превышении порогового значения (например, комфортного для сайта количества запросов в секунду) активируется защита;
- к сайту допускаются только пользователи из белого списка, остальные перенаправляются на страничку с CAPTCHA. Страничка расположена на отдельном сервере, способном выдержать нагрузку ботнета любого размера;
- пользователи, успешно прошедшие тест, добавляются в белый список и дальше работают с сайтом без ограничений;
- боты не могут продвинуться дальше проверочной странички и не создают нагрузку на сайт.
==== Параметры защиты ====
Защита активируется при превышении одного из порогов, заданных в ''/etc/dpi/fastdpi.conf''.
Порог по запросам в секунду:
ddos_reqsec_threshold=300
ddos_reqsec_variation=5
* ''ddos_reqsec_threshold'' — количество запросов в секунду к защищаемому сайту; обычно выбирается максимальное значение, наблюдавшееся при нормальной работе сайта;
* ''ddos_reqsec_variation'' — допустимое отклонение от порога в процентах, при котором защита включается/выключается. Нужно для избежания «дребезга», по умолчанию 5%.
Порог по пакетам в секунду:
ddos_pktsec_threshold=5000
ddos_pktsec_variation=5
* ''ddos_pktsec_threshold'' — количество пакетов в секунду к защищаемому сайту; обычно выбирается максимальное значение, наблюдавшееся при нормальной работе сайта;
* ''ddos_pktsec_variation'' — допустимое отклонение от порога в процентах (по умолчанию 5%).
**Если заданы оба порога, приоритетным считается ''ddos_reqsec_threshold'', а ''ddos_pktsec_threshold'' не учитывается.**
Страничка с CAPTCHA, на которую выполняется перенаправление, и ключ шифрования:
ddos_check_server=www.server_name.ru/path/page.html?
ddos_security_key=123567890
* ''ddos_security_key'' — ключ шифрования для формирования токенов, сообщающих DPI об успешном прохождении проверки.
Логирование срабатывания защиты:
ddos_trace=1
==== Белый список доверенных IP ====
Список доверенных IP можно собрать заранее — по логам веб-сервера защищаемого сайта (скрипт анализа пишется самостоятельно или службой техподдержки) или по логу, который формирует сам DPI (см. [[dpi:dpi_options:opt_statistics:opt_li|СОРМ]]).
Загрузка списка в DPI (белый список — **услуга 8**):
fdpi_ctrl load --service 8 --file ip_list.txt
Подробнее о командах ''fdpi_ctrl'' и персистентности данных — в разделе [[dpi:dpi_components:platform:subscriber_management|Управление абонентами]]. Абонентами в этом случае считаются пользователи защищаемого сайта.
==== Страничка с CAPTCHA ====
Требования:
* страничка должна располагаться за DPI((В планах — поддержка размещения капчи на внешних ресурсах, например Cloudflare.)), и на неё тоже должна быть подключена услуга 10 с профилем защиты. Минимально в профиле должны быть указаны ''ddos_check_server'' и ''ddos_security_key''. Для простоты можно использовать тот же профиль, что и для защищаемого сайта;
* страничка должна быть легковесной, чтобы выдерживать наплыв атакующих компьютеров.
Порядок работы:
- на страничку передаётся параметр ''UrlRedir'' с URL защищаемого сайта, куда направлялся пользователь;
- после проверки капчи выполняется внутренний редирект на сайт с капчей с зашифрованным параметром, сигнализирующим DPI о прохождении проверки;
- затем выполняется редирект на защищаемый сайт по параметру ''UrlRedir''.
Успешный ввод капчи означает, что на сайт пришёл человек: на его IP-адрес автоматически подключается услуга 8, и дальше он работает с сайтом без повторной проверки. Эту услугу имеет смысл периодически сбрасывать, так как ранее чистые компьютеры могут быть заражены.
Правила формирования security token и пример странички с капчей можно получить через службу техподдержки.
===== Управление услугой =====
Защита от SYN flood и HTTP flood на уровне отдельных абонентов (защищаемых IP) управляется командой [[dpi:dpi_components:platform:subscriber_management:subsman_cmd|fdpi_ctrl]].
Формат команды:
fdpi_ctrl команда --service 10 [список опций] [список_IP или login]
Синтаксис команд и способы задания IP-адресов описаны в разделе [[dpi:dpi_components:platform:subscriber_management:subsman_cmd|Команды управления]].
==== Параметры профиля ====
Профиль услуги задаётся в формате JSON. Можно указать только часть параметров: например, только параметры HTTP flood — тогда защита от SYN flood будет неактивна. Неуказанные параметры принимают значения по умолчанию.
^ Защита ^ Параметры ^
| [[#защита_от_syn_flood|SYN flood]] | ''syncf_protection'', ''syncf_trace'', ''syncf_check_tmout'', ''syncf_tracking_packs_time'', ''syncf_unconfirmed_percent'', ''syncf_threshold'' |
| [[#защита_от_http_flood|HTTP flood]] | ''ddos_trace'', ''ddos_reqsec_threshold'', ''ddos_reqsec_variation'', ''ddos_pktsec_threshold'', ''ddos_pktsec_variation'', ''ddos_check_server'', ''ddos_security_key'' |
==== Примеры ====
Создать профиль и подключить защиту с этим профилем для нескольких абонентов:
fdpi_ctrl load profile --service 10 --profile.name test_protect --profile.json '{ "ddos_trace" : 1, "ddos_reqsec_threshold" : 100, "ddos_reqsec_variation" : 5, "ddos_pktsec_threshold" : 1000, "ddos_pktsec_variation" : 5, "ddos_check_server" : "captcha.server.ru/?", "ddos_security_key" : "123", "syncf_protection" : 0 , "syncf_trace" : 0 , "syncf_check_tmout" : 0 , "syncf_tracking_packs_time" : 0 , "syncf_unconfirmed_percent" : 0 , "syncf_threshold" : 0 }'
fdpi_ctrl load --service 10 --profile.name test_protect --ip 192.168.0.1
fdpi_ctrl load --service 10 --profile.name test_protect --ip 192.168.0.2
Найти абонентов с заданным профилем:
fdpi_ctrl list all --service 10 --profile.name test_protect
Изменить настройки профиля (применятся ко всем абонентам с этим профилем):
fdpi_ctrl load profile --service 10 --profile.name test_protect --profile.json '{ "ddos_reqsec_threshold" : 0, "ddos_reqsec_variation" : 5, "ddos_pktsec_threshold" : 0, "ddos_pktsec_variation" : 5, "syncf_protection" : 1 , "syncf_trace" : 1 , "syncf_check_tmout" : 500 , "syncf_tracking_packs_time" : 180 , "syncf_unconfirmed_percent" : 25 , "syncf_threshold" : 100 }'
Список профилей услуги и их настроек:
fdpi_ctrl list all profile --service 10
Удалить профиль (не должно быть абонентов, которые его используют):
fdpi_ctrl del profile --service 10 --profile.name test_protect
Отключить защиту для абонента:
fdpi_ctrl del --service 10 --ip 192.168.0.1
Просмотреть статус защиты:
fdpi_ctrl list status --service 10 --ip 192.168.0.1
Вывод:
192.168.0.1 synf=0 ddos=1
* ''synf=0'' — защита от SYN flood не активна;
* ''ddos=1'' — защита от HTTP flood активна.
==== Максимальное количество профилей ====
Задаётся в ''/etc/dpi/fastdpi.conf'' (по умолчанию ''32'', максимум ''65535''):
max_profiles_ddos=32
Это «холодный» параметр — после изменения требуется рестарт.