Развертывание ip-телефонии для небольшой компании
Случилось мне столкнуться с заданием: настроить ip-телефонию для небольшой компании (в городе А) с филиалом (только для заключения договоров) в другом городе (городе Б).
Тех. задание было простое: есть sip номер города филиала с тремя линиями, нужно заставить его работать для экономии денежных средств из основного офиса города А абонентам города Б + обеспечение внутренней связи между офисом и филиалами и запись разговоров.
Задача поставлена, начнем реализацию.
Подбор оборудования и ПО
Компания небольшая, сотрудников менее 30, значит подойдет машина не старше 5ти лет (CPU 2.5-3GHz, RAM 4Gb, HDD 1Tb). В работе было использовано следующее железо:
CPU AMD Athlon 64 X2 3GHz
RAM 2x2Gb
HDD 1x1Tb
С ПО вопрос решился моментально — это Asterisk в ввиду его бесплатности и большой базе знаний, да и на слуху именно он, но т. к. я с этим сталкиваюсь впервые, то мне нужен был GUI, а тут выбор богат (FreePBX, Elastix, TrixBox, Asterisk GUI, etc.)
Выбор дистрибутива
Первое что я попробовал был Aserisk NOW с FreePBX в качестве GUI, но как-то не задалось с ним изначально — очень тяжело для первоначального изучения.
Вторым дистрибутивом стал Elastix. Были скачены Elastix 3.0.0 RC 1 и Elastix 2.4.0 Stable.
Все дистрибутивы я качал только 64-битные
Первая была установлена версия Elastix 3.0.0 RC 1 и она мне визуально очень понравилась, НО изменения в web-интерфейсе не отражались в конфигурационных файлах и, как выяснилось позднее, отсутсвуют многие пункты меню. В общем, из-за этих косяков я потратил пару дней и решил накатить версию Elastix 2.4.0 Stable. Вся дальнейшая настройка будет именно в этой версии.
Разворачивание дистрибутива
Установить Elastix 2.4.0 Stable не составит труда. Пишем скаченный образ на диск и загружаемся с него. В начале отвечаем на простые вопросы (имя машины, как будем получать IP адрес, выбрать город для установки часового пояса, разметка диска). Перезагрузка. Задаем пароль root, пароль root для MySQL и пароль для admin от web морды Elastix.
После установки рекомендую подключиться к серверу по ssh и обновиться (на все вопросы отвечаем Y):
yum update
После обновления проверяем версии
# cat /etc/redhat-release
CentOS release 5.10 (Final)
# asterisk -V
Asterisk 11.10.0
Настройка IP-АТС
Допустим, SIP-провайдер (mtt.ru) выдал нам:
номер 74995647814
логин 74995647814
пароль 1234567890
адрес подключения voip.mtt.ru
Заходим в web-интерфейс https://ip-adress/ с логином admin и паролем, который забили самый последний (пароль для superadmin).
Дашборд можно немного настроить под себя, скрыв ненужные для вас аплеты.

Для смены пароля/заведения новых пользователей web-морды идем в System — Users. Там же можно создать свои группы и назначить им права.
В System — Backup/Restore делаем бекапы с возможностью разворачивания.
Основная настройка происходит в меню PBX — PBX Configuration
Создание транка
Первое, что нужно сделать — это подключить выданный sip-номер.
Заходим в PBX — PBX Configuration — Trunks и создаем новый SIP-транк

Заполняем поля:
Секция General Settings
Trunk Name — пишем название нашего транка (я обозвал его tr74995647814)
Секция Outgoing Settings
Trunk Name — пишем название нашего транка (я обозвал его tr74995647814)
PEER Details — параметры подключения к sip-провайдеру, кодеки и пр.
; — знак комментария
type=peer
defaultuser=74995647814
fromuser=74995647814
secret=1234567890
insecure=port,invite
host=voip.mtt.ru
fromdomain=voip.mtt.ru
;nat=yes
;qualify=3000
dtmfmode=rfc2833
;directmedia=no
disallow=all
allow=alaw,ulaw,g729
Секция Incoming Settings
Очищаем все поля
Секция Registration
Register String — строка подключения, имеет вид: login:pass@voip.mtt.ru/login
74995647814:1234567890@voip.mtt.ru/74995647814
Сохраняем — Submit

