Телефония asterisk с нуля текстовая инструкция

Время на прочтение
10 мин

Количество просмотров 141K

На написание этой статьи меня побудило практически полное отсутствие 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:YourLogin@1.2.3.4/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)

Спасибо за внимание.

Предположим что у нас есть небольшая организация, где работает около 50 сотрудников. Все они используют Asterisk для связи внутри компании и звонков наружу. Все настройки буду проводить на свежей Asterisk 18. В своей предыдущей статье я рассмотрел процесс установки Asterisk 18 на Centos 8. Давайте рассмотрим как происходит настройка Asterisk с нуля.

Учитывая тот факт что библиотека chan_sip не актуальна, будем рассматривать настройку через PJSIP. Старую библиотеку необходимо отключить (если включена) для исключения конфликтов.

Отключение chan_sip

В файле /etc/asterisk/modules.conf необходимо найти и убрать ; перед строкой noload => chan_sip.so

nano /etc/asterisk/modules.conf
noload chan_sip

Рассмотрим структуру Asterisk с кратким описанием конфигурационных файлов требуемых для настройки транка, пользователей, диалплана.

Структура Asterisk

Настройка Asterisk происходит путем редактирования конфигурационных файлов. Располагаются они в директории /etc/asterisk/ . Перечислю основные файлы которые нам потребуются для начальной настройки.

  • pjsip.conf — файл настройки мультимедийной библиотеки PJSIP. В нем содержатся настройки регистрации, транков, пользователей
  • extensions.conf — в данном файле происходит настройка диалплана. Все параметры обработки вызова, переадресация, мелодии на удержании, настройка автосекретаря и многое другое.
  • asterisk.conf — основной конфигурационный файл, тут указаны пути к используемым папкам, параметры запуска Asterisk и т.д. Подробный разбор параметров данного файла есть тут
  • sip.conf — файл настройки устарелой библиотеки chan_sip. В работе его использовать не будем
  • cdr.conf — основные настройки ведения отчета о звонках Call Detail Record
  • rtp.conf — в данном файле определены настройки касательно протокола RTP (порты, поддержка ICE и т.д.)
  • features.conf — указываются параметры перехвата и парковки вызова, максимальное время набора и переадресации, DTMF коды абонентских функций
  • modules.conf — в данном файле содержится информация о модулях которые необходимо загружать при старте Asterisk, либо отключить их загрузку.
  • musiconhold.conf — настройка параметров конфигурации музыки на удержании
  • iax.conf — используется для настройки соединений по протоколу IAX. Данный протокол как правило используется для объединения между собой двух и более АТС
  • voicemail.conf — детальная настройка параметров голосовой почты
  • logger.conf — указаны детальные параметры журналирования работы Asterisk

Я перечислил лишь основные конфигурационные файлы Asterisk. Но их значительно больше. В повседневной жизни используется только два файла exntensions.conf и pjsip.conf

Часть функций а также повторная загрузка данных из конфигурационных файлов происходит с помощью консоли Asterisk. Зайти в консоль можно так:

Для более детального вывода данных в консоль можно использовать ключ -v (я обычно использую -vvvvvv). Чем больше букв v указано, тем детальнее будет вывод информации в консоль. Запуск в режиме повышенной детализации:

Полный список консольных команд с описанием можно прочитать в моей статье

Подключение пользователей

Добавление новых пользователей происходит в файле pjsip.conf. Конфигурационный файл pjsip.conf состоит из секций. Имена секций указываются в квадратных скобках. Название секций может быть произвольным, кроме имен ENDPOINT и AOR которые должны быть одинаковые с заголовком SIP URI.

Перечислю возможные типы секций:

  • ENDPOINT — описывает опции SIP протокола и взаимодействует с модулями AOR, AUTH и TRANSPORT. Раздел ENDPOINT обязательно должен быть связан с одной или несколькими секциями AOR. В секции ENDPOINT указываются основные параметры SIP подключения (телефон, софтфон, транк и т.п.)
  • AOR — расшифровывается как Address of Record. Данная секция указывает как связаться с ENDPOINT. Без AOR секция ENDPOINT не работает. Тут указывается продолжительность регистрации, соответствие голосовой почте, MWI, настройки переодичности SIP сообщений для мониторинга состояния устройства. Получая запрос на регистрацию от устройства первичная обработка идет в AOR. Происходит поиск соответствия SIP заголовку To
  • TRANSPORT — в данной секции описываются настройки транспортного уровня с использованием протоколов UDP, TCP, WebSockets, а также шифрование TLS/SSL. Одну транспортную секцию можно настроить для использования множеством точек ENDPOINT. Либо, если необходимо, создать уникальный транспортный уровень для конкретной точки
  • System — определяются общие системные настройки PJSIP
  • Global — настраиваются глобальные параметры. Возможность включение дебага, изменение строки User Agent, параметр поля max forwards и т.п.
  • AUTH — данная секция используется для аутентификации и содержит настройки для входящих и исходящих регистраций. С этой секцией ассоциируются ENDPOINT и REGISTRATIONS. В случае необходимости разные ENDPOINT и REGISTRATIONS могут использовать общую секцию AUTH
  • REGISTRATION — обычно используется для регистрации транка от провайдера
  • DOMAIN_ALIAS — используется для указания псевдонимов используемых доменов
  • ACL — секция ACL используется для контроля входящих SIP соединений
  • IDENTIFY — указываются IP адреса конечных точек ENDPOINT
  • CONTACT — можно указать короткий контакт вместо SIP URI

В каждой секции есть опция type содержащая назначение секции в общей конфигурации.

Создание первого пользователя

Создадим учетную запись нашего первого пользователя в Asterisk. Пользователь может подключаться с SIP телефона либо софтфона. Для удобства я заполняю конфигурационные файлы добавляя новые данные в конец файла. Также очень удобно удалить все и создать чистый файл для удобства чтения. Откроем файл pjsip.conf для редактирования

nano /etc/asterisk/pjsip.conf

В конец файла добавим информацию о новом пользователе с добавочным номером 1000. Я всегда использую четырехзначные внутренние номера для дальнейшего возможного роста количества абонентов.

[tr-udp]
type=transport
protocol=udp
bind=0.0.0.0
allow_reload=true

[1000]
type=endpoint
context=from-internal
disallow=all
allow=alaw
transport=tr-udp
auth=auth1000
aors=1000
 
[auth1000]
type=auth
auth_type=userpass
password=parol
username=1000
 
[1000]
type=aor
max_contacts=2

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

[tr-udp] — является транспортной секцией. На это указывает запись type=transport

  • protocol — тип используемого протокола клиента
  • bind — IP адрес клиента. Можно указать конкретный IP чтобы с других адресов никто не мог использовать данную запись. Если необходимо можно задать и порт.
  • allow_reload — разрешить перенастройки транспортного уровня без перезагрузки Asterisk. По умолчанию без указания данного пункта с параметром true после изменения настроек необходимо рестартовать Asterisk

[1000] — это секция ENDPOINT. Как я писал выше название секции ENDPOINT соответствует названию секции AOR.

  • type — тип секции. В данном случае ENDPOINT
  • context — контекст диалплана. Данный параметр указывает куда будут направлены звонки приходящие на данный ENDPOINT
  • disallow — указывает какие кодеки необходимо запретить. В данном случае all — все кодеки
  • allow — кодеки разрешенные для использования. Строкой выше мы запретили все кодеки, текущей строкой разрешили только alaw
  • transport — указывает какую конфигурация использовать для траспорта. В нашем случае tr-udp что мы создали выше.
  • auth — объект аутентификации относящийся к данному ENDPOINT. В нашем случае это auth1000 дальше по файлу будет его описание
  • aors — объек AOR для этого ENDPOINT

[auth1000] — секция аутентификации

  • type — тип используемой секции
  • auth_type — тип используемой аутентификации. У меня используется логин и пароль
  • password — пароль от учетной записи
  • username — логин учетной записи

[1000] — AOR секция

  • type — тип секции
  • max_contacts — максимальное количество контактов которые могут использоваться с данной AOR

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

И введем команду повторной загрузки настроек из файла pjsip.conf

pjsip reload

Теперь запустим SIP телефон и настроем учетную запись 1000 на нём. В работе я использую софтфон MicroSIP. Он мне нравится за свою компактность и возможность работы в portable режиме.

Добавление пользователя 1000
Microsip user 1000 OnLine

Как видно на изображении выше мы удачно подключились к АТС. Но что делать если нам необходимо добавить не одного, а 50 пользователей? Если писать такой конфиг по каждому пользователю, потом очень сложно будет что-то найти. Для таких случаев есть шаблоны. Разберемся как они работают.

Создание шаблона

Использование шаблонов также полезно для разделения сотрудников из разных отделов с разным уровнем доступа. Название шаблона указывается в квадратных скобках [] затем идет (!)

;===============Шаблон отдела маркетинга
 
[marketing-endpoint](!)
type=endpoint
transport=tr-udp
context=from-internal
disallow=all
allow=alaw
 
[pass-auth](!)
type=auth
auth_type=userpass
 
[two-contact-aor](!)
type=aor
max_contacts=2

В шаблоне можно указывать все те же параметры что и при обычном создании пользователя. Я привел пример простого шаблона отдела маркетинга с указанием минимального набора настроек. Однако их может быть значительно больше, например: используемые кодеки, необходимость использования NAT, контекст, разрешенную лиюо запрещенную сеть для регистрации абонентов. В общем параметров может быль сколь угодно много, и писать все их для каждого пользователя дело не благодарное. Рассмотрим далее применение шаблона для создания пользователей.

Применение шаблона

Создадим трех пользователей отдела маркетинга с применением шаблона. Для использования шаблона необходимо справа от названия секции в круглых скобках добавить название шаблона.

;===============Добавочный номер 2000
[2000](marketing-endpoint)
auth=auth2000
aors=2000

[auth2000](pass-auth)
password=2000
username=2000
 
[2000](two-contact-aor)
 
;===============Добавочный номер 2001
[2001](marketing-endpoint)
auth=auth2001
aors=2001

[auth2001](pass-auth)
password=2001
username=2001
 
[2001](two-contact-aor)

;===============Добавочный номер 2002
[2002](marketing-endpoint)
auth=auth2002
aors=2002

[auth2002](pass-auth)
password=2002
username=2002
 
[2002](two-contact-aor)

Используя шаблон мы указываем только те параметры которые хотим поменять. Все параметры не указанные нами в каждой из секций будут браться из шаблона. Можно зайти под каждый из пользователей и проверить что все получилось.

Команда для вывода пользователей зарегистрированных на сервере

pjsip show aors
pjsip show auths
pjsip show endpoints
Маршрутизация вызовов

Однако, на данном этапе мы пока не можем совершать звонки. При попытке набрать любой номер будет ошибка. Для совершения звонков нам необходимо внести изменения в файл extensions.conf — основной рабочий файл. В нем настраивается маршрутизация вызовов Asterisk. В понимании телефонии и Asterisk не исключение это называется DIALPLAN.

Структура файла extensions.conf

Файл имеет две обязательные секции general и globals. Секции также указываются в квадратных кавычках. После двух обязательных секции идут секции вашего диалплана.

Рассмотрим параметры секции [general]

  • static — когда установлено значение no или не указано pbx_config перезапишет данный файл когда extensions будет изменен. Все комментарии в этом файле будут потеряны
  • writeprotect — если параметр static имеет значение yes, а параметр writeprotect=no то можно сохранить настройки диалплана через командную строку Asterisk «dialplan save»
  • autofallthrough — в случае когда параметр имеет значение yes и параметры вашего диалплана исчерпали возможности к дальнейшему действию, звонок будет завершен. Это происходит по умолчанию. Если значение будет no или не указано Asterisk будет ожидать действия от пользователя.
  • extenpatternmatchnew — установив параметр в значение true или yes будет использоваться новый алгоритм который будет искать лучшее совпадение паттерна. Увеличение скорости обработки по новому алгоритму повышается с увеличением количества обрабатываемых добавочных номеров. По умолчанию данный параметр отключено. Включайте на свой страх и риск.
  • clearglobalvars — если задан параметр clearglobalvars, глобальные переменные будут очищены и повторно обработаны при перезагрузке диалплана или перезапуска Asterisk. Когда параметр не установлен или имеет значение no глобальные переменные будут сохраняться при перезагрузке и даже при удалении из extensions.conf или одного из включенных в него файлов, будет использоваться предыдущее значение.

Перейдем к параметрам секции [globals]

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

Глобальные переменные могут быть определены в секции [globals] либо с помощью команды SetGlobalVar в плане набора номера. Глобальная переменная отличается тем, что работает для всего файла exntensions.conf. Переменные канала используются в том диалплане в котором они определены.

В глобальных переменных удобно хранить длинные добавочные номера, время работы (при использовании автосекретаря) и другие часто используемые переменные. Пример секции [globals]

[globals]
MSK_time=08:00-19:00
MSK_week=mon-sat
RECEPTION=PJSIP/3010

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

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

[from-internal]
exten = 1000,1,Dial(PJSIP/1000)

Я написал контекст с названием from-internal далее указал что при звонке на добавочный 1000 будет происходить дозвон номера 1000 через интерфейс PJSIP. При создании пользователя Asterisk в файле pjsip.conf в разделе настройки endpoint мы указываем поле context=from-internal. Это означает что совершая вызов данный пользователь будет руководствоваться правилами указанными в контексте [from-internal] файла extensions.conf

Процесс вызова

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

Формат записи такой: exten = имя,приоритет,приложение(параметры)

Расширим наш диалплан, добавив дополнительные пункты. И не забудьте, что при изменений файла extensions.conf необходимо чтобы Asterisk перечитал его. Для этого заходим в консоль и вводим команду dialplan reload

[from-internal]
exten = 1000,1,Answer() ; Поднимаем трубку
exten = 1000,2,Playback(demo-congrats)	; Проигрываем приветственное сообщение
exten = 1000,3,Dial(PJSIP/1000)	; Звоним на номер 1000

Как вы уже заметили, комментарии можно писать сразу после ;

При звонке на 1000 мы поднимаем трубку, проигрываем приветствие и последним действием будет звонок на добавочный 1000. Можно написать и так:

[from-internal]
exten = 1000,1,Answer()
exten = 1000,n,Playback(demo-congrats)
exten = 1000,n,Dial(PJSIP/1000)

Приоритет можно заменить буквой n но первый приоритет указывать необходимо обязательно. Можно еще немного оптимизировать наш диалплан.

[from-internal]
exten = 1000,1,Answer()
 same = n,Playback(demo-congrats)
 same = n,Dial(PJSIP/1000)

Используя same вместо exten можно не писать в каждой строке добавочный 1000. Но как и в случае с n в первой строке указывать exten обязательно.

Системные добавочные номера

  • s — при поступлении вызова в контекст, без указанного добавочного номера используют номер s (от слова start)
  • i — в случае когда абонент набирает не существующий добавочный номер вызов переходит на добавочный номер i
  • t — когда абонент долго не нажимает кнопку после запуска приложения WaitExten() вызов переходит на добавочный номер t. Время ожидания по умолчанию — 10 секунд
  • h — добавочный используемый при завершении вызова, когда уже закрылся медиаканал

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

Шаблоны номеров

Для удобства добавочные номера можно сопоставлять по шаблонам. Все шаблоны в диалплане начинаются со знака нижнего подчеркивания _

  • X — цифра от 0 до 9
  • Z — любая цифра от 1 до 9
  • N — любая цифра от 2 до 9
  • . — любой символ
  • [184-7] – цифры 1,8,4,5,6,7

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

[from-internal]
exten = _XXXX,1,Dial(PJSIP/${EXTEN})

Где _XXXX — любые 4 цифры, ${EXTEN} — переменная передающая набранный добавочный номер

Вложение контекстов

Есть одна особенность, Asterisk сначала сортирует добавочные (exten) и затем ищет первое совпадение. Чтобы при совпадении шаблонов заставить Asterisk звонить по нужному будем использовать вложенные контексты.

[from-internal]
include=long
exten = _XXXX,1,Dial(PJSIP/${EXTEN})

[long]
exten => _X.,1,Dial(PJSIP/${EXTEN}@sipnet)

В контексте from-internal сначала будет обрабатываться шаблон _XXXX затем вложенный контекст include=long

Увидеть в какой последовательности Asterisk обрабатывает диалплан можно введя в консоли команду dialplan show

dialplan show

Благодаря созданному диалплану все 4-х значные номера будут идти на локальных пользователей. Остальные номера пойдут через внешнего провайдера SIPNET. И чтобы все внешние звонки действительно пошли через SIPNET давайте его настроим в pjsip.conf

Настройка внешнего провайдера

Для проверки входящей и исходящей связи я буду использовать тестовый транк с регистрацией от SIPNET. Я настрою сам транк в файле pjsip.conf и правила маршрутизации звонков в extensions.conf

Открываем файл pjsip.conf

nano /etc/asterisk/pjsip.conf

Добавляем в конец файла регистрацию транка провайдера

[sipnet]
type=registration
transport=tr-udp
outbound_auth=sipnet
server_uri=sip:sipnet.ru
client_uri=sip:0042095477@sipnet.ru
retry_interval=60
 
[sipnet]
type=auth
auth_type=userpass
password=пароль
username=0042095477
 
[sipnet]
type=aor
contact=sip:sipnet.ru:5060
 
[sipnet]
type=endpoint
transport=tr-udp
context=from-sipnet
disallow=all
allow=alaw,ulaw
outbound_auth=sipnet
aors=sipnet
from_user=0042095477
from_domain=sipnet.ru
 
[sipnet]
type=identify
endpoint=sipnet
match=sipnet.ru

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

После добавления новых данных в файл не забываем зайти в консоль asterisk и перечитать конфиги

Настроим входящую маршрутизацию

Добавляем настройки маршрутизации входящей связи при звонке снаружи на наш номер SIPNET

nano /etc/asterisk/extensions.conf

Вставим следующий текс в конец файла

[from-sipnet]
exten = s,1,Answer()
 same = n,Wait(5)
 same = n,Playback(demo-congrats)
 same = n,Dial(PJSIP/1000&PJSIP/2000)

Я создал контекст from-sipnet указанный ранее при создании ENDPOINT sipnet. При поступлении входящего вызова (s -без доб номера) поднимать трубку, ожидать 5 секунд (Wait) затем проиграть приветственное сообщение. После окончания приветствия звонить одновременно на 2 добавочных 1000 и 2000.

Приветственное сообщение записать самим в формате wav с параметрами 8кГц, 16 Бит, Моно запись скинуть в папку и указать к ней путь, например

Playback(/opt/sound/my_sound)

Можно добавить обработку входящего вызова по времени.

[from-sipnet]
exten = s,1,Answer()
 same = n,Wait(5)
 same = n,GotoIfTime(08:00-18:00|mon-fri|*|*?work:outwork)
 same = n(work),Playback(/opt/work_music)
 same = n(work),Dial(PJSIP/1000&PJSIP/2000)
 same = n(outwork),Playback(/opt/outwork_music)
 same = n,Hangup()

В зависимости от текущего времени и дня недели если вызов совершен во временной промежуток указанный в GotoifTime будет переход на метку work. Все вызовы не попадающие под временной интервал будут отправляться на метку outwork.

На данном этапе мы создали обработку внутренних вызовов, входящих и исходящих внешних (городских) вызовов. В тестовом аккаунте проверить исходящие вызовы можно позвонив по телефону техподдержки 2009991

Считаю настройку для небольшой организации достаточной. Мы разобрали как происходит настройка Asterisk с нуля.

Смотрите видео по настройке

Хотите отблагодарить автора статьи? Это даст ему дополнительный стимул к написанию новых статей.

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

Если Вас интересует профессиональное внедрение системы IP-телефонии Asterisk «под ключ», то обращайтесь к нашим специалистам по телефону 8 (495) 989-85-33 или 8 (800) 333-75-33. Доверьте свою телефонию профессионалам.

Ручная установка Asterisk

Перед началом установки рекомендуется произвести полное обновление операционной системы. Это улучшит стабильность работы и безопасность сервера.

Создаем директорию, в которую поместим исходные коды дистрибутива Asterisk.

mkdir -p /usr/src/asterisk
cd /usr/src/asterisk

Далее загружаем с официального сайта Asterisk текущие пакеты в исходных кодах. Это можно сделать простым способом. В браузере открываем сайт www.asterisk.org, переходим в раздел Download, находим ссылки на требуемые пакеты и правой кнопкой копируем адрес ссылки в буфер обмена. Далее, в консоли сервера используем команду wget и ссылку, ведущую на сайт:

wget http://downloads.asterisk.org/pub/telephony/asterisk/releases/asterisk-11.0.0.tar.gz

Аналогичным образом выкачиваем все требуемые пакеты:
1. Asterisk
2. DAHDI
3. LibPRI

Для компиляции исходников потребуется сам компилятор. Устанавливаем его следующей командой (кавычки должны быть те, где на клавиатуре размещена буква «Ё»):

yum -y install make gcc gcc-c++ kernel-headers-`uname -r` kernel-devel-`uname -r` ncurses-devel newt-devel libtiff-devel libxml2-devel sqlite-devel glibc-headers

Распаковываем предварительно скачанные с официального сайта пакеты.

tar -xvf asterisk-current.tar.gz
tar -xvf dahdi-linux-complete-current.tar.gz
tar -xvf libpri-1.4-current.tar.gz

В первую очередь устанавливаем библиотеку LibPRI.

LibPRI — это OpenSource библиотека, предназначенная для работы с потоковыми TDM-интерфейсами ISDN: PRI (Primary Rate Interface)и BRI (Basic Rate Interface). Первый (PRI) часто используется в России для работы с операторами по каналам Е1.

cd /usr/src/asterisk/libpri-*
make clean
make
make install

Далее устанавливается драйвера каналов DAHDI.
Драйвера предназначены для взаимодействия Asterisk с платами цифровых интерфейсов: E1, FXO, FXS и пр.

cd /usr/src/asterisk/dahdi-linux-complete*
make all
make install
make config

Далее задаем автоматический запуск службы DAHDI при старте системы:

chkconfig dahdi on
service dahdi start

Если на данном этапе у Вас выдалось сообщение следующего характера:

You do not appear to have the sources for the 2.6.32-220.el6.i686 kernel installed.

make[1]: *** [modules] Error 1

