artem
18.02.2019
2300

Оперативная диагностика SIP в консоли Asterisk каналы PJSIP и CHAN_SIP

Данная статья посвящена диагностике sip канала. Так же в рамках этой статьи рассмотрим и PJSIP, его настройку и диагностику. Предисловие: Хотя сторонние инструменты как sngrep, tcpdump и wireshark являются прекрасными помощниками в поиске проблем с VoIP, а так же их устранении. Однако может возникнуть ситуация, что на системе нет возможности установить вышеперечисленные утилиты и единственная […]

Данная статья посвящена диагностике sip канала. Так же в рамках этой статьи рассмотрим и PJSIP, его настройку и диагностику.

Предисловие:

Хотя сторонние инструменты как sngrep, tcpdump и wireshark являются прекрасными помощниками в поиске проблем с VoIP, а так же их устранении. Однако может возникнуть ситуация, что на системе нет возможности установить вышеперечисленные утилиты и единственная возможность разобраться только за счет самого asterisk. К счастью, встроенные функции asterisk так же способны помочь устранить неисправность.

SSH Клиент:

Несмотря на то, что в начале статьи было сказано, что мы не будем использовать утилиты, это не значит, что мы совсем ничего не будем использовать. Для нашего с вами удобства мы будем использовать ssh-клиент для подключения. Как правило, на дистрибутивах, основанных на FreePBX Distro или же самими админстраторами на АТС уже установлен SSH-сервер. Это позволяет иметь возможность для удаленного подключения и администрирования АТС. Однако, кроме ssh-сервера так же для подключения к серверу требуется ssh-клиент.

Для такого рода администрирования совершенно не важно на каких операционных системах работает сервер и клиент.

В данной статье мы будем использовать ssh клиент PuTTY, который вы можете скачать с официального сайта разработчика по следующей ссылке.


Внешний вид программы

Почему PuTTY? Все просто, PuTTY является свободным приложением с открытым исходным кодом, а это значит, что программа распространяется абсолютно бесплатно и ее может использовать и модифицировать любой желающий. Так же существуют сборки программы не только для windows, но и для linux, а если использовать сторонние модификации, то вы можете найти версии не только под mac, но и для мобильных платформ android и iPhone.

Так же из особенностей PuTTY:

  • PuTTY: Telnet и SSH клиент
  • PSCP: SCP клиент — копирование файлов по шифрованному протоколу с управлением из командной строки
  • PSFTP: SFTP клиент — копирование файлов подобно FTP
  • PuTTYtel: отдельный Telnet клиент
  • Plink: интерфейс командной строки к PuTTY
  • Pageant: агент SSH-аутентификации для PuTTY, PSCP и Plink
  • PuTTYgen: утилита для генерации SSH-ключей

Тем не менее, несмотря на богатый функционал PuTTY, с которым вы можете ознакомиться по следующей ссылке, его чаще всего используют для удаленного подключения к серверу. В этой статьей мы его только так и будем использовать.

Первичная проверка:

Для начала нужно проверить, а запущен ли asterisk? Для этого нужно подключиться к серверу с помощью ssh-клиента.


Подключаемся к серверу 1

Вводим IP-адрес нашей АТС.


Подключаемся к серверу 2

После подключения под пользователем «root» видим следующее окно.


Подключаемся к серверу 3

Для проверки останется ввести лишь команду: asterisk –rv

Если вы наш клиент и используете наш дистрибутив, то не обязательно вводить полностью команду #asterisk –rv, будет достаточно просто набрать #a . 

Результат выполнения команды 1

Вы выполнили указанную команду, не появились никакие ошибки, и вы успешно зашли в asterisk. Все это значит, что выполнены следующие условия:

  • К asterisk можно подключиться.
  • Служба asterisk запущена, работает и не отваливается с ошибкой при попытке входа.

Предположим, что служба asterisk не запущена, зависла или отваливается с ошибкой.

В первую очередь следует попытаться ее перезагрузить. Это, конечно можно выполнить и перезагрузив весь сервер, но это не обязательно делать таким грубым образом, мы можем перезагрузить сам asterisk и для этого достаточно выполнить следующие команды:

  1. # service asterisk stop (не обязательный пункт, пытаемся остановить работу asterisk если таковая имеется)

