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")
Потім запустіть sngrep як HEP-listener на цьому порту і спостерігайте за розшифрованими діалогами — ladder-діаграми й повні тіла повідомлень — попри те що дріт ніс TLS:
-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 →