make[1]: Leaving directory `/usr/src/asterisk/dahdi-linux-complete-2.6.1+2.6.1/linux’

make: *** [all] Error 2

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

На этом этапе устанавливаем само телефонное ядро Asterisk.

cd /usr/src/asterisk/asterisk*
. /configure

Если на этом шаге у Вас отобразится такая заставка, значит все идет по плану:

На этом этапе можно выбрать модули, которые будут входить в состав сборки. Если требуется работа с MySQL или другими компонентами, их рекомендуется установить заранее.

Система выбора модулей выглядит следующим образом (хотя, она может быть и на черно-белом фоне):

Управление:

  • Перемещение — стрелками клавиатуры
  • Выбор — пробелом
  • XXX — модуль не доступен для установки. Необходимо установить недостающие зависимости и повторить все с шага». /configure»
  • F12 — сохраняем и выходим

Далее, оканчиваем установку:

Создаем дефолтные конфиги и образцы.

Добавляем Астериск в автозагрузку

Запускаем Астериск консольно, количеством «v» в опции задавая плотность протоколирования (verbosity). Убеждаемся, что Астериск запускается нормально, после чего останавливаем его.

Запуск будет сопровождаться таким списком загружаемых модулей:

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

service asterisk start
asterisk -rvvvv

Работа с DAHDi

После инсталляции карты, проверяем ее в системе

Компилируем нужный пакет для нашей карты, Парабел, например, тут.

комментим все модули, вписываем нужный нам, например, quasarm

Указываем зоновую (региональную) принадлежность.

loadzone=ru
defaultzone=ru

Настраиваем согласование потока между АТС оператора и Asterisk.

span = 1,0,0,CCS,HDB3,CRC4 //Задается источник синхронизации, тип кодирования и необходимость проверки четности
bchan=1-15,17-31 // Задаются тайм-слоты для голоса
dchan=16 //Задаются сигнальные тайм-слоты для данных (0-й — по умолчанию)
echocanceller=mg2,1-15,17-31 // Указывается тип эхоподавителя и тайм-слоты, на которых он будет задействован.

Теперь чуть более подробно по опциям.

span = <span_num>,<timing>,<LBO>,< framing>,<coding>[,crc4]
где
span_num – номер порта E1 (от 1 до максимального номера порта в плате)
timing – использовать ли порт как источник синхронизации
0 – порт адаптера ведущий по E1
1 и более – порт ведомый по E1 и является одним из источников синхронизации адаптера. Чем больше число, тем меньше приоритет порта.
LBO – параметр не используется, ставить 0.
Framing – тип телефонной сигнализации, ставить ccs или cas.
Coding – кодирование в линии, может принимать значения ami или hdb3
Crc4 – разрешить проверку и генерацию crc4 (не обязательный параметр)

Делаем рестарт dahdi

service dahdi stop
service dahdi status

Если не выгрузился, необходимо сначала остановить Asterisk:

после

запускаем DAHDI:

Проверка:

dahdi_test
dahdi_test
Opened pseudo dahdi interface, measuring accuracy…
99.999% 99.995% 99.999% 99.999% 99.999% 99.999% 99.999%
--- Results after 7 passes ---
Best: 99.999 — Worst: 99.995 — Average: 99.998506, Difference: 99.998507

Значения не ниже 99,9 — хороший результат. Он означает, что DAHDI-устройство не вынуждено конкурировать с другими процессами за прерывания и время процессора. Значения ниже 99.9 будут приводить к ухудшению качества звука, срыву синхронизации канала E1, скрежету и обрывам голоса.

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

cat /proc/interrupts
[pbx.localdomain ~]# cat /proc/interrupts
CPU0    CPU1
0:    1326273128   0              IO-APIC-edge timer
1:    8959         0              IO-APIC-edge i8042
4:    2796129      0              IO-APIC-edge serial
6:    6            0              IO-APIC-edge floppy
7:    2            0              IO-APIC-edge parport0
8:    1            0              IO-APIC-edge rtc
9:    1            0              IO-APIC-level acpi
14:   50338541     0              IO-APIC-edge ide0
50:   0            0              IO-APIC-level uhci_hcd:usb3
58:   7369         23441503       PCI-MSI ahci
114:  1326250778   0              IO-APIC-level wctdm
146:  28024883     0              PCI-MSI eth0
169:  0            0              IO-APIC-level uhci_hcd:usb5
225:  0            0              IO-APIC-level uhci_hcd:usb4
233:  0            0              IO-APIC-level ehci_hcd:usb1, uhci_hcd:usb2
NMI:  0            0
LOC:  1325416311   1325416314
ERR:  0
MIS:  0

wctdm занимает отдельный irq, это правильно
если с кем-то делит, то это может сказывать на работе карты и качестве голоса.

Чаще всего наблюдается ситуация, когда драйвера USB и DAHDI занимают одно прерывание. Это нежелательная ситуация, и в ней лучше всего либо разнести драйвера по разным прерываниям, либо отключить USB на уровне BIOS.

Тут можно увидеть ошибки в работе карты:

показывать сведения о карте

показывает конфигурационный файл, который используется

затем в /etc/asterisk/chan_dahdi.conf
примерный конфиг:

[trunkgroups]

[channels]

language=ru
context=from-trunk
signalling=pri_cpe
rxwink=300             ; Atlas seems to use long (250ms) winks
;
; Whether or not to do distinctive ring detection on FXO lines
;
;usedistinctiveringdetection=yes
usecallerid=yes
hidecallerid=no
callwaiting=yes
usecallingpres=yes
callwaitingcallerid=yes
threewaycalling=yes
transfer=yes
cancallforward=yes
callreturn=yes
echocancel=yes
echocancelwhenbridged=yes
echotraining=800
rxgain=0.0
txgain=0.0
group=0
callgroup=1
pickupgroup=1
immediate=no
;busydetect=yes
;busycount=5
faxdetect=no
  
switchtype=euroisdn ; or qsig
immediate=no
context=from-trunk
resetinterval=100000000
signalling=pri_cpe ; or pri_net
group=0
channel ≥1-15,17-31

В Астериск CLI

dahdi restart
dahdi show channels — проверяем что каналы поднялись
dahdi show channel 1

Установка Asterisk из YUM

Помимо компиляции Asterisk вручную, можно воспользоваться менеджером пакетов YUM, который является штатной утилитой RedHat-based дистрибутивов.

Установку Asterisk мы будем производить из самых «аутентичных» источников — репозитория Asterisk.Org.

Краткая инструкция по работе с данным репозиторием находится здесь

Вам требуется создать новый файл с названием «centos-asterisk.repo» в директории the» /etc/yum.repos.d». В него вы вносите следующую конфигурацию:

[asterisk-tested]
name=CentOS-$releasever — Asterisk — Tested
baseurl=http://packages.asterisk.org/centos/$releasever/tested/$basearch/
enabled=0
gpgcheck=0
#gpgkey=http://packages.asterisk.org/RPM-GPG-KEY-Digium

[asterisk-current]
name=CentOS-$releasever — Asterisk — Current
baseurl=http://packages.asterisk.org/centos/$releasever/current/$basearch/
enabled=1
gpgcheck=0
#gpgkey=http://packages.asterisk.org/RPM-GPG-KEY-Digium

Сохраняете данный файл и создаете новый: «centos-digium.repo». Вносите в него следующий текст:

[digium-tested]
name=CentOS-$releasever — Digium — Tested
baseurl=http://packages.digium.com/centos/$releasever/tested/$basearch/
enabled=0
gpgcheck=0
#gpgkey=http://packages.digium.com/RPM-GPG-KEY-Digium

[digium-current]
name=CentOS-$releasever — Digium — Current
baseurl=http://packages.digium.com/centos/$releasever/current/$basearch/
enabled=1
gpgcheck=0
#gpgkey=http://packages.digium.com/RPM-GPG-KEY-Digium

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

yum install asterisk18 asterisk18-configs asterisk18-voicemail dahdi-linux dahdi-tools

Запускаем Asterisk и подключаемся к нему:

service asterisk start
asterisk -rvvv

Астериск — конфигурационные файлы

Главный конфигурационный файл:

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

Файлы конфигурации каналов Asterisk:

 iax.conf: Файл с конфигурацией канала IAX2
sip.conf: Файл с конфигурацией канала SIP
chan_dahdi.conf: Файл с конфигурацией каналов DAHDi

Файлы конфигурации Диалплана (Плана набора):

extensions.conf: Конфигурация плана набора
extensions.ael: План набора в новом формате AEL (Asterisk Extensions Language)
features.conf: Конфигурация Парковки вызовов, перевода вызова, перехвата и прочих сервисных функций Asterisk.

Файлы конфигурации специфичные для некоторых команд плана набора:

alarmreceiver.conf: Конфигурация для команды AlarmReceiver
dundi.conf: Конфигурация, используемая командой DUNDiLookup
festival.conf: Конфигурация, используемая командой Festival
indications.conf: Определение тонов для команды Playtones
meetme.conf: Файл с конфигурацией конференций для команды MeetMe
musiconhold.conf: для команды MusicOnHold
queues.conf: Определение очередей звонков и их параметров для команды Queue
voicemail.conf: Конфигурация голосовых почтовых ящиков для команды VoiceMail

Конфигурационные файлы не попадающие в какую-либо категорию:

amd.conf: (Появился, начиная с версии 1.4.0) Параметры приложения для определения автоответчиков.
alsa.conf
cdr_odbc.conf
cdr_pgsql.conf
codecs.conf
features.conf: Конфигурация парковки вызовов и других возможностей
followme.conf: (Появился, начиная с версии 1.4.0) Параметры для трансфера вызовов системы findme/followme.
func_odbc.conf: (Появился, начиная с версии 1.4.0) В этом файле определяются параметры доступа к sql базам данных.
http.conf: (Появился, начиная с версии 1.4.0) Конфигурация встроенного мини http сервера в asterisk.
logger.conf: Настройка логирования в Астериск
manager.conf: Конфигурация для Asterisk manager API
modules.conf: Конфигурация загрузки модулей Asterisk
odbc.conf: Конфигурация UnixODBC? драйверов для Asterisk
 res_snmp.conf: (Появился, начиная с версии 1.4.0) Включение поддержки snmp в asterisk и определение статусов агентов full/sub.
 rtp.conf: Конфигурация протокола передачи media информации RTP, порты и настройки
say.conf: (Появился, начиная с версии 1.4.0) Определения правил произношения цифр, дат и т.д. Для различных языков.
sla.conf: (Появился, начиная с версии 1.4.0) Конфигурация Shared Line Appearance.
smdi.conf: (Появился, начиная с версии 1.4.0) Конфигурация обмена сообщениями SMDI.
udptl.conf: Появился, начиная с версии 1.4.0) конфигурация для транспорта T38 udptl.

Основная фишка во всех файлах конфигурации

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

Установка кодека g729  (и g723)

Кодек G729 обременен патентными ограничениями, что не дает возможность команде разработчиков Asterisk включить его в стандартную сборку Asterisk. Тем не менее, данный кодек является самым популярным кодеком на низкоскоростных каналах связи. Поэтому нам необходимо установить его самостоятельно.

cli> core show translation

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

cli>!cd /usr/lib/asterisk/modules/

»!» в CLI означает, что команду нужно выполнить в консоли LINUX
на сайте http://asterisk.hosting.lv/ выбираем версию нашего астериск, платформу (i386 или x86_64) и тип использованного компилятора (IPP или GCC4).

Например, для Сentos 32 бита, на платформе intel, подойдет:

cli>!wget http://asterisk.hosting.lv/bin/codec_g729-ast18-gcc4-glibc-pentium4.so

затем загружаем модуль в астериск

 cli>module load codec_g729-ast18-gcc4-glibc-pentium4.so

проверяем

cli> core show translation

если мы ошиблись в выборе нужного кодека, скорее всего астериск «упадет»

Запускаем астериск и видим на каком этапе он вываливается

asterisk -vvvvvvvvvvvvvvvvvvvc</span>

Удаляем модуль и перезапускаем астериск.

Без удаления можно обойтись так: в файле modules.conf добавить строчку

noload ≥ codec_g729-ast18-gcc4-glibc-pentium4.so</span>

это значит, что при старте этот модуль автоматически загружаться не будет

После нормальной загрузки кодека, выполните команду core show translations для того чтобы убедиться в корректности установки кодека.

Подключение SIP клиента

Теперь необходимо настроить со стороны Asterisk-а SIP-аккаунт для внутреннего абонента.

Структура sip.conf:

[general]
;глобальные значения переменных канала SIP
disallow=all
allow=gsm
allow=ulaw
allow=alaw
context=default
;……
register ≥ user:[email protected]/callerid

Создаем номер для абонента, указывая для него опции подключения.

[100]
deny=0.0.0.0/0.0.0.0     //указание сетей, из которых запрещено подключение
permit=0.0.0.0/0.0.0.0   //указание сетей, из которых разрешено подключение
type=friend              //указываем тип абонента.
secret=asdff34tgg        //задаем пароль на подключение
qualify=yes              // Активируем KeepAlive
port=5060                // Задаем порт, на котором будет работать абонентское устройство (используется, если не работает функция регистрации абонентского устройства)
pickupgroup=1            // Задаем принадлежность к группе перехвата
nat=yes                  // Указываем, будет ли устройство находиться за NAT-ом по отношению к серверу Asterisk
[email protected]       // Указываем номер и контекст ящика голосовой почты
host=dynamic             // Задаем IP абонетского устройства или сообщаем с опцией dynamic, что для местоопределения будет использоваться механизм регистрации
dtmfmode=rfc2833         // Тип передачи DTMF-сигналов
disallow=all             // Сначала запрещаем все кодеки
allow=ulaw               // Тут указываем допустимые кодеки, перечисляя их построчно сверху вниз в порядке приоритета
allow=gy29
dial=SIP/100             // Задаем команду Dial, которая будет использоваться для вызова данного абонента
context=from-internal    // Указываем принадлежность абонента определенному контексту.
canreinvite=no           // Указываем возможность использования механизма CanReinvite. Не рекомендуется для устройств, которые могут быть отделены от сервера NAT-ом
callgroup=1              // Указываем группу набора
callerid=Alexey <100>    // Задаем CallerID — имя и номер, которые будут высвечиваться у других абонентов, а также в CDR.
call-limit=2             // Задаем максимальное количество линий, которые одновременно могут использоваться абонентом. Рекомендуется задавать не более 2-3-х одновременных линий.

сохраняем и делаем в cli

проверяем

sip show peers
100/100                     (Unspecified)     D  N  A 5060    UNKNOWN
1 sip peers [Monitored: 1 online, 0 offline Unmonitored: 0 online, 0 offline]

Теперь настраиваем софтфон или SIP телефон. Простая и понятная инструкция по настройке софтфона X-Lite для Asterisk находится здесь. Указываем реквизиты из sip.conf
user
pass
ip-proxy — IP нашего Астериск
Когда телефон подключится, мы должны увидеть

sip show peers
100/100                     192.168.0.10    D  N  A 5060    OK (111 ms)
1 sip peers [Monitored: 1 online, 0 offline Unmonitored: 0 online, 0 offline]

Настройки для конкретного SIP peer

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

Полезные команды CLI Asterisk

sip show peers
sip show peer 100
sip show settings
sip reload
sip set debug on
rtp set debug on
core show translation
dahdi show channels
core show application Dial
core show application CALLERID
core reload
dialplan reload
dialplan show context
dialplan show [email protected]

Простой диалплан. Файл extensions.conf

Файл Extensions.conf описывает логику работы Asterisk, а именно, обработку входящих вызовов, маршрутизацию исходящих вызовов, обработку звонков и событий по разнообразным правилам. В Asterisk это называется ДиалПланом (DialPlan). Как говорят разработчики, диалплан — это сердце Asterisk.

За работу диалплана отвечает файл extensions.conf. Файл поделен на контексты, в каждом из которых прописана логика работы. Логика работы формируется с помощью приложений. Приложения — это функции Asterisk, запускаемые с параметрами. Последовательность выполнения приложений — построчная.

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

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

  • звонка на внутренний номер 999, который выполняет какую-либо функцию
  • звонка другому внутреннему абоненту, номер которого начинается с цифры «1» и состоящий из трех цифр
  • звонок на внешние телефонные линии через SIP-оператора
[from-internal]
;тестовый звонок на номер 999, с возможность донабрать 2,3,5
exten ≥ 999,1,Answer ()
exten ≥ 999,n,Background (hello-world)
exten ≥ 999,n,Hangup ()
exten ≥ 2,1,Playback (digits/2)
exten ≥ 3,1,Playback (digits/3)
exten ≥ 5,1,Playback (digits/5)
;звонок на внутреннего абонента 1XX подключенного по технологии SIP
exten ≥ _1XX,1,Dial (SIP/${EXTEN},60)
;звонок на московский номер через транк провайдера, который подключен к Asterisk по технологии SIP
exten ≥ _495ZXXXXXX,1,Dial (SIP/provider/8${EXTEN},60)

Предисловие

Существенный прогресс в развитии современных цифровых систем связи с пакетной передачей данных позволяет организовать поверх широкополосного соединения не только доступ к сети Интернет, но и организовать ранее раздельных технологии как одну из услуг связи [1].

Одной из таких услуг, рассматриваемых в рамках работы, является технология VoIP (англ. Voice over IP или IP-телефония) – телефонная связь (передача голоса) по существующим сетям передачи данных, использующим протокол IP. Использование этой технологии предполагает передачу сигнала по каналу связи в цифровом виде с ее предварительным преобразованием, а именно, сжатием для удаления избыточности.

Таким образом, технология IP-телефонии позволяет использовать любую существующую сеть с пакетной коммутацией и поддержкой протокола передачи данных IP в качестве средства организации локальной, или местной, междугородней или международной телефонной связи в режиме реального времени. При этом для передачи данных в последних двух случаях можно применить термин Интернет-телефонии, описывающий частный случай IP-телефонии, когда в роли основного канала передачи телефонного трафика используется широкополосное соединение с глобальной сетью Интернет [2-3].

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

Настоящее учебно-методическое пособие содержит четыре раздела. Первый раздел учебно-методического пособия посвящен начальной конфигурации операционной системы семейства Linux в качестве основы программной АТС. В силу значимых различий с привычными ОС Windows, приведено подробное описание дейсвий, необходимых для корректного запуска ОС CentOS 8 в качестве виртуальной машины, описаны основы работы с консольным текстовым редактором Vi, удаленного подключения к виртуальной машине с использованием протокола SSH, работа с репозиториями CentOS.

Второй раздел охватывает тему поэтапной компиляции программного кода АТС Asterisk. После рассматриваются базовая конфигурация программной АТС, планов обработки вызовов и списков абонентов, протоколов SIP и RTP. Также в разделе приведены методические указания по подключению абонентов к Asterisk, проверки установления соединения.

Третий раздел посвящен конфигурации соединения между двумя и более программными АТС, переносу конфигурации в СУБД. При этом рассмотрены как принципы работы с консольной версией базы данных, так и с использованием стороннего программного обеспечения, предоставляющего возможность взаимодействия с базой данных в графическом режиме. Приведены принципы работы и конфигурации транкового соединения IAX.

Четверный раздел описывает базовые принципы конфигурации защищенного соединения в программных АТС, а именно метод защиты загрузчика ОС Linux, продвинутой конфигурации протокола удаленного доступа SSH, создание и использование ключей шифрования для доступа к программной АТС и подключения абонентов.


Раздел 1. Начальная конфигурация операционной системы CentOS

1.1. Теоретические сведения

Как отмечалось ранее, IP-телефония является технологией, использующей существующую сетевую инфраструктуру с пакетной коммутацией сообщений и для передачи голосовой информации в реальном времени. Основой этой технологии принято считать концепцию передачи голоса по компьютерной сети связи, разработанную Чарли Кляйном в 1993 года в совокупности с программным обеспечением, позволявшим совершить вызов между двумя персональными компьютерами, находившимися в одной локальной сети.

Современное представление об IP-телефонии различается с первыми наработками в этой области, изменения затронули как аппаратную, так и программную составляющии технологии. Так, схема подключения абонентов к телефонной сети общего пользования должна иметь ряд необходимого для совершения звонка оборудования: АТС на стороне телефонного провайдера и телефонного аппарата на стороне абонента, соединенных между собой сетью PSTN (Public Switched Telephone Network – телефонная сеть общего пользования). PSTN, в свою очередь, может быть организована как на базе классической аналоговой медной линии, так и с применением технологий Ethernet, оптоволоконного соединения, ISDN и др.

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

При этом сама реализация IP-телефона может быть как программно-аппаратной, когда производитель выпускает устройство в «классическом» корпусе, так и исключительно программной. Как правило, исключительно программные продукты могут иметь свой собственный, частично или полностью отличающийся от классического, стек протоколов. Большинство из них недоступны для изучения, но существуют и полностью открытые протоколы и технологии, на базе которых возможно реализовать системы IP-телефонии.


1.2 Передача голоса по IP-сети

VoIP (Voice over IP – передача голоса по IP-сети) предполагает использование специализированных протоколов поверх существующего стека TCP/IP, но в теоретическом плане возможно рассмотреть взаимодействие протоколов и с уровнями открытой модели взаимодействия OSI. Так, если не установлены дополнительные ограничения, передача голоса начинается на прикладном уровне модели OSI, в этот момент программное обеспечение формирует данные для отправки. Стоит отметить, что в IP-телефонии возможна передача голоса исключительно в оцифрованном виде, это требование накладывается самой сетью с пакетной коммутацией.

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

1.3 Основные речевые кодеки систем IP-телефонии

Наиболее известными кодеками VoIP систем являются G.711 [ITU-T. G.711 : Pulse code modulation (PCM) of voice frequencies] и G.729 [ITU-T. G.729 : Coding of speech at 8 kbit/s using conjugate-structure algebraic-code-excited linear prediction (CS-ACELP)], описанные в рекомендациях института ITU-T. Первый из них впервые был представлен в 1972 году и представляет собой стандарт для 8-битного сжатия предварительно оцифрованной речевой информации с использованием частоты дискретизации равной 8 кГц, что соответствует 8000 выборок в секунду. Рассматриваемый кодек формирует поток данных со скоростью 64 Кбит/с, значение получено путем умножение размерности передаваемого слова на количество выборок в секунду. Несмотря на простоту исполнения, и, фактически отсутствие сжатие данных как такового, стандарт достаточно популярен в IP-телефонии и имеет две версии: A-law и U-law.

Версия A-law, или A-закон, представляет собой алгоритм компрессии данных с потерей информации и описывается следующей формулой:

picture
где x – исходные данные, A – параметр сжатия, типичное значение которого составляет 87,7. Такой тип кодека используется на территориях Европейских стран, а также России и стран СНГ.


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

picture

где u = 255. U-law тип кодека используется в основном на территории Японии и Северной Америки.

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

К достоинствам же можно отнести низкую вычислительную сложность, а значит – минимальную нагрузку на микропроцессор телефона. Также стоит отметить возможность свободного доступа к исходным данным стандарта, ввиду того что срок действия его патента уже истек.
G.729 также является широко используемым речевым кодеком, применяемым для цифрового представления телефонной речи с частотой дискретизации 8 кГц. Основное отличие этого кодека заключается в использовании принципа передачи не самого оцифрованного речевого сигнала, а его параметров, включая спектральную характеристику сигнала, количество переходов через ноль, при этом передаваемые данные должны иметь возможность последующего синтезирования исходного сигнала на приемной стороне.

В сравнении с ранее рассмотренным G.711, G,729 имеет повышенную задержку передачи, выраженную в обработке исходного сигнала частями, а именно выборками по 10 мс. Общая же задержка обработки составляет 15 мс, поскольку 5 мс необходимо для предварительного заполнения временного буфера для корректной работы алгоритма. Для сравнения, аналогичный параметр у G.711 равен 0,75 мс.
Безусловно, достоинством этого кодека является требуемая полоса пропускания, а именно, 8 кбит/с, что в 8 раз меньше чем у G.711, но также присутствуют и недостатки: худшее качество связи, высокая зажержка и повышенные требования к вычислительным ресурсам микропроцессора устройства. Несмотря на указанные недостатки, кодек G.729 весьма распространен и поддерживается большинством программных и аппаратных платформ, на данный момент является открытым, поскольку срок действия его патентных лицензия считается истекшим и имеет несколько модификаций, наиболее известными из которых являются Annex A и Annex B.

В первой модификации снижены требования к вычислительным ресурсам, ввиду использования вычислений с фиксированной точкой вместо плавающей, что приводит к незначительному ухудшению качества связи, но значительному в ресурсоемкости алгоритма. Во второй модификации применяется дополнительный модуль VAD (Voice Activity Detection – детектор голосовой активности), за счет использования которого определяются паузы в исходном речевом сигнале и заменяются шумовым сигналом, тем самым битовый поток во время пауз снижается и позволяет передавать исключительно полезный сигнал. При этом передача шума во время пауз не является технической необходимостью, ее функция заключена в устранении дискомфорта у абонента при воспроизведении абсолютной тишины.

Существует несколько подходов к классификации кодеков по используемым параметрам, например, по применяемой математической базе, типу принимаемой информации, вычислительной нагрузки на микропроцессор устройства, обеспечиваемому качеству связи.
С точки зрения телекоммуникаций, наиболее значимым является последний тип классификаций. Так, условно, все кодеки можно разделить на два класса: широкополосные и узкополосные.
Приведенные ранее кодеки G.711 и G.729, включая его ревизии G.729A и G.729B, являются узкополосными. В общем плане принадлежность определенного кодека к классу можно описать используемой частотой дискретизации, как итог, необходимой пропускной способностью для передачи данных после компрессии. К узкополосным кодекам относятся решения с частотой дискретизации менее 16 кГц, а к широкополосным наоборот, типовые значения этого параметра у них от 16 до 32 кГц.

Иногда в литературе можно встретить другое название технологии передачи голоса по IP сети с использованием широкополосного речевого кодека – HDVoIP (High Definition VoIP или VoIP высокого разрешения). При этом основная цель использования таких кодеков это повышение четкости принимаемого речевого сообщения в совокупности с уменьшением суммарной задержки на передачу сигнала. Для конечного пользователя эта разница должна быть заметна также, как при переходе с аналогового телевидения к цифровому повышенного разрешения.

К распространенным широкополосным кодекам можно отнести G.722, Speex и Opus. G.722 [ITU-T. G.722 : 7 kHz audio-coding within 64 kbit/s ] является одним из первых широкополсных кодеков и был разработан в 1989 году, как и ранее рассмотренные аналоги имеет принадлежность к стандарту ITU-T и работает со скоростями передачи 48, 56 и 64 кбит/с. В настоящий момент кодек является устаревшим и на его замену разработаны несколько ревизий: G.722.1, G.722.1 Annex C, G.722.2.


Основным отличием G.722 является применение адаптивной дифференциальной импульсно-кодовой модуляции в алгоритме, позволяющей динамически изменять параметр шага квантования при оцифровке речевого сигнала, что в итоге позволяет снизить требуемую полосу пропускания для передачи данных при заданном отношении сигнал – шум, то есть фактически при фиксированном качестве связи. Несмотря на возможность выбора скорости передачи данных, на практике используется лишь значение 64 кбит/с.

G.722.1 [ITU-T. G.722.1 : Low-complexity coding at 24 and 32 kbit/s for hands-free operation in systems with low frame loss] является более новой версией предыдущего кодека, датируемой 1999 годом. Несмотря на использование более низкой скорости передачи данных, а именно 24 и 32 кбит/с при аналогичной полосе пропускания от 50 Гц до 7 кГц, новая версия кодека позволяет передавать сигнал, по качеству воспроизведения более близкий к радио, чем к телефонии. Указанное свойство достигается за счет использования запатентованной технологии сжатия сигнала “Siren”, разработанной компанией Polycom. Аналогично предыдущему, кодек G.722.1 Annex C также использует схожий алгоритм сжатия, но новой версии под названием “Siren 14”, что позволяет еще больше повысить качество сигнала и приблизить его к качеству воспроизведения CD дисков при использовании скорости передачи данных 24, 32 и 48 кбит/с в совокупности с сверх-широкополосным речевым сигналом в 14 кГц.
G.722.2 [ITU-T. G.722.2 : Wideband coding of speech at around 16 kbit/s using Adaptive Multi-Rate Wideband (AMR-WB)] является наиболее свежим вариантом кодека, разработанным в 2002 году и позволяющим проводить быстрое изменение скорости сжатия исходного речевого сигнала в зависимости от доступной пропускной способности сети передачи данных, при этом в стандарте определяется 9 уровеней, фактически соответствующим скорости передачи от 6,6 до 23,85 кбит/с.

При этом первые три уровня, а именно 6,6 кбит/с, 8,85 кбит/с и 12,65 кбит/с, также используются в GSM и UMTS соединениях, где первые два применяются в случае недостаточного радиосоединения, а третий используется в качестве основного. При этом второй и третий уровни предоставляют возможность передачи широкополосного речевого сигнала с качеством, аналогичным для скоростей передачи 48 и 56 кбит/с в G.722.
Более высокие скорости передачи данных используются как для передачи речевого сигнала между двумя абонентами, так и для организации конференций с множеством участников, при использовании скорости передачи данных равной 23,85 кбит/с, предоставляется качество связи, аналогичное G.722 с использованием 64 кбит/c.
Speex представляет собой свободный кодек с компрессией речевого сигнала, относящийся к классу линейного предсказательного кодирования или CELP (Code Excited Linear Prediction). Указанный тип кодирования используется для аппроксимации части исходного речевого сигнала с применением цифрового фильтра авторегрессионного типа. При этом коэффициенты фильтра подстраиваются под выбранный отрезок сигнала, таким образом, кодек предусматривает наличие кодовой книги с предопределенным набором единичных импульсов.

При использовании Speex, речевой сигнал разбивается на отрезки длительностью 20 мс или 160 отсчетов при частоте дискретизации 8 кГц, но для оценки возбуждающего набора фильтра указанный отрезок дополнительно разбивается на 4 неперекрывающихся подотрезка, на каждом из которых отыскивыются требуемые наборы импульсов из кодовой книги. При этом Speex не использует алгебраические методы кодирования, ограничиваясь исключитально векторными, для избегания патентных ограничений.
Сам кодек оптимизирован для получения высококачественного речевого сигнала при низких скоростях и может быть использован с переменной степенью компрессии исходного сигнала, а также с сигналами различной полосы, а именно 8, 16 и 32 кГц.

Отметим, что после преобразований сигнала с применением указанного кодека, выходные данные могут быть сохранены для дальнейшего использования в формате .ogg, а также переданы другому абоненту с применением стека TCP/IP и протокола RTP. При этом кодек устойчив к потере пакетов, но не их искажениям, и может работать как поверх UDP, так и поверх TCP соединений.

Последним из указанных кодеков является Opus, являющийся решением компрессии речевого сигнала с потерями, разработанным сообществом IETF (Internet Engineering Task Force) в 2012 году специально для применения в системах передачи голоса по IP-сетям в режиме реального времени и описан в стандарте RFC 6716. Сам кодек распространяется с открытой лицензией BSD, а все патентные документы доступны под лицензией royalty-free.
Основным преимуществом рассматриваемого кодека является низкая задержка кодирования, имеющая значение от 2,5 до 60 мс в зависимости от конкретной конфигурации и поддержка многоканального аудио с использованием до 255 отдельных каналов.

Доступные параметры включают в себя изменяемую частоту дискретизации в диапазоне от 8 до 48 кГц, динамическую скорость кодирования данных от 6 до 510 кбит/с, при этом скорость может быть выбрана как постоянная величина, так и переменная.

Использование Opus позволяет получить высокое качество связи, сопоставимое с распространенным форматом аудиофайлов MP3, а также имеет широкое распространение в программном обеспечении для аудио и видеоконференций.
После сжатия речевого сигнала, данные передаются на сеансовый уровень, на котором также имеются несколько вариаций используемых протоколов в зависимости от конкретной реализации системы IP-телефонии, наиболее известными являются рекомендация H.323 и протоколы SIP и SDP.

1.4 Стек протоколов H.323

H.323 представляет собой рекомендации института ITU-T, определяющие набор стандартов и протоколов для проведения аудио и видео конференций через глобальную сеть Интернет в реальном времени. Отдельными стандартами рекомандации определяется, как именно конечный пользователь должен быть подключен к сети Интернет и в основном подключение описано с использованием коммутируемого телефонного соединения или сетью с негарантированной пропускной способностью (Ethernet).

Сама рекомандация H.323 не имеет связи с IP протоколом, хотя практические реализации, изначально, были базированы именно на нем. По своей сути, H.323 описывает целый стек протоколов, но нередко можно встретить его упоминание, как частного случая сигнализации, то есть отдельного протокола сеансового уровня, в системах VoIP.

Стандартом же описано разделение передачи данных на четыре компонента, каждый из которых имеет свои дополнительные рекомендации, определенные институтом ITU-T, а именно:

  1. Сигнализация;
  2. Управление потоковым видео и аудио;
  3. Приложение передачи данных;
  4. Коммуникационные интерфейсы.

Для сигнализации используется отдельный протокол согласования H.245, предусматривающий возможность выявления конечного набора функций, доступных двум и более конечным терминалам абонентов телефонной сети, а также управлением работой логических каналов связи между абонентами. Ограничением протокола является устанвление единичного экземпляра канала H.245 в каждом сеансе связи, при этом в рамках рекомендации H.323 возможно открытие отдельных сокетов для установления соединения, где под сокетом понимается классический набор IP-адреса устройства и сетевого порта.

Указанный подход достаточно прост в реализации, но для установления двух и более соединений требует наличия доступного сетевого порта для каждого из них, поскольку реальные сети передачи данных имеют ограничения в использовании адресного пространства, как следствие примение технологии трансляции сетевых адресов, установление соединения может быть затруднено. Для решения указанной проблемы существует возможность дополнительного туннелирования H.245 сессии в рамках H.255 сессии, что позволяет поддерживать несколько соединений на одном и том же сетевом сокете.

Основными сообщениями протокола являются TCS и TCSA, представляющие собой запрос и подтверждение набора функций отдельного терминала.

После инициации логического соединения между терминалами А и Б, терминал А отправляет сообщение формата TCS, с отмеченными поддерживаемыми функциями в направлении терминала Б. Терминал Б, при соответсвии функций, отправляет в ответ подтверждение формата TCSA, после чего зеркальная операция производится с терминала Б. При соответсвии наборов функций на обоих терминалах, терминал А отправляет сообщение формата OLC (Open Locical Channel – открытие логического канала) и ожидает в ответ от терминала Б сообщение OLCA, являющееся подтверждением готовности открытия логического канала, после чего процедура зеркально повторяется с терминала Б.

Аналогично открытию канала происходит и разрыв соединения с использованием сообщения формата CLC (Close Locical Channel – закрытие логического канала), в ответ на которое терминал также ожидает подтверждения сообщением CLCA. При этом двусторонняя отправка сообщений при закрытии канала не требуется, достаточно передачи двух сообщений. После чего Абонент А отправляет запрос формата EndSessionCommand или ESC для закрытия сессии и ждет в ответ от абонента Б аналогичный запрос.

Если сессия H.245 открывается внутри сессии H.225, перед отправкой сообщений требуется дополнительная передача сообщений формата H.225.0 Setup с одного из терминалов, после чего указанный терминал ожидает получения сообщений формата H.225.0 Alerting и H.225.0 Connect. При завершении соединения также требуется дополнительная передача сообщений типа H.225.0 ReleaseComplete. Описанный алгоритм представлен на рисунке 1.1.

picture

Рис 1.1. Процесс соединения абонентов с использованием H.323

Помимо описанных протоколов в стеке H.323 также используются рекомендацию Q.931 для установления и контроля за соединением, который условно сопоставим с протоколом TCP, но находится на другом уровне модели OSI, RTP/RTCP для оптимизации доставки потоковой речевой информации, RAS для взаимодействия с устройством привратником.
H.323 описывает несколько типов устройств:

  1. терминал;
  2. шлюз;
  3. привратник;
  4. сервер многосторонней конференции.

Каждое из устройств имеет свой набор функций и поддерживаемых протоколов, рассмотрим каждое из них подробнее.

Терминал является конечным устройством в системе IP-телефонии на основе стека H.323 и выполнен в виде программно-аппаратного устройства или персонального компьютера со специализированным программным обеспечением для реализации мультимедийных функций. При этом обязательным является поддержка речевой связи, а передача видео и данных является опциональным параметром.

Минимальный набор поддерживаемых протоколов, стандартов и рекомендаций для устройства терминала описан следующим списком: H.245, Q.931, RAS, RTP, G.711, H.450, где последний используется для поддержки обязательных для H.323 дополнительных видов обслуживния. На практике набор протоколов может отличаться и иметь дополнительную поддержку речевых и видео кодеков.

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

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

Список услуг устройства привратника можно условно разделить на два типа: основные и дополнительные. К основным услугам отностятся фунции трансляции внутренних адресов и телефонных номеров в сетевые адреса, управления доступом и авторизацией в H.323 сети и управления полосой пропускания.

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

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

Помимо указанной рекомендации H.323, существуют и аналоги для использования с различными типами коммуникационных интерфейсов, от модемных соединений до радиоканала разрабатываемые с 1990 по 1998 года и имеющие нумерацию H.320, H.321, H.322, H.324, H.324/C и H.310.

В настоящий момент времени H.323 не имеет широкого распространения на практике и чаще заменяется на SIP, но обратная совместимость с ним имеется в большинстве оборудования для IP-телефонии.

1.5 Протокол SIP

Упомянутый протокол SIP (Session Initiation Protocol – протокол установления сеанса) является альтернативой H.323 и описывает способ установки и завершения логического канала связи между устройствами системы IP-телефонии. На самом деле, помимо передачи потоковой аудио и видеоинформации, SIP позволяет также передавать мгновенные сообщения или данные приложений.

В отличие от рекомендации H.323, SIP не имеет монолитной архитектуры, за счет чего имеет более гибкую масштабируемость и полностью базирован на протоколах стека TCP/IP, следовательно, требует наличия широкополосного интернет соединения или подключения к локальной сети. SIP описывает каким именно образом приложение должно запрашивать начало соединение у собеседника, а также определяет способ согласования режимов установления логического канала с использованием сторонних протоколов, например, протокола RTP.

Аналогично H.323, а именно протоколам H.245 и H.225, SIP предполагает использование сокетов для установления соединений, но в отличии от первых, имеет стандартизированный порт для осуществления этого функционала. Так, традиционно SIP использует порт 5060 для TCP и UDP соединений отдельных компонентов сети. Основной задачей протокола является регистрация абонентов в сети, установление и завершение вызовов.

Для организации функций базового набора услуг, таких как набор номера абонента, звуковое оповещение о входящем вызове и, собственно, вызове телефонного аппарата используются дополнительные функциональные элементы сети: прокси-серверы и пользовательские агенты. При этом сам протокол используется исключительно для сигнализации в сессиях связи, как правило, для потоков пакетов протокола RTP, или SDP, описывающего параметры передачи мультимедийной информации в рамках установленной сессии.

Помимо указанного сетевого порта, используемого протоколом SIP, для него установлена уникальная схема адресации, в которой указывается идентификатор отдельного абонента и фрагмента, характеризующего отдельное сетевое устройство. При этом пара идентификатор-фрагмент всегда разделена с использованием символа «@», а в качестве идентификатора определен используемый телефонный номер или логин для авторизации конкретного абонента, для фрагмента IP-адрес устройства или его доменное имя.

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

Архитектура сети с использованием SIP предполагает налчия нескольких устройств:

  1. терминального оборудования;
  2. прокси-сервера;
  3. сервера B2BUA;
  4. сервера переадресации;
  5. сервера регистрации;
  6. сервера определения местоположения абонентов.

Терминальное оборудование, аналогично H.323, представляет собой програмнмое обеспечение на персональных компьютерах или программно-аппаратные устройства для передачи мультимедийной информации. Но в отличие от первого, терминалы могут быть двух видов в зависимости от установления соедиения и самого программного обеспечения: пользовательским агентским клиентом или пользовательским агентским сервером, UAC (User Agent Client) и UAS (User Agent Server) соответственно. Отличие заключается в том, что терминалы с ролью UAS могут взаимодействовать непосредственно с абонентами, а такие терминалы называют пользовательским агентом (UA – User Agent), поскольку в них присутствуют и роль UAC и UAS одновременно.

Устройства прокси-сервер выполняют функции приема и обработки запросов в сети с последующим выполнением требуемых действий. Как и терминалы UA, прокси-сервер состоит из клиентской и серверной компонент, соответственно позволяет как принимать входящие вызовы, так и формировать запросы к отдельным устройствам, при этом не изменяя исходного содержимого сообщений, поскольку для такого типа функций определено служебное поле «via» для указания адресной информации прокси-сервера.

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

Устройство сервер B2BUA функционально схож с прокси-сервером, с одним значимым отличием, он может поддерживать связь одновременно с несколькими терминальными устройствами, тем самым разделяя функции вызова и сигнализации по разным участкам. Применение такого типа устрйоств в сети IP-телефонии позволяет организовать функционал управления звонками, сопряжения разных сетей, а также частичного скрытия структуры сети. В качестве функций управления звонками могут быть использованы перевод звонка, биллинг, голосовое меню, автоматическое завершение вызова.

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

Сервер регистрации или регистратор необходим для получения новой адресной инфомации и ее хранении в базе данных в рамках сети IP-телефонии и предусмотрен архитектурой SIP ввиду возможной мобильности абонента.

Взаимодействие с сервером регистрации производится путем отправки сообщений установленного формата от терминального устройства, а именно – сообщения «REGISTER». При этом в зависимости от конфигурации регистратора возможно получение одного из четырех ответов на запрос регистрации:

  1. 200 OK;
  2. 404 Not Found;
  3. 403 Forbidden;
  4. 401 Unauthorized.

Сообщение первого типа означает успешную регистрацию, второго – ошибку при проверке учетной записи абонента, а именно отсутствие записи о таком абоненте в БД регистратора, третьего – запрет регистрации абонента, четвертого – запрос идентификатора пользователя.

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

Помимо рассмотренного сообщения типа «REGISTER», SIP поддерживает еще 5 сообщений в классическом наборе:

  • INVITE – пришлашение абонента к сеансу связи;
  • ACK – ответ на запрос приглашения абонента к сеансу связи;
  • BYE – завершение сеанса связи от одного из абонентов;
  • CANCEL – отмена обработки переданных запросов;
  • OPTIONS – запрос информации о наборе функций сервера.

Стоит отметить, что вместе с сообщением типа «INVITE» обычно передаются данные с информацией о SDP сеансе, а сообщение типа «CANCEL» не отменит обработку уже выполненных запросов.
В процессе модификаций протокола со временем в него были внесены дополнительные типы сообщений, стандартизированные в RFC 3252, RFC 3265, RFC 3903, RFC 2976, RFC 3515, RFC 3428 и RFC 3311 поверх первоначальной версии RFC 3261:

  • PRACK – временное подтверждение;
  • SUBSCRIBE – сообщение об инициализации подписки на уведомления;
  • NOTIFY – уведомление подписчика;
  • PUBLISH – публикация информации о событии на сервере;
  • INFO – передача информации;
  • REFER – запрос о передаче исходного SIP запроса;
  • MESSAGE – передача мгновенного сообщения;
  • UPDATE – модификация состояния сессии.

Структура и некоторые типы ответов на запросы SIP напрямую унаследованны от протокола HTTP и определены шестью классами, определяемыми по первой цифре трехзначного номера ответа:

  1. информационные ответы;
  2. ответ об успешной обработке запроса;
  3. ответ о новом местоположении абонента;
  4. сообщение об ошибке запроса;
  5. сообщение об отказе сервера;
  6. ответ о невозможности установления соединения.

Сам процесс установления соединения отличается в зависимости от использования промежуточных устройств и предусмотрено два варианта: с использованием прокси-сервера и сервера переадресации и с использованием сервера B2BUA.

В первом варианте установление соединения между терминальными устройствами А и Б начинается с отправки сообщения типа «INVITE» устройством А в направлении сервера переадресации с целью получения актуального адреса абонента Б, после получения ответа класса «3» абонент А отправляет сообщение «ACK». Следующим шагом является отправка сообщения типа «INVITE» в направлении необходимого для установления соединения прокси-сервера, который, в свою очередь, перенаправляет сообщение «INVITE» в направлении абонента Б и отправляет абоненту А ответ класса «1» с сообщением о попытке установления соединения. Далее абонент Б направляет прокси-серверу ответ класса «1» о попытке звонка, который перенаправляется прокси-сервером в направлении абонента А, аналогично отправляется ответ класса «2» об успешной обработке запроса. При получении ответа абонентом А отправляется сообщение «ACK» и перенаправляется прокси-сервером к абоненту Б, после чего соединение считается установленным и по логическому каналу передаются мультимедийные данные непосредственно между абоентами. По окончанию передачи один из терминалов аналогичным образом передает сообщение типа «BYE» и ожидает от другого устройства ответа класса «2» об успешной обработке запроса. На этом этапе соединение считается закрытым, связь между абонентами прекращается, иллюстрация работы алгоритма отражена на рисунке 1.2.

picture

Рис 1.2. Процесс соединения абонентов с использованием протокола SIP

Во втором случае абонент А отправляет сообщение типа «INVITE» в направлении B2BUA сервера, который формирует аналогичное сообщение к абоненту Б, после чего B2BUA отправляет абоненту А ответ класса «1» о попытке установления соединения (100 Trying) и ожидает от абонента Б два сообщения класса «1» о попытке установления соединения и совершении звонка (100 Trying и 180 Ringing), после получения которых направляет абоненту А ответ 180 Ringing. Далее абонент Б направляет B2BUA ответ класса «2» об успешной обработке запроса, а B2BUA отправляет аналогичный ответ абоненту А вместе с сообщением «ACK» абоненту Б и ожидает сообщения «ACK» от абонента А, после чего соединение считается установленным и по логическому каналу передаются мультимедийные данные на участках абонент А – B2BUA и B2BUA –абонент Б. Разрыв соедиенения происходит аналогично первому варианту, но через устройство B2BUA, иллюстрация к описанному процессу отображена на рисунке 1.3.

picture

Рис 1.3. Процесс соединения абонентов с использованием протокола SIP и сервера B2BUA

1.6 Технологии виртуализации

В работе описаны практические рекомендации, по конфигурации программной АТС на базе ПО Asterisk с поддержкой рассмотренных ранее протоколов. Asterisk – программный сервер телефонии (программная АТС) с открытым исходным кодом, поддерживающий работу со специализированным оборудованием для аналоговых/цифровых телефонных линий, а также программные и аппаратные IP-телефоны.

Указанное ПО имеет ограничения по установке, а именно, работает исключительно на операционных системах семейства Linux. Linux – общее название ОС из семейства Unix, которых объединяет ядро, созданное Линусом Торвальдсом. На базе ядра Linux создано множество дистрибутивов различного назначения (для использования в производственной среде, домашнего использования, и т.д.), среди наиболее известных — Red Hat, CentOS, Fedora, Debian, Ubuntu, Kali, Arch. Android также базируется на Linux.

Ввиду невысокого распространения подобных операционных систем на персональных компьютерах для личного использования, в работе использованы средства виртуализации для возможности запуска Linux поверх ОС Windows или Mac.
Виртуализация – технология создания виртуального представления вычислительных ресурсов абстрагировано от аппаратного обеспечения, на базе компьютера, сервера или серверного кластера (обобщенно говоря, хоста) для возможности одновременной работы нескольких ОС. Реальные ресурсы хоста (процессор, оперативная и дисковая память и т.д.) с помощью специализированного ПО (гипервизора) распределяются между виртуальными машинами (ВМ) – программными средами, имитирующими физический компьютер, на которые устанавливаются гостевые ОС.

Гипервизор – ПО, которое управляет выделением физических ресурсов хоста для ВМ, разделяет и изолирует эти ресурсы между ними, позволяя запускать несколько ОС одновременно, также гипервизор выполняет обработку запросов прерываний процессора и запросов на доступ к памяти от гостевых ОС. Для хостовой ОС ВМ представляет собой набор файлов – обычно это файл виртуального диска, файл конфигурации ВМ и некоторые другие файлы (файлы контрольных точек и тп).

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

Второй тип – ПО, устанавливаемое в обычной ОС (Windows, Linux, macOS), взаимодействующее с аппаратными ресурсами через основную ОС, что подходит для быстрого развертывания тестовых стендов и выполнения лабораторных работ. В работе используется второй тип гипервизора.

1.7 Создание ВМ в VMware Workstation Player 15

Скачайте с удаленного хранилища образ операционной системы CentOS и сохраните файл на персональный компьютер, после чего откройте графический интерфейс ПО VMware Workstation Player 15 ( или Oracle VM VirtualBox). Если вы ставите виртуальную машину Oracle VM VirtualBox, то следуйте на шаг 1.7.1:

  1. Нажмите Create a New Virtual Machine.
  2. Выберите пункт I will install the operating system later (Рисунок 1.4).

picture

Рис 1.4. Настройка окна установщика

  1. Выберите тип и версию гостевой ОС (если в вашей версии доступен на выбор CentOS 8 или Red Hat Enterprise Linux 8 – укажите его, если нет – CentOS 7) (Рисунок 1.5).

picture

Рис 1.5. Настройка типа и версии гостевой ОС

  1. Укажите имя (рекомендуется отобразить в имени принадлежность ВМ к студенту) и папку сохранения для ВМ (рекомендуется сохранить на диск D: или F:) (Рисунок 1.6).

picture

Рис 1.6. Настройка имени виртуальной машины

  1. Укажите параметры диска для ВМ (объем 20 ГБ) (Рисунок 1.7).

picture

Рис 1.7. Настройка параметров диска

  1. Нажмите Customize Hardware… Выделите для ВМ 1 ГБ оперативной памяти (Memory), 4 ядра процессора (Processors), в New CD/DVD выберите Use ISO image file и нажав Browse, укажите путь к сохраненному ранее образу CentOS (Рисунок 1.8).

picture

Рис 1.8. Настройка параметров ВМ

Выделенных ресурсов хватит для тестовой установки и эксплуатации CentOS без графического окружения с Asterisk, обслуживающим до 10 клиентов. Нажмите Close и потом Finish.

  1. Запустите ВМ (появится слева в VMware Player), нажав Play virtual machine.

Переключение ввода внутрь ВМ производится щелчком ЛКМ по окну с запущенной ВМ, возврат в хостовую ОС – Ctrl+Alt.

1.7.1 Создание ВМ в Oracle VirtualBox

  1. В левом верхнем углу нажмите кнопку «Создать»
  2. Укажите имя, версию и тип ОС. В имени рекомендуется отобразить в имени принадлежность ВМ к студенту. Тип ОС, как не трудно догадаться: «Linux». Дистрибутив Cent OS Linux, основан на ПО Red Hat Enterprise Linux (RHEL) компании Red Hat, выбираем соответствующую версию.

picture

Рис 1.8.1. Настройка параметров ВМ

  1. Укажите объём оперативной памяти, который будет выделяться под виртуальную машину. 2 Гб достаточно.

picture

Рис 1.8.2. Настройка выделения оперативной памяти

  1. В параметрах Жёсткого диска выберите пункт «Создать новый виртуальный жёсткий диск»

picture

Рис 1.8.3. Настройка параметров жёсткого диска

Далее тип диска: VDI (VirtualBox Disk Image)

picture

Рис 1.8.4. Настройка типа диска

Формат хранения: Динамический виртуальный жёсткий диск.

picture

Рис 1.8.5. Настройка формата хранения

Имя и размер файла.
Имя можно оставить такое же, размер рекомендуется поставить 20 Гб.

picture

Рис 1.8.6. Настройка выделяемого объёма памяти

Далее нажмите кнопку «Создать» и запустите виртуальную машину

  1. Откроется окно, где нужно указать путь к скачанному вами образу Cent OS.

picture

Рис 1.8.5. Выбор образа Cent OS

1.8. Установка CentOS 8

  1. При появлении меню загрузки, как показано на рисунке, выберите пункт Install CentOS… чтобы начать установку CentOS 8 (Рисунок 1.9).

picture

Рис 1.9. Установка CentOS 8

  1. Выберите язык системы (настоятельно рекомендуется оставить английский English (United States)) и нажмите Continue (Рисунок 1.10).

picture

Рис 1.10. Выбор языка системы

  1. В появившемся окне параметров установки перейдите в Time&Date, выберите корректный часовой пояс, нажмите Done (Рисунок 1.11).

picture
Рис 1.11. Настройка параметра часового пояса

  1. Перейдите в Software Selection и выберите подходящее базовое окружение – Minimal Install (в целом, опция Minimal Install вполне подходит для большинства случаев развертывания, установка Asterisk – в их числе) (Рисунок 1.12).

picture

Рис 1.12. Настройка базового окружения

  1. Откройте пункт Installation Destination и нажмите Done для автоматической разметки диска.
  2. Перейдите в пункт Network & Host name. Включите доступные сетевые интерфейсы Ethernet (и проверьте, что им присваивается IP-адрес). В поле Host Name внизу задайте произвольно имя хоста (это имя будет установлено в ОС как имя системы) и нажмите Apply. Если текущее имя изменено, адрес успешно получен, нажмите Done (Рисунок 1.13).

picture

Рис 1.13. Настройка используемого хоста

  1. Нажмите Begin Installation чтобы начать установку. В Root Password задайте пароль пользователю root (На данном этапе возможно задать простой короткий пароль путем двойного нажатия Done). Создайте своего пользователя (User Creation) с любым удобным именем (в поле Full name можно использовать прописные буквы и длинное имя, поле User name содержит логин, под которым авторизуется пользователь, он должен быть достаточно короток и не должен содержать прописных букв. Обязательно отметьте пункт Make this user administrator для добавления пользователя в соответствующую группу администраторов (wheel). На данном этапе также возможно аналогично задать простой короткий пароль (Рисунок 1.14).

picture

Рис 1.14. Настройка параметров пользователя

  1. По окончанию установки нажмите Reboot. ВМ перезагрузится и загрузится с виртуального диска со свежеустановленной CentOS.

1.9. Первоначальная настройка CentOS

В Linux подключенные диски отображаются иначе и имеют отличные от используемых в Windows идентификаторы. В зависимости от интерфейса, через который подключен жесткий диск, название может начинаться на:

  • sd – устройство, подключенное через интерфейс SCSI (SAS);
  • hd – устройство, подключенное через интерфейс ATA (SATA).

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

Также подобную информацию можно получить командой

Настройка удаленного доступа по протоколу SSH
Авторизуйтесь в окне ВМ под пользователем, которого Вы создали на этапе установки. (Данная работа (и последующие в курсе) предполагает, что Вы НЕ используете учетную запись root).
Узнайте IP адрес, который был получен CentOS от DHCP сервера VMware Player, для этого выполните команду:
ip address
Первый сетевой адаптер в списке с именем lo, с адресом 127.0.0.1 (адрес указан после слова inet), также известным как адрес localhost – loopback-адаптер, используемый для обращения ОС к себе самой, трафик этого адаптера никогда не покидает ОС и не попадает в сеть, целая подсеть 127.0.0.0/8 выделена под loopback, и, соответственно, недоступна извне. Используемый для связи с “внешним миром” адрес следует искать в секции, соответствующей адаптеру с именем, начинающимся на eth или ens. Этот интерфейс необходимо перевести в режим «Сетевой мост» или «Bridge» в настройках виртуальной машины.

picture

Рис 1.15. Настройка типа подключения

После этого необходимо перезапустить виртуальную машну, либо перезапустить сетевую службу с помощью команды

sudo systemctl restart NetworkManager

Для удаленного подключения к CentOS воспользуемся протоколом SSH (Secure SHell 2 версия), который предоставляет безопасный (защищенное криптоалгоритмами RSA или ECDSA соединение) доступ к командной оболочке. Этот протокол заменил в большинстве случаев небезопасный открытый протокол Telnet.
Запустите на хостовом ПК программу PuTTY, в поле Host Name введите полученный на предыдущем шаге IP адрес CentOS, выберите тип подключения SSH и нажмите Open (Рисунок 1.15).

picture

Рис 1.15.1 Настройка типа подключения

Согласитесь на добавление незнакомого ключа сервера, после появления окна с приглашением login as: введите имя пользователя, нажмите Enter, введите пароль, нажмите Enter. Вы можете открыть несколько параллельных сессий от имени одного пользователя в новых окнах PuTTY, что может быть удобно, если потребуется одновременно изменять конфигурацию и отслеживать сообщения в интерфейсе какого-либо ПО.


Конфигурация пакетного менеджера yum

Стандартный способ управления ПО в Linux (установка, обновление, удаление) – через соответствующий дистрибутиву пакетный менеджер, который скачивает и устанавливает пакетные файлы из репозиториев – хранилищ данных, предназначенных для распространения пакетов ПО по сети. В deb-based дистрибутивах Linux (Debian, Ubuntu, Kali) используется пакетный менеджер apt, в rpm-based (RedHat, CentOS, Fedora) — yum, в Fedora, а также начиная с 8 версии в RedHat и CentOS, yum является алиасом (ссылкой на другую команду) для менеджера dnf, который используется в системе вместо yum. Далее по тексту работы как пакетный менеджер будут упоминаться традиционный для CentOS yum и приводиться команды и конфигурация для него, что вполне возможно благодаря наличию в CentOS 8 обратной совместимости (а вот в ранних версиях CentOS использовать команды для dnf не получится).

В случае доступа в Интернет через прокси-сервер [4] необходимо сконфигурировать yum для работы через прокси ИЛИ настроить локальные репозитории. В данном курсе работ будет использоваться первый способ.

Изменение параметров работы системного ПО в подавляющем большинстве случаев в Linux производится редактированием соответствующих конфигурационных файлов в текстовом редакторе и применением изменений/перезапуском службы. По умолчанию в CentOS установлен текстовый редактор vi, первоначально используйте его для редактирования текстовых файлов конфигурации, после получения доступа к репозиториям (в случае отсутствия прямого доступа в Интернет), можно установить удобный Вам — mc, nano и тп.
Обратите внимание, что для возможности сохранения файлов (право записи на файл) в любых директориях, кроме домашней, могут потребоваться права суперпользователя, с которыми должен быть запущен текстовый редактор (sudo vi ПУТЬ_К_ФАЙЛУ) (Рисунок 1.16).

Параметры прокси-сервера прописываются в конфигурационном файле yum /etc/yum.conf, его необходимо открыть в редакторе с правами суперпользователя для внесения изменений:

picture
Рис 1.16. Ошибка при подключении пользователя

Если Вы получили такой вывод в терминале, значит Ваш пользователь при установке не был добавлен в группу администраторов (пользователей с привилегиями sudo). Следует под пользователем root добавить его в группу пользователей sudo (wheel) вручную командой usermod -aG wheel username (Рисунок 1.17).

picture
Рис 1.17. Добавление пользователя в группу администраторов

Команда su переключает сессию текущего пользователя на суперпользователя root, поэтому пароль необходимо вводить от учетной записи root.
Для применения изменений требуется полностью выйти из системы с помощью команды exit и авторизоваться под Вашим пользователем заново.

Конфигурация Proxy сервера иногда не требуется, уточняйте у преподавателя!
Переведите vi в режим редактирования нажав i. Добавьте в конец секции [main]:

- proxy=http://прокси:порт
- proxy_username=логин
- proxy_password=пароль

Уточните у преподавателя, какие параметры использовать для прокси соединения, если его конфигурация необходима, при отсутствии прокси-сервера в сети пропустите этот пункт.
Выход из vi с сохранением изменений: нажать Esc ввести :wq
Выход из vi без сохранения: Esc :q!

В репозиториях, которые включены в CentOS по умолчанию (Base, AppStream, Extras) доступны далеко не все пакеты, кроме того, большинство представлено устаревшими версиями (например, MariaDB, PHP). Некоторые из требуемых в данной работе пакетов доступны в репозитории EPEL (или Extra Packages for Enterprise Linux). Если один и тот же пакет находится в нескольких репозиториях, yum (если не указана желаемая версия и не сконфигурирован репозиторий по умолчанию для пакета) установит самую последнюю версию. Чтобы добавить репозиторий EPEL в список активных репозиториев, достаточно установить пакет epel–release из базового репозитория CentOS. Добавьте репозиторий EPEL:

sudo yum install epel–release

В зависимости от используемого дистрибутива операционной системы могут быть замечены некоторые ошибки в работе пакетного менеджера yum, например, ошибка типа «Failed to synchronize cache for repo appstream». Указанную проблему можно решить последовательным выполнением сделующих команд, при выполнении последней следует отказаться от обновление пакетов нажатием кнопки «n»:

sudo cd /etc/yum.repos.d/
sudo sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
sudo sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
sudo yum update

По умолчанию yum автоматически НЕ устанавливает пакеты, только проверяет их наличие в активных репозиториях, составляет список всех зависимых пакетов для установки, подсчитывает объем загружаемых файлов, требуемое место на диске для установки и спрашивает, следует ли установить их (см. рисунок ниже). На вопросы об установке пакетов и обновлении GPG-ключей репозиториев (Is this ok?) следует ответить y (Рисунок 1.18).

picture

Рис 1.18. Настройка устанавливаемых пакетов

Если yum успешно установил запрашиваемые пакеты, вывод будет подобен приведенному на рисунке ниже (все установленные пакеты и зависимости (если существуют) приведены после строк Installed: и Dependency Installed: соответственно (Рисунок 1.19).

picture

Рис 1.19. Проверка установки пакетов

Если vi Вам неудобен для редактирования, можно установить другой текстовый редактор, например редактор файлового менеджера MidnightCommander, который помимо возможности удобно просматривать файлы и директории, предоставляет свой собственный текстовый редактор.

Устанавливается через yum:

Редактор mcedit использует ряд F-клавиш для управления, их назначение указано внизу окна на кнопках с соответствующим номером, кроме того, mc поддерживает управление мышью, можно кликнуть по верхней панели для отображения меню, а также по нижним кнопкам. Для копирования/вставки используются сочетания Ctrl-Insert/Shift-Insert соответственно (а также выделение мышью с зажатым Shift/ПКМ) (Рисунок 1.20).

picture
Рис 1.20. Ознакомление с окном Edit

Чтобы открыть файловый менеджер в текущей директории выполните команду mc. Для редактирования файла замените vi на mcedit в вызове редактора:
sudo mcedit /etc/yum.conf
SELinux
Security-Enhanced Linux – дополнительная система безопасности Linux, реализующая мандатную систему управления доступом, позволяющая гибко разграничивать права пользователей и отдельных процессов в рамках контекстов безопасности. По умолчанию включена в CentOS в активном режиме, что без соответствующей настройки препятствует работе устанавливаемых пакетов и служб в фоновом режиме, поэтому ее требуется выключить.

Выключить SELinux немедленно до перезагрузки системы можно так:

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

SELINUX=enforcing на SELINUX=disabled в файле /etc/selinux/config:

sudo vi /etc/selinux/config

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

Установка пакетов для скачивания и сборки исходного кода

Установите пакет wget для скачивания файлов по URL ссылке, клиенты систем управления версиями git и svn, компиляторы gcc gcc -c++ и дополнительные пакеты для сборки проектов из исходного кода по Makefile:

sudo yum install wget git gcc gcc-c++ svn wget cmake make automake autoconf pkgconfig graphviz

Для управления репозиториями необходимо установить пакет утилит yum:

sudo yum install yum-utils -y

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

Включите репозиторий PowerTools (добавлен в CentOS 8 по умолчанию, но выключен) и установите криптографические пакеты и библиотеки для поддержки шифрования передаваемых голосовых данных:

sudo yum-config-manager --enable PowerTools
sudo yum install openssl openssl-devel libsrtp libsrtp-devel doxygen -y

Установка требуемых для Asterisk зависимостей из репозиториев (набор пакетов приведён для конфигурации, необходимой в данной работе; некоторые ненужные в данном курсе модули Asterisk будут недоступны при сборке):


UPD (2023): Чтобы команда корректно сработала и пакет sox смог установиться, нужно предварительно установить epel более старой версии, сделать это можно выполнив команду:

sudo yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm

После этого можно устанавливать основные пакеты:

sudo yum install libedit-devel jansson-devel uuid libuuid-devel sqlite-devel libxml2-devel libcurl-devel xmlstarlet bison flex  neon-devel lua-devel uriparser-devel libxslt-devel unixODBC unixODBC-devel bluez-libs-devel radcli-devel freetds-devel  newt-devel popt-devel libical-devel spandsp-devel codec2-devel fftw-devel libsndfile-devel unbound-devel binutils-devel gsm-devel zlib-devel libtool bzip2 patch sox redhat-rpm-config kernel-devel

Прокси для wget – пакета для загрузки файлов (выполняется при наличии прокси-сервера в сети или пропускается) (Аналогично с обычным Proxy, нужен не всегда).

Прописывается в начале файла /etc/wgetrc

Вставьте следующие параметры:

http_proxy=http://прокси:порт
https_proxy=http://прокси:порт
proxy_user=логин
proxy_passwd=пароль

Также можно использовать переменные окружения для указания прокси-сервера, yum/dnf/apt и wget умеют работать с ними. Подробнее об определении прокси в /etc/environment или использовании команды export можете узнать самостоятельно.

Настройка правил сетевого экрана.

В CentOS 8 в качестве сетевого экрана (firewall) используется firewalld – пакет, представляющий собой надстройку над встроенным в ядро Linux файерволом netfilter. Является аналогом широко распространенного в Linux пакета iptables, но вместо настройки таблиц и цепочек реализует концепцию zone-based firewall (сетевые интерфейсы привязываются к зонам, правила фильтрации применяются к зоне, также при необходимости настраиваются правила между зонами) [5]. По умолчанию все доступные ОС сетевые интерфейсы принадлежат зоне public, все новые правила, если не указана зона, также автоматически применяются к этой зоне.

Согласно настроенным по умолчанию правилам, доступ по сети к CentOS разрешен по 22 порту для удаленного подключения по уже упомянутому ранее протоколу SSH. Для удобства управления правилами в firewalld присутствует возможность создать сервис и ассоциировать с ним группу правил.

Создание нового сервиса:

sudo firewall-cmd --permanent --new-service=asterisk

Добавление к сервису нужных портов:

sudo firewall-cmd --permanent --service=asterisk --add-port=5060/tcp
sudo firewall-cmd --permanent --service=asterisk --add-port=5060/udp
sudo firewall-cmd --permanent --service=asterisk --add-port=5061/tcp
sudo firewall-cmd --permanent --service=asterisk --add-port=5061/udp
sudo firewall-cmd --permanent --service=asterisk --add-port=4569/udp
sudo firewall-cmd --permanent --service=asterisk --add-port=10000-20000/udp
  • где 5060 – SIP, 5061 – SIP over TLS, 4569 – IAX, 10000-20000 – диапазон для динамических портов RTP.

Теперь добавьте созданный сервис в список активных правил:

sudo firewall-cmd --permanent --add-service=asterisk

Перечитать установленные правила firewalld (применить изменения без сброса текущих сетевых соединений):

sudo firewall-cmd --reload

Так можно посмотреть правила, привязанные к сервису

sudo firewall-cmd --info-service=asterisk

Посмотреть всю конфигурацию firewalld

sudo firewall-cmd --list-all

Раздел 2. Сборка и начальная конфигурация сервера VoIP телефонии Asterisk

2.1. Установка Asterisk

Asterisk устанавливается путем сборки из исходного кода. Полная установка проходит в 3 этапа:

  1. (опц) Установка DAHDI (драйвера плат FXO интерфейсов);
  2. (опц) Установка LibPRI (библиотека для работы с потоковыми TDM-интерфейсами);
  3. Сборка и установка Asterisk.

При использовании тестового стенда на ВМ можно пропустить первые 2 пункта, поскольку использование спец оборудования не подразумевается, поэтому сразу приступим к сборке Asterisk. Архив с исходным кодом требуемой 16 версии Asterisk asterisk-16-current.tar.gz лежит в той же директории на сервере, где Вы брали образ CentOS; скачайте архив на свой ПК. Для того, чтобы перенести файл архива с хостового компьютера в CentOS, воспользуемся протоколом передачи файлов SCP (от англ. secure copy), который работает поверх SSH. Запустите на хостовом ПК программу WinSCP, которая представляет собой клиент таких протоколов передачи данных, как FTP SFTP SCP WebDAV и тд. В окне входа выберите протокол SCP, в поле Имя хоста укажите IP адрес CentOS, укажите имя пользователя и пароль в соответствующих полях (аналогично подключению по SSH). Нажмите войти (Рисунок 2.1).

picture

Рис 2.1. Настройка параметров соединения

В режиме Коммандер WinSCP отображает слева папки Вашего локального пользователя на хостовом ПК, а справа домашнюю директорию пользователя, под которым Вы подключились к серверу (к CentOS). В левой части перейдите в папку, в которую Вы ранее скачали архив с исходным кодом Asterisk, выберите и перетащите нужный файл мышью на правую половину, убедитесь, что он появился в домашней директории Вашего пользователя на CentOS (Рисунок 2.2).

picture

Рис 2.2. Настройка директории пользователя

Распаковка архива и переход в папку с извлеченными файлами:

tar -xzf asterisk-*.tar.gz

Следует отметить, что в скачанном архиве с исходным кодом Asterisk есть скрипт (contrib/scripts/install_prereq) для автоматической установки всех зависимостей, но он подразумевает установку множества пакетов для невостребованных в данной работе модулей, и в целях экономии времени, дискового пространства и интернет-трафика, ранее была произведена “ручная” установка необходимых пакетов.

Для выполнения следующего шага потребуется прописать прокси для клиента системы управления версиями subversion. Создайте новый файл:

sudo touch /etc/subversion/servers

Или сразу укажите имя нового файла в вызове редактора, новый файл также будет создан.
В созданный файл /etc/subversion/servers необходимо добавить следующие строки:

[global]
http-proxy-host = прокси
http-proxy-port = порт
http-proxy-username = логин
http-proxy-password = пароль

Добавление пакетов для работы с mp3:

./contrib/scripts/get_mp3_source.sh

Если эта команда не выполняется, проверьте, что вы находитесь в папке asterisk-16. с распакованными файлами (проверка текущей директории командой pwd).

Очищение директории от существующих файлов конфигурации сборки:

Конфигурация параметров сборки Asterisk (это одна команда, параметры, начинающиеся с — — разделяются пробелами):

./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --libdir=/usr/lib64 --with-iconv --with-libcurl --with-jansson-bundled --with-crypto --with-ssl=ssl --with-srtp

Полный перечень опций и что они означают можно посмотреть командой ./configure -h

В случае успешного конфигурирования в конце должна быть получена следующая картина (Рисунок 2.3).

picture

Рис 2.3. Подтверждение успешной конфигурации

Меню выбора требуемых компонентов, модулей и приложений Asterisk:

Необходимые компоненты:

  • Add-ons: format_mp3;
  • Call Detail Recording: убрать cdr_radius, cdr_sqlite3_custom, cdr_tds;
  • Channel Event Logging: убрать cel_radius, cel_sqlite3_custom, cel_tds;
  • Channel Drivers: оставить только chan_iax2, chan_pjsip, chan_rtp;
  • Codec Translators: добавить codec_opus;
  • Resource Modules: убрать res_agi, все пункты с res_ari, res_fax, res_phoneprov, res_smdi (эти модули не нужны в данной установке и вызывают появление ошибок при запуске);
  • Compiler Flags: LOW_MEMORY, G711_NEW_ALGORITHM, G711_REDUCED_BRANCHING;
  • Core Sound Packages: только RU-WAV.

После этого выйдите, нажав Save & Exit.

Запуск процесса сборки:

Если сборка прошла успешно, отобразится сообщение об успешном завершении и возможности установить собранный пакет (Рисунок 2.4).

picture

Рис 2.4. Подтверждение успешной сборки

Установка собранного пакета Asterisk:

Создание службы systemd для Asterisk и конфигурационных файлов по умолчанию:

sudo make samples && sudo make config

2.2. Базовая конфигурация и запуск Asterisk

Откройте в редакторе основной конфигурационный файл Asterisk:

/etc/asterisk/asterisk.conf

Необходимо раскомментировать (удалить ;) и редактировать следующие пункты:

runuser = asterisk
rungroup = asterisk
defaultlanguage = ru

Создайте служебного пользователя asterisk, от имени которого будет работать служба Asterisk (этот пользователь не сможет осуществлять вход в систему):

sudo useradd -r -s /sbin/nologin asterisk

Смените владельца следующих директорий на пользователя asterisk для предоставления ему полного доступа:

sudo chown -R asterisk:asterisk /var/run/asterisk
sudo chown -R asterisk:asterisk /etc/asterisk
sudo chown -R asterisk:asterisk /var/{lib,log,spool}/asterisk
sudo chown -R asterisk:asterisk /usr/lib64/asterisk

Запуск Asterisk для проверки корректности установки и первоначальной конфигурации:

Если Asterisk успешно запустится, в конце вывода служебных сообщений появится зеленая надпись Asterisk Ready и приглашение командной строки Asterisk CLI> (возможно появление предупреждений и ошибок — это обусловлено особенностями сгенерированной конфигурации по умолчанию, которая предполагает использование некоторых не сконфигурированных в текущей установке Asterisk модулей. На работоспособность в целом не влияет).

Выход обратно в bash: Ctrl+C.
Запретите загрузку вызывающих ошибки модулей, которые не понадобятся в текущей работе:

sudo vi /etc/asterisk/modules.conf

вставить после строки autoload=yes:

noload => pbx_dundi
noload => res_config_ldap
noload => res_pjsip_phoneprov_provider

Если на предыдущем шаге Asterisk успешно запустился, можно запустить Asterisk как фоновую службу с автозапуском на старте ОС:

sudo systemctl enable asterisk && sudo systemctl start asterisk

Проверьте, что Asterisk корректно запущен в виде фоновой службы:

sudo systemctl status asterisk

Если служба корректно запущена и работает, в выводе должно быть указано active (running) (Рисунок 2.5).

picture

Рис 2.5. Проверка корректного запуска Asterisk

Если получено иное, перезапустите службу и еще раз проверьте статус:

sudo systemctl restart asterisk
sudo systemctl status asterisk

Проверьте возможность подключения к интерфейсу CLI Asterisk:

Подключаться к Asterisk Вам потребуется позже при отладке конфигурации, пока что выйдите обратно в bash.
Если CLI Asterisk не открылся, проверьте состояние SELinux (sudo sestatus, Current mode не должен быть enforcing).

2.3. Конфигурация Asterisk для обработки вызовов

Чтобы Asterisk начал обрабатывать телефонные вызовы, необходимо сконфигурировать параметры канала связи (драйвер протокола SIP в данном случае) и план набора (dialplan). Протокол SIP представлен в Asterisk двумя драйверами канала – старым, проприетарным chan_sip и новым, открытым кроссплатформенным PJSIP. Преимущества последнего помимо кроссплатформенности в стабильности, активном развитии (исправлении багов и уязвимостей, оптимизации и обновлении), поддержке дополнительных протоколов (TURN и тд) для обеспечения лучшей проходимости трафика SIP через NAT [6-7], в возможности осуществлять множество регистраций на одну учетную запись клиента. Таким образом, для данной работы был выбран PJSIP как более функциональное современное решение. План набора конфигурируется как описание логики обработки вызовов практически одинаково для любого типа канала, отличия только в вызываемом приложении внутри записи экстеншена (пункт диалплана).

Для конфигурации Asterisk в качестве IP АТС согласно изложенному ранее, необходимо отредактировать два основных конфигурационных файла:

  1. pjsip.conf, в котором указываются сведения о транспортном протоколе, разрешенных кодеках, клиентах и регистрациях SIP, пользователи с соответствующими идентификаторами-номерами, параметры регистрации и аутентификации;
  2. extensions.conf, описывающий план набора — dialplan, правила обработки и маршрутизации вызовов.

После внесения изменений в любой конфигурационный файл Asterisk, служба Asterisk должна быть перезапущена для применения изменений!!!

sudo systemctl restart asterisk

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

sudo rm /etc/asterisk/extensions.conf
sudo rm /etc/asterisk/pjsip.conf

2.4. Конфигурация плана набора

План набора в файле extensions.conf структурирован в секции, называемые контекстами. Контекст – это независимая от остальных часть внутри диалплана. Контексты используются для разделения функций, обеспечения безопасной обработки и фильтрации вызовов между различными частями, определения класса обслуживания разных пользователей и так далее.
План набора, как было сказано ранее, состоит из одного или нескольких контекстов. Контексты используются для реализации основных функций АТС, таких как:

  • безопасность – можно разрешить вызовы на определенные номера только конкретным абонентам;
  • маршрутизация вызовов – маршрутизация вызовов в зависимости от номера абонента;
  • многоуровневые голосовые меню – голосовые меню для службы поддержки, отдела продаж и т.д;
  • авторизация – запрос пароля для вызова на некоторые номера;
  • обратный вызов;
  • списки доступа – занесение в черные списки нежелательных абонентов;
  • виртуальные АТС – возможность создавать независимые виртуальные АТС в пределах Вашей основной АТС;
  • дневной/ночной режим работы – изменение поведения АТС в зависимости от времени;
  • макросы – можно создавать скрипты для решения повторяющихся задач в плане набора.

Каждый контекст – это набор расширений (extension). Каждый экстеншен в контексте имеет уникальное имя, которое обычно является числовым идентификатором, присвоенным линии, идущей к конкретному телефону.

Синтаксис расширения начинается с выражения exten => Далее указывается имя (или номер) экстеншена. В традиционных системах телефонной связи под номерами понимаются номера из цифр, которые надо набрать, чтобы позвонить определенному абоненту с этим номером. В Asterisk понятие имени (номера) намного шире, в качестве имени добавочного номера может использоваться любая комбинация цифр и букв. Полный экстеншен состоит из трех компонентов:

  1. имени (или номера);
  2. приоритета (каждый добавочный номер может включать множество шагов обработки вызова, порядковый номер шага называется его приоритетом);
  3. приложение (или команда), которое выполняет некоторое действие над вызовом.

Эти три компонента разделяются запятыми:

exten => имя,приоритет,приложение()

Приведём пример простейшего экстеншена:

exten => 123,1,Answer()

В этом примере имя добавочного номера – 123, приоритет – 1, а приложение – Answer().

В начале диалплана также можно разместить два специальных контекста, [general] и [globals]:
[general] содержит список общих настроек диалплана;
[globals] — глобальные переменные.
Ниже приведен пример простейшего плана набора (реализует обработку звонков на любые трехзначные номера) в контексте default, который должен быть, сохранен в файле /etc/asterisk/extensions.conf

[default]

exten => _XXX,1,Dial(PJSIP/${EXTEN})

Теперь рассмотрим реализацию простого голосового меню с подробным описанием процесса маршрутизации и обработки вызовов.

[internal]

exten => 1234,1,GoTo(ivr,s,1)

[ivr]

exten => s,1,Answer()

 same => n,Playback(hello)

same => n,Background(basic-pbx-ivr-main)

 same => n,Playback(demo-thanks)


exten => 1,1,GoTo(1-otd,s,1)

[1-otd]

exten => s,1,Background(one-moment-please)

same => n,GoTo(ivr,s,4)

При звонке клиента из контекста internal на номер 1234 происходит перенаправление вызова приложением GoTo в контекст ivr на соответствующий экстеншен с именем s и приоритетом 1. Далее пошагово идёт обработка вызова: ”поднимается трубка” приложением Answer, проигрывается звуковая запись hello с помощью приложения Playback (по умолчанию Asterisk ищет записи в /var/lib/asterisk/sounds для указанного в конфигурации языка), далее проигрывается запись basic-pbx-ivr-main с помощью приложения Background. Отличие между этими двумя приложениями состоит в том, что во втором случае Asterisk во время проигрывания звукового файла прослушивает линию на предмет ввода дополнительного номера в тональном режиме (DTMF). При вводе 1 обработка вызова передается в контекст 1-otd. Если ввода не последовало, проигрывается demo-thanks и вызов завершается, поскольку больше нет настроенных экстеншенов для дальнейшей обработки вызова.
Задание. Создайте контекст с произвольным именем, настройте обработку внутренних 4-значных номеров, определите отдельно любой произвольный номер, при вызове на который Asterisk будет проигрывать запись num-was-successfully и принудительно завершать вызов с помощью приложения Hangup().

Конфигурация PJSIP

Настройки PJSIP в Asterisk производятся через текстовый файл конфигурации pjsip.conf, состоящий из секций. Общий вид секций стандартен для всех конфигурационных файлов Asterisk

  • начинается с указания имени секции в скобках[]. Основное отличие в структуре конфигурационного файла PJSIP от классического драйвера chan_sip, в том, что конфигурация SIP-клиентов разбивается на логические разделы:

  • Endpoint – соответствует клиенту или транку SIP, содержит описание основных параметров клиента, его принадлежность к контексту и определяет связь с остальными обязательгымиг модулями, такими как Transport, Auth и AOR;

  • Transport – данный раздел описывает тип транспортного протокола для подключаемых устройств, доступны TCP, UDP, TLS, а также WebSocket. Возможно использовать один раздел для многих конечных точек (разделов Endpoint), также можно при необходимости для раздела Endpoint создать свой собственный раздел Transport;

  • Auth – раздел, содержащий параметры аутентификации для исходящей или входящей регистрации SIP, с данным разделом связаны разделы Endpoint и Registrations. Одна запись раздела Auth при необходимости может использоваться несколькими разделами Endpoint и Registration (т.е. имя пользователя для регистрации совсем необязательно соответствует номеру пользователя);

  • AOR (Address of Record) – раздел по своей сути является указателем для Asterisk, каким образом связаться с точкой (Endpoint). Без соответствующей записи в AOR не будет возможности вызвать подключаем конечную точку (телефонный аппарат клиента или передать вызов в транк оператора);

  • Registration – раздел, отвечающий за исходящую регистрацию, например, регистрация Asterisk на сервере оператора связи. Для корректной работы данного раздела обязательно должны присутствовать две опции в которых указываются имена используемых разделов: раздел Transport (опция transport) и раздел Auth (опция outbound_auth); также обязательна опция type.

Пример конфигурации транспорта SIP и создание клиента с 3-значным номером, описанные в файле /etc/asterisk/pjsip.conf


[udp–transport]

type=transport

protocol=udp

bind=0.0.0.0

[101]

type=endpoint

transport=udp–transport

context=default

disallow=all

allow=g726,gsm

auth=101

aors=101

[101]

type=auth

auth_type=userpass

password=verysecuresupercoolencryptedpassword

username=101

[101]

type=aor

max_contacts=1

Посмотреть, какие кодеки поддерживает Asterisk можно выполнив команду:

Задание. Создайте конфигурацию для 2-х клиентов, каждому из которых соответствует 4-значный номер (номера выберите сами), привяжите к ранее созданному в плане набора контексту, разрешите использование только кодеков OPUS, G.711 A-law (корректные имена кодеков узнайте самостоятельно).
Обратите внимание, PJSIP очень чувствителен к корректности синтаксиса файла конфигурации, даже отсутствие/наличие пробела там, где он должен/не должен быть приводит к полной неработоспособности. Перезапустите службу Asterisk после изменения файлов конфигурации.
Теперь проверим, что Asterisk готов принимать вызовы, приходящие по сети, для этого нужно убедиться, что прослушивается порт SIP – 5060. Получить статистику по открытым портам и соединения можно с помощью нескольких команд, одна из них – ss:

ss – ulpn (Рисунок 2.6).

picture

Рис 2.6. Получение статистики об открытых портах и соединениях

2.5. Протоколы SIP и RTP

Современная IP-телефония строится на связке сигнальных протоколов и протоколов передачи данных реального времени. В качестве сигнального протокола, обеспечивающего установление сессий передачи данных наибольшую популярность, обрел SIP в связке с SDP, непосредственно для передачи данных используется протокол прикладного уровня RTP и тесно связанный с ним транспортный протокол RTCP.

Session Initiation Protocol (SIP) – это клиент-серверный протокол сигнализации прикладного уровня, предназначенный для установления, модификации и окончания сеансов связи с одним или несколькими участниками для обмена мультимедийным трафиком [8]. SIP использует текстовые сообщения, в которых используется кодировка UTF-8, работает на порту 5060, как в случае использования транспортного протокола UDP, так и TCP [9]. Описан в RFC 3261.

Основными функциями SIP являются:

  • определение местонахождения адресата;
  • определение готовности адресата установить контакт;
  • обмен данными о функциональных возможностях участников сеанса;
  • изменение параметров медиапотока уже установленного сеанса;
  • управление сеансом связи.

Основными функциональными элементами являются:

  • абонентский терминал (User Agent). SIP-клиент, реализованный как АО (VoIP телефон/VoIP-шлюз) или ПО (PhonerLite, SIPp), с помощью которого абонент совершает вызовы;

  • прокси-сервер. Узел в сети, принимающий и обрабатывающий запросы от терминалов, выполняя соответствующие этим запросам действия и возвращая ответы. Прокси-сервер может принимать вызовы, переадресовывать их, вносить изменения в передаваемые сообщения SIP (например, для преодоления NAT), инициировать запросы к клиентам;

  • сервер переадресации. Узел, хранящий записи о текущем местоположении всех зарегистрированных в сети клиентах (терминалах) и прокси-серверах. Сервер переадресации только переадресует вызовы и не генерирует собственные запросы;

  • сервер регистрации / определения местоположения пользователей (Register). Представляет собой базу данных адресной информации (IP-адресов). Необходим для обеспечения мобильности пользователей. Чаще всего совмещен с прокси-сервером.

Asterisk в стандартной установке совмещает все 3 последние упомянутые роли.
В протоколе SIP определено 6 основных запросовов (Табл. 2.1).

Таблица 2.1

Основные запросы в протоколе SIP

picture

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

  • info: Расширение протокола, описанное в RFC 2976;
  • notify: Расширение протокола, описанное в RFC 2848;
  • subscribe: Расширение протокола, описанное в RFC 2848;
  • unsubscribe: Расширение протокола, описанное в RFC 2848;
  • update: Запрос на изменение параметров сеанса, описан в RFC 3311;
  • message: Расширение протокола, описанное в RFC 3428;
  • refer: Расширение протокола, описанное в RFC 3515.

Для SIP определено 6 кодов ответа, которыми прокси-сервер описывает состояние соединения, например: подтверждение установления соединения, передача запрошенной информации, сведения о неисправностях и пр. Все классы ответов, кроме 1 завершают выполнение запроса.

  1. 1хх – Информационные ответы, сообщают о ходе выполнения запроса;
  2. 2хх – Успешное окончание запроса;
  3. 3хх – Информация об изменения местоположения вызываемого абонента;
  4. 4хх – Информация об ошибке;
  5. 5хх – Информация об ошибке сервера;
  6. 6хх – Информация о невозможности вызова абонента (пользователь с таким адресом не зарегистрирован, или пользователь занят).

Непосредственным носителем голосовых или видеоданных является протокол RTP (Real-time Transport Protocol), SIP-сообщение же выполняет роль контейнера для сообщений протокола описания сеансов связи SDP (Session Description Protocol RFC 4566).

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

RTP – транспортный протокол для передачи трафика реального времени (в том числе потоковой передачи мультимедийного трафика) [9]. Для передачи и контроля параметров соединения используется протокол RTCP.

2.6. Настройка клиентов

В терминале подключитесь к службе Asterisk (sudo asterisk -vvvr), оставьте открытой консоль Asterisk, чтобы там видеть информационные сообщения о регистрации клиентов и обработке вызовов. Из директории с руководством по данной работе на сервере скачайте на свой компьютер архив PhonerLite.zip, разархивируйте его в 2 разные папки для двух разных клиентов. Сначала проделайте все указанные ниже шаги для одного клиента, если клиент успешно зарегистрировался и может совершить звонок на номер Asterisk с проигрыванием записи num-was-succesfully, то сконфигурируйте и второго клиента для 2 номера.

Запустите приложение PhonerLite.exe, выберите manual configuration. В строке Proxy/Registrar укажите IP-адрес Asterisk, нажмите далее (кнопка со стрелкой влево), введите имя пользователя и пароль (из секции Auth pjsip.conf). Завершите оставшиеся этапы конфигурации клиента.

Если регистрация клиента на сервере прошла успешно, внизу окна появится соответствующая надпись и индикатор будет зелёным, а в интерфейсе Asterisk появятся сообщения о том, что прошла регистрация и клиент с номером … стал доступен (Рисунок 2.7).

picture

Рис 2.7. Проверка успешной регистрации клиента на сервере

Во вкладке Configuration – Network снимите выделение с пункта Multicast DNS, нажмите Save.

Иначе возможны некоторые нежелательные ситуации, поскольку клиенты могут находить друг друга в сети посредством рассылки запросов и при вызове могут игнорировать Asterisk.

Первому клиенту PhonerLite поставьте первым разрешенным приоритетом кодек Opus, второму – G.711 A-law, совершите звонок. Убедитесь, что в консоли Asterisk отображается информация об обработке вызова, если нет, проверьте, что неактивен пункт Multicast DNS, закройте клиенты, перезапустите Asterisk, откройте консоль Asterisk, запустите клиенты и попробуйте заново.

2.7. Отладка SIP протокола

Модуль res_pjsip_history сохраняет в памяти историю всех отправленных и полученных SIP-сообщений, которые проходят через стек PJSIP.
Для того, чтоб начать захват, нужно выполнить следующую команду в CLI Asterisk:

Для наглядного отображения порядка проведения VoIP вызова с помощью протоколов SIP и RTP, можно использовать Wireshark — инструмента для захвата и анализа сетевого трафика. Запустите Wireshark и выберите соответствующий сетевой адаптер для захвата трафика из списка (VMnet8 для сети NAT в VMware Player).

В строке Apply a display filter введите sip || rtp для отфильтровывания в выводе пакетов соответствующих протоколов (Рисунок 2.8).

picture

Рис 2.8. Проведение VoIP вызова с помощью протоколов SIP и RTP

Совершите вызов из PhonerLite второму клиенту, не забудьте принять вызов на втором PhonerLite. После завершения вызова (достаточно принять вызов и можно сразу же нажать отбой) нажмите на красный квадратик слева сверху, чтобы остановить захват трафика и перейти к его анализу. В пункте Telephony выберите VoIP Calls, в открывшемся окне будут отображены все захваченные звонки (сеансы SIP). Выберите один из них и нажмите внизу Flow Sequence, чтобы наглядно отобразить этапы установления и завершения соединения с помощью протокола SIP.

Сравните с историей SIP сообщений на Asterisk:

Также можно получить информацию о клиентах:

Вопрос для самоконтроля. Почему некоторые сообщения SIP (в частности INVITE при инициализации сеанса) клиент отправляет по 2 раза?

Раздел 3. Настройка канала между Asterisk серверами. Realtime конфигурация

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

  1. Откройте VMware Player, убедитесь, что ваша ВМ с CentOS выключена (State: Powered off), нажмите Edit virtual machine settings.
  2. Нажмите Add…, выберите Network adapter. Отредактируйте конфигурацию нового сетевого адаптера (Network Adapter 2), укажите Bridged вместо NAT в Network connection. Сохраните изменения (Рисунок 3.1).

picture

Рис 3.1. Настройка нового сетевого адаптера

  1. После запуска ВМ настройте новый адаптер согласно инструкции ниже и убедитесь, что CentOS получает адрес из той же сети, в которой находится хостовой ПК.

Определите, какое имя получил новый адаптер в системе, выполните команду ip address, новый адаптер отобразится последним в списке.
Сгенерируйте уникальный идентификатор с помощью команды uuidgen имя_адаптера скопируйте полученное значение, его потребуется вставить в поле файла конфигурации на следующем шаге. Создайте файл конфигурации для нового адаптера в директории /etc/sysconfig/network-scripts c именем ifcfg-имя_адаптера.

В файле следует указать следующие параметры (пример актуален для подсети с DHCP):

TYPE=Ethernet
BOOTPROTO=dhcp
NAME=имя_адаптера
ONBOOT=yes
UUID=полученное_значение_от_uuidgen
NM_CONTROLLED=yes

Применение изменений в CentOS 8:

systemctl restart NetworkManager

Если новый сетевой адаптер (ens или eth) в CentOS не получил IP адрес (или получил вида 169.254.x.x), в настройках нового сетевого адаптера (Player – Removable Devices — Network Adapter 2 – Settings) выберите Configure Adapters, в появившемся окне снимите выделение со всех адаптеров, кроме того, через который хостовой ПК имеет доступ к локальной сети. Если потребуются права администратора, проконсультируйтесь с преподавателем на предмет, какие учетные данные использовать.

На одном узле Asterisk (назовем его node1) требуется добавить клиента с номером в формате 4XXX, на втором (node2) в формате 5XXX (помните, клиенты описываются в файле pjsip.conf 3 секциями – Endpoint, Auth, AOR), контекст укажите тот, который создали в предыдущей работе для внутренних вызовов. Назначьте клиенту произвольный идентификатор CallerID (см. пример ниже, как назначается идентификатор first клиенту с номером 4001).


Пример секции Endpoint из /etc/asterisk/pjsip.conf для node1

[4001]
type=endpoint
transport=udp-transport
context=internal
disallow=all
allow=alaw,opus
callerid=first<4001>
auth=4001
aors=4001

ВАЖНО! Убедитесь, что на первом Asterisk отсутствуют настроенные номера формата 5XXX, а на втором 4XXX.

3.1. Краткие сведения о протоколе IAX

Среди поддерживаемых Asterisk протоколов, особое место занимает протокол IAX. Это протокол, созданный разработчиками Asterisk (Digium Inc.), расшифровывается как Inter-Asterisk eXchange protocol – протокол обмена между Asterisk. Хотя IAX и поддерживается некоторыми VoIP-телефонами, в первую очередь он предназначен для организации между узлами Asterisk каналов типа транк, в которых осуществляется одновременная передача данных нескольких вызовов. IAX первой версии в настоящее время не поддерживается ввиду наличия проблем в плане безопасности, а говоря IAX, обычно подразумевают вторую версию IAX2. Для работы протокола используется UDP-порт 4569, который предназначается не только для обмена сигнальной информацией о сеансе связи (аналогично SIP с SDP), но и для обмена голосовой информацией (аналогично RTP), таким образом, IAX берет на себя передачу и сигнальной и голосовой информации. Дополнительно следует сказать, что IAX – протокол, использующий бинарный формат для передачи данных, в отличие от протокола SIP, передающего сообщения в открытом текстовом формате, что позволяет IAX уменьшить объем передаваемых данных в случае использования его на транк-канале с одновременной передачей множества вызовов. Помимо этого, протокол использует агрегацию параллельных сеансов связи в рамках использования одного IAX-соединения между узлами Asterisk, так что в одном UDP-пакете может одновременно передаваться служебная и голосовая информация, принадлежащая нескольким вызовам.

Основные недостатки – сложная расширяемость (внедрение новых функций) и уязвимость старых реализаций к атакам типа DoS (версии Asterisk новее 2009 года менее подвержены этой уязвимости, поскольку есть возможность ограничить число подключений и вызовов с одного адреса, использовать дополнительно при соединении токены CallToken).

Процесс регистрации клиента IAX на сервере с настроенной аутентификацией с использованием алгоритма хэширования MD5 при поддержке CallToken (Рисунок 3.2).

picture

Рис 3.2. Алгоритм хэширования MD5 при поддержке CallToken

Первым шанрм клиент отправляет серверу сообщение REGREQ с информационными элементами ‘username’ (содержит имя пользователя, под которым нужно зарегистрироваться), ‘refresh’ (период обновления регистрации в секундах) и пустым ‘CallToken’;

Сервер отвечает сообщением CALLTOKEN, содержащим элемент CallToken с идентификатором, который должен использовать клиент;

Клиент отправляет подтверждает получение токена сообщением ACK и посылает новое сообщение REGREQ (c элементами username, refresh и CallToken c полученным от сервера значением);

Сервер отвечает сообщением REGAUTH, содержащим элементы authentication methods, username и MD5 challenge (данные для вычисления хэша пароля);

Клиент посылает финальное сообщение REGREQ с элементами username, refresh, CallToken и MD5 challenge с результатом выполнения хэш-преобразования по алгоритму MD5 над указанным в конфигурации паролем пользователя IAX;

Сервер в случае, если полученный от клиента хэш совпадает с вычисленным от хранимого на сервере Asterisk пароля, отвечает клиенту сообщением REGACK с элементами username, date time (текущие дата/время), refresh, apparent address (содержит в себе адрес клиента);

Клиент отсылает финальное сообщение ACK, если полученные данные корректны.

Для IAX регистрация означает отслеживание клиента (его адреса и порта прослушивания), все вызовы, проходящие через канал IAX, проходят аутентификацию отдельно, впрочем, как и для SIP.

Ниже приведена диаграмма обмена сообщениями при совершении вызова: клиента 1 отправляет запрос NEW с параметрами вызова (номер, кодеки, пользователь IAX, дата/время) клиенту 2, клиент 2 отвечает сообщением, содержащим CallToken для этого вызова, клиент 1 повторно отправляет то же NEW с полученным CallToken. Клиент 2 высылает параметры для аутентификации (данные для MD5/RSA преобразования пароля) в AUTHREQ. Клиент в данном представлении может быть как Asterisk, так и конечным клиентом (Рисунок 3.3).

picture

Рис 3.3. Диаграмма обмена сообщениями при совершении вызова

Происходит разговор клиента 2 с клиентом 1 (периодически посылаются сообщения LAGRQ (Request) LAGRP (Response) для определения задержки между узлами). Вызов завершается клиентом 1 (сообщение HANGUP) (Рисунок 3.4).

picture

Рис 3.4. Диаграмма разговора клиента 2 с клиентом 1 (периодически посылаются сообщения LAGRQ (Request) LAGRP (Response)

3.2. Настройка транка IAX в Asterisk

Приведенная ниже конфигурация предполагает, что оба клиента осуществляют взаимную регистрацию (схема peer-to-peer для равноправных узлов), в других ситуациях регистрация может быть односторонней (схема клиент-сервер), как например при подключении корпоративной АТС к провайдерской.

Удалите сгенерированный по умолчанию файл конфигурации IAX:

sudo rm /etc/asterisk/iax.conf

Конфигурация протокола IAX для данной работы должна производиться в новом файле /etc/asterisk/iax.conf, добавьте следующие строки:


На node1:

[iaxuser1]
type=friend
qualify=yes
auth=md5
context=outcall
secret=secret1
host=dynamic
trunk=yes

На node2:

[iaxuser2]
type=friend
qualify=yes
auth=md5
context=outcall
secret=secret2
host=dynamic
trunk=yes

В приведенной конфигурации создается пользователь с именем, указанным в [] и паролем, заданным параметром secret, от имени которого удаленный узел сможет зарегистрироваться на данном Asterisk. Указанный тип friend дает пользователю право отправлять и принимать вызовы (существуют также типы user и peer, первый позволяет ТОЛЬКО принимать вызовы от удаленного узла, второй — ТОЛЬКО перенаправлять их на удаленный узел).

Параметр qualify включает опрос доступности удаленного узла (отправка сообщения POKE, ожидание в ответ PONG, отправка подтверждения получения ответа PONG сообщением ACK), параметр auth определяет тип аутентификации (по умолчанию происходит аутентификация с передачей учетных данных в открытом текстовом виде) md5 — передача хешированных данных. Параметр context определяет, в какой(ие) локальный(е) контекст(ы) должен быть передан пришедший из IAX-канала вызов.

Настройка взаимной регистрации IAX-серверов. Для этого добавьте в начало файла /etc/asterisk/iax.conf :

на node1:


[general]
autokill=yes
language=ru
disallow=all
allow=opus,alaw
register => iaxuser2:secret2@A.B.C.D
где A.B.C.D IP адрес node1 (IP_node1 далее)

На node2 :
[general]
autokill=yes
language=ru
disallow=all
allow=opus,alaw
register => iaxuser1:secret1@A.B.C.D

где A.B.C.D IP адрес node2 (IP_node2 далее)

Рассмотрим конфигурацию, проделанную на node1. Она предписывает узлу node1 зарегистрироваться на узле node2 с IP-адресом IP_node2 под пользователем iaxuser2 с паролем secret2. Параметр autokill=yes завершает неудачно установленные соединения по тайм-ауту.

Для принятия изменений перезагрузите службу Asterisk:

sudo systemctl restart asterisk

Проверка состояния регистрации данного узла на удаленном:

sudo asterisk -rx 'iax2 show registry'

Данная команда демонстрирует, как можно выполнять любые команды CLI Asterisk (и получать ответный вывод) напрямую из bash.

В полученном выводе State должно быть Registered (т.е. локальный Asterisk успешно зарегистрировался на удаленном). Состояние Rejected означает, что в регистрации было отказано, следует выяснить и устранить причину (Рисунок 3.5).

picture

Рис 3.5. Появление ошибки отказа в регистрации

Состояние регистрации удаленного узла на данном:

sudo asterisk -rx 'iax2 show peers'

Status должен быть OK, а внизу указано, что есть 1 online (Рисунок 3.6).

picture

Рис 3.6. Данные об успешной регистрации

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

Для обработки приходящих из IAX-транка вызовов, на обоих узлах нужно добавить указанный ранее в конфигурации IAX контекст outcall в файл /etc/asterisk/extensions.conf:

На node1:

[outcall]
exten => _4XXX,1,Dial(PJSIP/${EXTEN})

На node2:

[outcall]
exten => _5XXX,1,Dial(PJSIP/${EXTEN})

В файле /etc/asterisk/extensions.conf добавьте в начало контекста, отвечающего за обработку внутренних звонков экстеншн для обработки вызовов, уходящих в IAX-транк:

на узле node1:

exten => _5XXX,1,Dial(IAX2/iaxuser2:secret2@IP_node2/${EXTEN})

И аналогично для node2:

exten => _4XXX,1,Dial(IAX2/iaxuser1:secret1@IP_node1/${EXTEN})

Перезагрузите Asterisk:

sudo systemctl restart asterisk

Настройте клиенты PhonerLite на обеих сторонах для регистрации под соответствующим номером 4XXX или 5XXX. На обоих узлах Asterisk откройте командный интерфейс Asterisk (sudo asterisk -vvvr). Совершите звонок между клиентами. Убедитесь, что на обеих сторонах в консоли Asterisk отображаются служебные сообщения PJSIP, IAX об установлении соединения и информация о задействованных при обработке вызова экстеншенах. Если вышеуказанные условия выполнены и вызов успешно совершается, можно переходить ко 2 части работы.

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

Проблему динамического изменения конфигурационных параметров Asterisk решает так называемая Realtime конфигурация, при которой конфигурационные параметры хранятся в таблицах базы данных (БД) вместо текстовых файлов. Изменение значения какого-либо параметра в таблице приводит к немедленному изменению в работе Asterisk (однако не всегда хранение параметров в БД означает realtime, можно сконфигурировать статическое хранение параметров, при котором после внесения изменений в базу потребуется перезагрузить Asterisk для принятия изменений).

3.3. Установка СУБД MariaDB

MariaDB представляет собой систему управления реляционными базами данных, является свободным ответвлением (распространяется по лицензии GNU GPL) от СУБД MySQL, при этом сохраняя обратную совместимость для API.

В официальном репозитории AppStream доступна версия MariaDB 10.3, чтобы получить новее, необходимо скачать исходный код и собрать пакет самостоятельно, либо добавить репозиторий разработчика в список репозиториев для yum и установить пакет стандартным способом, что и будет сделано далее.

Для добавления репозитория MariaDB версии 10.5 создайте файл /etc/yum.repos.d/MariaDB.repo и добавьте в него следующие строки:


[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.5/centos8-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
enabled=1

Строка enabled отвечает за включение/отключение репозитория, изменяя значение в файле можно включать/отключать репозиторий при необходимости.

Установите вспомогательные пакеты и саму СУБД MariaDB (для предотвращения возникновения конфликта между репозиториями придется на время установки выключить стандартный репозиторий AppStream):

sudo yum install boost-program-options -y
sudo yum --disablerepo=AppStream install MariaDB-server MariaDB-client

Запуск службы СУБД (и установка автозапуска на старте):

sudo systemctl enable mariadb && sudo systemctl start mariadb

После установки рекомендуется осуществить первичную настройку параметров безопасности MariaDB. По умолчанию пароль пользователя СУБД root не задан (требуется просто нажать Enter), в следующих шагах, кроме шага, где потребуется задать новый пароль пользователю root (это пользователь СУБД, НЕ системный root), просто нажимать Enter, поскольку подходящий ответ здесь выбран по умолчанию:

sudo mysql_secure_installation

Проверка возможности локального подключения к СУБД (Пароль вводить от пользователя root СУБД, заданный на предыдущем шаге):mysql -u root -p (Рисунок 3.7).

picture

Рис 3.7. Проверка возможности локального подключения к СУБД

Выход в интерпретатор bash производится следующей командой: q

3.4. Теоретические сведения о реляционных БД и SQL

Реляционная БД – набор данных, организованных в виде таблиц, включающих в себя столбцы (поля/атрибуты) и строки (записи/кортежи). Строка таблицы по сути – это набор данных, относящихся к хранимому в БД объекту. Таблицы БД, также называемые отношениями (relation), имеют, согласно реляционной модели, следующие свойства:

  • столбцы имеют определенный порядок, заданный при создании таблицы, которая может не иметь строк, но обязана иметь хотя бы один столбец;

  • таблица не может хранить две одинаковые строки;

  • каждый столбец имеет уникальное в пределах таблицы имя и хранит значения одного типа (дата, строка, число и т.д.);

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

Согласно этой же модели, любой элемент данных (ячейка) в таблице может быть однозначно идентифицирован именем столбца и значением в ячейке столбца, выбранного в качестве первичного ключа.

Первичный ключ (Primary key)
Может быть логическим (естественным — на основе поля, содержащего реальные данные объекта) или суррогатным (искусственным – на базе дополнительного поля, например, уникального ID). Рекомендуется использовать суррогатные ключи, поскольку данные объекта могут измениться, что приведет к необходимости удалять существующую запись и вносить новую, т.к. первичные ключи изменять нельзя.

Внешние ключи (Foreign key) позволяют связать строки и отдельные элементы разных таблиц.

Аспекты реляционных БД.

  • SQL – (язык структурированных запросов) основной интерфейс для работы с реляционными БД, используется для добавления, обновления и удаления строк данных, а также управления работой БД в целом;

  • целостность данных (через определение первичных и внешних ключей, а также ограничений (атрибутов столбца, см. в справочнике запросов SQL));

  • транзакция – последовательность операций на языке SQL, представляющая собой единую логическую задачу. Она должна быть выполнена целиком, либо не должен быть выполнен ни один из ее компонентов, независимо от других транзакций.

Требования ACID к транзакциям

  • атомарность – транзакция может выполниться только целиком, если не выполнена любая из частей — вся транзакция полностью отменяется;

  • единообразие – все данные, записываемые в БД через транзакции, должны соответствовать всем правилам и ограничениям БД;

  • изолированность – обеспечения согласованности и гарантия независимости каждой транзакции;

  • надежность – все внесенные транзакцией изменения в БД на момент успешного завершения этой транзакции считаются постоянными.

Далее приведен краткий список некоторых команд SQL.

3.5. Краткий справочник запросов SQL

Отобразить все созданные БД;

Создать базу; таблицу с описанием столбцов (имя, тип данных, указание атрибутов (опционально)):


CREATE DATABASE databasename;

CREATE TABLE table_name (

    column1 datatype attribute,

    column2 datatype,

    column3 datatype,
         ...
);

Примеры атрибутов:

PRIMARY KEY – указание столбца в качестве первичного ключа (NOT NULL присваивается автоматически);

UNIQUE – указание, что столбец должен хранить только уникальные значения;

NULL и NOT NULL – указание, может ли столбец хранить значение NULL;

AUTO_INCREMENT – значение столбца столбца будет автоматически увеличиваться при добавлении новой строки.

Записать в таблицу новую строку:

INSERT INTO table_name (column1, column2) VALUES (value1,value2);

Обновить существующую(ие) строку(и), которые подпадают под условие(я):

UPDATE table_name SET column1 = value1, column2 = value2, … WHERE condition1 AND condition2;

Выбрать все строки из таблицы:

SELECT * FROM table_name;

Удалить базу, таблицу, строку из таблицы:

DROP DATABASE databasename;

DROP TABLE table_name;

DELETE FROM table_name WHERE condition;

Далее приведены команды для создания БД и ее конфигурации на языке SQL, который традиционно используется для управления реляционными БД. Обратите внимание, запрос SQL ВСЕГДА заканчивается символом «;». Команды SQL выполняются в интерфейсе СУБД (вход mysql -u root -p ).

Создайте БД с именем asteriskdb с символьной кодировкой UTF8 по умолчанию:

CREATE DATABASE asteriskdb DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;

На следующем шаге создайте пользователя СУБД, под которым Asterisk будет подключаться к СУБД, имя и пароль выберите самостоятельно.

CREATE USER ‘имя_пользователя’@’localhost’ IDENTIFIED BY ‘пароль’;

Выдайте права полного доступа на базу asteriskdb созданному на предыдущем шаге пользователю, обновите действующие права.

GRANT ALL PRIVILEGES ON asteriskdb.* TO ‘имя_пользователя’@’localhost’;

FLUSH PRIVILEGES;

Выберите базу для работы (по умолчанию после входа в СУБД база не выбрана):

USE asteriskdb;

Создайте в выбранной базе таблицы, необходимые Asterisk для хранения своих данных с помощью готовых SQL-скриптов.

source ~/asterisk-16.12.0/contrib/realtime/mysql/mysql_config.sql;

Если СУБД возвращает ошибку, убедитесь, что путь до файла существует, проверьте, что версия установленного Asterisk (16.12.0 в примере) правильная, замените ~ на /home/USERNAME где USERNAME — имя вашего пользователя CentOS.

3.6. Сборка и установка коннектора ODBC

Коннектор Open Database Connectivity предоставляет API, с помощью которого сторонние сервисы (Asterisk в данном случае) могут получить доступ к БД.

Для работы коннектора требуются пакеты unixODBC unixODBC-devel, они были установлены во время выполнения предыдущей части работы среди зависимостей Asterisk.

Укажите прокси для Git:

git config --global http.proxy http://login:pass@proxy:port

Клонировать репозиторий с исходным кодом в текущую директорию и перейти в него:

cd ~
git clone https://github.com/MariaDB/mariadb-connector-odbc.git
cd mariadb-connector-odbc

Выберите версию кода 3.1.5:

Инициализация и обновление вложенных репозиториев:

git submodule init && git submodule update

Конфигурация параметров компиляции:


cmake -G "Unix Makefiles" --DCMAKE_BUILD_TYPE=RelWithDebInfo --DCONC_WITH_UNIT_TESTS=Off -DWITH_OPENSSL=true --DCMAKE_INSTALL_PREFIX=/usr

Конец вывода в терминал в случае успешного завершения сборки выглядит так (Рисунок 3.8).

picture

Рис 3.8. Успешное завершение собрки

Сборка и установка:

В конец файла /etc/odbcinst.ini добавьте описание нового драйвера подключения к СУБД (если уже существует с именем [MariaDB], приведите к представленному ниже виду):


[MariaDB]

Description=ODBC for MariaDB

Driver=/usr/lib64/libmaodbc.so

Setup=/usr/lib64/libodbcmyS.so

UsageCount=1

В файл /etc/odbc.ini добавьте параметры подключения к базе:


[Asterisk-odbc]

Description=MariaDB connection to 'asteriskdb' database

driver=MariaDB

server=localhost

database=asteriskdb

Port=3306

Socket=/var/lib/mysql/mysql.sock

option=3

Charset=utf8

Проверка работоспособности коннектора (подключение к базе asteriskdb от имени созданного для Asterisk пользователя СУБД) (Рисунок 3.9).

isql -v Asterisk-odbc имя_пользователя пароль

picture

Рис 3.9. Проверка работоспособности коннектора

В начало (перед строкой [asterisk]) файла /etc/asterisk/res_odbc.conf добавьте конфигурацию для ODBC коннектора:


[asteriskdb]

enabled => yes

dsn => Asterisk-odbc

username => имя_пользователя

password => пароль

pre-connect => yes

Перезапустите службу Asterisk:

sudo systemctl restart asterisk

Проверка состояния подключения Asterisk к БД (Рисунок 3.10):

sudo asterisk -rx 'odbc show'

picture

Рис 3.10. Проверка состояния подключения Asterisk к БД

3.7. Перенос конфигурации PJSIP в БД.

В начало файла /etc/asterisk/sorcery.conf вставьте следующие строки для перевода PJSIP в режим конфигурации Realtime:


[res_pjsip]

endpoint=realtime,ps_endpoints

auth=realtime,ps_auths

aor=realtime,ps_aors

domain_alias=realtime,ps_domain_aliases

contact=realtime,ps_contacts

[res_pjsip_endpoint_identifier_ip]

identify=realtime,ps_endpoint_id_ips

В файл /etc/asterisk/extconfig.conf добавьте после строки [settings] сведения, где Asterisk должен искать конфигурацию для PJSIP:


ps_endpoints => odbc,asteriskdb

ps_auths => odbc,asteriskdb

ps_aors => odbc,asteriskdb

ps_domain_aliases => odbc,asteriskdb

ps_endpoint_id_ips => odbc,asteriskdb

ps_contacts => odbc,asteriskdb

Пример. Для вставки новых строк в таблицу используется запрос INSERT, параметр INTO указывает в какую таблицу вставить (указывается полный путь в формате БД.Таблица или просто имя таблицы при условии, что БД была выбрана ранее через USE), далее в скобках следует перечисление имен столбцов через запятую, в которые нужно вставить данные (это не обязательно все столбцы таблицы), после VALUES в скобках указываются в соответствующем перечисленным в первой скобке именам столбцов порядке значения.

Далее в качестве примера приведен процесс создания клиента PJSIP с номером 101, путем заполнения значениями трех ключевых таблиц:

-ps_aors

INSERT INTO asteriskdb.ps_aors (id, max_contacts) VALUES (101, 1);

— ps_auths

INSERT INTO asteriskdb.ps_auths (id, auth_type, password, username) VALUES (101, 'userpass', 'secret', 101);

— ps_endpoints

INSERT INTO asteriskdb.ps_endpoints (id, transport, aors, auth, callerid, context, disallow, allow, direct_media) VALUES (101, 'udp-transport', '101', '101', 'first<101>', 'internal', 'all', 'opus,alaw', 'no').

Это аналог следующей конфигурации из файла pjsip.conf:


[101]
type=endpoint
transport=udp-transport
context=internal
disallow=all
allow=alaw,opus
callerid=first<101>
auth=101
aors=101
direct_media=no

[101]
type=auth
auth_type=userpass
password=secret
username=101

[101]
type=aor
max_contacts=1

Задание. Войдите в СУБД и аналогично примеру создайте записи в таблицах ps_aors ps_auths ps_endpoints БД asteriskdb, описывающие конфигурацию для всех описанных в файле pjsip.conf клиентов. В файле /etc/asterisk/pjsip.conf удалите все секции, принадлежащие клиентам, оставьте ТОЛЬКО секцию [udp-transport] и все параметры в ней.
Проверьте, что SIP-клиент может зарегистрироваться на Asterisk после перезапуска службы.

3.8. Установка веб-интерфейса phpMyAdmin для MariaDB

Для удобства управления MariaDB можно использовать веб-интерфейс для MySQL (MariaDB) – phpMyAdmin, представляющий собой готовое веб-приложение, написанное на языке PHP. Может быть работать на базе LAMP (Linux, Apache, MariaDB, PHP) или LEMP (Linux, NGINX, MariaDB, PHP) стека. В рамках данной работы примем за основу LEMP. Поскольку MariaDB уже присутствует в системе, остаётся установка веб-сервера NGINX и интерпретатора PHP с некоторыми дополнительными пакетами.

Системные репозитории CentOS содержат модифицированную версию NGINX в плане расположения и содержания конфигурационных файлов. Для использования стандартной конфигурации можно установить NGINX из официального репозитория или собрать из исходного кода. Воспользуемся первым из указанных вариантов.

Создайте файл /etc/yum.repos.d/nginx.repo и поместите в него следующие строки:


[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

Далее необходимо установить веб-сервер NGINX:

Основная конфигурация NGINX содержится в файле /etc/nginx/nginx.conf, его структура представлена ниже:


global options

events {

.......

}

http{

.......

include /etc/nginx/conf.d/*.conf;

}

Сначала идут глобальные параметры (global options), которые задают основные параметры работы NGINX, например, от какого пользователя будет запущен процесс, а также количество одновременно запущенных процессов. В секции events описывается, как NGINX должен реагировать на входящие подключения, ниже расположена секция http, объединяющая все параметры, связанные с работой протокола HTTP. Последняя директива говорит, что дополнительно в конфигурацию секции http включаются все файлы с расширением .conf из директории /etc/nginx/conf.d, эти файлы могут как содержать дополнительные параметры http, так и секции server c вложенными секциями location. По умолчанию существует файл /etc/nginx/conf.d/default.conf который ответственен за настройки сайта по умолчанию, отображение проверочной страницы NGINX после установки, его структура представлена ниже.


server {

.......

location ...{

.......

}

}

Обычно в секции http находится одна или несколько секций server, каждая секция отвечает за отдельный домен (доменное имя сайта), в секции server размещаются секции location, каждая из которых отвечает за обработку запроса с определенным URL.

Для оптимизации производительности отредактируйте и добавьте недостающие параметры в основной файл конфигурации NGINX /etc/nginx/nginx.conf:

1. Глобальные параметры. Исправьте/добавьте под параметром user:

worker_processes auto;

worker_cpu_affinity auto;

Эти параметры оптимизируют производительность рабочих процессов NGINX и их количество под число доступных ядер CPU.

2. Настройка обработки соединений, добавьте следующие параметры внутри, блока events :

multi_accept on;

use epoll;

Параметр use epoll – устанавливает оптимальный метод обработки соединений для Linux. Когда multi_accept выключен, рабочий процесс NGINX за один раз будет принимать только одно новое соединение. В противном случае рабочий процесс за один раз будет принимать сразу все новые соединения.

3. Параметры HTTP. Добавьте/скорректируйте следующие параметры:

access_log     off;
server_tokens  off;
tcp_nopush      on;
tcp_nodelay     on;
reset_timedout_connection    on;
gzip  on;
gzip_static on;
gzip_min_length     1024;
gzip_comp_level 3;

Для ускорения работы и снижения нагрузки на диск в текущей установке можно отключить ведение лога доступа к веб-серверу через директиву access_log. Директива server_tokens при выставлении параметра в off предписывает NGINX не отсылать информацию о своей версии клиентам. Это может быть полезно, если вы хотите усложнить эксплуатацию ошибок и уязвимостей конкретной версии NGINX. Директивы tcp отвечают за ускорение работы транспортного протокола TCP, keepalive_timeout и reset_timedout_connection отвечают за таймер keepalive для сетевого соединения (время, в течение которого соединение остается открытым с момента последнего ответа клиента на сообщение keepalive) и разрыв соединений с истекшим таймером. Директивы gzip включают сжатие передаваемых данных, предварительное сжатие статических файлов и минимальный размер файла, подлежащего сжатию.

Сохраните файл конфигурации и проверьте его корректность (Рисунок 3.11):

picture

Рис 3.11. Сохранение файла конфигурации и проверка его корректности

Если на предыдущем шаге проверка пройдена, запустите службу NGINX с автозапуском на старте ОС:

sudo systemctl enable nginx && sudo systemctl start nginx

Откройте в фаерволе 80 порт для доступа к веб-интерфейсу.

sudo firewall-cmd —add-service=http —permanent

sudo firewall-cmd —reload

Проверьте, что по URL http://IP_CentOS в браузере отображается тестовая страница Nginx.
Для работы последних версий phpMyAdmin требуется веб-сервер с поддержкой PHP 7.1 или новее; пакет PHP-FPM для NGINX, отвечающий за обработку php можно установить из репозитория Remi:

sudo yum install http://rpms.remirepo.net/enterprise/remi-release-8.rpm

Проверьте, что репозиторий Remi добавлен в список разрешенных:

sudo yum repolist

Включение модуля репозитория PHP версии 7.4 и установка PHP-FPM для Nginx и дополнительных пакетов PHP для phpMyAdmin:

sudo yum module enable php:remi-7.4 -y

sudo yum install php-fpm php-pear php-gettext php-bcmath php-zip php-mysqlnd php-gd php-pdo php-json php-xml php-opcache php-mbstring php-soap php-curl

В файле /etc/php-fpm.d/www.conf измените параметры пользователя user и group, под которым будет работать php-fpm с apache на nginx и проверьте, что взаимодействие между php-fpm и сторонними приложениями осуществляется через UNIX сокет:


listen = /run/php-fpm/www.sock;

user = nginx

group = nginx

В файле /etc/php.ini найдите, раскомментируйте и отредактируйте следующие параметры (отключение автоисправления URL):

cgi.fix_pathinfo=0

Выдайте права php-fpm, на директорию для хранения данных сессий.

sudo chown -R nginx.nginx /var/lib/php/session/

Разрешите автозагрузку на старте и запустите службу php-fpm:

sudo systemctl enable php-fpm && sudo systemctl start php-fpm

3.9. Установка phpMyAdmin

Архив с файлами phpMyAdmin находится в директории с софтом для лабораторной работы. Перенесите его с помощью WinSCP в домашнюю директорию своего пользователя CentOS и распакуйте:


cd ~

tar -xzf phpMyAdmin-*

sudo mkdir /var/www/phpmyadmin

sudo cp -r ./phpMyAdmin-5.0.2-english/* /var/www/phpmyadmin

sudo mkdir /var/www/phpmyadmin/tmp

sudo chown -R nginx.nginx /var/www/phpmyadmin/tmp


В файле /etc/nginx/conf.d/default.conf найдите строку #error_page 404 и приведите конфигурацию, находящуюся ДО этой строки к следующему виду:

server {

    listen       80;

    server_name   _;

    root /var/www/phpmyadmin;

    charset utf-8;

    index  index.php index.html index.htm;

    location / {

        try_files $uri $uri/ /index.php?$args;

    }

    location ~ .php$ {

        try_files  $uri =404;

        fastcgi_pass unix:/run/php-fpm/www.sock;

        fastcgi_index index.php;

	fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

        fastcgi_param QUERY_STRING  $query_string;

        include fastcgi_params;
    }

/ – корень сайта, перехватывает все запросы к домену, если не найдено более точное совпадение.

~ .php$ – перехватывает запросы к файлам с расширением php. То есть если в запросе указан файл .php, то запрос отправляется на обработку к php-fpm.

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

head /dev/urandom | tr -dc A-Za-z0-9 | head -c 32; echo »

Скопируйте полученную последовательность символов и вставьте ее в конфигурацию phpMyAdmin, находящуюся в файле /var/www/phpmyadmin/config.inc.php


<?php

$cfg['blowfish_secret'] = 'generated_symbols';

?>`

Перезапустите службы для принятия изменений конфигурации:

sudo systemctl restart php-fpm

sudo systemctl restart nginx

3.10. Работа в интерфейсе phpMyAdmin

Войдите в веб-интерфейс phpMyAdmin, используя URL http://IP_CentOS в браузере. В качестве учетных данных для входа используйте пользователя root СУБД.

Для сохранения конфигурации phpMyAdmin требуется отдельная БД, чтобы создать ее, найдите внизу страницы соответствующее сообщение (приведено ниже), нажмите на ссылку Find out why и на следующей странице нажмите Create (Рисунок 3.12).

picture

Рис 3.12. Сохранение конфигурации phpMyAdmin

Выберите слева базу asteriskdb, в ней таблицу ps_endpoints. Нажмите на… Создать представление (Create view) (Рисунок 3.13).

picture

Рис 3.13. Создание представления

В появившемся окне укажите название ps_endpoints_view, в названия столбцов вставьте укажите id, callerid, aors, auth, context, transport, disallow, allow, direct_media (Рисунок 3.14).

picture

Рис 3.14. Настройки параметров представления

Ниже вставьте SELECT id, callerid, aors, auth, context, transport, disallow, allow, direct_media FROM `ps_endpoints` Нажмите Format, для форматирования кода (так выглядит эталонная запись запросов на SQL).

Нажмите вперёд, после этого слева, в новом разделе для asteriskdb — Представления (Views) выберите представление ps_endpoints_view. Убедитесь, что в таблице отображается запись со всеми настроенными параметрами из раздела endpoints.

Представление (View) делает возможным отобразить выбранные данные из таблиц БД в виде настраиваемой таблицы (в отображении можно выбрать конкретные столбцы, переименовать их, соединить несколько). Данное представление ps_endpoints_view было создано для удобства отображения нужных параметров, поскольку если посмотреть, какие столбцы содержит таблица ps_endpoints, можно убедиться, что их число достаточно велико, причем большинство пустует ввиду отсутствия нужды задавать те параметры, которые эти столбцы хранят, а нужные столбцы разбросаны по всей ширине таблицы, что затрудняет читабельность. Для оставшихся таблиц ps_aors и ps_auths можно не создавать представление как можете самостоятельно убедиться, число столбцов в них невелико.

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

Для ускорения поиска данных и их сортировки, в таблице используются индексы, которые назначаются из числа столбцов таблицы (отображены слева в древовидной структуре таблицы). Индексы могут быть уникальными (все соответствующие значения столбцов во всех строках должны быть различны), составными (содержать более одного столбца – в этом случае уникальность проверяется по составной строке из всех указанных столбцов индекса), кластерными (хранятся данные записей таблицы целиком) и некластерными (хранятся только ссылки на записи таблицы). Каждая таблица должна иметь Первичный ключ, который обязан быть уникальным (среди всех значений данного столбца) и единственным (в одной таблице), первичные ключи таблиц InnoDB являются кластерными индексами. Первичный ключ может быть назначен вручную (в Структуре таблицы в phpMyAdmin будет помечен символом золотого ключа), или создан автоматически (скрыт в таком случае).

