< meta name="referrer" content="origin">
Home » Asterisk » Анализ SIP трафика в Asterisk с помощью sngrep

Анализ SIP трафика в Asterisk с помощью sngrep

Практически с любым сервером asterisk время от времени случаются проблемы — то голос пропадает, то звонки не проходят, то качество звука становится невыносимым. Решение каждой такой задачи — отдельное нетривиальное исследование, в котором нет универсальных советов. Значительно упрощает подобное расследование консольная утилита sngrep, которая а реальном времени позволяет анализировать и sip трафик, либо записывать дампы.

Введение

Сразу приведу пример результата работы программы sngrep. Вот первое окно после запуска.

анализ sip трафика asterisk в sngrep

Можно заглянуть в каждую строку и посмотреть все этапы взаимодействия в sip протоколе.

дамп трафика астериск

У вас перед глазами будет полная картина в режиме реального времени всех событий на вашем сервере asterisk. Вы можете не только просматривать события, но и сохранять дампы для последующего изучения или отправки. Часто техподдержка оператора или просто в теме на форуме с вопросом, люди просят предоставить sip логи в режиме debug. Их можно собрать с помощью астериска через консоль или вывод в файл. Но с помощью sngrep это сделать удобнее и нагляднее, особенно если надо выделить какую-то одну небольшую часть.

Я расскажу, как установить sngrep на сервере с CentOS 7, а затем на простом примере, покажу, как пользоваться этим инструментом. Рассмотрим изменение конфигурации asterisk и проследим с помощью sngrep эти изменения в sip трафике. Работать будем на сервере, настроенном по моей статье — установка и настройка asterisk.

Установка sngrep

Ставить, как я уже сказал ранее, будем на CentOS 7 из исходников. Устанавливаем необходимые пакеты.

# yum install ncurses-devel make libpcap-devel pcre-devel openssl-devel git gcc autoconf automake git

Дальше скачиваем исходники и собираем.

# cd /usr/src
# git clone https://github.com/irontec/sngrep
# cd sngrep
# ./bootstrap.sh
# ./configure
# make
# make install

На этом все, ничего сложного. Установили sngrep. Теперь можно проверить его в работе. Для этого просто запустите в консоли.

# sngrep

Не буду описывать ключи и горячие клавиши программы. Все это легко гуглится, либо читается в man. Перейдем сразу к конкретному примеру.

Анализ sip трафика asterisk с помощью sngrep

Давайте посмотрим, что у нас происходит во время регистрации у провайдера. В данном случае это проект zadarma. Запускаем в одной консоли sngrep, а в другой выполняем команду, в результате которой в том числе обновятся все регистрации.

# asterisk -rx "sip reload"

Смотрим консоль с sngrep. Там появилась строка с командой register.

информация о регистрации

Выбираем ее и жмем Enter. Проваливаемся в более подробную информацию о событии. Направления стрелок указывают направления передачи информации. Сначала наш сервер отправил запрос на регистрацию.

дамп register в asterisk

Потом удаленный сервер прислал ответ о том, что все в порядке.

Обращаю внимание на выделенный параметр expires=120. Это время действия регистрации, которую установил для нас сервер. Она равна двум минутам. Если мы посмотрим на левый столбец последнего скрина, то заметим, что повторный запрос на регистрацию нашим сервером был отправлен через 105 секунд. Это время expires — 15 секунд.

Дальше подключим нового абонента к нашему серверу и посмотрим на его регистрацию. Это будет софтофон с номером 100.

визуальный debug логов астериска

Смотрим подробности обмена информацией.

дебаг регистрации пира

Клиент с user-agent 3CXPhone запросил регистрацию с временем 120. Наш сервер зарегистрировал его с указанными параметрами.

дебаг успешной регистрации

Теперь предположим, что к нам подключается очень много клиентов и мы хотим увеличить интервал регистрации с 120 секунд до 600 (10 минут), чтобы на сервер сыпалось поменьше запросов. Мы можем указать этот параметр на стороне каждого клиента, но это более хлопотно. Вместо этого изменим минимальное время регистрации на сервере. Проверим, какое оно установлено сейчас.

# asterisk -rx "sip show settings" | grep "Reg. min duration\|Reg. max duration\|Reg. default duration"

Reg. min duration 60 secs
Reg. max duration: 3600 secs
Reg. default duration: 120 secs

Изменим параметр Reg. default duration и Reg. min duration до 600 секунд. Для этого добавляем в sip.conf в блок [general] параметры.

defaultexpiry=600
minexpiry=600

Перечитываем настройки.

# asterisk -rx "sip reload"

Открываем в консоли sngrep и снова подключаемся тем же софтфоном. Проверяем регистрацию.

запрос на регистрацию в asterisk

Клиент шлет запрос с Expires: 120, мы ему подтверждаем регистрацию с нашим временем — 600.

