Русский
Русский
English
Статистика
Реклама

Asterisk ip-телефония ubuntu

Виртуальная АТС. Часть 3 Переводим Asterisk на PjSIP без лишних телодвижений

11.11.2020 18:11:34 | Автор: admin


В первой и второй частях цикла статей мы разобрались с установкой IP-АТС (IP-PBX) на работающий под управлением Ubuntu VPS от RuVDS и настройкой основных функций с использованием канального драйвера chan_sip. Этот подход считается устаревшим, и в будущих версиях Asterisk поддержка chan_sip будет прекращена. Вместо него лучше использовать открытую мультимедийную библиотеку PjSIP. Несмотря на кардинальные различия в файлах конфигурации, переход не так сложен, как может показаться на первый взгляд.

Что такое PjSIP?


Важно понимать, что PjSIP не какой-то новый протокол, а целая библиотека для работы со стеком обеспечивающих голосовую связь протоколов: SIP, RTP, SDP, STUN и т.д. Она представляет собой целую кучу модулей, что нашло отражение в конфигурационном файле pjsip.conf (он заменяет традиционный sip.conf). Файл разделен на секции, а работает с ним преимущественно модуль res_pjsip, при этом каждая секция определяет конфигурацию некоторого объекта. Имена секций традиционно заключаются в квадратные скобки, а в секции обязательно присутствует определяющая ее тип конструкция type =.

Типы секций могут быть следующими:

ENDPOINT аналог пира в sip.conf, который определяет опции протокола SIP и взаимодействие с AOR, AUTH и TRANSPORT. Обязательно связана хотя бы с одной секцией AOR;
AOR здесь описано, как связаться с ENDPOINT;
TRANSPORT в этой секции описываются настройки протоколов транспортного уровня, веб-сокеты и методы шифрования (наподобие general в sip.conf). Может быть одной для разных ENDPOINT или уникальной для некоторой точки;
REGISTRATION отвечает за исходящие регистрации, например, транки к провайдерам;
AUTH содержит опции и полномочия для входящих и исходящих регистраций. С ней ассоциируются ENDPOINT и REGISTRATIONS;
IDENTIFY здесь можно задать IP источника для ENDPOINT;
ACL используется res_pjsip для контроля входящих соединений, не привязан к ENDPOINT;
DOMAIN_ALIAS псевдонимы домена;
CONTACT нужна, чтобы явно не указывать SIP URI в Dialplan;
System системные опции;
Global глобальные опции;

Имена секций в большинстве случаев могут быть произвольными, но, к примеру, ENDPOINT и AOR должны именоваться идентично с заголовком SIP URI.

Нашу справку трудно назвать исчерпывающей, поскольку за кадром осталось много интересных фишек, вроде PjSIP Configuration Wizard: пока речь идет о миграции на новую библиотеку малой кровью. С нюансами и тонкостями можно разобраться позднее.

Конвертируем sip.conf в pjsip.conf


Из-за модульности структура конфигурационного файла pjsip.conf размазана тонким слоем по множеству секций она гораздо сложнее, чем у старого-доброго sip.conf. Разработчики Asterisk подумали о простых админах и создали сценарий для конвертации. Написан он на Python, и если вы собираете ПО из исходников, уже есть в дистрибутиве: в каталоге contrib/scripts/sip_to_pjsip/. Мы ставили Asterisk из входящего в репозиторий Ubuntu бинарного пакета, поэтому скрипты пришлось скачать с GitHub.

Хотя формат конфигурационных файлов для разных версий IP-PBX особо не менялся, лучше выбрать скрипты из установленной у вас версии Asterisk вместо последней по умолчанию в нашем случае 16.2.


Версию Asterisk можно посмотреть в консоли IP-PBX с помощью команды core show version

Вам понадобятся все файлы на Python из каталога contrib/scripts/sip_to_pjsip/ в репозитории на GitHub. Их нужно сложить в локальный каталог, перейти в каталог с конфигами Asterisk (обычно /etc/asterisk) и запустить скрипт sip_to_pjsip.py с привилегиями суперпользователя. Основная его задача, прочитать входной файл sip.conf и сделать новый pjsip.conf (подробности доступны в wiki Asterisk).


Сценарий сделает pjsip.conf, а дальше вас ждет его ручная полировка. Если вы устанавливали Asterisk по нашим статьям, придется еще настроить загрузку модулей в /etc/asterisk/modules.conf и изменить в Dialplan (/etc/asterisk/extensions.conf) вызов приложения Dial.

Сделанный конвертером файл /etc/asterisk/pjsip.conf на практике оказался нерабочим:

pjsip.conf
;--;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Non mapped elements start;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;[general]allowoverlap = no[office]call-limit = 2[sipnet]remotesecret = пароль;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Non mapped elements end;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;--;[transport-udp]type = transportprotocol = udpbind = 0.0.0.0[sipnet]type = aorcontact = sip:логин@sipnet.ru[sipnet]type = identifyendpoint = sipnetmatch = sipnet.ru[sipnet]type = endpointcontext = sipnet-trunkdtmf_mode = rfc4733disallow = allallow = alaw,ulawdirect_media = nofrom_user = логинfrom_domain = sipnet.ruaors = sipnet[1001]type = aormax_contacts = 1[1001]type = authusername = 1001password = пароль[1001]type = endpointcontext = homeofficedtmf_mode = rfc4733disallow = allallow = ulawallow = alawallow = g729allow = g723allow = g726allow = h261allow = h263allow = h264allow = h263pcallerid = Директор <1001>auth = 1001outbound_auth = 1001aors = 1001[acl]type = aclpermit = XXX.XXX.XXX.XXXdeny = 0.0.0.0/0.0.0.0[1002]type = aormax_contacts = 1[1002]type = authusername = 1002password = пароль[1002]type = endpointcontext = homeofficedtmf_mode = rfc4733disallow = allallow = ulawallow = alawallow = g729allow = g723allow = g726allow = h261allow = h263allow = h264allow = h263pcallerid = Секретарь <1002>auth = 1002outbound_auth = 1002aors = 1002


Синтаксис его понятен, подробности можно найти в wiki Asterisk. Чтобы довести конфигурационный файл до ума, потребуется ручная правка.

Исправленный /etc/asterisk/pjsip.conf (как и в sip.conf, в нем можно использовать шаблоны):

Исправленный /etc/asterisk/pjsip.conf
;===============TRANSPORT[transport-udp]type = transportprotocol = udpbind = 0.0.0.0;===============ACL[acl]type = acldeny = 0.0.0.0/0.0.0.0permit = XXX.XXX.XXX.XXX;===============SIPNET TRUNK[sipnet]type = registrationtransport = transport-udpoutbound_auth = sipnetserver_uri = sip:sipnet.ruclient_uri = sip:логин@sipnet.ruretry_interval = 60[sipnet]type = authauth_type = userpasspassword = парольusername = логин[sipnet]type = aorcontact = sip:логин@sipnet.ru[sipnet]type = endpointtransport = transport-udp; Контекст должен быть прописан в Dialplancontext = sipnet-trunkdtmf_mode = rfc4733disallow = allallow = alaw,ulawdirect_media = nofrom_user = логинfrom_domain = sipnet.ruoutbound_auth=sipnetaors = sipnet [sipnet]type = identifyendpoint = sipnetmatch = sipnet.ru;===============USER TEMPLATES [endpoint-template](!)type = endpointtransport = transport-udpcontext = homeofficedtmf_mode = rfc4733disallow = allallow = ulawallow = alawallow = g729allow = g723allow = g726allow = h261allow = h263allow = h264allow = h263p [auth-template-userpass](!)type = authauth_type = userpass [aor-template-single-reg](!)type = aor; PjSIP допускает и множественные регистрации с одного аккаунтаmax_contacts = 1;===============User 1001[1001](endpoint-template)auth = auth1001aors = 1001callerid = Директор <1001>[auth1001](auth-template-userpass)username = 1001password = пароль [1001](aor-template-single-reg);===============User 1002[1002](endpoint-template)auth = auth1002aors= 1002callerid = Секретарь <1002>[auth1002](auth-template-userpass)username = 1002password = пароль [1002](aor-template-single-reg)


С шаблонами писанины стало меньше, но есть и более интересный способ упростить админу жизнь Configuration Wizard. Пожалуй, это одна из самых удобных фишек PjSIP, с которой мы разберемся в следующей статье.

Загружаем модули


Переписываем Dialplan


Самая простая часть: достаточно заменить SIP на PJSIP в вызове приложения Dial. Пока мы немного изменили простейший тестовый Dialplan из предыдущей статьи, более сложными вещами займемся позднее.

Конфигурационный файл /etc/asterisk/extensions.conf
[general]static=yeswriteprotect=nopriorityjumping=noautofallthrough=yesclearglobalvars=no; Контекст по умолчанию принято закрывать ради удобства и безопасности[default]exten => _X.,1,NoOp()same => n,Busy()same => n,HangUp(); Определяем контекст homeoffice[homeoffice]; разрешаем внутренние звонкиexten => _1XXX,1,Dial(PJSIP/${EXTEN}); звонки по России производим через SIPNETexten => _.7XXXXXXXXXX,1,Dial(PJSIP/${EXTEN:1}@sipnet); Определяем контекст sipnet-trunk, разрешаем входящие звонки через SIPNET[sipnet-trunk]; входящие звонки рассмотрим в следующей статье

Переход с chan_sip на PjSIP оказался делом не особенно сложным, но требующим изрядной доли ручной работы. Автоматически конвертировать конфигурацию у нас не получилось: сценарий выдал неработоспособный вариант, который пришлось переписать вручную. В следующей статье мы разберем работу с Configuration Wizard и наконец расширим dialplan для приема входящих вызовов, организации конференций и решения других задач маршрутизации звонков.



Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru