Asterisk. начало
На написание этой статьи меня побудило практически полное отсутствие how-to по настройке Астериска, с понятными новичку примерами. В сети можно найти кучу информации по настройке IVR, по настройке авторизации SIP-пользователей через LDAP, мануалов по созданию HA-кластеров с Астерисками внутри, etc., но нет ни одной статьи о том, как завести его с нуля, да и еще с примерами. Практически везде предлагается сразу же использовать все возможности, которые предлагает Астериск, а если убрать часть функционала, предлагаемого в мануале, то в большинстве случаев это приведет к получению неработоспособной конструкции. Эта статья — результат
хождения по граблям
… чтения мануалов. Если вы находитесь в такой же ситуации, что и я пару лет назад — добро пожаловать под кат.
И так, ситуация: вы только что узнали про Астериск и его возможности, и захотели использовать его у себя дома, или ваше руководство захотело IP-телефонию в офис.
Первое что нам необходимо — сервер с установленной операционкой. По ряду причин я выбрал для своих серверов CentOS 6. Все примеры будут с привязкой к этой ОС, так как именно на ней получаются наиболее стабильные сервера. Тем не менее, я ни коим образом не пытаюсь ограничить вас выборе. Астер нормально заведется и под Debian-ом, и под Arch-ем, и даже на FreeBSD. Замечу: желательно не пользоваться гипервизорами на начальном этапе, так как вы можете получить «металлический» голос, либо его полное отсутствие. Про таймеры и прерывания расскажу в следующей статье, так как их описание и настройка выходит за рамки этой статьи. В том случае, если свободного сервера у вас нет и без виртуальной машины не обойтись, обязательно ставьте x86-го гостя.
После того, как вы установили операционку на сервер, можно приступить к установке Астериска. Добавляем репозитории Didgium:
rpm -Uvh http://packages.asterisk.org/centos/6/current/i386/RPMS/asterisknow-version-3.0.1-2_centos6.noarch.rpm yum update
Устанавливаем dnsmasq:
yum install dnsmasq
Устанавливаем Астериск:
yum install asterisk asterisk-configs --enablerepo=asterisk-12
Важное замечание: цифра в конце строки указывает на мажорную версию Астериска. В примере будет установлена наиболее свежая версия из 12-й ветки, доступная в репозиториях.
После установки перезагружаем сервер и заходим в шелл Астериска:
asterisk -rv
Обратите внимание на ключи, c которыми запускается шелл. Количество ключей «v» влияет на количество выводимой информации при звонке, их количество варьируется от 1 до 14.
Если установка прошла успешно и Астериск запустился, вы увидите вот такое приглашение:
asterisk*CLI>
Поздравляю, Астериск установился и готов к работе. Но пока что шелл нам не нужен, поэтому пишем exit.
Для того, чтобы сэкономить ваше время и сделать материал понятным, рассмотрим теорию на конкретном примере, а также разберем основные термины, которыми вам придется оперировать при настройке, при общении с саппортом оператора и своими коллегами. Для примера мы заведем двух внутренних пользователей с номерами 100 и 101, и двух операторов телефонии. Один из операторов будет предоставлять нам городские номера через транк с регистрацией, другой будет обеспечивать доступ к направлениям дальней связи, используя транк без регистрации.
Первое что вам требуется сделать — создать пиров в файле /etc/asterisk/sip.conf. Открываем его:
nano /etc/asterisk/sip.conf
И сразу переходим в конец файла. Вставляем следующий текст:
[internal](!) type=friend insecure=invite,port context=office fromdomain=<имя домена или IP> host=dynamic disallow=all allow=alaw qualify=yes canreinvite=no nat=no [100](internal) secret=XXX [101](internal) secret=XXX
Мы завели двух внутренних пиров с номерами 100 и 101. Разберем эти настройки, так как их понимание — ключ к успешному внедрению Астериска.
[internal](!)
[internal], это имя шаблона, а (!) указатель шаблона.
Почему сразу начинаем использовать шаблоны? Потому что они сокращают время настройки и уменьшают количество текста с конфигурационном файле, а для понимания они очень просты.
type=friend
Доступные параметры: «peer», «user» и «friend». Очень часто встречается ошибочное мнение относительно того, чем они отличаются. Многие считают, что параметр «user» разрешает только исходящие, «peer» — только входящие звонки, а «friend» разрешает звонки в обе стороны. Это не так. Использование ключа «peer» отключает проверку соответствия имени пользователя и пароля при звонке. При использовании параметра «peer», Астериском проверяется только соответствие IP-адреса и номера порта источника вызова, при использовании «user» — проверяется поле username, а проверка адреса источника не производится. Параметр «friend» заставляет проверять поле username и IP-адрес источника.
insecure=invite,port
invite — отключается аутентификация при входящем звонке.
port — отключается проверка порта источника.
При первоначальной настройке пропишите оба ключа.
context=office
Контекст, в котором будут обрабатывается исходящие звонки от этого устройства. Подробности чуть ниже.
fromdomain=<имя домена или IP>
Имя SIP-домена. Для первоначальной настройки укажите IP адрес сервера с Астериском.
host=dynamic
IP-адрес пира. В случае использования авторизации по логину и паролю — ставьте dynamic. Конкретный IP указывается только в том случае, если настройки пира используются для транка без регистрации.
disallow=all
allow=alaw
Указываем разрешенные кодеки.
В нашем примере первая строка запрещает использование всех кодеков, а вторая — разрешает g711-a. Настройки кодеков индивидуальны для каждого случая, однако, большинство Российских и Украинских провайдеров используют g711a и g729. Последний — пропиетарный, и Астериском поддерживается лишь в Passthrough-режиме (то есть, невозможен транскодинг).
qualify=yes
Эта строка заставляет Астериск опрашивать устройство или софтфон пакетами OPTIONS. Необходим для мониторинга и траблшутинга.
canreinvite=no
Запрещает пересылать медиа напрямую между устройствами. Рекомендую ставить «no», для упрощения настройки.
nat=no
Говорим Астериску, что пир не за натом. Описание ключей и вариантов их использования, если сервер за ним, выходит за рамки статьи. Про варианты обхода расскажу в следующей статье.
[100](internal)
secret=XXX
[101](internal)
secret=XXX
Тут мы задаем имя пира и берем настройки из шаблона. Единственные уникальные параметры в нашем примере — имя пира и пароль.
На этом мы закончили настраивать внутренних пиров, перейдем к настройке стыка с операторами. Добавим 2 записи в конец sip.conf:
[operator1] fromdomain=<имя домена или IP> host=1.2.3.4 insecure=invite,port port=5060 qualify=yes type=friend username=YourLogin secret=YourPass disallow=all allow=alaw context=operator1
Не буду расписывать значения каждой строки, т.к. все настройки идентичны настройкам внутренних пиров, за исключением поля host. В том случае, если Астериск выступает в роли клиента (а для сервера оператора наш астериск является клиентом), нам нужно указать адрес сервера оператора или его dns-имя.
Добавим второго оператора:
[operator2] fromdomain=<имя домена или IP> host=5.6.7.8 insecure=invite,port port=5060 qualify=yes type=friend disallow=all allow=alaw. context=operator2
Отличий тоже никаких, за исключением отсутствия строк username и secret, так как, напомню, второй оператор не использует регистрацию.
Осталось настроить регистрацию на сервере оператора №1. Для этого в файле sip.conf, перед секцией описывающей настройки оператора вставим следующую строку:
register => udp://YourLogin:YourPass:[email protected]/YourLogin
Синтаксис, для неподготовленного человека, выглядит сложным, поэтому не заморачивайтесь и просто позвоните в саппорт провайдера и узнайте у них о том, как регистрироваться на сервере Астериском, либо попросите выслать настройки. Как правило, большинство операторов без проблем высылают пример конфигурации под свои софт-свитчи.
Наверняка вы редактировали файлы конфигурации под пользователем с ограниченными правами. Если это так, то Астериск не сможет получить доступ к файлу конфигурации, поэтому пишем:
chown asterisk:asterisk /etc/asterisk/sip.conf
На этом настройка пиров закончена, ее достаточно для работы в минимальной конфигурации, сохраняем и закрываем файл и возвращаемся в шелл Астериска командой:
asterisk -rv
В шелле Астериска пишем команду:
sip reload
Теперь вы можете зарегистрировать на своем Астериске пользователей с логинами 100 и 101. Проверяется состояние регистрации следующей командой:
sip show peers
Если вы все настроили правильно, то увидите примерно вот такой вывод:
asterisk*CLI> sip show peers Name/username Host Dyn Forcerport Comedia ACL Port Status Description 100/100 10.0.0.52 D Yes Yes 59080 OK (1 ms) 101/101 10.0.0.57 D Yes Yes 49973 OK (1 ms) operator1 1.2.3.4 No No 5060 OK (22 ms) operator2 5.6.7.8 No No 5060 OK (22 ms)
Если вы это видите, то, поздравляю, ваши устройства или софтфоны успешно зарегистрировались и Астериск увидел сервера операторов.
Состояние регистрации проверяется командой:
sip show registry
Если регистрация прошла успешно, то вы должны увидеть вот такой вывод:
asterisk*CLI> sip show registry Host dnsmgr Username Refresh State Reg.Time 1.2.3.4:5060 N YourLogin 120 Registered 1 SIP registrations.
На этом настройка пиров закончена, перейдем к настройке диалплана. Диалплан — это сердце Астериска, с помощью него обрабатываются абсолютно все звонки. Астериск понимает несколько языков, но в нашем примере мы будем использовать стандартный, появившийся в самых первых релизах Астериска. Файл конфигурации хранится в файле /etc/asterisk/extensions.conf.
Откроем его командой:
nano /etc/asterisk/extensions.conf
В стандартных файлах конфигурации хранится много дефолтных правил. Они нам не нужны, поэтому очистим содержимое и пропишем следующее:
[general] static=yes writeprotect=no [globals]
Это параметры необходимые для нормального чтения диалплана, поэтому менять их не следует.
Начнем с простого. Нам нужно позвонить с номера 100, на номер 101. Для этого нужно прописать правило, сразу после секции globals:
[office] exten => _1XX,1,Dial(SIP/${EXTEN})
Разберем эту строку.
[office]
— имя контекста, в котором обрабатываются звонки от пира.
exten =>
— указатель начала шага.
_1XX
— маска. На маске остановимся чуть подробнее. С помощью нее сортируются все звонки, попадающие в контекст диалплана.
Маска использует набор паттернов для сортировки звонков по caller-id:
X – любая цифра от 0-9 N – любая цифра от 2-9 [234-6] – цифры 2, 3, 4 и 6 . – любые возможные символы
Маска начинается с символа “_”, который означает что это шаблон. В случае, если вы забудете указать его, Астериск примет 1XX за вызываемый номер и передаст Dial-у паттерны вместо номера телефона, и звонок не состоится.
1
— номер действия.
Dial — это приложение. В диалплане можно использовать более 200 различных приложений, которые используются для манипуляций со звонками. Сейчас, в самом начале, мы будем использовать только одно приложение — Dial. Из названия понятно, что оно используется для совершения звонков.
(SIP/${EXTEN}) — аргументы для приложения. В нашем примере, для внутренних пиров мы используем протокол SIP, поэтому первый аргумент, который мы передаем dial-у — указывает на используемый протокол сигнализации. ${EXTEN} — текущий экстеншен, его значение берется из заголовка (из поля destination).
/ — разделитель для передаваемых аргументов.
Каждый из параметров разделяется запятыми. В нашем примере используются трехзначные номера, поэтому в маске должно быть 3 паттерна. В случае, если вы захотите использовать иную длину нумерации, то пишите в маске нужное количество паттернов. Теперь сохраняем файл, открываем шелл астериска и пишем команду:
dialplan reload
Если возникли проблемы с доступом к файлу, то пишем:
chown asterisk:asterisk /etc/asterisk/extensions.conf
И снова перезагружаем диалплан через шелл Астериска.
Теперь пробуем звонить. Если вы все правильно настроили, то пир с номером 100 дозвонится до пира с номером 101. Сейчас мы можем звонить внутри офиса, между пирами, которые работают в контексте office. Для того что бы позвонить в город, нам нужно написать правило для исходящих звонков через первого оператора. Прописываем его в контекст office, выглядит оно так:
exten => _XXXXXXX,1,Dial(SIP/${EXTEN}@operator1)
Перезагружаем диалплан и пробуем звонить в город.
Теперь нам надо принять входящий звонок. Сделаем новый контекст в диалплане, пишем в конец файла:
[operator1] exten => s,1,Dial(SIP/100&SIP/101)
Поясню что означает «s». Это стандартная маска в Астериске, под которую попадают абсолютно все вызовы. То есть, если мы используем транк с регистрацией, входящий caller-id будет «s».
Сохраняемся и перезагружаем диалплан. Теперь мы можем принять входящий звонок через оператора, предоставляющего нам городской номер.
Сейчас нам понадобилось позвонить на сотовый телефон, с федеральным номером. Допишем еще одну строку в контекст [office]:
exten => _89XXXXXXXXX,1,Dial(SIP/${EXTEN}@operator1)
Сохраняемся, перезагружаем диалплан и звоним. Все. Теперь мы можем полноценно использовать услуги оператора, предоставляющего городской номер.
Однако, тут кроется небольшая проблема, которая возникнет при звонке на сотовые телефоны других регионов. Так как номер телефона федеральный, то все звонки пойдут через первого оператора. Поэтому уместно уменьшить размер масок в диалплане. К примеру:
exten => _8909[89][2-9][1-3]XXXX,1,Dial(SIP/${EXTEN}@operator1) exten => _8901[456][2-5]1XXXX,1,Dial(SIP/${EXTEN}@operator1) exten => _XXXXXXX,1,Dial(SIP/${EXTEN}@operator1)
С такой конструкцией все звонки на телефоны с кодами из диапазонов 890982XXXXX-890999XXXXX и 8901421XXXX-8901651XXXX пойдут через первого оператора. Не совсем удобно, соглашусь с этим. В будущих статьях выложу конфигурацию диалплана для автоматического выбора оператора в зависимости от направления звонка, так как подобное опять же выходит за рамки этой статьи.
Теперь нам осталось пустить междугородние звонки через второго оператора. Добавляем строку в контекст [office]:
exten => _[78][3-689]XXXXXXXXX,1,Set(CALLERID(num)=74991234567) same => n,Dial(SIP/${EXTEN}@operator2)
Как вы заметили, тут появились новые приложения, которые обрабатывают звонки.
Set(CALLERID(num)=74991234567)
— так как мы используем транк без регистрации, то это значит что мы должны отсылать оператору caller-id. Этот номер не обязательно должен существовать. Тут мы просто представляемся провайдеру и не более. Какой номер подставлять — зависит от оператора. Некоторые предоставляют услугу подмены caller-id на номер другого оператора, для совершения исходящих вызовов по межгороду или для зоновуй связи. За подробностями обращайтесь к оператору.
same => n
— указатель, который позволяет не писать каждый раз маску и номер действия. К примеру:
exten => 78121234567,1,Answer exten => 78121234567,1,Set(CALLERID(name)=Trunk_1 exten => 78121234567,1,Dial(SIP/1000)
Можно заменить на:
exten => 78121234567,1,Answer same => n,Set(CALLERID(name)=Trunk_1 same => n,Dial(SIP/1000)
Во втором случае все гораздо проще, не так ли?
На этом все, мы настроили Астериск. Теперь мы можем звонить в город, на сотовые, по межгороду и у нас есть внутренняя связь между пирами. Получаем вот такой, вполне рабочий диалплан:
[general] static=yes writeprotect=no [globals] [office] exten => _8909[89][2-9][1-3]XXXX,1,Dial(SIP/${EXTEN}@operator1) exten => _8901[456][2-5]1XXXX,1,Dial(SIP/${EXTEN}@operator1) exten => _[78][3-689]XXXXXXXXX,1,Set(CALLERID(num)=74991234567) same => n,Dial(SIP/${EXTEN}@operator2) exten => _XXXXXXX,1,Dial(SIP/${EXTEN}@operator1) exten => _1XX,1,Dial(SIP/${EXTEN}) [operator1] exten => s,1,Dial(SIP/100&SIP/101)
Спасибо за внимание.
Автоматизация
Для автоматической подгрузки новых данных из AD в cron добавлено задание перезагрузки конфигурации asterisk:
asterisk -rx reload
При такой перезагрузке, в отличии от перезагрузки службы целиком, телефонные сеансы не обрываются.
Диспозиция:
Есть контроллер домена dc.steepler.local (10.10.8.200). Домен, соответственно — steepler.local. На сервере заведены пользователи, побиты на отделы и т.д. Что важно – у каждого пользователя в графе «телефон» прописан его номер на сервере Asterisk.
Есть установленный VoIP сервер Asterisk (10.10.8.98). Все пользователи подключены по SIP, соответственно устройства, в понимании Asterisk, у них вида SIP/XXX (где XXX – добавочный номер). На момент написания сервер был давно установлен и уже подвергнут серьезным настройкам.
Именно поэтому работа не была доведена до логического конца – закономерным финалом была бы автоматическая генерация SIP конфига оконечных устройств и плана набора. К сожалению, я побоялся, что придется серьезно переписывать существующую конфигурацию, да и в любом случае – автоматическая генерация того плана набора, который существует сейчас в нашей организации и имеет множество интерактивных меню и прочих кастомизаций, не будет интересна читателю, перед которым стоит задача, в первую очередь, связать между собой сервера. Куда двигаться дальше — будет понятно. Написанные скрипты не сложны и имеют хороший задел для дальнейшей работы.
Итак, есть Asterisk с установленным фронтендом FreePBX, что сильно усложнило задачу. Ибо FreePBX имеет обыкновение и необходимость переписывать поверх все конфигурационные файлы после внесения любых изменений в web интерфейсе. То есть, поменять конфиги из командной строки мы можем, но, как только поменяем что-то потом через веб-морду, конфиги будут затерты FreePBX’ом, как порядочным фронтендом.
Конечно, создатели оболочки не полагались на свою гениальность и оставили возможность для тонкой настройки. Возможность эта реализуется через подгрузку дополнительных контекстов с суффиксом «-custom» (чего, в итоге, оказалось достаточно), либо при помощи “override” конфигов, которые жестко фиксируют необходимые вам изменения.
Но, надо понимать, что то, что прописано в custom или override конфиге будет работать по-вашему, не взирая на веб-интерфейс FreePBX. Либо шашечки, либо ехать. То есть, что бы вы ни крутили там во фронтенде, что бы ни настраивали – если оно коснется кастомизированных настроек – работать будут настройки из файлов, а не фронтенда.
Дружим между собой active directory, сервер ip телефонии asterisk и jabber-сервер openfire.
Не буду касаться установки всего по отдельности – все неплохо описано и работает в индивидуальном порядке весьма замечательно. Напишу, как я объединял все это вместе, на что наткнулся и что у меня получилось.
Приступаем
Первое, что нам понадобится – пользователи. Создаем в домене двух пользователей. Один нам будет нужен для ldap аутентификации, другой для Kerberos. Первого я назвал openfire, второго xmpp-openfire. Дальше – сразу создаем группу для пользователей jabber (у меня она называется IM) и добавляем в нее необходимых пользователей.
Проверяем, чтобы у всех пользователей, имеющих внутренний телефон и входящих в группу IM в поле «номер телефона», стоял именно внутренний номер абонента. Второе – прописываем в DNS наш будущий jabber сервер. Нам нужна и прямая и обратная зона. На самом jabber сервере настраиваем имя хоста – прописываем в /etc/hosts:
127.0.0.1 localhost.localdomain localhost
10.10.8.226 jbrgseveren01.steepler.local jbrgseveren01
Продолжение
Если статья вызовет интерес у сообщества, то готов продолжить повествование в которые хотел бы включить следующие темы:
- Автоматическое разворачивание конфигурации телефонов DLINK DPH-150, и других аппаратов, поддерживающих autoprovision
- Использование ПО DialFox для автоматического набора номеров с авторизацией NTLM через AD. В частности, прикручивание mod_ntlm к apache2
Благодарю за уделенное внимание.
Формирование телефонных групп на базе групп ad
Основной план нумерации расписан в ручную в файле конфигурации extensions.conf. Но в нашей организации довольно часто сотрудники переходят из одного отдела в другой, из за чего пришлось бы постоянно переформировывать конфиг extensions.conf, что в совокупности с человеческим фактором приводило бы к неминуемым ошибкам.
Суть альтернативного решения такова, что в AD, в определенном OU (в скрипте $ADGroupsSearchBase) создаются группы, в ‘description’ которых пишется телефонный номер группы а в ‘members’ включаются те абоненты, на которые будет поступать звонок при наборе номера группы.
Скрипт в конфиге подключается так же:
#exec /etc/asterisk/scripts/exten.pl
Скрипт: