Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
| projects:qoe_analytics:unknown_discovering:start [2026/07/28 13:24] – vas_admin | projects:qoe_analytics:unknown_discovering:start [2026/07/28 15:24] (current) – [Маршрутизация к наборам сервисов] evgeniy | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== | + | ====== |
| - | - Ты работаешь с DPI и есть риск, что протокол уровня приложений | + | |
| - | - Часто в не распознанный трафик | + | Точка |
| - | - Анализируй вероятность наличия того или иного трафика в на AS. Есть вероятность, | + | ===== Когда применять ===== |
| - | - Старайся проверять однотипные выгрузки, из нескольких временных диапазонов, это позволит сформировать стабильный | + | * Задача — классифицировать трафик QUIC или HTTPS с 0-RTT, в котором |
| - | + | * На вход — выгрузки из внутренней | |
| + | * Цель — определить роль конкретного узла '' | ||
| - | == Не актуально, тк нет | + | ===== Общие принципы анализа ===== |
| - | - При выгрузке данных из QoE ограничивай их размер через limit, | + | * Работа поверх DPI: есть |
| + | * В нераспознанный трафик часто попадают 0-RTT пакеты. Анализируй **окружение** неизвестного протокола, | ||
| + | * Оценивай | ||
| + | * Проверяй однотипные выгрузки из **нескольких | ||
| - | - При выгрузке RAW netflow, не выставляй большие временные диапазоны (достаточно в пределах нескольких минут), это | + | ===== Алгоритм классификации IP → сервис ===== |
| + | Метод строит «землю» (ground truth) из флоу, где SNI виден, и применяет её к тому же IP там, где SNI отсутствует. | ||
| + | ==== Шаг 1. Кандидаты ==== | ||
| + | Из агрегированного netflow получить top host IP by traffic за период, | ||
| + | |||
| + | ==== Шаг 2. Земля по SNI ==== | ||
| + | По каждому IP-кандидату выгрузить сырой netflow, где поле host (SNI) **не пустое**. Это выборка: | ||
| + | |||
| + | Схема raw flow (важно): | ||
| + | * '' | ||
| + | * '' | ||
| + | * Серверный порт двунаправленного флоу выводится из направления: | ||
| + | |||
| + | ==== Шаг 3. Оценка попадания в сет ==== | ||
| + | Для каждого IP посчитать долю записей, | ||
| + | |||
| + | ===== Правила матчинга ===== | ||
| + | |||
| + | * **Знаменатель** — все записи с непустым host на данном IP. | ||
| + | * **Доля** — записи, | ||
| + | * **Семантика '' | ||
| + | * **Регистр** — матчинг регистронезависимый. | ||
| + | * **Порог** — у каждого сервиса свой (см. страницы в :services). Если порог берут несколько сервисов на одном IP — метка по максимальной доле. | ||
| + | * **Доп. фильтры набора.** Помимо масок host, набор может нести дополнительные фильтры (например по '' | ||
| + | |||
| + | ===== Выделение и дополнение сетов ===== | ||
| + | |||
| + | Отдельная задача: | ||
| + | |||
| + | ==== Что запросить ==== | ||
| + | Сырой netflow для изучаемого '' | ||
| + | |||
| + | ==== Процедура ==== | ||
| + | - Сгруппировать по '' | ||
| + | - Построить распределение FQDN: число записей на каждый '' | ||
| + | - Определить доминирующее семейство сервиса на IP. Проверить, | ||
| + | - Обобщить FQDN в маски: свернуть случайные лейблы в wildcard ('' | ||
| + | - Выбрать порог: высокий (напр. 80%) для сервисов с высоким риском загрязнения общими фронтами (как youtube среди GFE), 50% для более «чистых» выделенных семейств. Обосновать выбор. | ||
| + | - Валидировать: | ||
| + | - Зафиксировать на странице провайдера в :services в стандартном формате (метка, | ||
| + | |||
| + | ==== Предостережения ==== | ||
| + | * Не строить наборы по netblock / AS / IPv6-сигнатурам — это только подсказки для discovery, проверять по SNI-«земле». | ||
| + | * Одна выгрузка = одно временное окно; подтверждать набор по нескольким окнам до финализации. | ||
| + | * Следить за update/ | ||
| + | |||
| + | ===== Важные предостережения ===== | ||
| + | |||
| + | * **Мультитенантность.** Принадлежность IP netblock' | ||
| + | * **Общие фронты (GFE).** На общих фронтах Google один IP отдаёт play + maps + cloud + прочее, | ||
| + | * **Объём vs число записей.** Доля считается по числу записей. Несколько тяжёлых видеосессий доминируют по объёму, | ||
| + | * **IPv6 и anycast.** Среди кандидатов бывают IPv6 и anycast-адреса; | ||
| + | |||
| + | ===== Маршрутизация к наборам сервисов ===== | ||
| + | |||
| + | Наборы масок по провайдерам — в [[projects: | ||
| + | |||
| + | |||
| + | ===== DSL декларация ===== | ||
| + | |||
| + | Формальная нотация для описания правил классификации. Основные конструкции: | ||
| + | |||
| + | Общие соглашения: | ||
| + | * Маски host — семантика fnmatch: '' | ||
| + | * Доля совпадения считается **только по числу записей** (by records). Знаменатель — записи с непустым host на IP, прошедшие фильтры. | ||
| + | * Комментарии — ''//'' | ||
| + | * Строковые значения с пробелами/ | ||
| + | |||
| + | ==== SELECT — выборка кандидатов (шаг 1) ==== | ||
| + | Отбор IP-кандидатов из агрегированного netflow. Здесь же задаётся фильтр по AS — он применяется ко всей выборке. | ||
| + | |||
| + | < | ||
| + | CANDIDATES = | ||
| + | SELECT host_ip, total_volume | ||
| + | FROM | ||
| + | WHERE application_protocol = " | ||
| + | AND host_as IN (28917) | ||
| + | ORDER BY total_volume DESC | ||
| + | LIMIT 30 | ||
| + | </ | ||
| + | |||
| + | * '' | ||
| + | * Фильтр по AS обычно живёт здесь, на шаге 1, и применяется ко всему пулу кандидатов. Пример: | ||
| + | |||
| + | ==== SET — декларация набора ==== | ||
| + | Именованный набор: маски + порог. Фильтр — опционально. | ||
| + | |||
| + | < | ||
| + | SET instagram { | ||
| + | masks: | ||
| + | instagram.*.fbcdn.net | ||
| + | *.cdninstagram.com | ||
| + | threshold: 90% | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | Пример с фильтром на уровне набора (наборы Google): | ||
| + | < | ||
| + | SET google_play { | ||
| + | masks: | ||
| + | play.googleapis.com | ||
| + | filter: host_as IN (15169) | ||
| + | threshold: 50% | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ==== RULE — правило классификации (шаг 3) ==== | ||
| + | Развёрнутая форма: ссылается на объявленный '' | ||
| + | |||
| + | < | ||
| + | RULE instagram { | ||
| + | for ip in RAW | ||
| + | match SET instagram | ||
| + | if match_share_by_records > instagram.threshold | ||
| + | then LABEL (ip:443) -> instagram | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * Если у набора задан '' | ||
| + | |||
| + | ==== DISCOVER — выделение набора (обратный ход) ==== | ||
| + | Не присваивает метку; возвращает распределение FQDN на IP, из которого строятся '' | ||
| + | |||
| + | < | ||
| + | DISCOVER SET candidate | ||
| + | FROM RAW where host_ip = " | ||
| + | GROUP BY host | ||
| + | RANK BY records | ||
| + | </ | ||
| + | |||
| + | ===== Планируемое ===== | ||
| + | |||
| + | * Автоматизированные инструменты для рутинных выгрузок (top hosts, raw flow по IP). | ||
| + | * Discovery новых сетов и источников такого типа трафика — пополнение страниц в :services. | ||
| + | |||
| + | ==== Не актуально (нет инструмента для выгрузки) ==== | ||
| + | * При выгрузке из QoE ограничивать размер через limit; запрещено превышать limit = 1000. | ||
| + | * При выгрузке RAW netflow не выставлять большие временные диапазоны (несколько минут), | ||