Перейти до змісту

8.7 Захоплення SIP через TLS — siptrace і HEP

[!IMPORTANT] Щойно ви вмикаєте TLS (5061) або WebSocket-Secure, tcpdump і sngrep на дроті сліпнуть — бачать TLS-записи, не SIP. Трюк, до якого рано чи пізно приходить кожен оператор: перестати захоплювати на дроті й захоплювати всередині Kamailio, де повідомлення вже відкритий текст, стрімлячи копію назовні через HEP. Саме це робить siptrace, і sngrep рендерить це наживо.

Чому захоплення на дроті не працює з TLS

TLS завершується на транспортному рівні — модуль tls розшифровує байтовий потік під час приймання (3.1), до того як парсер і request_route щось побачать. Тож sip_msg, який Kamailio роутить, — завжди відкритий текст, незалежно від транспорту. На NIC-рівні потік 5061 або WSS — це непрозорий потік TLS-записів: sngrep не може його парсити, а витягати session-ключі з навантаженого проксі для офлайн-дешифрування — це не робочий процес дебагу. Для зашифрованої сигналізації wire-захоплення мертве — треба відводити трохи вище.

siptrace — відвід на рівні SIP

siptrace дублює повідомлення таким, яким його бачить Kamailio: після розшифрування, до повторного шифрування — копія завжди у відкритому тексті. Два способи увімкнути: sip_trace() per-message в маршруті (вибірково — трейсити тільки те, що відповідає умові) або trace_mode/trace_on для автоматичного глобального дзеркалювання; sip_trace_mode() (або mode-аргумент) задає охоплення: повідомлення, транзакція чи діалог.

Куди іде копія — задається через modparam'и:

  • trace_mode — бітові прапори для призначення: 1=HEP, 2=база даних, 4=SIP URI.
  • duplicate_uri — ціль у вигляді SIP URI, наприклад sip:127.0.0.1:9060.
  • hep_mode_on — загортати копію в HEP; hep_version (1/2/3); hep_capture_id тегує цей агент.
  • trace_to_database — також записувати в таблицю sip_trace для офлайн-зберігання чи Homer.

HEP — навіщо, якщо можна просто переслати SIP

HEP (Homer Encapsulation Protocol) загортає оригінальний SIP-payload разом із метаданими — source/destination IP:port, транспорт, timestamp, кореляційний/capture id — у UDP-конверт. Метадані — це і є головне: розшифрована копія втратила реальну транспортну ідентичність (вона тепер виходить від Kamailio), тому HEP несе оригінальний 5-tuple поряд із payload'ом, а кореляційний id зшиває обидва leg'и виклику. Homer/sipcapture — довготривале сховище; для живого дебагу воно не потрібне — підійде будь-який HEP-listener.

Перегляд наживо через sngrep

sngrep розуміє HEP в обидва боки. Направте siptrace на локальний порт:

modparam("siptrace", "trace_mode", 1)                 # 1 = HEP
modparam("siptrace", "hep_mode_on", 1)
modparam("siptrace", "duplicate_uri", "sip:127.0.0.1:9060")
request_route {
    sip_trace();      # duplicate this (decrypted) message over HEP
    ...
}

Потім запустіть sngrep як HEP-listener на цьому порту і спостерігайте за розшифрованими діалогами — ladder-діаграми й повні тіла повідомлень — попри те що дріт ніс TLS:

sngrep -L udp:127.0.0.1:9060

-L (--eep-listen) стартує HEP-сервер; -H udp:homer.example.net:9060 (--eep-send) ретранслює той самий потік далі до Homer-інстансу або другого sngrep (в старіших білдах ці EEP-опції мають вигляд --eep / -E). Одна точка захоплення, розшифровано, з можливістю пересилання.

Коли варто звертатися до siptrace

TLS/WSS — очевидний випадок, але відвід зсередини виграє й там, де дріт бреше в інший спосіб: ви бачите повідомлення після власних lump-правок (фінальна форма, яка реально надсилається), ви бачите обидві сторони виклику з прихованою топологією (siptrace сидить всередині, де topos ще нічого не маскував), і кореляційний id HEP дозволяє відстежити один виклик через кластер. Ціна — один дублюючий UDP-пакет на трейсоване повідомлення — дешево, але при важкому трафіку тримайте sip_trace() за умовою, а не дзеркалюйте все підряд.


← Зміст · ← 8.6 Медіа — rtpengine · Далі: 7.1 Архітектура RPC →