Создание входящих/исходящих правил
Создадим исходящее правило
Исходящие правила создаются в меню PBX — PBX Configuration — Outbound Routes
Идем в PBX — PBX Configuration — Outbound Routes и начинаем заполнять поля:
Route Name: — название правила (я обозвал его out74995647814)
Поля Dial Patterns that will use this Route заполняем так:
(prepend) + prefix | [7XXXXXXXXXX] / XXX
(+7) + [78] | [XXXXXXXXXX] / XXX
Этим мы разрешили звонить на +7 и сделали автозамену +7 на 8.
Из выпадающего списка номер 0 Trunk Sequence for Matched Routes выбираем наш транк — tr74995647814
Сохраняем — Submit

Создадим входящее правило
Входящие правила в PBX — PBX Configuration — Inbound Routes
Идем в PBX — PBX Configuration — Inbound Routes и начинаем заполнять поля:
Description — название правила (я обозвал его in74995647814)
Language — указываем ru
В секции Set Destination пока выберем Terminate Call — Hungup
Сохраняем — Submit

Создание внутренних номеров
Для начала нужно определиться с форматом внутренних номеров, я делал так:
100, 200,300 и т.д — это номера отцела целиком
101-199, 201-299, 301-399 и т. д. — номера сотрудников отделов
Думаю, что идея понятна.
Внутренние номера создаются в меню PBX — PBX Configuration — Extensions
Жмем Add Extension, выбираем Device — Generic SIP Device и жмем Submit

Секция Add Extension
User Extension — внутренний номер абонента
Display Name — отображаемое имя при звонке
Секция Device Options
secret — пароль
Секция Language
В поле Language Code прописываем ru
Секция Recording Options
В полях Record Incoming и Record Outgoing выбираеем Always

Сохраняем — Submit
Создаем нужное количество внутренних номеров.
Работа с очередями
Очереди позволяют организовать для поступающих звонков ожидание освободившегося оператора, возможность предоставить абоненту, ожидающему соединения, переход из очереди в интерактивное меню. С их помощью удобнее всего организовывать call-центры.
Очереди создаются в меню PBX — PBX Configuration — Queues
Секция Add Queue
Queue Number — номер очереди (у меня это номер отдела)
Queue Name — название очереди (наизвание отдела, например)
Static Agents — сотрудники отдела. Поле заполняется при выборе из выпадающего списка параметра Extension Quick Pick.
Секция Queue Options
Max Wait Time — максимальное время нахождения звонящего в очереди на ожидании
Max Callers — максимальное количество абонентов, ожидающих в очереди
Ring Strategy — определяет стратегию дозвона в очередь: ringall — звонят все телефонные аппараты в очереди, leastrecent — поступление звонка на наименее загруженного оператора, fewestcalls — поступление звонка на оператора с наименьшим количеством законченных разговоров, random — звонок поступает на случайным образом выбранного оператора, rrmemory — поступает на любого доступного оператора с учетом последнего ответившего, rrordered — похоже на предыдущую стратегию, но с учетом агентов в конфиг файле, linear — звонок поступает на агентов в том порядке в котором они перечислены, для динамических агентов — в порядке их регистрации, wrandom — звонок поступает на случайно выбранного оператора с учетом занятости.
Agent Timeout — время поступления звонка на оператора, до выдачи сообщения о недоступности
Skip busy agents — пропуск занятых операторов
Секция Caller Position Announcements
Отвечает за оповещение звонящего, каким по счету он является в очереди
Frequency — частота оповещения
Announce Position — оповещать о позиции в очереди
Announce Hold Time — оповещать о примерном времени ожидания
Секция Fail Oxer Destination
Выбираем куда отправится звонок по истечению времени ожидания (никто не ответил)
Пока выберем Terminate Call — Hungup (положить трубку)

Создаем нужное количество групп
Создание голосового меню (IVR)
Для голосового меню нам нужны записаные фразы, записываем в любой любимой программе (например, Sound Forge) в формате PCM Encoded, 16 Bits, at 8000Hz.
Записать нужно:
1) Приветствие (01-hello.wav) — Здравствуйте, вы позвонили в компанию РиК.
2) Меню (02-menu.wav) — Нажмите 1 для связи с отделом А. Нажмите 2 для связи с отделом Б. Или дождитесь ответа.
3) Если никто не берет трубку (03-buzy.wav) — Извините, в данный момент все заняты, ожидайте.
4) Если долго никто не берет трубку (04-buzy_call_later.wav) — Извините, все операторы заняты, перезвоните позже.
5) Время работы компании (05-work_time.wav) — Наша компания работает с понедельника по пятницу с 9:00 до 17:00.
Теперь нужно все эти записи передать Asterisk, для этого идем в меню PBX — PBX Configuration — System Recordings
Выбираем файл hello.wav и присваеваем имя нашей записи в поле Name this Recording (например, Hello)
Сохраняем — Save

