Практически с любым сервером asterisk время от времени случаются проблемы - то голос пропадает, то звонки не проходят, то качество звука становится невыносимым. Решение каждой такой задачи - отдельное нетривиальное исследование, в котором нет универсальных советов. Значительно упрощает подобное расследование консольная утилита sngrep, которая а реальном времени позволяет анализировать и sip трафик, либо записывать дампы.
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Введение
Сразу приведу пример результата работы программы 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. Проваливаемся в более подробную информацию о событии. Направления стрелок указывают направления передачи информации. Сначала наш сервер отправил запрос на регистрацию.
Потом удаленный сервер прислал ответ о том, что все в порядке.
Обращаю внимание на выделенный параметр expires=120. Это время действия регистрации, которую установил для нас сервер. Она равна двум минутам. Если мы посмотрим на левый столбец последнего скрина, то заметим, что повторный запрос на регистрацию нашим сервером был отправлен через 105 секунд. Это время expires - 15 секунд.
Дальше подключим нового абонента к нашему серверу и посмотрим на его регистрацию. Это будет софтофон с номером 100.
Смотрим подробности обмена информацией.
Клиент с 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 и снова подключаемся тем же софтфоном. Проверяем регистрацию.
Клиент шлет запрос с Expires: 120, мы ему подтверждаем регистрацию с нашим временем - 600.
Повторно за регистрацией абонент придет теперь только через 10 минут.
Заключение
На простом примере показал, как можно работать с sngrep и анализировать sip трафик вашего сервера астериск. Дамп трафика можно сохранить в файл, отправить кому-нибудь, либо посмотреть в Wireshark. Сам я только недавно познакомился с этим инструментом. Опыта чтения дампов особо нет, но разбираюсь. Жизнь заставляет :) В принципе, ничего суперсложного нет, чаще всего можно разобраться и понять, в чем же проблема.
Например, если до вас не доходят входящие звонки, то вы можете запустить sngrep и звонить на номер. Если информации о звонке нет вообще, то есть в логах никакой реакции на новые события во время звонка (должен приходить INVITE), значит от провайдера к вам ничего не приходит и можно смело ему звонить и сообщать, что у меня есть дамп sip трафика в во время звонка и от вас не поступает никакой информации. Провайдер проверит свои дампы, сверит с вашим и сможет более точно и быстро определить причину проблем.
Не забывайте пользоваться поиском во время работы. Он обновляет результаты в режиме реального времени, что очень удобно. В моем примере я запускал анализатор без ключей, он анализировал весь sip поток. Вы можете его сразу ограничить только конкретным сетевым интерфейсом, либо ip адресом, если дебажите что-то конкретное.
По большому счету, sngrep не делает ничего особенного. Собирать и анализировать sip поток можно и с помощью tcpdump, но в sngrep это более удобно и наглядно, особенно визуализация со стрелочками :)
Другие материалы по asterisk:
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
- Установка и настройка астериск с нуля
- Мониторинг asterisk в zabbix
- Соединение двух серверов астериск
- Анализ SIP трафика
- Замена +7 на 8 и наоборот
- Ограничение на звонки для группы номеров
Без --prefix=/usr к команде ./configure не билдилось.
ура! вышло под centos 8! все теперь я точно перееду на новую ос! д
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]#
Это помогло
dnf --enablerepo=PowerTools install libpcap-devel
Спасибо за инфу.
на centos 8 пока не вышло :( https://github.com/irontec/sngrep/wiki/Installing-Binaries
Спасибо, не знал про такую утилитку.
Только я поставил из репы irontec.
Так же оттуда стянул.
после установки и попытке запустить выдает вот такое
"Couldn't open device any: any: You don't have permission to capture on that device (socket: Operation not permitted)"
Подскажите, где права забыл дать?
Я все проделывал под учеткой root. Возможно у вас не хватает прав, если работаете не под рутом.
делал все через sudo ... ок. попробую через root-а.
удобный инструмент, спасибо за статью!
а в чем преимущества перед записью тем же тшарком дампов?
Тут наглядно в режиме реального времени можно смотреть и сразу визуально или мышкой выбирать нужные тебе куски дампов. По мне так просто удобнее, если хочется здесь и сейчас посмотреть, что происходит на сервере. Тшарк или тспдамп сначала собирают, а потом ты внимательно смотришь. Нет визуализации в реальном времени.
эмммм ну вот кусок логов в реальном времени из тшарка
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 вплоть до прослушки разговоров