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 14:08] – Инструкция для LLM: алгоритм классификации quic_unknown по SNI-земле claude | projects:qoe_analytics:unknown_discovering:start [2026/07/28 15:24] (current) – [Маршрутизация к наборам сервисов] evgeniy | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Unknown Discovering — распознавание QUIC/HTTPS 0-RTT без SNI ====== | ====== Unknown Discovering — распознавание QUIC/HTTPS 0-RTT без SNI ====== | ||
| - | Точка входа для LLM при анализе выгрузок неопознанного трафика | + | Точка входа для LLM при анализе выгрузок неопознанного трафика |
| ===== Когда применять ===== | ===== Когда применять ===== | ||
| Line 21: | Line 21: | ||
| ==== Шаг 1. Кандидаты ==== | ==== Шаг 1. Кандидаты ==== | ||
| - | Из агрегированного netflow получить top host IP by traffic за период | + | Из агрегированного netflow получить top host IP by traffic за период, отфильтровав неопознанный трафик без SNI, сортировка по суммарному объёму в обе стороны. Фильтр зависит от того, что разбираем: |
| ==== Шаг 2. Земля по SNI ==== | ==== Шаг 2. Земля по SNI ==== | ||
| Line 41: | Line 41: | ||
| * **Регистр** — матчинг регистронезависимый. | * **Регистр** — матчинг регистронезависимый. | ||
| * **Порог** — у каждого сервиса свой (см. страницы в :services). Если порог берут несколько сервисов на одном IP — метка по максимальной доле. | * **Порог** — у каждого сервиса свой (см. страницы в :services). Если порог берут несколько сервисов на одном IP — метка по максимальной доле. | ||
| + | * **Доп. фильтры набора.** Помимо масок host, набор может нести дополнительные фильтры (например по '' | ||
| + | |||
| + | ===== Выделение и дополнение сетов ===== | ||
| + | |||
| + | Отдельная задача: | ||
| + | |||
| + | ==== Что запросить ==== | ||
| + | Сырой netflow для изучаемого '' | ||
| + | |||
| + | ==== Процедура ==== | ||
| + | - Сгруппировать по '' | ||
| + | - Построить распределение FQDN: число записей на каждый '' | ||
| + | - Определить доминирующее семейство сервиса на IP. Проверить, | ||
| + | - Обобщить FQDN в маски: свернуть случайные лейблы в wildcard ('' | ||
| + | - Выбрать порог: высокий (напр. 80%) для сервисов с высоким риском загрязнения общими фронтами (как youtube среди GFE), 50% для более «чистых» выделенных семейств. Обосновать выбор. | ||
| + | - Валидировать: | ||
| + | - Зафиксировать на странице провайдера в :services в стандартном формате (метка, | ||
| + | |||
| + | ==== Предостережения ==== | ||
| + | * Не строить наборы по netblock / AS / IPv6-сигнатурам — это только подсказки для discovery, проверять по SNI-«земле». | ||
| + | * Одна выгрузка = одно временное окно; подтверждать набор по нескольким окнам до финализации. | ||
| + | * Следить за update/ | ||
| ===== Важные предостережения ===== | ===== Важные предостережения ===== | ||
| Line 52: | Line 74: | ||
| Наборы масок по провайдерам — в [[projects: | Наборы масок по провайдерам — в [[projects: | ||
| - | * [[projects:qoe_analytics:unknown_discovering:services:google|google]] | + | |
| - | * [[projects:qoe_analytics:unknown_discovering:services: | + | |
| - | | + | ===== DSL декларация ===== |
| - | * [[projects:qoe_analytics: | + | |
| + | Формальная нотация для описания правил классификации. Основные конструкции: | ||
| + | |||
| + | Общие соглашения: | ||
| + | * Маски 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, и применяется ко всему пулу кандидатов. Пример: кеш-сервер Instagram развёрнут в Fiord ('' | ||
| + | |||
| + | ==== SET — декларация набора ==== | ||
| + | Именованный набор: маски + порог. Фильтр — опционально. | ||
| + | |||
| + | < | ||
| + | SET instagram { | ||
| + | masks: | ||
| + | instagram.*.fbcdn.net | ||
| + | *.cdninstagram.com | ||
| + | threshold: 90% | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | Пример с фильтром на уровне набора (наборы Google): | ||
| + | < | ||
| + | SET google_play { | ||
| + | masks: | ||
| + | play.googleapis.com | ||
| + | filter: host_as IN (15169) | ||
| + | | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ==== 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 | ||
| + | </ | ||
| ===== Планируемое ===== | ===== Планируемое ===== | ||