Останавливаем работу asterisk
  •  # service asterisk restart – пытаемся перезагрузить asterisk. Если вы до этого выполнили команду # service asterisk stop и она успешно отработала, то вместо нее можете набрать # service asterisk start

  • Рестартуем asterisk
  • После чего вновь пробуем подключиться к asterisk.

    Попытка подключения

    Как вы можете видеть выше, мы успешно перезагрузили asterisk и подключились к нему.

    Диагностика SIP и оборудования связанного с ним:

    Отладка SIP протокола в Asterisk:

    И так, asterisk работает нормально. Однако предположим, что у нас наблюдаются какие-то неполадки на внутреннем номере 120, и мы хотим посмотреть, какие sip сообщения приходят от этого внутреннего номера и какие sip-сообщения он получает от нас в ответ. Для этого нужно выполнить следующие шаги:

    1. Проверить, что IP адрес устройства не заблокирован fail2ban. Это можно сделать средствами iptables следующей командой: # iptables -L –n
    2. Как видим выше, fail2ban пустой, переходим ко второму шагу.


    3. Включить отладку sip для внутреннего номера 120 следующей командой: CLI> sip set debug peer 120
    4. Эту же команду (и многие другие) можно выполнять, не входя в asterisks, и в нашем случае команда примет следующий вид: # asterisk –rx "sip set debug peer 120"

      Результат выполнение команды 2
    5. После чего, скорее всего, вы увидите примерно следующие сообщения:

    Результат выполнение команды 3

    Для того, чтоб снять дамп таким образом необходимо, чтоб asterisk был известен ip адрес конечного устройства пользователя т.е или пользователь должен быть зарегистрирован, либо ip адрес пользователя должен быть сконфигурирован в настройках пользователя.

    Зная, какой ip адрес у пользователя, можно выполнить отладку немного иначе, а именно указать ip адрес пользователя: # sip set debug ip 192.168.1.1


    Результат выполнение команды 4

    Если требуется включить отладку всех sip сообщений, а не с какого-то определенного ip/peer, то команда выглядит следующим образом:


    Результат выполнение команды 5

    Однако учтите, что если через АТС в этот момент совершается много звонков, то и количество сообщений будет огромным.

    Результаты можно проверить или в консоли asterisk или же в лог-файле.

    Консоль удобна тем, что можно быстро посмотреть какие приходят и уходят сообщения, их расшифровку, но если в данный момент совершается много звонков (даже если в отладке учувствует только один ip), то выцепить нужную информацию будет сложно. В таком случае лучше смотреть в лог-файлах.

    Лог-файл располагается по следующему маршруту«/var/log/asterisk/full». Здесь можно выполнить поиск по ip-адресу устройства, или, к примеру, по типу сообщения. Давайте проверим файл по ключевому слову «REGISTER»

    Переходим в раздел хранящий логи


    Проверка лога 1

    Для проверки лога набираем следующую команду: grep ‘REGISTER’ full


    Проверка лога 2

    Если вы все сделали правильно, то вы получите нечто схожее тому, что вы можете видеть выше (если такие сообщения были). Однако лучше читать лог немного другим образом, с помощью дополнительной команды less. Чтоб отобразить весь лог на одной отдельной странице можно выполнить следующую команду # grep ‘REGISTER’ full | less


    Проверка лога 3

    Вы могли заметить, что лог был немного «обрезан» в прошлых примерах. Использовать less рекомендуется хотя бы потому, что позволяет удобно просмотреть весь лог. Давайте нажмем стрелочку вправо.


    Проверка лога 4

    Для того, чтоб выйти достаточно нажать на q. Этим функции не ограничиваются, к примеру, присутствует возможность поиска по тексту, для этого существуют следующие команды. Для поиска определенного текста вперед нужно набрать: /текст/ (к примеру , REGISTER )


    Результат выполнение команды 6

    а для того, чтоб искать по заданному тексту назад ?текст? (к примеру Request)

    Результат выполнение команды 7

    Сейчас эти команды не так полезны т.к размер лога не большой, но если логов много они могут сократить время поиска нужной строчки. Когда вы закончите экспериментировать, то чтоб вывести на экран справку по командам нужно набрать h.

    А теперь, после всей работы не забывайте выключать отладку т.к высока вероятность того, что на жестком диске попросту закончится место.

    # asterisk -rx "sip set debug off"

    Результат выполнение команды 8

    Мы рассмотрели здесь базовую отладку средствами самого asterisk. Возможно, вам будет интересно почитать об утилите sngrep, которая благодаря своему удобному интерфейсу и богатому функционалу может стать отличным инструментом для отладки и снятия дампа. Так же стоит ознакомиться с SIP-ответами и их значением которые будут приведены в конце статьи.

    Отладка PJSIP протокола в Asterisk

    Канальный драйвер chan_sip протокола SIP был создан давно, в 2002 году, это уже почти 16 лет назад. Тогда еще никто и не предполагал, что протокол SIP на рынке получить одну из лидирующих ролей, а так же получить множество расширений. Однако сейчас с каждым годом этому модулю сложнее идти в ногу с новыми технологиями и обновлениями.

    Таким образом, был создан новый канальный драйвер для Asterisk – PJSIP.

    Пример работы модуля


    PJSIP — мультимедийная коммуникационная библиотека, написанная на Си. Поддерживает такие протоколы как SIP, SDP, RTP, STUN, TURN, и ICE. Эта библиотека работает на различных платформах, начиная с хэндсетов и мобильных устройств и заканчивая высоконагруженными АТС. Начиная с asterisk 12, эта библиотека поддерживается частично и только с asterisk 13 появилась полноценная поддержка. Для осуществления звонков программной АТС Asterisk

    Главное отличие этого нового канального драйвера в том, что он хорошо работает с различными брандмауэрами и NAT, как в составе Asterisk-сервера, так и на клиентских устройствах.

    Тем не менее, несмотря на ряд преимуществ перед Chan_SIP, PJSIP все еще не получил широкого применения из-за отличия конфигурации. Новый стек использует подход разделения конфигурации на логические разделы, поэтому создаются разные разделы для различных целей.

    В данной статье мы рассмотрим основные способы отладки PJSIP. В Asterisk версии 13.8.0 был добавлен новый модуль - res_pjsip_history, который обеспечивает сбор, фильтрацию и отображение SIP-сообщений в командной строке.

    Для проверки, какая у вас версия asterisk достаточно выполнить команду #asterisk –rv и обратить внимание на выделенную область на скриншоте.

    Пример работы модуля

    Как видим выше у нас версия старше, и это значит, что модуль включен по умолчанию.

    Захват SIP-сообщений:

    Для того чтоб начать захват нужно выполнить следующую команду:

    CLI> pjsip set history on
    Результат выполнения команды 1

    Для того, чтоб отключить захват выполните следующую команду:

    CLI> pjsip set history off
    Результат выполнения команды 2

    Эта команда не очищает историю сообщений, сообщения только перестают записываться. Для очистки истории есть следующая команда:

    CLI> pjsip set history clear
    Результат выполнения команды 3
    Не забывайте после отладки выключать захват сообщений, иначе при большом потоке звонков может закончиться место на жестком диске, что в свою очередь приведет к неполадкам.

    Просмотр:

    И так, вы включили запись, прошло какое-то время, пользователи совершали звонки, подключали аппараты и.т.д и по итогам всего действия мы собрали какие-то данные, но как нам теперь их просмотреть?

    Чтоб показать всю историю собранных сообщений нужно выполнить следующую команду: CLI> pjsip show history

    Результат выполнения команды 4

    Эта команда предоставит краткое изложение истории sip-сообщений.

    Просмотреть подробнее какое-то конкретное SIP-сообщение, нужно указать в команде его номер. Команда примет следующий вид:

    CLI> pjsip show history entry 6 ,где цифра обозначает номер строки


    Результат выполнения команды 5

    Пожалуйста, обратите внимание, что номера всех записей отображаются в левом столбце. Номера сообщений идут по порядку, и их номер увеличивается с каждым полученным или отправленным SIP-сообщением.

    Манипуляции с результатами:

    Выше мы получили подробную информацию о sip-сообщении. Тем не менее, в таком виде редко когда удобно просматривать сообщения, в особенности когда на станции зарегистрированы не два пользователя, а 10 и даже больше и все они в этот момент совершают звонки. Модуль res_pjsip_history поддерживает простую фильтрацию запросов по заданным условиям, подобную тому, который есть в SQL.

    Для теста давайте отфильтруем запрос по SIP Call-ID, используя следующую команду:

    CLI>pjsip show history where sip.msg.call-id = “ваш caller-id“

    Выполнение команд 6

    Результат выполнения команды вы можете видеть выше. Если вы знакомы или даже работали с программой «sngrep», то можете заметить сходства в отображении информации о входящих и исходящих пакетов.

    На момент написания статьи модульres_pjsip_history поддерживает следующие команды:

    • number : номер записи в истории
    • timestamp : время отправка сообщения SIP
    • addr : Адрес источника/Получателя SIP-сообщения
    • sip.msg.request.method : Метод запроса SIP
    • sip.msg.callid : Значение заголовка

    Так же Res_pjsip_history поддерживает все логические операторы, а так же операторы регулярных выражений.

    Дебаг pjsip без использования Res_pjsip_history:

    Сбор информации для дебага:


    Пример консоли с pjsip

    Как было упомянуто раньше – модульres_pjsip_history был включен в asterisk, только начиная с версии Asterisk 13.8.0, и в младших версиях он отсутствует. Как в таком случае проводить дебаг? Этому посвящен этот раздел.

    И так, предположим, что наш asterisk младше указанных версий дебаг pjsip придется выполнять иначе. Какие нужно сделать шаги для отлавливания ошибок?

    Для начала нужно включить запись логов следующей командой: > pjsip set logger on

    Включаем логирование

    Как можете видеть выше, эта команда похожа на аналогичную команду для sip, > sip set debug on/off. Как и в случае с дебагом для sip не забывайте после траблшутинга выключать логирование следящей командой: > pjsip set logger off

    Выключаем

    Обычно для отладки этого достаточно, но иногда (и в этой статье мы будем использовать в некоторых примерах, и такие строки помечаются как DEBUG) следует так же включить debug. Обычно этим пользуются разработчики во время тестирования программ и утилит, но и нам это может помочь в поисках проблем. Включить дебаг можно следующей командой: CLI> core set debug 4

    Включаем дебаг

    И соответственно выключается следующей командой CLI> core set debug off


    Выключаем дебаг

    Как вы могли заметить выше мы можем задавать уровень логивания. Можно задать от 0 до 10 и чем выше, тем больше будет выводиться информации. Сообщения debug по умолчанию выводятся в файл /var/log/asterisk/messages.

    Траблшутинг pjsip:


    И так, логирование включено. Теперь можно приступать к траблшутингу. Т.К тут много схоже с отладкой chan_sip (те же sip ответы, о которых вы можете почитать в следующей главе) мы разберем некоторые другие ошибки, с которыми вы можете столкнуться.

    Неизвестная конечная точка:

    Если Asterisk не может определить куда отправить входящий звонок, то входящий вызов будет отклонен. Если вы видите в консоли следующее сообщение:

    Или же

    [2018-11-11 16:12:17.349] DEBUG[20937]: res_pjsip_endpoint_identifier_user.c:167username_identify: Could not identify endpoint by username 'ivanivanov'

    Это признак того, что запрос отклоняется по причине того, что Asterisk не может определить, с какой конечной точки поступает входящий запрос.

    И так, как asterisk вообще определяет, с какой конечной точки поступает запрос? Asterisk использует т.н. «endpoint identifiers» (идентификатор конечных точек). Существует три идентификатора:

    User — предоставляется модулем res_pjsip_endpoint_identifier_user.so. Способ его использования заключается в использовании заголовка From из входящего sip. R К примеру:


    Пример 1.1

    Для исправления ошибки связанной с этим для начала введи команду > pjsip show endpoints.  

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

    Ip — Asterisk также может распознавать конечные точки на основе исходного IP-адреса SIP-запроса. Ниже приведены некоторые шаги по исправлению возможных неполадок.

    • Для начала убедитесь, что res_pjsip_endpoint_identifier_ip.so загружен и работает. Из CLI модель отображается как res_pjsip_endpoint_identifier_ip.so и команда примет следующий вид: CLI> module show like res_pjsip_endpoint_identifier_ip.so Результат должен выглядеть следующим образом:
    Пример 1.3
    • Для проверки идентификатора наберите следующую команду > pjsip show endpoint . Обратите внимание навыделенную область. В данном примере настройки иные, но если было все настроено, то строчка приняла бы вид Identify:192.168.1.5/32

    Пример 1.4
    • Так же убедитесь, что в вашей конфигурации нет конфликтов ip-адресов.

    Anonymous – Использует специальную конечную точку «anonymous», если другие идентификаторы конечных точек не могут определить, с какой именно  конечной точки отправляется запрос. Ниже приведены некоторые шаги по исправлению возможных неполадок:

    • Убедитесь, что res_pjsip_endpoint_identifier_anonymous.so загружен и работает. Из командной строки Asterisk модуль запуска отображается как res_pjsip_endpoint_identifier_anonymous.so и команда примет следующий вид: CLI> module show like res_pjsip_endpoint_identifier_anonymous. Результат должен выглядеть следующим образом:
    Пример 1.5
    • Проверьте, что «анонимная» конечная точка была правильно загружена. Для проверки наберите следующую команду > pjsip show endpoint и обратите внимание на строчку Users.

    Ошибка регистрации:

    Если вы видите следующие ошибки:

    и

    Пример 1.7

    Или же

    Значит, пароль не соответствует заданным настройкам на номере. Так же если пароль верен, но все равно в консоли вы видите ошибку типа «authentication is failing» и в дебаге сообщения типа:

    Пример 1.9

    То следует пройтись по ниже перечисленным шагам для исправления возможных неполадок:

    • Убедитесь, что имя пользователя и пароль в разделе type=auth написаны правильно.
    • Если вы используете опцию md5_cred в разделе auth, убедитесь, что:
      • Проверьте, что вы установили auth_type = md5.
      • Убедитесь, что рассчитанная сумма MD5 состоит из имени пользователя: realm: password
      • Убедитесь, что рассчитанная сумма MD5 не содержит посторонних пробелов.
      • Убедитесь, что не было ошибки во время копировани. Сумма MD5 составляет ровно 32 шестнадцатеричных символа. Если параметр в вашем файле конфигурации содержит меньше или превышает 32 символа, или если какой-либо из символов не является шестнадцатеричным символом, тогда сумма MD5 недействительна.
    • Убедитесь, что конечная точка, которая взаимодействует с Asterisk, использует метод аутентификации «Digest» и алгоритм «md5». Если они используют что-то другое, Asterisk не поймет и не отклонит попытку аутентификации.

    Asterisk не может найти указанное расширение:

    Если вы видите в CLI сообщение, подобное приведенному ниже

    то это означает, что Asterisk не смог направить входящий вызов на соответствующее расширение в диалплане. В приведенном выше случае я набрал «456789» на телефоне, который соответствует конечной точке131. Конечная точка 131 настроена с контекстом «from-internal», а этот контекст в моем диалплане не имеет расширения «49944».

    • Убедитесь, что конечная точка настроена на ожидаемый контекст.
    • Убедитесь, что набираемый номер существует в диалплане. Из CLI Asterisk запустите dialplan show <имя контекста>, чтобы увидеть расширения для определенного контекста. Если номер, который вы набираете, не указан, то Asterisk не знает о расширении и не сможет соединить с номером.
    • Если если вы недавно вносили изменения в extensions.conf то убедитесь, что вы сохранили изменения и перезагрузили dialplan из CLI Asterisk.
    • Убедитесь, что набираемый номер имеет 1 приоритет.
    • Убедитесь, что набираемый номер находится в ожидаемом диалплан-контексте.


    Полезные инструменты:

    В данной статье мы рассмотрели дебаг с помощью встроенных функций asterisk. Как вы можете видеть, Asterisk даже без сторонних утилит способен помочь обнаружить и устранить неполадки. Тем не менее, все же рекомендуем при возможности использовать дополнительные утилиты, которые не только облегчат дебаг, но и помогут сократить время нужное для отлавливания проблемы благодаря богатому функционалу и удобному оформлению. Советуем ознакомиться со следующими инструментами для отладки телефонии и по возможности использовать их во время дебага

    Установка и настройка Sngrep

    Sngrep

    Wireshark. Сохраняем дамп нужного разговора.

    Перехват и прослушивание разговора в кодеках G722 и G729. Использование Wireshark

  • Подписаться
    Уведомление о
    guest
    0 Комментарий
    Inline Feedbacks
    View all comments

    Остались вопросы?

    Я - Першин Артём, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

    VoIP оборудование

    ближайшие курсы

    ближайшие Вебинары

    ONLINE

    10 доводов в пользу Asterisk

    Распространяется бесплатно.

    Asterisk – программное обеспечение с открытым исходным кодом, распространяется по лицензии GPL. Следовательно, установив один раз Asterisk вам не придется дополнительно платить за новых абонентов, подключение новых транков, расширение функционала и прочие лицензии. Это приближает стоимость владения станцией к нулю.

    Безопасен в использовании.

    Любое программное обеспечение может стать объектом интереса злоумышленников, в том числе телефонная станция. Однако, сам Asterisk, а также операционная система, на которой он работает, дают множество инструментов защиты от любых атак. При грамотной настройке безопасности у злоумышленников нет никаких шансов попасть на станцию.

    Надежен в эксплуатации.

    Время работы серверов некоторых наших клиентов исчисляется годами. Это значит, что Asterisk работает несколько лет, ему не требуются никакие перезагрузки или принудительные отключения. А еще это говорит о том, что в районе отличная ситуация с электроэнергией, но это уже не заслуга Asterisk.

    Гибкий в настройке.

    Зачастую возможности Asterisk ограничивает только фантазия пользователя. Ни один конструктор шаблонов не сравнится с Asterisk по гибкости настройки. Это позволяет решать с помощью Asterisk любые бизнес задачи, даже те, в которых выбор в его пользу не кажется изначально очевидным.

    Имеет огромный функционал.

    Во многом именно Asterisk показал какой должна быть современная телефонная станция. За многие годы развития функциональность Asterisk расширилась, а все основные возможности по-прежнему доступны бесплатно сразу после установки.

    Интегрируется с любыми системами.

    То, что Asterisk не умеет сам, он позволяет реализовать за счет интеграции. Это могут быть интеграции с коммерческими телефонными станциями, CRM, ERP системами, биллингом, сервисами колл-трекинга, колл-бэка и модулями статистики и аналитики.

    Позволяет телефонизировать офис за считанные часы.

    В нашей практике были проекты, реализованные за один рабочий день. Это значит, что утром к нам обращался клиент, а уже через несколько часов он пользовался новой IP-АТС. Безусловно, такая скорость редкость, ведь АТС – инструмент зарабатывания денег для многих компаний и спешка во внедрении не уместна. Но в случае острой необходимости Asterisk готов к быстрому старту.

    Отличная масштабируемость.

    Очень утомительно постоянно возвращаться к одному и тому же вопросу. Такое часто бывает в случае некачественного исполнения работ или выбора заведомо неподходящего бизнес-решения. С Asterisk точно не будет такой проблемы! Телефонная станция, построенная на Asterisk может быть масштабируема до немыслимых размеров. Главное – правильно подобрать оборудование.

    Повышает управляемость бизнеса.

    Asterisk дает не просто набор полезных функций, он повышает управляемость организации, качества и комфортности управления, а также увеличивает прозрачность бизнеса для руководства. Достичь этого можно, например, за счет автоматизации отчетов, подключения бота в Telegram, санкционированного доступа к станции из любой точки мира.

    Снижает расходы на связь.

    Связь между внутренними абонентами IP-АТС бесплатна всегда, независимо от их географического расположения. Также к Asterisk можно подключить любых операторов телефонии, в том числе GSM сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.