3.11. Перенос конфигурации плана набора (extensions) в БД

В файле /etc/asterisk/extconfig.conf добавьте в секцию [settings] строку:

extensions => odbc,asteriskdb

В /etc/asterisk/extensions.conf в начало каждого контекста добавьте строку:

switch => Realtime/ИМЯ_КОНТЕКСТА@extensions

Пример переноса контекста outcall на node1 в БД:

В файле /etc/asterisk/extensions.conf добавить в начало переносимого контекста строку:

[outcall]

switch => Realtime/outcall@extensions

Добавление данных об экстеншенах в таблицу extensions:

INSERT INTO extensions VALUES (1, ‘outcall’, ‘_1XXX’, ‘1’, ‘DIAL’, ‘PJSIP/${EXTEN}’);

Не забудьте выбрать базу asteriskdb, в интерфейсе СУБД.

Перезапустите Asterisk, проверьте работоспособность (вызовы совершаются успешно).

Задание. Аналогично приведенному примеру (используя SQL-запросы) или через графическую форму во вкладке Вставить (Insert) в phpMyAdmin, перенесите всю имеющуюся конфигурацию плана набора в таблицу extensions, удалите все записи об экстеншенах из файла extensions.conf (кроме параметров switch).

3.12. Перенос конфигурации IAX в БД

