Фильтрация трафика
Обзор
Система фильтрации трафика 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-Agenthttp.referer- Заголовок Refererhttp.cookie- Заголовок Cookiehttp.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/"