Перейти к основному содержимому

Фильтрация трафика

Обзор

Система фильтрации трафика CloudPub обеспечивает контроль доступа к сервисам на основе параметров соединения.

Возможности

Система фильтрации позволяет:

  • Защитить ваши сервисы от нежелательного трафика
  • Ограничить доступ по географическому принципу
  • Заблокировать подозрительные IP-адреса и порты
  • Контролировать HTTP-запросы по методам, путям и заголовкам
  • Перенаправлять трафик при необходимости
  • Ограничить частоту запросов для защиты от DDoS-атак и перебора
  • Журналировать соединения без их блокировки

Параметры фильтрации

Система использует синтаксис, совместимый с фильтрами Wireshark.

Фильтрация трафика

Доступные переменные

IP-адреса

  • ip.src - IP-адрес источника (клиента)
  • ip.dst - IP-адрес назначения (сервера)
  • ip.src.subnet24 - подсеть /24 источника (адрес клиента с обнулённым последним октетом)
  • ip.src.subnet16 - подсеть /16 источника (адрес клиента с обнулёнными двумя последними октетами)

Поля ip.src.subnet24 и ip.src.subnet16 используются прежде всего в ключе подсчёта при ограничении частоты запросов (см. раздел «Ограничение частоты запросов»).

Порты

  • port.src - Порт источника (клиента)
  • port.dst - Порт назначения (сервера)

Протокол

  • protocol - Протокол соединения ("tcp", "udp", "http")

HTTP-поля (доступны только для HTTP-соединений)

  • http.host - Хост из HTTP-заголовка
  • http.path - Путь в HTTP-запросе
  • http.method - HTTP-метод (GET, POST, PUT, DELETE и т.д.)
  • http.user_agent - Заголовок User-Agent
  • http.referer - Заголовок Referer
  • http.cookie - Заголовок Cookie
  • http.headers - Карта HTTP-заголовков

Геолокация

  • geo.country - Страна клиента
  • geo.region - Регион клиента
  • geo.city - Город клиента
  • geo.code - Код страны (ISO)

Синтаксис

Операторы сравнения

  • == - Точное равенство
  • != - Неравенство
  • > - Больше
  • < - Меньше
  • >= - Больше или равно
  • <= - Меньше или равно

Операторы для строк

  • matches - Сопоставление с регулярным выражением
  • contains - Содержит подстроку
  • starts_with - Начинается с подстроки
  • ends_with - Заканчивается подстрокой

Логические операторы

  • and - Логическое И
  • or - Логическое ИЛИ
  • not - Логическое НЕ

Скобки

  • () - Группировка выражений

Примеры

Фильтрация HTTP-запросов

# Правило 1: Блокировать ботов
http.headers["User-Agent"] contains "bot"

# Правило 2: Ограничить размер файлов
http.method == "POST" and http.headers["Content-Length"] > 10000000

Фильтрация по IP-адресам

# Заблокировать конкретный IP-адрес
ip.src == 192.168.1.100

# Разрешить доступ только из локальной сети
ip.src >= 192.168.1.0 and ip.src <= 192.168.1.255

# Заблокировать диапазон IP-адресов
ip.src >= 10.0.0.0 and ip.src <= 10.255.255.255

# Разрешить доступ только с определенных адресов
ip.src == 192.168.1.10 or ip.src == 192.168.1.20

Фильтрация по портам

# Разрешить доступ только с непривилегированных портов
port.src > 1024

# Заблокировать конкретный порт
port.src == 22

# Разрешить доступ только к определенному порту назначения
port.dst == 80 or port.dst == 443

# Заблокировать диапазон портов
port.src >= 1000 and port.src <= 2000

Фильтрация по протоколу

# Разрешить только HTTP-соединения
protocol == "http"

# Заблокировать TCP-соединения
protocol != "tcp"

# Разрешить только UDP-трафик
protocol == "udp"

HTTP-фильтрация

# Заблокировать доступ к админке
http.path matches "^/admin.*"

# Разрешить доступ только к API
http.path starts_with "/api/"

# Заблокировать конкретный хост
http.host == "blocked.example.com"

# Разрешить только GET-запросы
http.method == "GET"

# Заблокировать ботов по заголовку User-Agent
http.user_agent contains "bot"

# Защита от хотлинкинга — разрешить запросы только со своего сайта
http.referer contains "mysite.example.com"

# Фильтрация по произвольному заголовку
http.headers["X-Api-Key"] == "secret"

# Комбинированная фильтрация
http.method == "POST" and http.path starts_with "/api/v1/"

Геофильтрация

# Заблокировать доступ из определенной страны
geo.country == "Russia"

# Разрешить доступ только из определенных стран
geo.code == "US" or geo.code == "CA" or geo.code == "GB"

# Заблокировать доступ из определенного региона
geo.region == "Москва"

# Разрешить доступ только из определенных городов
geo.city == "Санкт-Петербург" or geo.city == "Новосибирск"

Узнать правильное написание города или региона можно в разделе Инспектор запросов.

  • Нажмите на "Инспектр запросов" в личном кабинете
  • Нажмите на "Столбцы"
  • Выберите "Страна", "Регион", "Город"

Сложные комбинированные правила

# Заблокировать админку для всех, кроме локальной сети
http.path matches "^/admin.*" and not (ip.src >= 192.168.1.0 and ip.src <= 192.168.1.255)

# Разрешить API только для аутентифицированных пользователей
http.path starts_with "/api/" and http.headers["Authorization"] contains "Bearer"

# Ограничить доступ к загрузкам только для определенных стран
http.path starts_with "/uploads/" and (geo.code == "US" or geo.code == "CA")

# Заблокировать подозрительные запросы
http.method == "POST" and http.headers["Content-Type"] contains "multipart" and port.src < 1024

# Разрешить доступ только в рабочее время для определенных IP
ip.src >= 192.168.1.0 and ip.src <= 192.168.1.255 and http.path starts_with "/internal/"

Типы действий

После создания правила фильтрации, система выполняет одно из следующих действий:

  • Разрешить - Разрешить соединение
  • Запретить - Заблокировать соединение
  • Перенаправить - Только для HTTP-запросов: перенаправить соединение на другой адрес
  • Журналировать - Записать соединение в журнал, не блокируя его
  • Ограничить частоту - Ограничить частоту новых соединений и число одновременных соединений (см. раздел «Ограничение частоты запросов»)

Ограничение частоты запросов

Действие Ограничить частоту защищает сервис от DDoS-атак, перебора паролей и чрезмерной нагрузки. Оно объединяет два независимых ограничителя:

  • по частоте — сколько новых соединений источник может открыть за интервал времени;
  • по числу одновременных соединений — сколько соединений источника могут быть активны в один момент.

Можно задать любой из ограничителей или оба сразу.

В отличие от остальных действий, правило ограничения частоты не является терминальным: пока лимит не превышен, соединение продолжает проверяться следующими правилами, и только при превышении лимита новые соединения отклоняются. Поэтому ограничение частоты можно совмещать с обычными правилами фильтрации.

Параметры

Названия параметров соответствуют полям формы правила в личном кабинете:

  • Ключ подсчёта (characteristics) - поля, по которым соединения группируются для подсчёта (см. раздел «Ключ подсчёта»)
  • Запросов (requests_per_period) - сколько новых соединений разрешено за один период
  • Период (сек.) (period_seconds) - длительность скользящего окна подсчёта в секундах
  • Блокировка (сек.) (mitigation_timeout_seconds) - на сколько секунд источник блокируется после превышения лимита частоты (если не задана, блокировка снимается по мере «устаревания» соединений в окне)
  • Макс. одновременных (max_concurrent) - максимальное число одновременно активных соединений на один ключ подсчёта

Ограничитель по частоте включается, когда заданы Запросов и Период (сек.). Ограничитель по числу одновременных соединений включается, когда задан параметр Макс. одновременных. Хотя бы один из ограничителей должен быть задан.

Параметр Блокировка (сек.) относится только к ограничителю по частоте. Для ограничителя Макс. одновременных блокировка не применяется: как только активное соединение закрывается, освободившийся слот сразу занимает новое соединение.

Ключ подсчёта

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

При значении ip.src счётчик ведётся отдельно для каждого IP-адреса клиента. Поля ip.src.subnet24 и ip.src.subnet16 группируют клиентов по подсети (/24 или /16) — это помогает против атак, когда злоумышленник меняет адреса в пределах одной подсети.

Доступные поля ключа подсчёта: ip.src, ip.src.subnet24, ip.src.subnet16, ip.dst, port.src, port.dst, protocol, http.host, http.path, http.method, http.user_agent.

Если ключ подсчёта не задан, лимит применяется ко всему трафику правила суммарно.

Примеры

Не более 100 запросов в минуту с одного IP-адреса:

  • Действие: Ограничить частоту
  • Ключ подсчёта: ip.src
  • Запросов: 100
  • Период (сек.): 60

Защита от перебора — не более 10 соединений за 5 минут с подсети /24, с блокировкой нарушителя на 15 минут:

  • Действие: Ограничить частоту
  • Ключ подсчёта: ip.src.subnet24
  • Запросов: 10
  • Период (сек.): 300
  • Блокировка (сек.): 900

Не более 5 одновременных соединений с одного IP-адреса:

  • Действие: Ограничить частоту
  • Ключ подсчёта: ip.src
  • Макс. одновременных: 5

Общий лимит на сервис — не более 1000 запросов в минуту и не более 200 одновременных соединений:

  • Действие: Ограничить частоту
  • Ключ подсчёта: не задан
  • Запросов: 1000
  • Период (сек.): 60
  • Макс. одновременных: 200

Порядок обработки правил

Правила обрабатываются в порядке их приоритета. Первое совпавшее правило определяет действие, которое будет выполнено. Если ни одно правило не совпало, соединение разрешается по умолчанию.

Порядок имеет значение

Правила обрабатываются по приоритету. Размещайте более специфичные правила выше:

# Сначала разрешаем админам
ip.src == 1.2.3.4 and http.path starts_with "/admin/"

# Потом блокируем всем остальным
http.path starts_with "/admin/"

Комбинируйте условия

Создавайте точные правила, комбинируя несколько условий:

# Блокировать POST-запросы к API от неизвестных IP
http.method == "POST" and
http.path starts_with "/api/" and
not (ip.src >= 192.168.1.0 and ip.src <= 192.168.1.255) and
not http.headers["Authorization"] contains "Bearer"

Регулярные выражения

При использовании оператора matches можно использовать регулярные выражения:

# Соответствует любому пути, начинающемуся с /api/v1/ или /api/v2/
http.path matches "^/api/v[12]/"

# Соответствует файлам с расширением .php
http.path matches ".*\\.php$"

# Соответствует IP-адресам в определенном диапазоне (как строка)
ip.src matches "192\\.168\\.1\\.[0-9]+"

Производительность

  • Простые правила (IP, порты) выполняются за микросекунды
  • Регулярные выражения кэшируются
  • Геолокация использует in-memory базы данных
  • Правила компилируются в оптимизированный код

Настройка

  1. Откройте панель управления
  2. Перейдите в раздел "Публикации"
  3. Откройте настройки публикации
  4. Перейдите на вкладку "Правила фильтрации"
  5. Создайте правило
  6. Протестируйте работу

Рекомендации

  1. Простые правила выполняются быстрее регулярных выражений
  2. Размещайте строгие правила в начале списка
  3. Комбинируйте условия для точности
  4. Для защиты от перебора и DDoS используйте ограничение частоты с ключом подсчёта ip.src или ip.src.subnet24
  5. Геолокация может быть неточной для VPN и прокси