В файл /etc/asterisk/extconfig.conf добавьте строку

iaxfriends => odbc,asteriskdb

Пример.

В файле /etc/asterisk/iax.conf

добавьте в начало секции [general] строку:

rtcachefriends=yes;

Перенести конфигурацию пользователя IAX в БД:

INSERT INTO `iaxfriends` (`id`, `name`, `type`,  `secret`, `context`, `host`, `trunk`, `auth`, `qualify`) VALUES ('1', 'iaxuserX', 'friend', 'secretX', 'outcall', 'dynamic', 'yes', 'md5', 'yes');

Удалить всю секцию пользователя из iax.conf;

Перезапустить Asterisk, проверить работоспособность IAX.

Задание. Аналогично приведенному примеру (используя SQL-запросы) или через графическую форму во вкладке Вставить в phpMyAdmin, перенесите всю имеющуюся конфигурацию IAX в таблицу iaxfriends. Проверьте работоспособность после переноса конфигурации в Realtime.

Раздел 4. Настройка безопасного удаленного доступа к серверу Asterisk. Защита передаваемых данных

В данной работе будет проведена комплексная конфигурация безопасности доступа к серверу, сервисов Asterisk Nginx и т.д.

4.1. Защита загрузчика ОС Linux

В современных дистрибутивах Linux для загрузки ОС используется загрузчик GRUB2 (GRand Unified Bootloader 2 версии). По умолчанию загрузчик обычно не защищен, т.е. можно изменить параметры загрузки ядра при наличии локального доступа (или удалённой KVM консоли) к серверу/ВМ во время загрузки системы и, например, получить доступ с root правами.

Продемонстрируем способ получения такого доступа, не зная ни имен пользователей, ни паролей. Запустите ВМ с CentOS, когда появится меню загрузчика нажмите e. Отобразятся параметры загрузочного устройства, загрузки и инициализации ядра и тд. Найдите строку с параметрами загрузки ядра (строка начинается с linux16 или linuxefi), замените параметр ro на rw для монтирования файловой системы в режим чтения-записи, добавьте в самый конец параметров init=/bin/sh и нажмите Ctrl+X для загрузки системы с этими параметрами. CentOS загрузится в терминал от имени пользователя root. Теперь Вы можете совершать любые действия в системе, добавить или просмотреть пользователей в системе (cat /etc/passwd), сменить пароль любому пользователю (passwd username), внести любое изменение в работу ОС. ЕСЛИ в CentOS БЫЛ включен SELinux в активном режиме (это не наш случай, сведения приведены просто для справки), выполните команду touch /.autorelabel для создания в корне файловой системы пустого скрытого файла, который является маркером SELinux, что при загрузке необходимо обновить метки всех файлов (после загрузки проверьте, что этот файл удалился, иначе удалите вручную).

Для продолжения загрузки ОС введите exec /sbin/init, для перезагрузки exec /sbin/reboot.

Пароль на GRUB устанавливается следующей командой:

grub2-setpassword

Теперь для доступа к параметрам загрузки потребуется авторизоваться под именем пользователя root с заданным паролем (это не системный root, просто имя совпадает).

4.2. Смена порта SSH

Использовать SSH на стандартном 22 порту, особенно при наличии доступа к серверу из сети Интернет, не рекомендуется ввиду частого проведения атак злоумышленниками по этому порту с целью получить доступ к ОС и использовать сервер в своих целях (часто незаметно для владельца). С целью усложнения проведения атак также рекомендуется запретить доступ к системе по SSH пользователю root, не использовать стандартные имена пользователей вроде admin [10].

Для смены порта на другой, к примеру, 30000, и установления запрета на вход пользователя root, требуется отредактировать в файле /etc/ssh/sshd_config следующие параметры:

Port 30000

PermitRootLogin no

Далее для успешного прохождения сетевого трафика нужно разрешить его в firewalld:

sudo firewall-cmd --add-port=30000/tcp --permanent

Перезапустите демон sshd и перечитайте правила firewalld без разрыва текущего соединения:

sudo systemctl restart sshd && sudo firewall-cmd --reload

Существующее соединение SSH не будет разорвано, но все новые соединения будут приниматься только по новому порту. Проверьте возможность подключения, в PuTTY в поле Port смените 22 на 30000.

Если SSH сервер успешно принимает подключения, закройте 22 порт в firewalld:

sudo firewall-cmd --permanent --remove-service=ssh

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

4.3. Защита сервера с помощью fail2ban

Fail2ban – утилита, отслеживающая в логах разных служб определенные события и при происшествии их определенного количества за определенное время выполняющая указанные в конфигурации действия. Используется для защиты от подбора учетных данных (атак типа bruteforce) и атак типа DoS. может отслеживать неудачные попытки подключения на указанных в конфигурации сервисах и портах и соответственно временно создавать блокирующее правило для отбрасывания трафика с IP адреса.

Установите пакет:

sudo yum install fail2ban-firewalld

Базовая настройка параметров блокирования содержатся в файле /etc/fail2ban/jail.d/00-firewalld.conf:

[DEFAULT]
maxretry = 4
findtime = 10m
bantime = 1m
banaction= firewallcmd-ipset[actiontype=<multiport>],

где:

  • maxretry – количество событий, которые могут произойти до срабатывания триггера (наложение бана);
  • findtime – время в секундах, в течение которого подсчитывается количество событий;
  • bantime – время, на которое будет заблокирован IP-адрес;
  • banaction – действия, которое будет выполняться в случае срабатывания триггера.

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


/etc/fail2ban/jail.d/ssh.conf

[ssh]
enabled = true
port = 30000
filter = sshd
logpath = /var/log/secure
/etc/fail2ban/jail.d/asterisk.conf
[asterisk]
enabled = true
port = 5060,5061
protocol = all
filter = asterisk
action = firewallcmd-ipset[name=asterisk, port="5060,5061", protocol=all]
logpath = /var/log/asterisk/messages
/etc/fail2ban/jail.d/phpmyadmin.conf
[phpmyadmin]
enabled = true
filter = apache-myadmin
port = http,https
action = firewallcmd-ipset[name=phpmyadmin, port="http,https", protocol=tcp]
logpath = /var/log/nginx/error.log

[nginx-http-auth]

enabled = true
filter = nginx-http-auth
action = firewallcmd-ipset[name=nginx, port="http,https", protocol=tcp]
logpath = /var/log/nginx/error.log

Просмотр настроенных правил:

и заблокированных IP:

fail2ban-client status ssh

Пример. Удалить из списка заблокированных клиентов для сервиса asterisk все адреса из подсети 192.168.0.0/16:

sudo fail2ban-client set asterisk unbanip 192.168.*

4.4. Настройка аутентификации SSH по ключу

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

  • открытый (публичный) ключ;
  • закрытый (приватный) ключ [11].

Протокол SSH использует асимметричные алгоритмы шифрования, в которых, как уже было сказано, данные/соединение передачи данных шифруется одним ключом, расшифровывается другим. открытый ключ помещается на сервер SSH, а закрытый хранится у пользователя, указывается в конфигурации клиента SSH. Как только открытый ключ будет помещен в список доверенных ключей и, если разрешено использование аутентификации по ключу в конфигурации SSH сервера, вы сможете подключиться по SSH к серверу, используя приватный ключ для аутентификации, без необходимости вводить пароль для входа в систему. Хотя пара ключей может быть сгенерирована без дополнительной защиты, лучшая рекомендация с точки зрения безопасности — использовать ключи с фразой-паролем.

Традиционно для SSH используется криптоалгоритм RSA, но в последнее время в OpenSSH по умолчанию используются криптоалгоритмы, основанные на вычислениях по эллиптических кривым Монтгомери – Curve25519 (обмен ключами) и Эдвардса – EdDSA (генерация ключей). Наиболее распространенный вариант реализации EdDSA, Ed25519 обеспечивает лучшую безопасность по сравнению с RSA при меньшей длине ключа, что также означает и большую производительность при генерации пар ключей. Из недостатков стоит отметить, что, к сожалению, нельзя использовать открытый ключ Ed25519 для шифрования/подписи файлов, как в случае с открытым ключом RSA.

Далее Вам предлагается настроить в рамках работы аутентификацию SSH по ключу без парольной фразы. Сгенерируйте новый ключ командой (после ключа С подставьте произвольный комментарий, обычно он поясняет принадлежность ключа):

ssh-keygen -t ed25519 -C "pbx server"

Не заполняйте (оставьте значения по умолчанию) запрашиваемые параметры, место сохранения и парольную фразу (passphrase) во время процесса генерации пары ключей.

Убедитесь, что оба ключа сгенерированы (есть файлы id_ed25519 id_ed25519.pub в директории ~/.ssh)

Просмотр приватного ключа:

Просмотр публичного ключа:

cat ~/.ssh/id_ed25519.pub

Для разрешения использовать данную пару ключей для аутентификации необходимо создать файл ~/.ssh/authorized_keys и скопировать в него данные публичного ключа (вывод команды cat ~/.ssh/id_ed25519.pub).

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

chmod 700 ~/.ssh

chmod 700 ~/.ssh/authorized_keys

Перезапустите демон OpenSSH:

sudo systemctl restart sshd

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

Загрузите на свой компьютер файл id_ed25519 из .ssh/. Формат файлов ключей, используемый OpenSSH, не подходит для PuTTY, поэтому сначала полученный приватный ключ придется сконвертировать в используемый PuTTY формат ppk. Запустите программу PuTTYgen, выберите Conversions – Import key, укажите файл с приватным ключом, нажмите Save private key, согласитесь на сохранение приватного ключа без парольной фразы, укажите размещение файла с приватным ключом в формате ppk, который будет использовать PuTTy для аутентификации (Рисунок 4.1).

picture

Рис 4.1. Размещение файла с приватным ключом в формате ppk

Откройте новое окно PuTTY, слева в пункте Connections разверните подпункт SSH, в нем выберите подпункт Auth и в поле Private key for authentication укажите путь к сконвертированному файлу приватного ключа в формате ppk (Рисунок 4.2).

picture

*Рис 4.2. Указание пути к сконвертированному файлу приватного ключа в формате ppk. *

Перейдите в пункт Session, введите IP адрес CentOS, укажите протокол SSH, в поле Saved Sessions укажите имя, под которым хотите сохранить это подключение, нажмите Save (Рисунок 4.3).

picture

Рис 4.3. Настройка параметров подключения

Теперь вы можете подключаться к серверам, используя заранее настроенные параметры сессии, двойным щелчком мыши по соответствующей сохраненной сессии. Попробуйте подключиться к CentOS, если все было сделано правильно, после ввода имени пользователя появится сообщение об аутентификации с публичным ключом “комментарий вашего ключа” и вы получите доступ к системе без запроса пароля. Этот же файл закрытого ключа можно использовать и в WinSCP.

