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

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

Обзор​

Система фильтрации трафика 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 и прокси