CentOS → Настройка сервера VoIP Asterisk на PBX Elastix (CentOS) - Часть 1


    Когда-то давно я разворачивал сервер VoIP в офисе, выбор был между Trixbox и Elastix, правда у Elastix был странный глюк со стабильностью работы транка к провайдеру, проблема была в том что транк падал по необъяснимой причине, в логах по данному поводу ничего вразумительного не было, в результате, после тестирования, предпочтения были отданы Trixbox, который, в тестовой среде, показал себя просто отлично, и результатом стало успешное использование более 2х лет. Тут мне на поддержку перешла новая компания, в планах которой было использовать VoIP в этот раз я решил еще раз протестировать Elastix. Визуально Elastix более функционален т.к. содержит больше функций из коробки, остальное можно добавлять с помощью модулей. 
    В функционале Elastix есть, собственно PBX-сервер, mail-сервер, jabber (openfire), статистика. Все остальное можно добавить самому.
    Я хочу настроить сервер Asterisk с тремя подключенными телефонами, мы будем использовать 2 провайдера VoIP — PCtel.ruи sipnet.ru
    Первый обеспечивает дешевую телефонную связь по РФ 1 руб. за мин. второй позволяет звонить на прямые московские номера до 40 мин в день бесплатно, при условии что у вас на счету более 5 у.е., в общем для тестирования данные провайдеры легко настраиваются, а в дальнейшем, с небольшими изменениями, можно подключать к любому провайдеру с сохранением функционала.
    Мы настроим диалплан, чтобы звонки на мобильные телефоны и городские телефоны в других городах автоматически шли через pctel.ru, а на городские Москвы через sipnet.ru, при этом входящие звонки будут попадать на номер 100, если он недоступен или не отвечает, через 10 сек, перенаправлен на номер 200, если и он не отвечает то «пиликать» должны все телефоны — 100, 200, 300.
    Я не буду рассматривать процесс установки системы, он весьма прост и нагляден.
    Для работы нам понадобится дистрибутив Elastix, актуальную версию которого, можно скачать с сайта разработчика

    Подготовительная часть

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

    yum -y update

    Перезагрузимся, чтобы применить обновления:

    reboot


    ну и идем в web консоль, если случайно вы не задали статистический IP адрес вашему серверу, то IP можно узнать зайдя в консоль, под пользователем root( на скриншоте подчеркнуто красным):
    elastix console

    Если требуется настроить сеть то идем во вкладку System, а там в Network и жмем на кнопку Edit Network Parameters (на скриншоте обведено красным)


    Редактируем настройки сети- если требуется, далее идем настраивать экстеншены- вкладка PBX.

    1 Настраиваем экстеншены, для подключения телефонов пользователей


    Выбираем устройство SIP:


    Первый пользователь с внутренним номером 100 у нас будет оператор (operator) в поле DisplayName, укажем его имя латиницей, тогда у того кому он звонит, будет высвечиваться его имя(при условии что телефон, у того кто принимает звонок, поддерживает данную функцию есть такие что не поддерживают, тогда высвечивается номер), также мы активируем функцию, Call Waiting, весьма полезная вещь, нужна она для того, если поступил новый звонок, во время того как пользователь уже разговаривает, а телефон имеет 2 канала, то пользователь может переключиться на вторую линию, а первый звонок будет находиться в режиме удержания и к нему можно будет вернуться, если телефон пользователя имеет только одну линию, то положив трубку, он будет переключен на новый входящий звонок. Для подключения экстеншена к VoIP серверу нам нужно придумать пароль, !!! для тестовых целей!!! я использовал 123456qw.

    Все поля которые менялись, выделены красным:


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


    Экстеншены 200 и 300 создаем аналогичным образом, в результате, у нас должно появится 3 эктеншена — Operator с номером 100, Megatronov с номером 200 и Kukueva с номером 300, остается только применить изменения


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

    2 Создание транка в Asterisk
    Транк это ничего иное как подключение к провайдеру или внешней линии, через него к нам будут приходить входящие вызовы и уходить исходящие.

    Для упрощения понимания, мы будем использовать какие-то данные для подключения к SIP провайдерам, после регистрации у нас будет логин и пароль для подключения, в примерах, я буду использовать данные пользователей:
    логин: USER_LOGIN
    пароль: PASSWORD
    Остальные данные будут представлены по ходу дела.

    Настраиваем транк для подключения к PCtel.ru

    Сначала мы настроим подключение к провайдеру PCtel.ru, для того чтобы начать полноценно пользоваться их сервисом, требуется зарегистрироваться и закинуть на счет 200 руб (меньше не принимают!). После регистрации у вас будет аккаунт с логином и паролем и внутренний номер абонента (например 000000000)
    Переходим в раздел Tranks и создаем SIP транк т.к. подключение к провайдеру у нас идет по протоколу SIP


    Придумаем имя транка, я назвал pctel.ru. Чувствуете задумку, а?! :)



    ну и вторая часть настройки транка


    ну и теперь в виде текста, поля с настройками:
    PEER Details:

    type=friend
    secret=PASSWORD
    defaultuser=USER_LOGIN@sip.pctel.ru
    fromuser=USER_LOGIN
    fromdomain=sip.pctel.ru
    host=sip.pctel.ru
    port=5060
    insecure=invite
    qualify=no
    disallow=all
    allow=alaw&ulaw&g729&h261
    dtmfmode=rfc2833
    canreinvite=no
    nat=yes


    ну и Regirter Strings

    USER_LOGIN:PASSWORD@sip.pctel.ru/000000000


    Где:
    USER_LOGIN — указываем логин
    PASSWORD — указываем пароль для подключения
    000000000 — указываем номер который нам достался при регистрации

    Настраиваем транк для sipnet.ru

    Тут все примерно тоже самое, также задаем название для транка sipnet.ru:


    ну и вторая часть


    настройки текстом:
    PEER Details:
    username=000000000
    type=friend
    secret=PASSWORD
    qualify=yes
    insecure=invite
    host=sipnet.ru
    fromuser=000000000
    fromdomain=sipnet.ru
    dtmfmode=rfc2833
    disallow=all
    allow = alaw&ulaw&g729
    nat = yes


    Regirter Strings
    000000000:PASSWORD@sipnet.ru

    Где:
    000000000 — SIP ID выдается при регистрации
    PASSWORD — пароль

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

    3 Настраиваем исходящую маршрутизацию звонков — Outbound Routers
    Чтобы звонить на внешние номера, нам необходимо настроить исходящую маршрутизацию. На данном этапе, мы настроим простую систему, из соображений-чтобы все просто работало, остальные навороты в конце статьи.

    Начнем с pctel.ru

    Идем в пункт Outbound Routers (у меня уже был создан исходящий маршрут, то я привел его содержимое) и создаем новый маршрут, назвав его pctel-out, как указано на скриншоте, то что менялось выделено красным:


    Лирическое отступление: Набор номера у PCtel.ru идет следующий 0+7+XXX+XXX+XX+XX т.е. 0 потом код страны 7, потом 10ти-значный номер телефона.
    По этому в пункте: Dial Patterns that will use this Route указан номер 07XXXXXXXXXX, таким образом, все звонки начинающиеся на 07 и содержащие 10 цифр, автоматически будут идти через транк pctel.ru
    В пункте Trunk Sequence for Matched Routes указываем транк через который будет идти звонок, а это у нас pctel.ru.

    Настраиваем маршрутизацию для sipnet.ru

    Тут все действия аналогичны предыдущим, задаем название исходившего маршрута sipnet-out

    У sipnet.ru набор номера идет через 7-ХХХ-ХХХ-ХХ-ХХ таким образом все номера, набор которых идет начиная с 7, будет идти через транк sipnet.ru

    Тестируем работу исходящих вызовов.
    Для этого нам достаточно иметь только 1 мобильный телефон, ну и немного денег на счете sip-провайдеров, чтобы можно было совершать исходящие звонки.
    Звоним, сами себе, сначала через pctel.ru набрав 07-XXX-XXX-XX-XX, где вместо Х вбиваем свой номер мобильного, на мобильном определился номер входящего звонка, затем просто набрав 7-XXX-XXX-XX-XX определился другой номер, видно что маршрутизация звонков работает и идет через разных провайдеров, трубку на мобильном можно не снимать-чтобы деньги не уходили.

    4 Настройка группы вызовов — Ring Group.

    Собственно из названия функции Ring Group понятно что она формирует группу телефонов при звонке на номер группы, телефоны будут звонить у всех членов данной группы, пока кто-то не снимет трубку.
    Телефонный номер группы будет 600, а назовем мы ее Allusers в нее будут входить номера 100,200,300.
    Подробнее на скриншоте, все что менялось, выделено красным

    Расскажу подробнее о том что там изображено:
    Group Description: — название группы
    Extension List: — список номеров входящих в эту группу это номера 100,200,300 -номера вписываются с новой строки
    Extension Quick Pick — в этом меню можно выбрать номера которые будут входить в эту группу они добавятся в Extension List.
    Destination if no answer: — куда будет отправлен звонок, если нет ответа.

    5 Настраиваем входящую маршрутизацию звонков — Inbound Routers

    Можно считать что мы вышли на финишную прямую, как было оговорено ранее, все входящие звонки будут попадать на номер 100, если он не отвечает, то переводиться на номер 200, ну а если и он не отвечает, то на номер группы 600 (чтобы звонили все телефоны 100,200,300).
    Идем в раздел Inbound Routers, ну и заполняем поля, все что менялось подчеркнуто красным.

    Рассмотрим подробнее то что мы тут наделали:
    1 — Названия правила для маршрутизации входящих звонков, я назвал его IncomingCall — чтобы было понятно за что оно отвечает.
    2 — Устанавливем галку signal ringing
    3 — В пункте Set Destination указываем куда будут идти входящие звонки, а это у нас внутренний номер 100

    Сохраняем изменения и применяем настройки, нам остается протестировать работу маршрутизации входящих звонков.
    Для этого нам нужно позвонить на шлюз SIP провайдера и набрать внутренний номер абонента, у sipnet.ru телефоны доступа из городов можно посмотреть на странице customer.sipnet.ru/cabinet/do_showphones у pctel.ru это единый номер +74995034004 (на который хрен дозвонится).
    Пример sipnet.ru для Москвы +7(499)346-42-00 + SIP ID звонок придет на внутренний номер 100.
    Как было оговорено в начале статьи, логика работы АТС будет следующая: звонок приходит на номер 100, если в течении 10 сек номер не отвечает, то звонок уходит на номер 200 если и он не отвечает, то звонок уходит на группу номеров 600 в результате чего должны звонить все телефоны 100, 200 и 300.
    Отлично звонок приходит на номер 100, теперь нам нужно чтобы звонок в случае если номер не отвечает отправлялся на номер 200 а если и он не ответит то на группу с номером 600.
    Для этих целей существует функция Follow Me

    7 Настройка функции следования — Follow Me
    Идем в пунскт с названием Follow Me и там вы выбираем экстеншен к которому мы хотим применить данные правила, выбираем номер 100
    Изменения выделены на скриншоте:

    Подробнее о том что там менялось:
    Ring Time (max 60 sec) указываем значение 10 т.е. если в течение 10 сек на номер 100 не отвечает, то звонок будет перенаправлен на внутренний номер 200, который указан в пункте Destination if no answer:
    Сохраняем изменения и переходим к настройке номера 200, тут все примерно тоже самое, но с небольшими отличиями, подробнее на скриншоте:

    Тут есть небольшие отличия, что если ответа от номера не будет в течении 5 сек, то звонок будут переведен на группу с номером 600.
    Вот так все просто.

    8 Настройка плана набора-DialPlan

    Ну и теперь самое главное, работа с набором номера и преобразование набранного номера клиентом в правила набора устанавливаемые SIP провайдером.

    Собственно идея, я хочу чтобы звонки идущие на городские номера москвы автоматически шли через sipnet.ru, а на все остальные через pctel.ru, суть в том что набор номера у этих провайдеров разный, а пользователям довольно трудно объяснить как и через кого звонить, они обязательно всё забудут или перепутают, по этому у пользователя должен быть один способ набора номера, а остальное на себя берет АТС, а как и что она делает с номером пользователю знать и не надо, да и зачем все эти системы нужны, если они не решают рутинные задачи и такие нюансы приходится держать в голове. По старой традиции звонок наружу идет через 9, этот способ принят почти повсеместно, где его нет, то там скорее всего, настраивал какой-то извращенец «эстет» со своим тонким видением мира.
    В общем набор номера будет иметь следующий вид 9-8-495-ХХХ-ХХ-ХХ это при звонке на городские номера или 9-8-ХХХ-ХХХ-ХХ-ХХ при звонках на мобильные и т.п.
    Почему именно 8?!
    Я ориентируюсь на свою маму, которая даже в мобильном набирает так как она привыкла и ей трудно объяснить что правильно +7, ничего не поделать человек старой закалки, ну мы используем клиенто-ориентированный подход, и это правильно…

    Для начала определимся с переменными и их значениями:

    X — любая цифра 0—9
    Z — любая цифра 1—9
    N — любая цифра 2—9
    [123] — может быть любая из цифр, указанная в квадратных скобках т.е. или 1 или 2 или 3
    . — одна или несколько произвольных цифр;
    | — позволяет удалить все что было указано до этого знака, пример 9|4951234567, тогда набранный номер будет иметь вид 94951234567, увидев данное правило Asterisk отрежет значения указанный перед | таким образом, в транк будет набран номер 4951234567 без 9.

    Для начала, заходим в раздел настройки исходящих маршрутов Outbound Routers и в списке находим маршрут 9_outside, нам он не нужен и мы его удаляем иначе система нам не даст создать правило, где уже есть 9 в наборе.
    После этого переходим к маршруту pctel-out, в пункте Dial Patterns that will use this Route у нас указано правило, которое начинает работать если пользователь набрал 07ХХХХХХХХХХ, т.е. набрал 07 и десятизначный номер мобильного телефона, тогда набор удовлетворяет правилу и звонок уходит через транк pctel.ru
    Запись преобразования номера имеет следующую структуру
    prepend + prefix | match pattern
    Давайте представим что мы хотим позвонить на мобильный тогда запись плана набора будет иметь вид 98|XXXXXXXXXX набор на телефоне будт выгладеть так 980001234567.

    Делаем набранному номеру «обрезание»
    98-префикс, а 0001234567-match pattern, префикс будут удален сервером и набор номера будет следующий 0001234567, а в транк попадет только 10 цифр, чего у PCtel не достаточно и у нас не хватает 07 чтобы правильно выполнить набор номера и совершить звонок, чтобы набор номера был выполнен как надо, нам требуется добавить 07 в начале набора, т.е. склеить номер из частей, одна часть есть у сервера, а пользователь предоставит завершающую часть.

    «Склеиваем» номер для выполнения звонка
    Нам нужно добавить 07 к набору, во тут нам понадобится пункт prepend в правиле обработки номера, добавим туда недостающие цифры.
    Тогда правило принимает вид:
    07+98|XXXXXXXXXX
    При выполнении звонка 98 будет вырезано, а 07 добавлено спереди и набор получает вид 070001234567 что pctel.ru примет на раз и совершит звонок, но это все применительно к звонкам на 10ти-значные федеральные номера мобильных телефонов и тут проблемы нет все будет работать как часы, а т.к. основной трафик у нас будет идти именно через pctel.ru, то у нас появляется проблема, если в вызываемом номере больше 10 знаков, то вызов не пройдет, это может произойти при звонке на городские номера других городов, где вместе с кодом города и городским номером будет больше 10 знаков.
    Что делать?!
    «Пилить» правила набора под 11, 12 значные номера и т.д.-не вариант, правило должно быть одно и применимо ко всем.
    тогда набор принимает вид
    07+98|. переменную (.) я указывал в примерах, вернитесь и взгляните за что она отвечает.
    Таким образом мы создали 1 правило которое удовлетворяет всем требованиям, для выполнения звонка через pctel.ru, само правило имеет вид:


    Сохраним изменения и переходим к редактированию правил sipnet-out
    Как я писал в начале, sipnet.ru у нас будет использоваться для того чтобы звонить на городские номера Москвы.
    Чтобы снова вспомнить правила обработки номера опять приведу исходник:
    prepend + prefix | match pattern
    Телефонные номера москвы бывают в кодах 495 и 499, а набор номера у sipnet.ru начинается на 7, таким образом правила обработки набранного номера принимает вид:
    7+98|495XXXXXXX и 7+98|499XXXXXXX т.е. после 495 может быть 7 знаков, можно забабахать 2 правила и все будет работать, но можно его немного оптимизировать, чтобы количество правил было меньше, тогда правило принимает вид:
    7+98|49[59]XXXXXXX
    где переменная [59] может быть или 5 или 9, тогда у нас получилось что при наборе 98 будет вырезано и набор примет вид 7495ХХХХХХХ
    таким образом, набранные номера в наборе которых присутствует 495 или 499 после которых идут 7 цифр, автоматически будут маршрутизироваться в транк sipnet.ru

    Итог:
    В результате всех наших действий, у нас получился простой сервер VoIP в котором звонки автоматически распределяются между провайдерами в зависимости от того куда звонит пользователь. У нас создан универсальный способ набора номера вида 98ХХХХХХХХХХ, о правилах набора которого пользователю можно не замарачиваться т.к. система сделают всю рутинную работу за него, пользователь просто набирает номер, а что там внутри происходит его не волнует, ему важен результат.
    Прошу обратить внимание что данная конфигурации была представлена исключительно в целях ознакомления, некоторые моменты там сделаны не оптимально и я об этом знаю, но зато она дает получить представление о ее принципах работы и сделать быстрый старт в освоении VoIP в целом и Asterisk в частности.
    Ну и как всегда, нашли ошибку пишите в личку или на email, есть вопросы, прошу в комментарии.

    В ходе написания статьи были использованы ссылки:
    Пример настройки подключения к PCtel.ru
    Пример настройки подключения к Sipnet.ru
    Сообщения пользователя ded, дай бог ему здоровья!

    Поиск по этому блогу