4.5. Инфраструктура открытого ключа

Приведенный выше пример использования асимметричного шифрования для защиты соединения подходит для ограниченного доступа к серверу, когды мы сами генерируем пару ключей и уверены в их идентичности. Однако такой принцип совершенно не подходит для защиты соединения к публичным сервисам, например, для защиты HTTP (использование аналогичной схемы для HTTPS приведет к необходимости заранее сохранять ключ к КАЖДОМУ сайту, который пользователь планирует посетить). Кроме того, необходимо при подключении однозначно удостовериться, что удаленная сторона является той, кем представляется (то есть дополнительно к ключу необходимо получать достоверную информацию о его владельце), что ключ не был отозван вследствие компрометации приватной части или других причин. Для решения данной проблемы используется инфраструктура открытого ключа (PKI), использование которой подразумевает создание специальных электронных документов — сертификатов, выдаваемых доверенными удостоверяющими центрами субъектам, подлинность которых необходимо удостоверить (обычно используется доменное имя, но можно использовать IP адрес или даже собственное имя для выпуска личного сертификата). Удостоверяющие центры, с помощью которых можно как выпустить сертификат, так и при необходимости проверить подлинность выпущенного ранее, являются доверенной третьей стороной.

Сертификат – это подписанный электронной подписью документ, содержащий публичный ключ, сведения о том, кому, когда и кем выдан данный сертификат, некоторую дополнительную информацию о владельце, а также срок действия сертификата, цели его использования, алгоритм подписи и тд. Поскольку от сертификата в первую очередь требуется обеспечение однозначной идентификации удаленной стороны при соединении/передаче данных, т.е. определении, что удаленная сторона действительно является тем, за кого себя выдает, необходимо, чтобы на клиентской стороне был или “правильный” сертификат, с которым будет сравниваться предложенный сервером сертификат при установлении соединения, что опять же ведет к необходимости хранить всевозможные сертификаты в локальном хранилище, либо должен использоваться способ проверить подлинность сертификата, не имея его “эталона”. Такой способ заключается в использовании локального хранилища сертификатов в ОС для хранения сертификатов доверенных удостоверяющих центров сертификации. Получив при соединении от удаленной стороны сертификат и определив на основе содержащейся в нем информации удостоверяющий центр (чаще всего корневые центры сертификации не выдают сертификаты, а удостоверяют другие центры, образуя цепочку от корневого центра до непосредственно центра, выпустившего данный сертификат), можно проверить по цепочке CA сертификат и соответственно доверять ему или нет, при условии того, что Вы доверяете или не доверяете CA в цепочке.

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

Минимальная рекомендуемая конфигурация для использования в реальной производственной среде – корневой CA и промежуточный CA, выдающий сертификаты по требованиям. Если ключ CA будет скомпрометирован, потребуется обновить ключ и, соответственно, корневой сертификат тоже. Это приведёт к тому, что все сертификаты, подписанные этим CA станут недействительны, для избежания подобной ситуации и используется многоуровневая структура, чтобы снизить риск компрометации приватных ключей корневых CA, которые строго рекомендуется развертывать на изолированных физических серверах с отсутствием (постоянного) подключения к сети (вплоть до того, что требуется вывести из строя все сетевые адаптеры).

4.6. Создание локального CA с помощью OpenSSL

Для генерации ключей RSA, создания и подписания сертификатов может использоваться OpenSSL – пакет с криптографической библиотекой со свободным и открытым исходным кодом, которая предоставляет инструменты для работы с цифровыми сертификатами. В данной работе для упрощения мы будем выдавать сертификаты конечным потребителям от имени корневого CA и не будем касаться процедуры отзыва сертификатов.

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

В рамках данной работы мы храним сертификаты и ключи в домашней директории пользователя, но стоит отметить, что для реального CA правильнее будет хранить сертификаты и ключи в специально существующих для этого директориях /etc/pki/tls/certs:

/etc/pki/tls/private.

Сгенерируйте защищенный приватный ключ будущего CA длиной 4096 бит c помощью следующей команды:

Затем выпустите самоподписанный корневой сертификат с указанными после ключа subj параметрами (в CN вместо voip.local можете подставить hostname CentOS) с помощью следующей команды:

10000 -out rootCA.crt -subj ‘/C=RU/ST=Moscow/L=Zelenograd/O=MIET/OU=TCS/CN=voip.local CA’

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

Сгенерируйте ключ для клиентского сертификата:

Сгенерируйте запрос на подпись сертификата с указанием параметров (в CN подставьте IP адрес CentOS):

Выпустите сертификат согласно запросу, подписав его ранее выпущенным сертификатом CA:

Посмотреть данные сертификата:

Проверка, что сертификат действительно выпущен указанным CA:

*Если бы сертификат был выдан промежуточным центром, то пришлось бы добавить данные о сертификатах всех промежуточных центров, чтобы сервер отсылал клиенту корректные данные о цепочке сертификатов.*

Создайте каталог для сертификатов SSL, используемых NGINX:

Скопируйте сертификаты, предназначенные для phpmyadmin в созданную директорию:

Сгенерируйте файл параметров алгоритма обмена ключами Диффи-Хеллмана для усиления стойкости используемых шифров и использования forward secrecy. Эта технология позволяет уменьшить возможный ущерб при компрометации ключа путем генерации отдельного ключа для каждой сессии (а не использовать один общий ключ).

В файле конфигурации для сайта phpMyAdmin секцию server приведите к следующему виду:

server {

    listen       443 ssl http2;
    server_name  _;
    ssl_protocols         TLSv1.2 TLSv1.3;
    ssl_certificate     /etc/nginx/ssl/pma.crt;
    ssl_certificate_key /etc/nginx/ssl/pma.key;
    ssl_session_timeout               10m;
    ssl_session_cache      shared:TLS:10m;
    ssl_session_tickets               off;
    ssl_ciphers          HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers          on;
    ssl_dhparam /etc/nginx/ssl/dhparam.pem;


    root /var/www/phpmyadmin;
    charset utf-8;
    index  index.php index.html index.htm;
    location / {
        try_files $uri /index.php?$args;
    }
    location ~ .php$ {

        try_files  $uri =404;

        fastcgi_pass unix:/run/php-fpm/www.sock;
        fastcgi_index index.php;
        fastcgi_param HTTPS on;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param QUERY_STRING    $query_string;
        include fastcgi_params;
    }

В начало того же файла с конфигурацией для сайта phpMyAdmin добавьте еще одну секцию server для перенаправления всех запросов от клиентов с порта 80 (HTTP) на 443 порт (HTTPS).

server {

        listen 80;
        server_name _;
        location / {
            return 301 https://$host$request_uri;
        }
    }

Проверьте корректность файла конфигурации sudo nginx -t.
Перезапустите NGINX sudo systemctl restart nginx.

Теперь покажем, как можно проверить работоспособность сервера, использующего SSL/TLS с помощью OpenSSL клиента, это также полезно использовать при устранении ошибок/неисправностей:

openssl s_client -host localhost -port 443

При работоспособном HTTPS сервере верхняя часть вывода должна выглядеть подобно приведенному ниже, указано состояние (CONNECTED), отображена цепочка сертификации и результаты проверки валидности сертификатов (возврат 1 означает успешное прохождение) (Рисунок 4.4):

picture

Рис 4.4. Проверка работоспособности HTTPS сервера

Для доступа к порту 443 потребуется добавить его в список разрешенных:


sudo firewall-cmd --add-service=https --permanent

Зайдите на веб-интерфейс phpMyAdmin. Браузер должен предупредить об угрозе безопасности вследствие недоверенного издателя сертификата. На данном этапе игнорируйте это предупреждение.

Если веб-интерфейс недоступен, проверьте, что прослушивается 443 порт (присутствует в выводе команды ss -tlpn), проверьте права доступа на сертификаты (владелец – nginx).

4.7. Защита сайта

Для дополнительной защиты доступа к некоторым сайтам/разделам можно использовать несколько различных механизмов аутентификации и авторизации, рассмотрим один из простейших, базовую аутентификацию HTTP. При ее использовании сервер при обращении к защищенному ресурсу будет посылать ответ 401 Unauthorized и добавлять дополнительный заголовок HTTP WWW-Authenticate с указанием схемы (Basic в данном случае) и сопутствующих параметров аутентификации. Браузер, получив такой ответ, отображает окно ввода учетных данных и потом отсылает их в незашифрованном виде, вставляя заголовок Authorization. При использовании HTTPS такая схема достаточно безопасно, поскольку заголовок шифруется вместе с данными.

Для использования базовой аутентификации с NGINX, необходимо установить пакет htpasswd для создания хэшированных скрытых одноименных файлов, содержащих имена пользователей и пароли. Пакет входит в состав утилит для веб-сервера Apache и устанавливается следующей командой:

sudo yum install httpd-tools

Создайте пользователя developer (после ввода данной команды система запросит ввод пароля для этого нового пользователя, его задайте самостоятельно):

sudo htpasswd -c /etc/nginx/conf.d/.htpasswd developer

Теперь осталось только указать NGINX, для каких сайтов/локаций требуется использовать созданный файл. Вставьте следующие строки в локацию, соответствующую phpMyAdmin внутри секции server для 443 порта:

auth_basic

«Restricted Access!»;

auth_basic_user_file

/etc/nginx/conf.d/.htpasswd;

4.8. Защита соединений SIP RTP для Asterisk

Протоколы SIP и RTP передают все данные в открытом виде, как Вы могли сами убедиться, анализируя их сообщения в Wireshark, для защиты передаваемых данных были созданы протокол Secure SIP (SIPS) для защиты сигнального трафика и протоколы Secure RTP (SRTP) и Z RTP (ZRTP) для защиты медиа трафика. Аналогично протоколу HTTPS, протоколам SIPS SRTP для безопасной передачи c шифрованием данных сигнального и медиа трафика также требуется сертификат.

Сгенерируйте ключ и сертификат для сервера Asterisk, в CN вместо IP_addr подставьте IP адрес CentOS


cd ~/ca

openssl genrsa -out asterisk.key 2048

openssl req -new -key asterisk.key -out asterisk.csr -subj '/C=RU/ST=Moscow/L=Zelenograd/O=MIET/OU=TCS/CN=IP_addr'

openssl x509 -req -in asterisk.csr -days 365 -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out asterisk.crt

Сгенерируйте ключ и сертификат для SIP-клиента с номером XXXX (подставьте существующий в Вашей конфигурации номер), он будет подписан не корневым сертификатом, а сертификатом, выданным для Asterisk.


openssl genrsa -out clientXXXX.key 2048

openssl req -new -key clientXXXX.key -out clientXXXX.csr -subj '/C=RU/ST=Moscow/L=Zelenograd/O=MIET/OU=TCS/CN=XXXX'

openssl x509 -req -in clientXXXX.csr -days 365 -CA asterisk.crt -CAkey asterisk.key -CAcreateserial -out clientXXXX.crt

Задание. Сгенерируйте таким образом сертификат для каждого клиента.

Создайте директорию для хранения ключей и сертификатов Asterisk:

sudo mkdir /etc/asterisk/keys && umask 277 /etc/asterisk/keys

Скопируйте в эту директорию ключ и сертификат для Asterisk и клиента.

Установите владельца директории и файлов на asterisk:

sudo chown -R asterisk.asterisk /etc/asterisk/keys

Для возможности клиентам использовать SIPS и SRTP, необходимо внести изменения в конфигурацию PJSIP. Для каждого клиента, описанного в таблице ps_endpoints БД asteriskdb значение параметра transport, измените на tls-transport, добавьте параметры со следующими значениями (Табл. 4.1).

picture

Таблица 4.1

Добавьте новую секцию tls-transport в начало файла /etc/asterisk.pjsip.conf

[tls-transport]

type=transport

protocol=tls

bind=0.0.0.0:5061

direct_media=no;

cert_file=/etc/asterisk/keys/asterisk.crt

priv_key_file=/etc/asterisk/keys/asterisk.key

cipher=ADH-AES256-SHA,ADH-AES128-SHA

method=tlsv1

allow_reload=true


Перезапустите службу Asterisk для применения настроек нового транспорта.

Для проверки работоспособности осталось сконфигурировать клиент. Для установления защищенного соединения клиенту потребуется сертификат. С помощью WinSCP перенесите на хостовой компьютер сертификат, сгенерированный для клиента. Запустите клиент PhonerLite, во вкладке Конфигурация, разделе Сеть смените порт на указанный в конфигурации PJSIP для TLS, протокол смените на TLS, в разделе Кодеки отметьте пункт SRTP, в разделе Сертификаты в поле Сертификат клиента укажите путь до клиентского сертификата, сохраните параметры. Убедитесь, что клиент зарегистрировался через TLS-соединение (внизу окна рядом с индикатором регистрации появится символ ключа с надписью TLS), совершите вызов, убедитесь, что голосовой трафик передается.

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

Для того, чтобы добавить корневой сертификат в список доверенных центров сертификации, перенесите rootCA.crt на хостовой компьютер, откройте оснастку MMC Сертификаты (certmgr.msc). Аналогично приведенному ниже выполните импорт сертификата, укажите расположение файла rootCA.crt, не изменяйте остальные параметры хранилища. После успешного импорта Вы сможете найти сертификат в общем списке справа (Рисунок 4.5).

picture

Рис 4.5. Добавление корневого сертификата в список доверенных центров сертификации

Снова попробуйте авторизовать PhonerLite на сервере Asterisk, теперь проверка должна пройти удачно.

4.9. Настройка безопасности PHP

В файле /etc/php/php.ini найдите/добавьте следующие параметры:

#Отключаем опасные функции

disable_functions = phpinfo, system, mail, exec

#Максимальное время исполнения скрипта

max_execution_time = 30

#Максимальное время, которое может потратить скрипт на обработку данных запросаtime = 30

max_input_time = 60

#Максимальное количество памяти, выделяемое каждому скрипту

memory_limit = 8M

#Максимальный размер данных, отсылаемых скрипту с помощью метода POST

post_max_size = 8M

#Максимальный размер загружаемых файлов

upload_max_filesize = 2M

#Не показывать ошибки PHP-скриптов пользователям

display_errors = Off

#Включаем Safe Mode

safe_mode = On

#Включаем SQL Safe Mode

sql.safe_mode = On

#Защищаемся от утечки информации о PHP

expose_php = Off

#Ведем логи

#Запрещаем открытие удаленных файлов

Данные параметры повышают защищенность веб-сервера, ограничивая возможности по исполнению вредоносного кода PHP.

Заключение

В данном учебно-методическом пособии рассматриваются основы конфигурации программной АТС Asterisk. Показаны основные возможности используемой АТС, локальное подключение, организация соедиения между двух и более программных АТС. Приведены принципы конфигурации с использованием локальной или внешней базы данных, а также принципы взаимодействия с БД в консольном и графическом режимах работы. Также в работе рассмотрены основы обеспечения защищенного соединения с программной АТС, использования удаленного доступа с поддержкой ключей шифрования, защита загрузчика операционной системы Linux, продвинутая конфигурация протокола SSH.

В результате выполнения описанных в учебно-методическом пособии работ, студенты (бакалавриата и магистратуры) получают понимание принципов конфигурации программной АТС и работы IP-телефонии в целом, включая основные телекоммуникационные протоколы и технологии IP-телефонии (SIP, H.323 и др.), принципы взаимодействия АТС между собой, а также основы работы с ОС Linux. Данный материал позводит сформировать базовые знания для проведения научных исследований и разработок в области телекоммуникационного оборудования и систем связи.

Библиографический список

  1. Шиндер Д.Л. Основы компьютерных сетей : Пер. с англ. / Д.Л. Шиндер. — М. : Вильямс, 2002. — 652 с.
  2. Сакалема Д.Ж. Подвижная радиосвязь / Сакалема Домингуш Жайме; Под ред. О.И. Шелухина. — М. : Горячая линия-Телеком, 2012. — 512 с.
  3. Спортак М. Компьютерные сети и сетевые технологии : Пер. с англ. / М. Спортак, Ф. Паппас. — Киев : ТИД ДС, 2002. — 711 с.
  4. Таненбаум Э. Компьютерные сети : Пер. с англ. / Э. Таненбаум. — 3-е изд. — СПб. : Питер, 2002. — 846 с.
  5. Андэрсон К. Локальные сети. Полное руководство : Пер. с англ. / К. Андэрсон, М. Минаси. — СПб. : Век+ : ЭНТРОП : КОРОНА принт, 1999. — 620 с.
  6. Блам Р. Администрирование почтовых серверов sendmail / Р. Блам. — 2-е изд. — М. : ИНТУИТ, 2016. — 702 с.
  7. Мельников Д.А. Информационные процессы в компьютерных сетях : Протоколы, стандарты, интерфейсы, модели… / Д.А. Мельников. — М. : Кудиц-образ, 1999. — 256 с.
  8. Кульгин М. Технологии корпоративных сетей : Энциклопедия / М. Кульгин. — СПб. : Питер, 2000. — 699 с.
  9. Олифер В.Г. Компьютерные сети. Принципы, технологии, протоколы : Учеб. пособие для вузов / В.Г. Олифер, Н.А. Олифер. — СПб. : Питер, 2001. — 668 с.
  10. Соколов А.В. Защита информации в распределенных корпоративных сетях и системах / А.В. Соколов, В.Ф. Шаньгин. — М. : ДМК Пресс, 2002. — 655 с.
  11. Рябко, Б. Я. Криптографические методы защиты информации : учебное пособие / Б. Я. Рябко, А. Н. Фионов. — 2-е изд., стер. — Москва : Горячая линия-Телеком, 2013. — 229 с.

IP-АТС Asterisk умеет все то же, что и традиционная АТС, плюс поддерживает актуальные для бизнеса VoIP-протоколы: голосовую почту, конференц-связь, центр обработки звонков, интерактивное меню, хранение записей. Рассказываем, как настроить с нуля базовый функционал «Астериск» АТС и получить рабочий сервер компьютерной телефонии.

Для примера настройки Asterisk возьмем офис с такими характеристиками:

  • 3 отдела, в которых работают 25 сотрудников;
  • используются трехзначные телефонные номера;
  • услуги предоставляет один SIP-провайдер.

Не советуем устанавливать Asterisk из репозитория, так как при данной установке может установиться не та версия Asterisk и необходимых к ней зависимостей. В данном случае используем установку Asterisk из исходников.

В разных операционных системах (Cent Os, Ubunty и др.) отличаются команды и необходимые зависимости.

Файлы для первоначальной настройки

Настройка Asterisk – это, по сути, редактирование конфигурационных файлов в директории /etc/asterisk/. К таким файлам относят:

  • pjsip.conf – настройка мультимедийной библиотеки PJSIP;
  • extensions.conf – настройка диалплана: вызовы, переадресация, мелодии на удержании, автосекретарь и прочее;
  • asterisk.conf – настройка путей к используемым папкам Asterisk;
  • cdr.conf – основные настройки отчета о звонках Call Detail Record;
  • rtp.conf – настройки протокола RTP;
  • features.conf – параметры перехвата и парковки вызова, максимальное время набора и переадресации, DTMF-коды абонентских функций;
  • modules.conf – данные о модулях загрузки при старте Asterisk;
  • musiconhold.conf – конфигурации музыки на удержании;
  • iax.conf – соединения по протоколу IAX для объединения между собой двух и более АТС;
  • voicemail.conf – параметры голосовой почты;
  • logger.conf – параметры журналирования работы Asterisk.

Установка Asterisk из исходников

Сборка и установка необходимых зависимостей и пакетов.

Вначале нужно установить дополнительные пакеты, которые необходимы для установки и работы Asterisk. Без части из этих пакетов Asterisk вообще откажется устанавливаться (к примеру, если отсутствует gcc). Без некоторых пакетов Asterisk установится и даже будет работать, однако часть функционала окажется недоступна.

Например, пакет bison необходим для обработки выражений в файле extensions.conf. Еще пример: libnewt необходим для работы интерфейса управления astman. Для сервера Asterisk он не требуется, но без этого пакета у вас не будет приложения astman, которое является отдельной программой.

Приводим пример установки Asterisk 13 в системе Cent OS 6.9:

yum -y install gcc gcc-c++ make ncurses-devel libxml2-devel sqlite-devel bison kernel-headers kernel-devel openssl openssl-devel newt newt-devel flex curl sox binutils

Для 12-13 версии Asterisk требуется установка пакетов uuid и janson. Для установки библиотеки uuid в RHEL / Centos выполните команду:

yum -y install libuuid-devel

. Для установки библиотеки jansson в RHEL / Centos выполните команду:

yum -y install jansson-devel (предварительно требуется установка репозитория epel): yum install epel-release

После обновляем систему до последней версии командой yum update –y и перегружаем ее: reboot

Установка и установка их исходников

Настройка Asterisk выполняется в чистом виде, без дополнительных плат расширения и модемов. Так вы получите максимально эффективное и рабочее решение – программную АТС, которую можно легко переносить с одного сервера на другой. Для этого необходимо установить Asterisk с нуля, инсталлировать pjproject с jansson, обновить систему и отключить SELinux.

Для начала отключим Selinux. Для этого заходим /etc/selinux/config и ставим: SELINUX=DISABLED.

Также выключаем FireWall (iptables):

  1. Проверка статуса: service iptables status;
  2. Отключение: service iptables stop
  3. Отключение из автозагрузки: chkconfig iptables off
  4. Перегружаем систему: reboot

Скачайте и инсталлируйте pjproject:

d /usr/src

git clone git://github.com/asterisk/pjproject pjproject

cd pjproject/

./configure –libdir=/usr/lib64 –prefix=/usr –enable-shared –disable-sound –disable-resample

make dep

make

make install

ldconfig

ldconfig -p | grep pj

Для конвертации mp3-файлов необходим пакет Lame. Установим его из репозитория:

rpm -Uvh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm

yum repolist — проверка установленных репозиториев

Далее устанавливаем сам пакет: yum install lame

Скачиваем и устанавливаем библиотеку Libpri:

cd /usr/src/

wget http://downloads.asterisk.org/pub/telephony/libpri/libpri-1.4-current.tar.gz

tar xvfz libpri-1.4-*.tar.gz

cd /usr/src/libpri-1.4.*

make

make install

Если команды wget – не существует, то устанавливаем ее командой yum –y install wget

Далее скачиваем и устанавливаем сам asterisk 13:

cd /usr/src/

wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-13-current.tar.gz

tar xvfz asterisk-13-current.tar.gz

cd asterisk-13.*

contrib/scripts/get_mp3_source.sh

./configure –libdir=/usr/lib64

Если при проверки и подготовки сборки необходимых настроек, моделей никаких ошибок нету, то появиться в консоли иконка Asterisk

Настройка Asterisk АТС - изображение 1

make menuselect — выбираются все необходимые параметры, но в принципе можно оставить по умолчанию, главное чтобы были включены необходимые драйверы каналов

Выберите модули и звуки (можно оставить по умолчанию). В модулях выбираем только sip. (pjsip не ставим):

Настройка Asterisk АТС - изображение 2

Настройка Asterisk АТС - изображение 3

Настройка Asterisk АТС - изображение 4

Установите озвучку для core и extra (для второй она доступна на русском языке). Рекомендуем кодеки g729, alaw, ulaw, ,gsm. Далее уже на Ваш вкус какие кодеки необходимы.:

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

Продолжайте инсталляцию:

make

make install

make config

make samples

ldconfig

При успешной установки Asterisk видно в строчках лога эмблему Asterisk (появляется после этапа configure).

Добавьте Asterisk в автозапуск и приступайте к работе:

chkconfig asterisk on

service asterisk start

Проверьте корректность запуска через консоль:

asterisk -r

Перегрузите компьютер чтобы проверить автоматический запуск Asterisk. При вводе asterisk –r мы должны попасть в консоль, как на скрине выше.

Подключение абонентов

Протестируйте работу ATC Asterisk с помощью программного сервиса звонков. Сделайте базовые настройки в файле конфигурации sip.conf (где лежит – /etc/asterisk/sip.conf). По умолчанию в нем много полезных комментариев, но они загромождают код. Рекомендуем сделать копию файла конфигурации и сохранить ее отдельно, а оригинальную очистить от лишнего текста. Пример типовой конфигурации Asterisk:

документация https://asterisk-pbx.ru/wiki/asterisk/cf/chan_sip

[general]

context = default

realm = Test Aster

transport=udp

useragrent= Test Asterisk 13

nat=yes

bindaddr=0.0.0.0

bindport=5060

srvlookup=yes

disallow=all

allow=ulaw

allow=alaw

language=ru

trustrpid = yes

sendrpid = yes

allowexternalinvites=no

allowguest=no

alwaysauthreject=yes

defaultexpiry=150

limitonpeers=yes

maxexpiry=3600

minexpiry=60

registerattempts=0

registertimeout=30

Настройка peer — https://www.voip-info.org/wiki/view/Asterisk+config+sip.conf

[101]

context=local

dtmfmode=rfc2833

host=dynamic

type=friend

username=101

qualify=yes

secret=101a

disallow=all

allow=ulaw

allow=alaw

insecure=invite,port

nat=yes

[102]

context=local

dtmfmode=rfc2833

host=dynamic

type=friend

username=102

qualify=yes

secret=102a

disallow=all

allow=ulaw

allow=alaw

insecure=invite,port

nat=yes

Для применения изменений Sip перегружаем SIP в консоли астера (asterisk -r) командой sip reload

Добавление плана звонков

План звонков при настройке Asterisk потребуется для совершения вызовов. Найдите файл конфигурации extensions.conf, сделайте его резервную копию, а оригинальную версию очистите от комментариев и запишите в нее следующее:

extension — http://asterisk.ru/knowledgebase/Asterisk+config+extensions.conf

[local]

;для исход. внутренних номеров между собой

exten => _XXX,1,Noop(Test ${CALLERID(num)} Hat)

exten => _XXX,n,Dial(SIP/${EXTEN})

Так вы добавите план звонков на трехзначные номера. В нашем случае это номера 101 и 102 (в sip.conf)

Перезагрузите план набора (диалплан):

dialplan reload

Не страшно, если на экране появятся сообщения об ошибках – вы еще не завершили настройку и исправите их на следующих шагах.

Проверьте список пользователей командой:

sip show peers

Список пользователей и их пароли

Пользователи, пароли и контекст

Установите любую программную «звонилку» или воспользуйтесь реальным телефоном. В первом варианте вам понадобится настроить софт для работы с АТС. В нашем примере используем Zoiper 5. Пример настроек указан в нашей вики http://wiki.new-tel.net/doku.php?id=Zoiper-PC:

Рекомендованные настройки для программной «звонилки»

Настройки софтовой «звонилки» для проверки Asterisk

Все дальнейшие настройки звонилки и принцип работы указан в ссылке выше.

Теперь проверьте подключенные пиры с помощью команды:

Sip show peers

Если все верно, вы увидите такую строку:, в котором видно нашу SIP-линию и статус подключения SIP-линии:

Sip-линия IP-address A 5060 OK Cached RT

После настройки Asterisk протестируйте звонки на двух абонентах. Для этого подключите еще один физический или программный телефон. Позвоните от одного абонента другому (набрав с 101 на 102 и наоборот). Проверьте содержимое файла /var/log/asterisk/full. – там появится запись о последнем вызове. Также там фиксируется все сообщения и ошибки, возникаемые при работе Asterisk.

Записи обо всех последующих вызовах тоже попадут в этот файл. Позже их можно будет перебросить в базу данных.

Настройка транка

Зарегистрируйтесь у SIP-провайдера и получите настройки транков. Необходимую информацию – логин, пароль, адрес сервера, настройки подключения и номера для тестирования – можно найти в личном.

В конец файла sip.conf добавьте нового пира, как это рекомендует ваш провайдер:

[test_trunk]

context=trunk_cid

dtmfmode=rfc2833

host=ip-адрес sip-провайдера

type=friend

username=test_trunk

qualify=yes

secret=password ;пароль для подключения транка

disallow=all

allow=ulaw

allow=alaw

allow=g729

insecure=invite,port

nat=yes

Пусть Asterisk заново перечитает файл:

Sip reload

Если настройка программы в IP АТС Asterisk прошла успешно, в консоли появится такая строка:

Sip-линия IP-address A 5060 Unmonitored Cached RT

Редактирование dialplan

Чтобы настроить входящие и исходящие звонки в IP-телефонии Asterisk, отредактируйте файл extensions.conf, добавив в конце следующий код (с контекста local):

;для исход по транку (пример указан с префиксом 123#).

exten => _123#8XXXXXXXXXX,1,Set(CALLERID(all)=78125000963)

exten => _123#8XXXXXXXXXX,n,Noop( (CALLERID(all) + Boris)

exten => _123#8XXXXXXXXXX,n,Dial(SIP/7${EXTEN:5}@Ip-address)

избавление от префикса 123# и заменой цифры 8 на 7. Далее отправляется звонок на хост IP провайдера (указан в sip.conf)

[trunk_cid]

для вход. по транку на 101.

exten => _XXXXXXXXXX,1,Dial(SIP/101,30,r)

Перезагрузите Asterisk командой core restart now и снова сделайте тестовый звонок. Информация о нем добавится в файле full

Пример лога консоли Asterisk:

Настройка Asterisk АТС - изображение 5

На этом базовая настройка IP-телефонии «Астериск» завершена. Чтобы расширить функционал после того, как Asterisk установлен, настройте приветствие и голосовое меню (ivr), активируйте голосовую почту, настройте очередь (queue) входящих звонков, сбор и просмотр статистики (cdr viewer), запись (record) разговоров, поставьте музыку на ожидание (on hold), настройте конференции, перевод, перехват и переадресацию звонков.

Ошибки в настройке Asterisk

Рассмотрим распространенные ошибки при настройке виртуальной АТС «Астерикс» и дадим инструкции, которые помогут их .

  • Asterisk не регистрируется на сервере и возвращает ответ Forbidden в режиме отладки.

    Причина: некорректно введен пароль, указан SIP ID или домен. Проверьте содержимое файла sip.conf.

  • Сбрасываются входящие звонки.

    Причины: внутренний пользователь не зарегистрирован. Проверьте регистрацию командой sip show registry.

  • Не проходят исходящие вызовы.

    Причина: некорректно задан шаблон номера (пропущен символ «_» перед шаблоном).

  • Звук проходит только в одну сторону.

    Причина: вы используете NAT. Включите debug и используйте tcpdump – так вы увидите, куда уходят запросы и аудиотрафик.

Расширенные настройки Asterisk

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

Настройка голосового меню (IVR)

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

Для настройки IVR перейдите в файл конфигурации extensions.conf. Все изменения необходимо внести в план набора dialplan. Общая схема выглядит так: вначале воспроизводится запись с приветствием, затем звонящий слышит предложение ввести номер в тональном режиме. Нам нужно обработать эту информацию и затем в зависимости от выбранного сценария перевести звонящего на конкретного сотрудника, очередь или другой план набора.

Голосовое приветствие должно быть сохранено в формате .waw или .gsm, это можно сделать во многих приложениях для звукозаписи. Если вы используете готовый файл в другом формате, воспользуйтесь пакетом для конвертации sox.

В Asterisk инструкция для изменения или создания IVR выглядит следующим образом:

а) в файл конфигурации добавьте код:

[outcaling]

exten => 222,1,Answer()
same => n,Background(basic-pbx-ivr-main)
exten => _XXX,1,Dial(SIP/${EXTEN},,m)

б) перезапустите настройки:

asterisk -x «dialplan reload»

в) настройте возможность выбора отдела:

exten => 333,1,Answer()
exten => 333,2,Background(basic-pbx-ivr-main)
exten => 333,3,WaitExten(5)
exten => 1,1,Goto(managers,s,1)
exten => 2,1,Goto(support,s,1)

[managers]
exten => s,1,Ringing
same => n,Wait(1)
same => n,Background(/var/lib/asterisk/sounds/wav/managers)
same => n,Waitexten(5)
exten => 1,1,Dial(SIP/201)
exten => 2,1,Dial(SIP/202)
exten => 0,1,Goto(outcaling,333,1)

[support]
exten => s,1,Ringing
same => n,Wait(1)
same => n,Background(/var/lib/asterisk/sounds/wav/support)
same => n,Waitexten(5)
exten => 1,1,Dial(SIP/101)
exten => 2,1,Dial(SIP/102)
exten => 0,1,Goto(outcaling,333,1)

Снова перезапустите настройки:

asterisk -x «dialplan reload»

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

exten => 333,1,Answer()
exten => 333,2,Background(basic-pbx-ivr-main)
exten => 333,3,WaitExten(5)
exten => 1,1,Goto(managers,s,1)
exten => 2,1,Goto(support,s,1)
exten => t,1,Dial(SIP/101)
exten => i,1,Background(invalid)
same => n,Goto(outcaling,333,3)

При наборе внутреннего номера могут возникнуть проблемы. Если это случилось, проверьте режим DTMF – это аналоговый сигнал для набора телефонного номера. Чтобы настроить sip-пир на определенный способ передачи DTMF, добавьте в файл конфигурации такую строку:

dtmfmode=rfc2833

Голосовая почта

Если звонящий долго находится на линии в ожидании ответа оператора, ему можно предложить оставить голосовое сообщение. Для реализации этого функционала откройте файл voicemail.conf и добавьте в него такой код:

130 => 9999,Number 130,ms@mail.ru

100 => 9999,Number 100,ms@mail.ru,

где 130 – внутренний номер оператора, 9999 – пароль доступа к ящику голосовой почты, ms@mail.ru – электронный ящик, на который будет отправлено голосовое сообщение.

Предварительно настройте локальный почтовый сервер или используйте внешний.

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

CLI> voicemail reload

Reloading voicemail configuration…

asterisk*CLI> voicemail show users

Context Mbox User Zone NewMsg

default 130 Number 121 0

default 100 Number 100 0

other 1234 Company2 User 0

3 voicemail users configured.

Добавьте голосовую почту в dialplan:

[call-out]

Номер для записи звуков, окончание записи #

exten => _35X, 1, NoOp()

exten => _35X, n, Wait(2)

exten => _35X, n, Playback(beep)

exten => _35X, n, Record(/tmp/music${EXTEN:2}:wav)

exten => _35X, n, Wait(1)

exten => _35X, n, Playback(/tmp/music${EXTEN:2})

exten => _35X, n, Wait(2)

exten => _35X, n, Hangup()

Управление голосовой почтой

exten => 500,1,VoiceMailMain()

Звонок на внутренний номер

exten => _XXX,1,Dial(SIP/${EXTEN},15)

Звонок на внешний номер

exten => _XXX.,1,Dial(SIP/${EXTEN}@397945)

По умолчанию время ожидания ответа до включения голосовой почты составляет 15 секунд.

Очередь входящих звонков (queue)

Настройка Asterisk с нуля редко предполагает организацию очереди, но мы рассмотрим, как ее реализовать, если ваша компания в этом функционале нуждается. Очередь позволяет управлять потоком звонков и перераспределять их по заданным правилам – например, направлять первому освободившемуся оператору. Для настройки очереди откройте файл queues.conf. Предположим, что у нас два оператора с внутренними номерами 101 и 102. Тогда в конец файла добавьте такой код:

[secretary]

strategy = ringall

member => SIP/100

member => SIP/130

Узнать, какие значения может принимать параметр strategy, который отвечает за принцип распределения вызовов, можно здесь: https://www.voip-info.org/asterisk-call-queues/.

Добавьте в файл extensions.conf подготовленный заранее контекст с голосовым меню, заменив в [ivr-main] строку

exten => t,1,Dial(SIP/100,15)

на строку с таким содержимым:

exten => t,1,Queue(secretary,t)

Перезагрузите конфигурацию Asterisk:

CLI> reload

Статистика звонков (cdr viewer)

Вы можете попробовать разобрать содержимое файла /var/log/asterisk/cdr-csv/Master.csv, где Asterisk по умолчанию сохраняет собранную статистику звонков, но проще воспользоваться другим инструментом. Предлагаем перенести сбор статистики в базу данных MySQL. Для этого запустите сервер mariadb и введите следующие команды:

# systemctl start mariadb

# systemctl enable mariadb.service

# /usr/bin/mysql_secure_installation

Создайте БД и пользователя:

# mysql -uroot -p

MariaDB [(none)]> create database asterisk;

MariaDB [(none)]> use asterisk;

MariaDB [asterisk]> CREATE TABLE `cdr` ( `id` int(9) unsigned NOT NULL auto_increment, `calldate` datetime NOT NULL default ‘0000-00-00 00:00:00’, `clid` varchar(80) NOT NULL default », `src` varchar(80) NOT NULL default », `dst` varchar(80) NOT NULL default », `dcontext` varchar(80) NOT NULL default », `channel` varchar(80) NOT NULL default », `dstchannel` varchar(80) NOT NULL default », `lastapp` varchar(80) NOT NULL default », `lastdata` varchar(80) NOT NULL default », `duration` int(11) NOT NULL default ‘0’, `billsec` int(11) NOT NULL default ‘0’, `disposition` varchar(45) NOT NULL default », `amaflags` int(11) NOT NULL default ‘0’, `accountcode` varchar(20) NOT NULL default », `uniqueid` varchar(32) NOT NULL default », `userfield` varchar(255) NOT NULL default », PRIMARY KEY (`id`), KEY `calldate` (`calldate`), KEY `accountcode` (`accountcode`), KEY `uniqueid` (`uniqueid`), KEY `dst` (`dst`), KEY `src` (`src`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

MariaDB [asterisk]> grant all on asterisk.* to ‘asterisk_user’@’localhost’ identified by ‘12345678’;

Добавьте odbc-коннекторы:

# yum install -y mysql-connector-odbc.x86_64 unixODBC-devel.x86_64

Откройте /etc/asterisk/res_odbc.conf и в конец файла добавьте код:

[asterisk]

enabled => yes

dsn => MySQL-asterisk

username => asterisk_user

password => 12345678

Аналогично с файлом /etc/asterisk/cdr_adaptive_odbc.conf:

[cdr_adaptive_connection]

connection=asterisk

table=cdr

alias start => calldate

Создайте новый файл /etc/odbc.ini и внесите туда такой фрагмент:

[MySQL-asterisk]

Description = MySQL Asterisk database

Driver = MySQL

Server = localhost

User = asterisk_user

Password = 12345678

Socket = /var/lib/mysql/mysql.sock

Database = asterisk

В инструкции «Астериска» предлагают после этого перезапустить его:

# service asterisk restart

Затем проведите тест, совершив пару звонков. После запустите и добавьте в автозагрузку такие строки:

# systemctl start httpd

# systemctl enable httpd

Запись разговоров (record)

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

mkdir /records
chmod 777 /records

Откройте файл extensions.conf и внесите туда такие изменения:

[default]
exten => _XXXX,1,Set(fname=${STRFTIME(${EPOCH},,%Y%m%d%H%M)}-${CALLERID(number)}-${EXTEN})
exten => _XXXX,2,MixMonitor(/records/${fname}.wav)
exten => _XXXX,3,Dial(SIP/${EXTEN},,)

Музыка на ожидании (hold on)

Эта настройка Asterisk позволит выбрать мелодию, которая будут звучать на линии во время ожидания звонка в очереди. По умолчанию мелодии воспроизводятся из директории /var/lib/asterisk/moh. Чтобы добавить свою мелодию в формате mp3, скопируйте ее на сервер любым удобным способом, а затем создайте директорию /var/lib/asterisk/mohmp3 и перекодируйте в ней музыку в «понятный» для системы формат wav:

# mkdir /var/lib/asterisk/mohmp3

# lame —decode /root/music.mp3 /var/lib/asterisk/mohmp3/music.wav

Откройте файл /etc/asterisk/musiconhold.conf и в конец добавьте новый класс музыки musiconhold.conf:

[mp3]

mode=files

directory=mohmp3

К описанию очереди добавьте еще один параметр:

[secretary]

music = mp3

strategy = ringall

member => SIP/100

member => SIP/130

Выполните перезапуск, как сказано в инструкции по настройке Asterisk:

# service asterisk restart

Конференции

Конференции позволяют организовать одновременный разговор между несколькими звонящими. Для их настройки откройте confbridge.conf и добавьте в конец файла:

[confer]

type=bridge

max_members=20

mixing_interval=10

internal_sample_rate=auto

record_conference=yes

В начало файла:

exten => 333,1,Answer()

exten => 333,n,ConfBridge(1,confer)

Теперь при наборе номера 333 звонящий попадет в комнату для конференций.

Поздравляем, установка и настройка Asterisk завершена!

Перевод, перехват и переадресация звонков

По умолчанию для перевода звонков используется команда # + номер, на который нужно перевести звонок. Для успешного перевода нужно, чтобы он был предварительно разрешен в диалплане в команде Dial:

exten => _XXX,n,Dial(SIP/${EXTEN},15,Tt)

В «Астериске» для перевода звонков используется режим Attended Transfer, который по умолчанию выключен. Чтобы использовать его для перенаправления звонков, в файле features.conf необходимо раскомментировать строку:

atxfer => *2

Горячую клавишу для перевода можно назначать произвольным образом.

Перехват звонков в Asterisk работает по умолчанию, дополнительные настройки этой функции не требуются. Комбинация кнопок для перехвата задается в уже знакомом файле features.conf.

Например, чтобы реализовать переадресацию на мобильный номер 222, в dialplan следует добавить строку:

exten => 222,n,Dial(SIP/89151234567@397945)

Чтобы переадресация действовала только на внутренние номера офиса:

exten => 222,n,Dial(SIP/89151234567@397945)

exten => _XXX,n,Dial(SIP/${EXTEN},15,Tt)

А теперь вариант с переадресацией для звонков извне:

exten => 115,n,Dial(SIP/89151234567@397945)

exten => _XXX,n,Dial(SIP/${EXTEN},15,Tt)

Настройка Asterisk с помощью fail2ban

Если у «Астериска» внешний IP-адрес или на него организован переброс с внешних IP-адресов, его необходимо обезопасить от перебора учеток. Проще всего это сделать с помощью fail2ban – специального программного решения для предотвращения вторжений и атак, которые осуществляются методом перебора.

Для начала необходимо инсталлировать fail2ban:

# dnf install fail2ban

Запись событий будем вести в лог. Откроем файл /etc/asterisk/logger.conf и раскомментируем такую его строку:

security => security

Считываем параметры хранения логов:

# asterisk -x «logger reload»

После этого в директории /var/log/asterisk должен появиться файл с названием security, записи из которого будет анализировать инструмент fail2ban.

Открываем файл /etc/fail2ban/jail.conf и в секции [asterisk] меняем путь к файлу и дописываем еще одну важную строку:

logpath = /var/log/asterisk/security

enabled = true

Нужно, чтобы fail2ban запускался автоматически:

# systemctl start fail2ban

# systemctl enable fail2ban

Не забываем, что для корректной работы fail2ban требуется заранее сконфигурированный и запущенный iptables. Учитывайте, что при отключенном firewalld вначале нужно удалить /etc/fail2ban/jail.d/00-firewalld.conf, после чего перезапустить fail2ban, чтобы он заработал.

Настройка обратного звонка

Настройка Asterisk Callback очень удобна в использовании: клиент вводит свой номер телефона в специальную форму на сайте, а спустя какое-то время ему перезванивает специалист компании. Чтобы воспользоваться Asterisk Web Callback, потребуется веб-сервер с поддержкой PHP. Настройки выполняются в файле manager.conf.

[general]

enabled = yes

port = 5038

bindaddr = 0.0.0.0 ;или реальный IP вашего сервера Asterisk

[your_name]

secret=your_secret

deny=0.0.0.0/0.0.0.0

permit=0.0.0.0/0.0.0.0 ;или ip вашего веб-сервера

read = system,call,log,verbose,command,agent,user,config,originate

write = system,call,log,verbose,command,agent,user,config,originate

Теперь работаем со скриптом – определяем IP-адрес Asterisk:

$strHost = «Asterisk IP Address»;

Назначаем пользовательское имя – то, которое ранее задали в файле /etc/asterisk/manager.conf):

$strUser = «your_name»;

Пароль:

$strSecret = «your_secret»;

Канал, куда будут направлены звонки:

$strChannel = «SIP/107»;

В /etc/asterisk/extensions_custom.conf:

[from-script-n]

exten = s,1,Goto(from-internal,600,1)

Чтобы защититься от нежелательных звонков:

$strChannel = «SIP/107»;

В /etc/asterisk/extensions_custom.conf:

/etc/asterisk/extensions_custom.conf

Теперь следует задать длину номера телефона, которую могут указать клиенты в веб-форме (в нашем случае это 11 символов):

if ($length == 11 && is_numeric($strExten))

<table width=»300″ border=»1″ bordercolor=»#630000″ cellpadding=»3″ cellspacing=»0″>

<tr><td>

<font size=»2″ face=»arial,georgia» color=»#630000″>Введите Ваш номер 812XXXXXXX.</font>

<form action=»<? echo $_SERVER[‘PHP_SELF’] ?>» method=»post»>

<input type=»text» size=»20″ maxlength=»11″ name=»txtphonenumber»><br>

<input type=»submit» value=»Позвонить!»>

</form>

</td></tr>

</table>

Сам скрипт:

<?php

$strHost = «127.0.0.1»;

$strUser = «test»;

$strSecret = «test2»;

$strChannel = «Local/s@from-script-n»;

$strContext = «from-script»;

$strWaitTime = «60000»;

$strPriority = «1»;

$strExten = $_POST[‘txtphonenumber’];

$strCallerId = «n <$strExten>»;

$length = strlen($strExten);

if ($length == 11 && is_numeric($strExten))

{

$oSocket = fsockopen($strHost, 5038, $errnum, $errdesc) or die(«Connection to host failed»);

fputs($oSocket, «Action: loginrn»);

fputs($oSocket, «Events: offrn»);

fputs($oSocket, «Username: $strUserrn»);

fputs($oSocket, «Secret: $strSecretrnrn»);

fputs($oSocket, «Action: originatern»);

fputs($oSocket, «Channel: $strChannelrn»);

fputs($oSocket, «Timeout: $strWaitTimern»);

fputs($oSocket, «CallerId: $strCallerIdrn»);

fputs($oSocket, «Exten: $strExtenrn»);

fputs($oSocket, «Context: $strContextrn»);

fputs($oSocket, «Priority: $strPriorityrnrn»);

fputs($oSocket, «Action: Logoffrnrn»);

sleep (1);

fclose($oSocket,128);

?>

<p>

<table width=»500″ border=»2″ bordercolor=»#850000″ cellpadding=»3″ cellspacing=»0″>

<tr><td>

<font size=»2″ face=»verdana color=»#850000″>Идет вызов. Дождитесь, когда зазвонит телефон!<br>Если звонок не поступил в течение 60 секунд, сделайте еще одну попытку.<br><a href=»<?php echo $_SERVER[‘PHP_SELF’] ?>»>Повторить</a>$

</td></tr>

</table>

</p>

<?php

}

else

{

?>

<p>

<table width=»500″ border=»1″ bordercolor=»#850000″ cellpadding=»3″ cellspacing=»0″>

<tr><td>

<font size=»2″ face=»verdana» color=»#850000″>Введите номер телефона.</font>

<form action=»<?php echo $_SERVER[‘PHP_SELF’] ?>» method=»post»>

<input type=»text» size=»20″ maxlength=»12″ name=»txtphonenumber»><br>

<input type=»submit» value=»Позвонить!»>

</form>

</td></tr>

</table>

</p>

<?php

}

?>

Настройка черного списка

Эта настройка Asterisk позволяет запретить нежелательные входящие звонки и оставить линию свободной для приоритетных звонков. Работает следующим образом: сверяет, не содержится ли входящий номер в черном списке внутренней базы данных Asterisk. Для проверки используется astdb, на выходе функция возвращает значение «0» (нет в базе данных) или «1» (есть в базе данных).

Для вызова функции используется команда:

BLACKLIST()

Допустим, 2000 – наш абонент, 8882888 – CallerID в черном списке. Тогда:

exten => _2000,1,GotoIf($[${BLACKLIST()}]?black,1)

same => n,Dial(PJSIP/2000,,tr)

exten => black,1,Playback(privacy-you-are-blacklisted)

same => n,Hangup()

Чтобы добавить новый номер в черный список, используем Asterisk CLI (Command Line Interface):

asterisk -rx «database put blacklist 8882888 1»

Допустим, нам нужно текущее содержимое черного списка. Как его получить:

asterisk -rx ‘database show’ | grep blacklist

/blacklist/8882888:1

Чтобы сделать то же самое, но с помощью sqlite cli, выполняем команду:

sqlite> select * from astdb where key like ‘%blacklist%’;

/blacklist/8882888|1

Настройка умной предустановленной переадресации вызовов

За нее отвечает функция FollowMe, сама команда ссылается на профили <followmeid>, которые заданы в файле followme.conf. В общем случае синтаксис команды выглядит следующим образом:

FollowMe(followmeid[,options])

Пример содержимого файла followme.conf:

[4444]

music => default

context => default

number => 1965751234,5

number => 17182025678,20

number => 1234

number => 5678

[UserTest]

number => 09253&410,30,2 ; вызываются одновременно 09253 и 410 в течение 30 секунд.

number => 525,40,1 ; но сначала вызывается 525 в течение 40 секунд.

Чтобы настроить функцию предустановленной переадресации, убедитесь, что заранее загрузили app_followme.so.

*CLI> module load app_followme.so

Loaded app_followme.so

== Parsing ‘/etc/asterisk/followme.conf’: Found followme.conf

== Registered application ‘FollowMe’

Loaded app_followme.so => (Find-Me/Follow-Me Application)

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

featuredigittimeout=>4000

enable_callee_prompt=>true

Подготовьте голосовое объявление для абонента: предложите или принять, или отказаться от переадресации:

takecall=>1

По умолчанию код значения кода DTMF равен двум:

declinecall=>2

Абонент будет слышать стандартное музыкальное сопровождение:

context=>default

Автообзвон

Для автоматического обзвона в настройке Asterisk используются call-файлы (Call Files). Список для автообзвона генерируется на основе номеров из заранее подготовленного текстового файла. После выполнения bash-скрипта готовый перечень звонков попадает в каталог /var/spool/asterisk/outgoing.

Пример автообзвона, при котором номера вызываются по порядку из списка и каждому абоненту проигрываются сообщения в зависимости от выбранного контекста:

[outboundmsg1]

exten => s,1,Wait(2)

exten => s,n,Playback(/var/lib/asterisk/sounds/custom/you_call_your_friends_are_collectors)

exten => s,n,Hangup

Так выглядит bash-скрипт:

#!/bin/sh

while read number; do

cat <<EOF > /var/spool/asterisk/$number

Channel: SIP/voip_trunk/$number

Callerid: $number

MaxRetries: 200

RetryTime: 20

WaitTime: 30

Context: outboundmsg1

Extension: s

Priority: 1

EOF

chown asterisk:asterisk /var/spool/asterisk/$number

mv /var/spool/asterisk/$number /var/spool/asterisk/outgoing

echo «$number»

number=`expr $number + 1`

while [ «$?» -eq «0» ]

do

count_files ()

{

count_f=`ls /var/spool/asterisk/outgoing | wc -l`

if [ «$count_f» -eq «30» ]; then

sleep 10

return 0

else

return 1

fi

}

count_files

done

done < /var/spool/asterisk/list.txt

exit 0

Список для автоматического обзвона хранится в файле с названием /var/spool/asterisk/list.txt. Каждый следующий номер написан с новой строки, например:

3352

3353

3354

Отправка факсов на e-mail

В «Астериск» реализована функция отправки факсов на электронную почту (например, общую или отдельно назначенную). Чтобы реализовать прием факсов в FreePBX 12, в Asterisk должна быть реализована поддержка SpanDSP. Для начала убедимся, что у нас предварительно загружены два важных модуля – res_fax.so и res_fax_spandsp.so.

localhost*CLI> module show like fax

Module Description Use Count Status

res_fax.so Generic FAX Applications 1 Running

res_fax_spandsp.so Spandsp G.711 and T.38 FAX Technologies 1 Running

2 modules loaded

Переходим в настройки системного факса:

Settings > Fax Configuration

Создаем виртуальный факс командой Add Extension, а затем в настройках включаем поддержку факсов (для этого достаточно поставить галочку напротив Fax Email).

Переходим в модуль FolowMe. В блоке Destination if no answer: указываем Fax Recipient и уже там – номер нашего факса FAX (например, 2566).

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

Connectivity > Inbound Routes

Активировать автоматическое распознавание факс-сигнала можно в разделе Fax Detected.

Все входящие факсы по умолчанию сохраняются в каталоге /var/spool/asterisk/fax.

Преимущества Asterisk

У системы Asterisk есть ряд важных преимуществ:

  • Не нужно платить за лицензии, минуты и количество пользователей.
  • Легко масштабируется под любое количество сотрудников.
  • После настройки Asterisk вы получаете неограниченный набор функций IP-телефонии: запись и хранение звонков, голосовое меню, интеграцию с CRM и мессенджерами, автообзвон, обратный звонок и прочее.

Понравилась статья? Поделить с друзьями:

А вот и еще наши интересные статьи:

  • Цб при новом руководстве
  • Руководство к духовному пробуждению читать онлайн
  • Ацетилцистеин инструкция по применению таблетки шипучие 200 мг детям
  • Р5083 руководство по эксплуатации
  • Амбробене раствор для детей как принимать внутрь инструкция по применению

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии