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

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

Онлайн-курс по устройству компьютерных сетей

На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Введение

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

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

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

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

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

Для отладки и тестирования работы voip я рекомендую сервис Zadarma. Плюс его в том, что после регистрации вы получите настройки пира для внутренней сети оператора. И внутри этой сети вы можете бесплатно звонить. Например, я одного пира регистрирую на sip клиенте смартфона и с него звоню на второй аккаунт, пир от которого настроен в астериске. Таким образом эмулирую внешний звонок. Удобно отлаживать различные конфигурации звонков, не требуя платного подключения.

Я расскажу, как установить 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

Если у вас система Debian или Ubuntu, то необходимые пакеты будут такими.

# apt-get install git autoconf automake gcc make libncurses5-dev libpcap-dev libssl-dev libpcre3-dev

Дальнейшее будет актуально для любой системы.

Скачиваем исходники и собираем.

# 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 это более удобно и наглядно, особенно визуализация со стрелочками :)

Другие материалы по asterisk:

Онлайн-курс по устройству компьютерных сетей.

На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Помогла статья? Подписывайся на telegram канал автора

Анонсы всех статей, плюс много другой полезной и интересной информации, которая не попадает на сайт.

Автор Zerox

Владимир, системный администратор, автор сайта. Люблю настраивать сервера, изучать что-то новое, делиться знаниями, писать интересные и полезные статьи. Открыт к диалогу и сотрудничеству. Если вам интересно узнать обо мне побольше, то можете послушать интервью. Запись на моем канале - https://t.me/srv_admin/425 или на сайте в контактах.

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

  1. Без --prefix=/usr к команде ./configure не билдилось.

  2. ура! вышло под centos 8! все теперь я точно перееду на новую ос! д

  3. centos ведет себя странно везде на одном из серверов не удалось установить в штатном режиме
    [root@localhost sngrep]#
    [root@localhost src]# yum install ncurses-devel make libpcap-devel pcre-devel openssl-devel git gcc autoconf automake git
    Last metadata expiration check: 1:18:44 ago on Fri 14 Feb 2020 07:07:01 AM +05.
    Package ncurses-devel-6.1-7.20180224.el8.x86_64 is already installed.
    Package make-1:4.2.1-9.el8.x86_64 is already installed.

    No match for argument: libpcap-devel

    Package pcre-devel-8.42-4.el8.x86_64 is already installed.
    Package openssl-devel-1:1.1.1-8.el8.x86_64 is already installed.
    Package git-2.18.1-3.el8.x86_64 is already installed.
    Package gcc-8.2.1-3.5.el8.x86_64 is already installed.
    Package autoconf-2.69-27.el8.noarch is already installed.
    Package automake-1.16.1-6.el8.noarch is already installed.
    Package git-2.18.1-3.el8.x86_64 is already installed.

    Error: Unable to find a match

    [root@localhost src]# dnf install libpcap-devel
    Last metadata expiration check: 1:19:14 ago on Fri 14 Feb 2020 07:07:01 AM +05.
    No match for argument: libpcap-devel
    Error: Unable to find a match
    [root@localhost src]#

  4. Спасибо, не знал про такую утилитку.

  5. после установки и попытке запустить выдает вот такое
    "Couldn't open device any: any: You don't have permission to capture on that device (socket: Operation not permitted)"

    Подскажите, где права забыл дать?

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

  7. Аноним

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

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

      • Аноним

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

        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 вплоть до прослушки разговоров

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Нажимая кнопку "Отправить комментарий" Я даю согласие на обработку персональных данных.
Используешь Telegram? Подпишись на канал автора →
This is default text for notification bar