Успешная регистрация с Expires=600

Повторно за регистрацией абонент придет теперь только через 10 минут.

Заключение

На простом примере показал, как можно работать с sngrep и анализировать sip трафик вашего сервера астериск. Дамп трафика можно сохранить в файл, отправить кому-нибудь, либо посмотреть в Wireshark. Сам я только недавно познакомился с этим инструментом. Опыта чтения дампов особо нет, но разбираюсь. Жизнь заставляет 🙂 В принципе, ничего суперсложного нет, чаще всего можно разобраться и понять, в чем же проблема.

Например, если до вас не доходят входящие звонки, то вы можете запустить sngrep и звонить на номер. Если информации о звонке нет вообще, то есть в логах никакой реакции на новые события во время звонка (должен приходить INVITE), значит от провайдера к вам ничего не приходит и можно смело ему звонить и сообщать, что у меня есть дамп sip трафика в во время звонка и от вас не поступает никакой информации. Провайдер проверит свои дампы, сверит с вашим и сможет более точно и быстро определить причину проблем.

Перед тем, как обращаться к провайдеру, убедитесь, что у вас с сетью и фаерволом все в порядке, сервер провайдера как минимум пингуется и нету потерь в трейсе.

Не забывайте пользоваться поиском во время работы. Он обновляет результаты в режиме реального времени, что очень удобно. В моем примере я запускал анализатор без ключей, он анализировал весь sip поток. Вы можете его сразу ограничить только конкретным сетевым интерфейсом, либо ip адресом, если дебажите что-то конкретное.

По большому счету, sngrep не делает ничего особенного. Собирать и анализировать sip поток можно и с помощью tcpdump, но в sngrep это более удобно и наглядно, особенно визуализация со стрелочками 🙂

5 комментариев

  1. Аноним

    а в чем преимущества перед записью тем же тшарком дампов?

    • Тут наглядно в режиме реального времени можно смотреть и сразу визуально или мышкой выбирать нужные тебе куски дампов. По мне так просто удобнее, если хочется здесь и сейчас посмотреть, что происходит на сервере. Тшарк или тспдамп сначала собирают, а потом ты внимательно смотришь. Нет визуализации в реальном времени.

      • Аноним

        эмммм ну вот кусок логов в реальном времени из тшарка

        241237 6638.953885 212.xx.xx.xx -> 10.zz.zz.zz SIP 405 Request: ACK sip:4957654321@10.zz.zz.zz:5060 |
        241326 6639.880586 10.zz.zz.zz -> 212.xx.xx.xx SIP 775 Request: BYE sip:4991234567@212.xx.xx.xx:5060;transport=udp |
        241331 6639.913793 212.xx.xx.xx -> 10.zz.zz.zz SIP 380 Status: 200 OK |
        241332 6685.008842 10.zz.zz.zz -> 212.xx.xx.xx SIP/SDP 951 Request: INVITE sip:84990011223@212.xx.xx.xx |
        241333 6685.011789 212.xx.xx.xx -> 10.zz.zz.zz SIP 322 Status: 100 Trying |
        241383 6686.064832 212.xx.xx.xx -> 10.zz.zz.zz SIP/SDP 802 Status: 180 Ringing |
        241391 6686.208837 10.zz.zz.zz -> 212.xx.xx.xx SIP 672 Request: PRACK sip:84990011223@212.xx.xx.xx:5060;user=phone;transport=udp |
        241395 6686.243754 212.xx.xx.xx -> 10.zz.zz.zz SIP 355 Status: 200 OK |
        242049 6692.844163 212.xx.xx.xx -> 10.zz.zz.zz SIP 428 Status: 200 OK |
        242056 6692.897076 10.zz.zz.zz -> 212.xx.xx.xx SIP 446 Request: ACK sip:84990011223@212.xx.xx.xx:5060;user=phone;transport=udp |
        243051 6702.799334 10.zz.zz.zz -> 212.xx.xx.xx SIP 758 Request: BYE sip:84990011223@212.xx.xx.xx:5060;user=phone;transport=udp |
        243056 6702.843879 212.xx.xx.xx -> 10.zz.zz.zz SIP 353 Status: 200 OK |

        хотя если тут стоит вопрос разбора логов напрямую в окне консольки без выгрузки, то может быть, но мне как то проще тшарком наснимать тонну говна)))

      • Сергей

        ну если на то пошло то делаем так:

        ssh 192.168.1.30 -p1474 «tcpdump -i eth0 -s 0 -U -w — » | wireshark-gtk -k -i —

        И получаем данные sip трафика в реальном времени в wireshark cо всеми возможностями wireshark вплоть до прослушки разговоров

  2. удобный инструмент, спасибо за статью!

Добавить комментарий

Ваш e-mail не будет опубликован.