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:25] – Обобщён охват: метод применим к HTTPS 0-RTT/resumption/ECH, не только QUIC claude | projects:qoe_analytics:unknown_discovering:start [2026/07/28 15:24] (current) – [Маршрутизация к наборам сервисов] evgeniy | ||
|---|---|---|---|
| Line 41: | Line 41: | ||
| * **Регистр** — матчинг регистронезависимый. | * **Регистр** — матчинг регистронезависимый. | ||
| * **Порог** — у каждого сервиса свой (см. страницы в :services). Если порог берут несколько сервисов на одном IP — метка по максимальной доле. | * **Порог** — у каждого сервиса свой (см. страницы в :services). Если порог берут несколько сервисов на одном IP — метка по максимальной доле. | ||
| + | * **Доп. фильтры набора.** Помимо масок host, набор может нести дополнительные фильтры (например по '' | ||
| ===== Выделение и дополнение сетов ===== | ===== Выделение и дополнение сетов ===== | ||
| Line 73: | 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 | ||
| + | </ | ||
| ===== Планируемое ===== | ===== Планируемое ===== | ||