Так же загружаем оставшиеся файлы.
Теперь можно приступить к созданию самого голосового меню
Голосовые меню создаются в меню PBX — PBX Configuration — IVR
Для создания нажимаем Add IVR
Change Name — название меню
Announcement — выбираем наше приветствие (01-hello)
Timeout — время ожидания нажатия клавиши (в секундах)
Enable Direct Dial — ставим галочку, если нужно, чтобы дозвонившийся мог набрать внутренний номер сотрудника
Дальше создаем наше меню:
1 Queuse 100
2 Queuse 200
3 Extensions 301
t Extensions 301
i Extensions 301
Цифра 1 — отправляем звонок в очередь 100
Цифра 2 — отправляем звонок в очередь 200
Цифра 3 — отправляем звонок на номер 301 (секретарь)
Если ничего не нажато после 10 секунд отправляем звонок на секретаря
Если нажата любая другая клавиша (кроме 1,2 и 3) отправляем звонок на секретаря
Сохраняем — Save

Создадим дополнительные анонсы для нашего меню
Переходим в меню PBX — PBX Configuration — Announcements
Создаем анонс — Add Announcement
Description — название (All buzy call later)
Recording — выбираем нашу хапись 04-buzy_call_later
В секции Destination after playback выбираем:
Terminate Call Hangup
Сохраняем — Submit Changes

Создадим еще одно меню IVR-CALL-LATER
Announcement — выбираем 04-buzy_call_later
Timeout — 1
Enable Direct Dial — галочку не ставим
В опицях указываем:
t Terminate Call Hangup
При переходе в это меню будет сказана фраза, чтобы перезвнили позже и через 1 секунду повесится трубка.

Отредактируем наши очереди.
Открываем очередь 100 и секции Fail Over Destination выбираем IVR IVR-CALL-LATER и сохраняем. То же проделываем с остальными очередями.
Не забываем после внесеныых изменений принимать их, нажимая на Apply Configuration Changes Here.
Голосовое меню в рабочее и не рабочее время
Создадим анонс WorkingTime с нашим звуковым файлом 05-work_time в меню PBX — PBX Configuration — Announcements
Перейдем в меню PBX — PBX Configuration — Time Group и создадим группу:
Description — название (TG-WorkingTime)
Time to start — 09:00
Time to finish — 17:00
Week Day Start — Monday
Week Day finish — Friday
Сохраняем — Submit

Переходим в меню PBX — PBX Configuration — Time Condition и создаем условие:
Time Condition name — название (TC-WorkingTime)
Time Group — выбираем созданную группу TG-WorkingTime
Destination if time matches — назначение при совпадении времени с тем, что указано в TG-WorkingTime.
IVR IVR-MAIN
Destination if time does not match — назначение при несовпадении времени с тем, что указано в TG-WorkingTime.
Announcements WorkingTime
Сохраняем — Submit

Устанавливаем русские звуки
Скачиваем необходимые голосовые фразы: стандартные и расширенные
Сохраняем и разархивируем во временной директории на локальном компьютере
Содержимое архива закачиваем на Elastix в директорию /var/lib/asterisk/sounds/ru
В sip_general_custom.conf добавляем строку language=ru (отредактировать файл можно через веб-интерфейс, меню PBX-Tools-Asterisk File Editor)
Сохраняем — Save

Прием факсов
Для того, чтобы научить наш Elastix/Asterisk принимать факс, необходимо следующее:
Переходим в меню PBX — PBX Configuration — Extensions
Создаем Generic IAX2 Device
Прописываем номер в User Extension (например, 901)
Даем имя в Display name (например, Fax)
Задаем пароль в secret
Секция Recording Options
Record Inbound — Never
Record Outbound — Never
Сохраняем — Submit

Далее зайдем и отредактируем созданный номер:
Секция Device Options
disallow — all
allow — alaw
Сохраняем — Submit

Переходим в меню Fax — New Virtual Fax
Virtual Fax Name — название
Associated Email — e-mail куда будет отсылаться факс
Fax Extension (IAX) — созданный выше Extension
Secret (IAX) — пароль
Country Code — префикс страны (8)
Area Code — код города
Сохраняем — Save

Если очень хочется, то можно руссифицировать письмо с факсом в меню Fax — Email Template

Вызов внешнего номера
Что бы сделать вызов внешнего номера из голосового меню, необходимо узнать номер голосого меню (ivr), присвоенный системой, для этого идем в файл extensions_additional.conf и просматриваем наличие [ivr-<номер>], т. к. в этой статье создали два меню, то можно будет обнаружить два таких фрагмента. Определить нужный просто. Тот где много строк — нужный (например, [ivr-2]).
Необходимо, чтобы внутри массива ivr была строка include => ivr-<номер>-custom (например, include => ivr-2-custom)
После того, как узнали номер IVR, нужно в конце файла extensions_custom.conf прописать
[ivr-2-custom]
exten => _9,1,Dial(SIP/{Trunk}/{number})
где _9 — цифра вызова внешнего номера
SIP/{Trunk} — это строка SIP/tr74995647814 (см. создание транка)
{number} — внешний номер

Работает это так: звонит клиент, ему что-то говорится в меню, он нажимает 9 и Asterisk перекидывает звонок на внешний номер, а сам кладет трубку.
Работа за NAT
Для полноценной работы за NAT требуется доступ к портам 5060/UDP, 10000-20000/UDP и следующее содержание файла sip_nat.conf
nat=route
bindaddr=0.0.0.0/0.0.0.0
externip=88.88.88.88
localnet=192.168.0.1/255.255.255.0
canreivite=no
qualify=yes
directmedia=no
externip — внешний IP-адрес
localnet — внутренний IP-адрес/маска сети
Своя мелодия при ожидании
Как и для голосового меню мелодии нужно сохранить в формате PCM Encoded, 16 Bits, at 8000Hz.
Имея 2-3 готовых файла идем в меню PBX — PBX Configuration — Music on Hold
Создаем новую категорию — Add Music Category, вводим в поле Category Name название и жмем Submit Changes.
Переходим в созданную категорию и заливаем наши файлы с мелодиями. Если хотите, чтобы каждый раз проигрывалась произвольная мелодия, необходимо прожать Enable Random Play.
Не забываем применить настойки кликом на Apply Configuration Changes Here.

Дальше необходимо отредактировать все очереди
Секция Queue Options
Music on Hold Class — выбираем созданную группу с мелодиями
Сохраняем — Submit Changes
Мониторинг транков
Мониторить состояние транков можно в консоле командой:
asterisk -rx "sip show registy"
Смена RTP портов
RTP порты прописаны в файле rtp.conf
;
; RTP Configuration
;
[general]
;
; RTP start and RTP end configure start and end addresses
; These are the addresses where your system will RECEIVE audio and video streams.
; If you have connections across a firewall, make sure that these are open.
;
rtpstart=10000
rtpend=20000
Звонки в разные города с разных SIP номеров
После развертывания АТС обнаружилось, что нужно совершать звонки в другой город, например Томск (код города 3822), а звонить с московского номера (в примере 74995647814) дорого. Для минимизации расходов было принято решение приобрести томский sip номер. Сказано — сделано.
Допустим, SIP-провайдер (mtt.ru) выдал нам:
номер 73822555555
логин 73822555555
пароль 1234567890
адрес подключения voip.mtt.ru
Заводим новый транк как делали это выше
После этого создадим исходящее правило для нового транка, но в полях секции Dial Patterns that will use this Route указываем следующее:
(prepend) + prefix | [73822XXXXXX] / XXX
+7 + [78] | [73822XXXXXX] / XXX
В секции Trunk Sequence for Matched Routes выбираем наш новый транк.
Этими правилами мы указываем, что при исходящем звонке на номера вида +7(3822) XX-XX-XX набор пойдет через томский номер +7(3822) 55-55-55
Так же не стоит забывать, что правила применяются сверху вниз, а это значит, что пока мы наше новое правила не поставим выше предыдущего все звонки будут идти с московского номера +7(499) 564-78-14, т. к. в исходящем правиле out74995647814 у нас прописаны строки вида
(prepend) + prefix | [7XXXXXXXXXX] / XXX
(+7) + [78] | [XXXXXXXXXX] / XXX
Что бы поставить правило out73822555555 выше out74995647814 нужно в выпадающем списке Route Position выбрать First before out4995647814 и сохранить изменения.
Таким образом мы подключили два sip номера к Asterisk и настроили исходящие звонки для всех внутренних номеров в Томск через томский номер, а все остальные звонки — через московский номер.