- Запуск asterisk
- Установка Asterisk из YUM
- Установка Asterisk 16 на Debian 10
- Ручная установка Asterisk
- Подключение абонентов и проверка внутренних звонков
- Работа с DAHDi
- Подключение SIP клиента
- Онлайн курcы по Mikrotik
- Помогла статья? Подписывайся на telegram канал автора
- Загрузка asterisk на сервер
- Простой диалплан. Файл extensions. conf
- Установка из исходников
- Быстрая установка из репозитория
- Настройка iptables, asterisk за NAT, проброс портов
- Включаем голосовую почту
Запуск asterisk
По-умолчанию, asterisk установлен от root и будет запускаться от него же. Я предлагаю для этого создать отдельного пользователя и запускать астериск от него. Для этого создаем пользователя и добавляем его в некоторые группы.
# adduser --system --group --home /var/lib/asterisk --no-create-home --gecos "Asterisk" asterisk # usermod -a -G dialout,audio asterisk
Настраиваем Asterisk на запуск под этим пользователем. Для этого добавляем в конфиг /etc/default/asterisk
параметры:
AST_USER="asterisk" AST_GROUP="asterisk"
Назначаем новому пользователю права на директории астериска.
# chown -R asterisk: /var/{lib,log,run,spool}/asterisk /usr/lib/asterisk /etc/asterisk Пробуем запустить asterisk:
# systemctl start asterisk
Если нет сообщений об ошибке, скорее всего все в порядке. Проверяем статус службы.
# systemctl status asterisk

Asterisk запустился, но у меня ошибка:
radcli: rc_read_config: rc_read_config: can't open /etc/radiusclient-ng/radiusclient.conf: No such file or directory
Не может найти необходимый конфиг. Я проверил глазами, директории /etc/radiusclient-ng
действительно нет, но есть /etc/radcli
, где находится указанный в ошибке конфиг radiusclient.conf
. Подозреваю, что это он и есть. Посмотрел, где в конфигах астериска используется этот путь. Оказалось, что в /etc/asterisk/cdr.conf
и /etc/asterisk/cel.conf
. Я там раскомментировал параметры, где указан ошибочный путь и указал правильный.
В /etc/asterisk/cdr.conf
раскомментировал и отредактировал строки:
[radius] radiuscfg => /etc/radcli/radiusclient.conf
То же самое в /etc/asterisk/cel.conf
:
[radius] radiuscfg => /etc/radcli/radiusclient.conf
После этого перезапустил астериск и проверил, все было в порядке.
# systemctl restart asterisk # systemctl status asterisk

Добавим астериск в автозагрузку:
# systemctl enable asterisk
Запускаем консоль астериск и убеждаемся, что он работает:
# rasterisk

Все в порядке, сервер телефонии asterisk установлен и готов к работе. Можно заниматься настройкой.
Установка Asterisk из YUM
Помимо компиляции Asterisk вручную, можно воспользоваться менеджером пакетов YUM, который является штатной утилитой RedHat-based дистрибутивов.
Установку Asterisk мы будем производить из самых аутентичных» источников — репозитория Asterisk. Org.
Краткая инструкция по работе с данным репозиторием находится здесь
Вам требуется создать новый файл с названием -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
Сохраняете данный файл и создаете новый: -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 16 на Debian 10
Запускаем скрипт подготовки исходников asterisk к компиляции.
# ./configure
Успешное завершение подготовки будет ознаменовано следующим выводом в консоль.

На следующем этапе мы будем выбирать компоненты астериска для установки.
# make menuselect

К тому, что установлено по-умолчанию, я добавляю:
- На первой вкладке format_mp3.
- В Core Sound Packages указываю русские звуки RU-WAV.
- В Extras Sound Packages выбираю английский EN-WAV, русского, к сожалению, нет.
Продолжаю, после принятия настроек, нажатием на Save & Exit
. Компилируем, добавляя ключ j4. В данном случае у меня 4 ядра на сервере, сборка будет происходить с участием всех ядер.
# make -j4
Успешное окончание сборки будет обозначено сообщением в консоли.

Теперь устанавливаем asterisk 16 и все его модули.
# make install
В процессе установки инсталлятор будет загружать некоторые файлы, к примеру wav файлы, из интернета. По окончании установки, увидите сообщение.

Формируем образцы файлов конфигурации, чтобы не писать их с нуля самим.
# make samples
В завершении установки, создаем init скрипт.
# make config
Можно еще обновить кэш используемых динамических библиотек.
# ldconfig
На этом непосредственно установка asterisk 16 закончена.
Ручная установка Asterisk
Перед началом установки рекомендуется произвести полное обновление операционной системы. Это улучшит стабильность работы и безопасность сервера.
Создаем директорию, в которую поместим исходные коды дистрибутива Asterisk.
mkdir -p /usr/src/asterisk cd /usr/src/asterisk
wget http://downloads.asterisk.org/pub/telephony/asterisk/releases/asterisk-11.0.0.tar.gz
Аналогичным образом выкачиваем все требуемые пакеты:
1. Asterisk
2. D AHDI
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.
Это может означать, что не стоят исходные коды для ядра. Вернитесь на этап, где требовалось установить исходные коды ядра.
На этом этапе устанавливаем само телефонное ядро Asterisk.
cd /usr/src/asterisk/asterisk* . /configure
Если на этом шаге у Вас отобразится такая заставка, значит все идет по плану:

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

- Перемещение — стрелками клавиатуры
- Выбор — пробелом
- XXX — модуль не доступен для установки. Необходимо установить недостающие зависимости и повторить все с шага». /configure»
- F12 — сохраняем и выходим
Далее, оканчиваем установку:
Создаем дефолтные конфиги и образцы.
Добавляем Астериск в автозагрузку
Запускаем Астериск консольно, количеством «v» в опции задавая плотность протоколирования (verbosity). Убеждаемся, что Астериск запускается нормально, после чего останавливаем его.
Запуск будет сопровождаться таким списком загружаемых модулей:

Теперь Asterisk можно запустить как службу, после чего подключиться к нему штатно в режиме консоли.
service asterisk start asterisk -rvvvv
Подключение абонентов и проверка внутренних звонков
Астериск у нас установлен, firewall настроен. Можно попробовать подключиться и протестировать работу АТС. Я для отладки использую бесплатную софтовую звонилку 3CXPhone 6-й версии. Не знаю, где ее сейчас найти в интернете. У самого производителя давно уже вышли более новые и платные версии, которые работают только с его АТС. А эта версия универсальная. В ней отличный функционал, удобные настройки, есть дебаг режим с подробным логированием. Пользоваться программой удобно и приятно. Скачиваем
ее у меня и устанавливаем.
Теперь нам нужно сделать некоторые общие настройки и добавить пользователей. Работать будем с файлом конфигурации /etc/asterisk/sip.conf
. Файлы настроек астера хорошо закомментированы, но мне это мешает с ними работать. Они слишком большие и громоздкие, неудобно прокручивать вверх и вниз, поэтому я их полностью чищу и вношу только те настройки, которые мне нужны. Так удобнее и нагляднее получается. Сохраните на всякий случай куда-нибудь оригинальный файл sip.conf
и начинайте новую настройку. Вот мой пример конфига для нашего случая:
[general] ;Внешний ip адрес externaddr=212.78.136.18:5060 ;Указываем использовать русскую озвучку language=ru context=default allowoverlap=no udpbindaddr=0.0.0.0 tcpenable=no tcpbindaddr=0.0.0.0 transport=udp srvlookup=yes allowguest=no limitonpeers=yes [authentication] ;Создаем шаблон для телефонов менеджеров [managers-phones](!) type=friend context=call-out secret=123 host=dynamic nat=no qualify=yes canreinvite=no callgroup=1 pickupgroup=1 call-limit=1 dtmfmode=auto disallow=all allow=alaw allow=ulaw allow=g729 allow=g723 allow=g722 ;Создаем пользователей менеджеров [100](managers-phones) callerid="Number 100" <100> [101](managers-phones) callerid="Number 101" <101> [102](managers-phones) callerid="Number 102" <102> [103](managers-phones) callerid="Number 103" <103> [104](managers-phones) callerid="Number 104" <104> [105](managers-phones) callerid="Number 105" <105> [106](managers-phones) callerid="Number 106" <106> [107](managers-phones) callerid="Number 107" <107> [108](managers-phones) callerid="Number 108" <108> [109](managers-phones) callerid="Number 109" <109> [110](managers-phones) callerid="Number 110" <110> ;Создаем шаблон для телефонов поддержки [support-phones](!) type=friend context=call-out secret=456 host=dynamic nat=no qualify=yes canreinvite=no callgroup=2 pickupgroup=2 call-limit=1 dtmfmode=auto disallow=all allow=alaw allow=ulaw allow=g729 allow=g723 allow=g722 ;Создаем пользователей техподдержки [111](support-phones) callerid="Number 111" <111> [112](support-phones) callerid="Number 112" <112> [113](support-phones) callerid="Number 113" <113> [114](support-phones) callerid="Number 114" <114> [115](support-phones) callerid="Number 115" <115> [116](support-phones) callerid="Number 116" <116> [117](support-phones) callerid="Number 117" <117> [118](support-phones) callerid="Number 118" <118> [119](support-phones) callerid="Number 119" <119> [120](support-phones) callerid="Number 120" <120> ;Создаем шаблон для телефонов топов [top-phones](!) type=friend context=call-out secret=789 host=dynamic nat=no qualify=yes canreinvite=no callgroup=3 pickupgroup=3 call-limit=1 dtmfmode=auto disallow=all allow=alaw allow=ulaw allow=g729 allow=g723 allow=g722 ;Создаем пользователей топов [121](top-phones) callerid="Number 111" <121> [122](top-phones) callerid="Number 122" <122> [123](top-phones) callerid="Number 123" <123> [124](top-phones) callerid="Number 124" <124> [125](top-phones) callerid="Number 125" <125> [126](top-phones) callerid="Number 126" <126> [127](top-phones) callerid="Number 127" <127> [128](top-phones) callerid="Number 128" <128> [129](top-phones) callerid="Number 129" <129> [130](top-phones) callerid="Number 130" <130>
Я немного пояснил комментариями отдельные моменты. Чтобы сократить размер sip.conf
, я использую шаблоны групп номеров, где задаю общие настройки для группы. Затем просто создаю пользователей и указываю их принадлежность к группе. Они берут все настройки этой группы. Если вам необходимо будет задать отдельные настройки для какого-то пользователя, как у меня, к примеру, callerid
, то вы просто в его разделе указываете эти настройки.
У меня стоит один и тот же пароль для всей группы. Это удобно, если все телефоны стационарные и стоят в офисе, настраивают их только сисадмины. Делать каждому персональный пароль особого смысла нет. Если вам это не нужно, то указывайте персональный пароль для каждого пользователя. Я просто привожу примеры использования тех или иных настроек, но не призываю делать так же, как я. Во многих случаях так делать нельзя. Уточню еще некоторые нюансы.
- Параметры callgroup
и pickupgroup
задают группы перехвата звонков. Люди из одной группы могут перехватывать звонки друг друга. Удобно заводить в одну группу людей, сидящих в одной комнате. Так они видят, что человека нет на месте и перехватывают его звонок. Эти параметры можно индивидуально задать для каждого пользователя в отдельности, если разбивка по шаблонам настроек не соответствует реальной рассадке людей в офисе. - Параметр callerid
можно задать кириллицей, но могут возникнуть проблемы с некоторыми телефонами и точно возникнут проблемы, когда вы будете вести статистику звонков в mysql. Я не смог победить эту проблему с кодировками, поэтому использую только латиницу в этом параметре. Туда можно писать либо должность, либо ФИО человека. - call-limit
=1 задает количество одновременных соединений на линию. Если у вас один человек = один телефонный аппарат, то разрешать больше одной линии на пользователя нет смысла. Ему будет идти новый звонок в тот момент, как он разговаривает. Конечно, если есть необходимость переключаться между разговорами и ставить кого-то на удержание, то можно делать и больше линий. Но мне кажется, это неудобно. Если ты разговариваешь, пусть звонящий лучше услышит занято и перезвонит. - Я всех добавляю в один context. В данном примере у нас будет только один номер телефона на всех. Если у вас их будет несколько, то контекстами можно будет разводить звонки на разные номера. Эту ситуацию я рассмотрю в отдельной статье.
Сохраняем sip.conf
. Теперь нам нужно добавить план звонков, для того, чтобы можно было совершать вызовы. Для этого как и с предыдущим конфигурационным файлом, очищаем файл extensions.conf
и записываем туда следующую информацию:
[general]
static=yes
writeprotect=no
[globals]
[default]
;Вешаем трубку
[handup-sip]
exten => _X!,1,HangUp()
;Исходящие звонки
[call-out]
;Звонок на внутренний номер
exten => _XXX,1,Dial(SIP/${EXTEN})
include => handup-sip У нас все готово для внутренних звонков через asterisk. Заходим в консоль и перезагружаем его:
# asterisk -r
CLI> reload
Вы увидите некоторые предупреждения и ошибки. Это не страшно, так и должно быть, так как мы многое еще не настроили. Загружаются модули, которым не хватает настроек. Проверим список созданных пользователей с помощью команды в консоли:
CLI> sip show users

Видим всех наших пользователей, их пароли и контекст. Список отсортирован не по порядку, не пугайтесь, если не заметите какой-то номер.
Дальше устанавливайте любую софтовую звонилку на компьютер или можете сразу использовать телефон, если он у вас под рукой. С телефонами удобнее, но не всегда они есть. В 3CXPhone
задаем следующие настройки подключения к нашей ip атс:

Я сразу открываю дебаг окно для отладки. Корректное подключение к серверу будет выглядеть вот так: 
Проверим на сервере список подключенных пиров с помощью команды:
CLI> sip show peers
Должна быть строка с подключенным пиром:
100/100 192.168.1.100 D No No 59891 OK (104 ms)
Если у вас так же, то все в порядке. Чтобы протестировать звонки, нам нужно подключить двух абонентов. Настраивайте еще один телефон или софтофон. Проверяйте в списке подключенных пиров чтобы было 2 подключения и попробуйте позвонить друг другу. Если вы все сделали правильно, то локальные звонки должны работать. Я обычно для тестирования второго клиента настраиваю на мобильном телефоне. Так можно проверить работу звонков через смартфоны.
После звонка в файле /var/log/asterisk/cdr-csv/Master.csv
появится запись о совершенном звонке:
"","101","100","call-out","""Number 101"" <101>","SIP/101-00000000","SIP/100-00000001","Dial","SIP/100","2020-02-27 12:38:35","2020-02-27 12:38:45","2020-02-27 12:38:47",12,2,"ANSWERED","DOCUMENTATION","1582807115.0",""
В этом файле будет накапливаться статистика звонков. Позже мы перенесем ее в mysql. Я позвонил с номера 101 на номер 100, там мне ответили. В файле отражены все основные данные этого звонка.
Один небольшой шажок по настройке voip атс asterisk мы сделали. Будем двигаться дальше.
Работа с 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 // Указывается тип эхоподавителя и тайм-слоты, на которых он будет задействован.
Теперь чуть более подробно по опциям.
Делаем рестарт dahdi
service dahdi stop service dahdi status
Если не выгрузился, необходимо сначала остановить Asterisk:
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
dahdi restart dahdi show channels — проверяем что каналы поднялись dahdi show channel 1
Подключение SIP клиента
Теперь необходимо настроить со стороны Asterisk-а SIP-аккаунт для внутреннего абонента.
[general] ;глобальные значения переменных канала SIP disallow=all allow=gsm allow=ulaw allow=alaw context=default ;…… register ≥ user:pass@host/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 mailbox=100@device // Указываем номер и контекст ящика голосовой почты 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 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 клиента коллеге.
Онлайн курcы по Mikrotik
Если у вас есть желание научиться работать с роутерами микротик и стать специалистом в этой области, рекомендую пройти курcы по программе, основанной на информации из официального курcа MikroTik Certified Network Associate
. Помимо официальной программы, в курcах будут лабораторные работы, в которых вы на практике сможете проверить и закрепить полученные знания. Все подробности на сайте Курcы по ИТ
.
Стоимость обучения весьма демократична, хорошая возможность получить новые знания в актуальной на сегодняшний день предметной области. Особенности курcов:
- Знания, ориентированные на практику;
- Реальные ситуации и задачи;
- Лучшее из международных программ.
Помогла статья? Подписывайся на telegram канал
автора
Анонсы всех статей, плюс много другой полезной и интересной информации, которая не попадает на сайт.
Загрузка asterisk на сервер
Я буду устанавливать LTS версию Asterisk 16. Советую для долгосрочного использования всегда использовать LTS версии. Они в целом стабильнее и дольше срок поддержки. Идем на страницу https://www.asterisk.org/downloads/asterisk/all-asterisk-versions
и копируем ссылку на нужную версию. Загружаем ее на сервер.
# cd /usr/src # wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-16-current.tar.gz
После загрузки, сразу распаковываем.
# tar xzvf asterisk-16-current.tar.gz
Переходим в директорию с исходниками asterisk 16.
# cd asterisk-16.*
Простой диалплан. Файл extensions. conf
Файл Extensions.conf описывает логику работы Asterisk, а именно, обработку входящих вызовов, маршрутизацию исходящих вызовов, обработку звонков и событий по разнообразным правилам. В Asterisk это называется ДиалПланом ). Как говорят разработчики, диалплан — это сердце Asterisk.
За работу диалплана отвечает файл extensions.conf. Файл поделен на контексты, в каждом из которых прописана логика работы. Логика работы формируется с помощью приложений. Приложения — это функции Asterisk, запускаемые с параметрами. Последовательность выполнения приложений — построчная.
Так как каждая телефонная линия или номер внутреннего абонента может принадлежать только одному контексту, осуществляется логическое разделение всех внутренних абонентов и телефонных линий операторов.
Например, в данном контексте, который назначен абоненту с номером 100, описана возможность выполнения трех действий:
- звонка на внутренний номер 999, который выполняет какую-либо функцию
- звонка другому внутреннему абоненту, номер которого начинается с цифры » и состоящий из трех цифр
- звонок на внешние телефонные линии через 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) Установка из исходников
Вопроса установки asterisk
я уже касался ранее в одной из прошлых статей. Но там я использовал связку с панелью управления freepbx. Здесь же мы будем использовать голый астериск, без обвязок. Более того, я не буду использовать никаких дополнительных плат расширения и модемов. Будет только софтовая АТС, которая легко переносится с одного сервера на другой при желании. Считаю, что такой подход наиболее эффективен и к нему стоит стремиться. Настроив виртуальную машину, вы навсегда будете отвязаны от конкретного железа и спокойно можете переносить свой сервер куда угодно, заменив только сетевые настройки.
Таким образом, нам нужно установить непосредственно asterisk и pjproject с jansson. На первоначальном этапе этого достаточно. Если вы предпочитаете сервер debian, то воспользуйтесь отдельной инструкцией по установке asterisk 16 на debian 10
. После этого можете сразу же переходить на следующий этап настройки. Приступим.
Первым делом обновляем систему и отключаем SELinux, как рассказано в статье про настройку centos
. Установим теперь пакеты, которые нам понадобятся для сборки. В первую очередь подключим репозиторий epel.
# dnf install epel-release
Дальше идет мета пакет Development Tools
со всем необходимым для сборки из исходников.
# dnf groupinstall "Development Tools"

И еще некоторые зависимости, которые будут нужны.
# dnf install git wget net-tools sqlite-devel psmisc ncurses-devel libtermcap-devel newt-devel libxml2-devel libtiff-devel gtk2-devel libtool libuuid-devel subversion kernel-devel kernel-devel-$(uname -r) crontabs cronie-anacron mariadb mariadb-server

Настройте mysql сервер, задав пароль для root.
# systemctl start mariadb # systemctl enable mariadb # /usr/bin/mysql_secure_installation
На этом подготовка закончена. Устанавливаем Jansson и pjsip.
# cd ~ # git clone https://github.com/akheron/jansson.git # cd jansson # autoreconf -i # ./configure --prefix=/usr/ # make && make install

# cd ~ # git clone https://github.com/pjsip/pjproject.git # cd pjproject # ./configure CFLAGS="-DNDEBUG -DPJ_HAS_IPV6=1" --prefix=/usr --libdir=/usr/lib64 --enable-shared --disable-video --disable-sound --disable-opencore-amr # make dep && make && make install # ldconfig

Все готово к установке непосредственно Astersik
Я буду устанавливать LTS версию Asterisk 16. Советую для долгосрочного использования всегда использовать LTS версии. Они в целом стабильнее и дольше срок поддержки. Идем на страницу https://www.asterisk.org/downloads/asterisk/all-asterisk-versions
и копируем ссылку на нужную версию. Загружаем ее на сервер.
# cd ~ # wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-16-current.tar.gz # tar xfz asterisk-16-current.tar.gz # cd asterisk-16*/ # contrib/scripts/install_prereq install # contrib/scripts/get_mp3_source.sh
Устанавливаем на centos 8 пакет libedit-devel
.
# dnf config-manager --set-enabled powertools # dnf install libedit-devel
# ./configure --libdir=/usr/lib64 # make menuselect

Выбирайте необходимые модули и звуки, в зависимости от того, что вам нужно. Я в общем случае указываю:
- Add-ons
: format_mp3, res_config_mysql. - Core Sound Packages
: русские звуки RU-WAV. - Music On Hold File Packages
: звук WAV. - Extras Sound Packages
: английский EN-WAV, русского к сожалению нет.
Все остальные настройки оставляем по-умолчанию. Ставится много модулей. Все они не нужны, но мало ли, пригодится что-то в будущем. Неиспользуемые модули можно будет потом отключить в конфигурации.
# make && make install && make samples && make config # ldconfig
По-умолчанию, asterisk установлен от root и будет запускаться от него же. Я предлагаю для этого создать отдельного пользователя и запускать астериск от него. Для этого создаем пользователя и добавляем его в некоторые группы.
# groupadd asterisk
# useradd -r -d /var/lib/asterisk -g asterisk asterisk
# usermod -aG audio,dialout asterisk
# chown -R asterisk.asterisk /etc/asterisk /var/{lib,log,spool}/asterisk /usr/lib64/asterisk Настраиваем Asterisk на запуск под этим пользователем. Для этого добавляем в конфиг /etc/sysconfig/asterisk
параметры:
AST_USER="asterisk" AST_GROUP="asterisk"
Теперь добавим примерно то же самое в сам конфиг астера /etc/asterisk/asterisk.conf
.
runuser = asterisk rungroup = asterisk
Пробуем запустить asterisk:
# systemctl start asterisk
Если нет сообщений об ошибке, скорее всего все в порядке. Проверяем статус службы.
# systemctl status asterisk

Asterisk запустился, но есть небольшие ошибки.
radcli: rc_read_config: rc_read_config: can't open /etc/radiusclient-ng/radiusclient.conf: No such file or directory
Связаны с тем, что в конфигах неверно указан путь к radiusclient. Сейчас исправим это.
# sed -i 's";\[radius\]"\[radius\]"g' /etc/asterisk/cdr.conf # sed -i 's";radiuscfg => /usr/local/etc/radiusclient-ng/radiusclient.conf"radiuscfg => /etc/radcli/radiusclient.conf"g' /etc/asterisk/cdr.conf # sed -i 's";radiuscfg => /usr/local/etc/radiusclient-ng/radiusclient.conf"radiuscfg => /etc/radcli/radiusclient.conf"g' /etc/asterisk/cel.conf
Перезапускаем asterisk и убеждаемся, что ошибок нет. Проверим, все ли в порядке, зайдя в консоль:
# asterisk -r

Если получили такой же вывод команды, значит все в порядке, астериск 16 установлен. Добавим его теперь в автозагрузку.
# systemctl enable asterisk
Для тех, у кого что-то не получается или не понятно, как сделать, записал видео по приведенной инструкции. Видео подтверждает, что материал актуален и если делать по нему, то все получится. https://youtu.be/9q9RGqBVQbA
Если вы хотите использовать для настройки Asterisk предыдущую версию системы, то смотрите мою статью по установке Asterisk 16 на Centos 7
. Там нет принципиальных отличий, но имейте ввиду, что все дальнейшие действия были проделаны и проверены на 8-й вверсии Центос, так что я не ручаюсь, что это так же заработает и на 7-й. Полную проверку и адаптацию материала я сделал для CentOS 8.
Быстрая установка из репозитория
У asterisk не существует официального репозитория пакетов, поэтому предпочтительным способом установки свежей версии является сборка из исходников. Но если вы хотите быстро установить и потестить систему, то можно использовать один из сторонних репозиториев asterisk. К примеру — Tuncy
. Я не знаю, кто ведет этот репозиторий, как часто он обновляется и насколько там актуальные версии. На момент актуализации этой статьи (март 2020 года) в репозитории не было свежих пакетов для Centos 8, только для 7-й.
Добавляем репозиторий астериск в систему. Для этого создаем файл /etc/yum.repos.d/ tuncy-asterisk-16.repo
следующего содержания.
[asterisk-common] name=Asterisk Common Requirement Packages @ tucny.com baseurl=https://ast.tucny.com/repo/asterisk-common/el\$releasever/\$basearch/ enabled=1 gpgcheck=1 gpgkey=https://ast.tucny.com/repo/RPM-GPG-KEY-dtucny [asterisk-16] name=Asterisk 16 Packages @ tucny.com baseurl=https://ast.tucny.com/repo/asterisk-16/el\$releasever/\$basearch/ enabled=1 gpgcheck=1 gpgkey=https://ast.tucny.com/repo/RPM-GPG-KEY-dtucny
Обновляем информацию о репозиториях и устанавливаем астериск.
# yum install asterisk

Настройка iptables, asterisk за NAT, проброс портов
Сразу же уделим внимание настройке iptables для работы астериск. У нас может быть 2 ситуации, которые требуют двух принципиально различных настроек:
- Сервер телефонии имеет свой внешний ip адрес и напрямую смотрит через него в интернет.
- Сервер стоит за шлюзом, не имеет своего внешнего адреса, доступ в интернет с помощью NAT.
В первом случае нам нужно открыть на iptables необходимые порты для работы, все остальное закрыть. Подробно вопрос настройки iptables
я рассматривал в отдельной статье. Там есть примеры и пояснения, рассказан мой подход к настройке.
В моем примере сервер будет находиться в локальной сети офиса за nat. Доступ в интернет осуществляется через офисный шлюз, на котором установлены iptables. На нем будет сделан проброс необходимых портов для работы внешних телефонных аппаратов. В случае, если у вас все телефоны будут находиться в локальной сети офиса вместе с сервером телефонии, пробрасывать ничего не нужно. С сервисом zadarma все будет работать без проброса портов. Пиры зарегистрируются на внешнем сервере провайдера и этого будет достаточно для приема и совершения звонков.
С другими провайдерами этого может быть не достаточно. В общем случае для настройки asterisk за nat нужно будет на шлюзе пробросить порт 5060 и диапазон 10000:20000. По-умолчанию астериск использует UDP порты. Если вы не будете менять эти настройки, то пробрасывать нужно именно UDP.
В моем случае получается следующая картина. На шлюзе сделан проброс необходимых портов:
iptables -t nat -A PREROUTING -p udp --dst $WAN_IP --dport 5060 -j DNAT --to 192.168.1.25:5060 iptables -t nat -A PREROUTING -p udp --dst $WAN_IP --dport 10000:20000 -j DNAT --to 192.168.1.25
Настройкой фаервола на самом астериске я не хочу сейчас заниматься, статья и так масштабная получается. С этим без проблем можно разобраться с помощью моей статьи по iptables, ссылку на которую я привел в начале раздела. Нужно просто открыть указанные выше порты, и любые другие, которые будут использоваться на сервере.
Если вы делаете тестовую установку и настройку asterisk, можете совсем отключить firewalld:
# systemctl stop firewalld # systemctl disable firewalld # dnf remove firewalld
Включаем голосовую почту
Продолжаем наращивать функционал voip атс. В данном разделе опишу настройку голосовой почты в asterisk. Для начала пару слов о том, что это такое. Если адресат звонка долго не отвечает, мы можем предложить звонящему оставить для него голосовое сообщение. Когда получатель вернется на место, он сможет прослушать оставленные ему сообщения. При этом, после записи голосового сообщения, будет отправлено письмо с записью этого сообщения на почтовый адрес получателя.
130 => 1234,Number 130,user130@mail.ru 100 => 1234,Number 100,user100@mail.ru
Для корректной отправки почтовых сообщений сразу на внешние почтовые ящики необходимо правильно настроить локальный почтовый сервер, либо использовать внешний. Я рекомендую использовать отдельный сервер, наверняка он есть в организации, либо на локальном использовать какой-то публичный с авторизацией по smtp. Пример такой настройки — отправка почты с авторизацией по smtp в linux
.
В консоли перезапускаем модуль голосовой почты и проверяем пользователей:
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. Причем в 2 разных места. Я буду использовать номер 500 для звонка в панель управления голосовой почтой. Позвонив на этот номер, пользователь введет свой пароль и сможет управлять голосовыми сообщениями (слушать, удалять, менять настройки). Добавим в контекст для исходящих звонков звонок на этот номер. Добавлять следует сразу за номерами для записи, которые мы ранее создали и перед правилом набора трехзначных номеров.
[call-out]
;Номер для записи звуков, окончание записи #
exten => _35X, 1, NoOp()
exten => _35X, n, Waitexten => _35X, n, Playback(beep)
exten => _35X, n, Record(/tmp/music${EXTEN:2}:wav)
exten => _35X, n, Waitexten => _35X, n, Playback(/tmp/music${EXTEN:2})
exten => _35X, n, Waitexten => _35X, n, Hangup()
;Управление голосовой почтой exten => 500,1,VoiceMailMain()
;Звонок на внутренний номер
exten => _XXX,1,Dial(SIP/${EXTEN},
;Звонок на внешний номер
exten => _XXX.,1,Dial(SIP/${EXTEN}@397945) Добавленные данные выделил цветом. Обращаю внимание на цифру 15
. Ранее этой настройки не было, сейчас я добавил. Она будет означать, что звонок будет длиться 15 секунд. Если за это время никто не ответит, он будет сброшен. До использования голосовой почты, можно было не устанавливать этот параметр, оставить его значение по-умолчанию, оно очень большое, не помню точно сколько по времени. Но сейчас нам нужно при неснятии трубки дольше 15-ти секунд, включать запись голосового сообщения.
Конкретно в контексте внутренних звонков этот параметр не принципиален, так как я не добавляю голосовую почту для звонков внутри организации, хотя можно это сделать. Не вижу в этом смысла. Я добавил сюда этот параметр, чтобы время ожидания ответа было одинаково во всех звонках. В следующих изменениях это уже будет играть принципиальное значение.
Пока мы просто добавили номер, куда можно позвонить для управления голосовой почтой. Теперь добавим непосредственно возможность записи голосовых сообщений по событиям. Остановимся на этом пункте поподробнее. Для начала уясним, в каких состояниях может пребывать номер:
- Номера вообще не существует на сервере. В нашем случае, к примеру, это любой номер не из диапазона 100-130.
- Номер существует, но он не зарегистрирован на АТС, то есть аппарат с этим номером не подключен.
- Номер существует, зарегистрирован, но при звонке на него никто не отвечает.
- Номер существует, зарегистрирован, но в данный момент занят.
Каждое из этих четырех состояний обрабатывается отдельно. Я считаю, что голосовую почту уместно будет включать по событию номер 3. Но это не обязательно, можно и на занято повесить возможность оставить сообщение. Тут на ваше усмотрение. Я покажу пример, как это делается, а вы сможете настроить так, как вам нужно.
Обработка этих событий не такая простая, как кажется на первый взгляд. Я сразу же столкнулся с трудностью следующего характера. С параметром call-limit=1 при звонке на номер, который занят в данный момент, астериск возвращает статус CHANUNAVAIL, что может означать, к примеру, что канал недоступен. На статус занято BUSY это совсем не похоже. Для разрешения этой ситуации я воспользуюсь функцией ChanIsAvail,
которая проверяет не статус пира, а статус канала и возвращает значение 2 или 3, когда он занят.
[ivr-main]
exten => s,1,Answer()
exten => s,2,Background(/etc/asterisk/ivr/ivr-main)
exten => s,3,WaitExten
exten => _XXX,1,Dial(SIP/${EXTEN},15)
;Задаем переменную для передачи в голосовую почту
exten => _XXX,n,Set(dstNUM=${EXTEN})
;Проверяем статус пира, существует или нет
exten => _XXX,n,GotoIf($["${SIPPEER(${EXTEN},status)}" = ""]?num-not-exist,1)
;Проверяем статус пира, подключен или нет
exten => _XXX,n,GotoIf($["${SIPPEER(${EXTEN},status):0:2}" = "UN"]?num-not-connected,1)
;Проверяем канал на занятость
exten => _XXX,n,ChanIsAvail(SIP/${EXTEN},s)
;Выводим в лог значение функции ChanIsAvail, нужно только для отладки, можно удалить строку
exten => _XXX,n,NoOp(=========== ChanIsAvail STATUS: ${AVAILSTATUS} ===========)
;Если функция возвращает 2 или 3, значит абонент занят
exten => _XXX,n,GoToIf($[${AVAILSTATUS} = 2]?num-BUSY,1)
exten => _XXX,n,GoToIf($[${AVAILSTATUS} = 3]?num-BUSY,1)
;Обрабатываем остальные статусы
exten => _XXX,n,Goto(num-${DIALSTATUS},1)
;Если номера не существует говорим "Ошибочный номер, попробуйте еще раз"
exten => num-not-exist,1,Wait
exten => num-not-exist,n,Playback(invalid)
;Если номер не подключен, говорим "Набранный вами номер отключен, проверьте номер и повторите попытку
exten => num-not-connected,1,Waitexten => num-not-connected,n,Playback(ss-noservice)
;Если номер занят, говорим "Занято"
exten => num-BUSY,1,Waitexten => num-BUSY,n,Playback(vm-isonphone)
;Если номер не отвечает, включаем голосовую почту
exten => num-NOANSWER,1,Waitexten => num-NOANSWER,n,Voicemail(${dstNUM},u)
;Если еще по какой-то причине будет статус CHANUNAVAIL, говорим, что номер не доступен в данный момент
exten => num-CHANUNAVAIL,1,Waitexten => num-CHANUNAVAIL,n,Playback(vm-isunavail)
;Если в голосовом меню не выбрали внутренний номер, адресуем звонок секретарю
exten => t,1,Dial(SIP/100,15)
[call-out]
;Номер для записи звуков, окончание записи #
exten => _35X, 1, NoOp()
exten => _35X, n, Waitexten => _35X, n, Playback(beep)
exten => _35X, n, Record(/tmp/music${EXTEN:2}:wav)
exten => _35X, n, Waitexten => _35X, n, Playback(/tmp/music${EXTEN:2})
exten => _35X, n, Waitexten => _35X, n, Hangup()
;Управление голосовой почтой
exten => 500,1,VoiceMailMain()
;Звонок на внутренний номер
exten => _XXX,1,Dial(SIP/${EXTEN},15)
exten => _XXX,n,Set(dstNUM=${EXTEN})
exten => _XXX,n,GotoIf($["${SIPPEER(${EXTEN},status)}" = ""]?num-not-exist,1)
exten => _XXX,n,GotoIf($["${SIPPEER(${EXTEN},status):0:2}" = "UN"]?num-not-connected,1)
exten => _XXX,n,ChanIsAvail(SIP/${EXTEN},s)
exten => _XXX,n,NoOp(=========== ChanIsAvail STATUS: ${AVAILSTATUS} ===========)
exten => _XXX,n,GoToIf($[${AVAILSTATUS} = 2]?num-BUSY,1)
exten => _XXX,n,GoToIf($[${AVAILSTATUS} = 3]?num-BUSY,1)
exten => _XXX,n,Goto(num-${DIALSTATUS},1)
exten => num-not-exist,1,Waitexten => num-not-exist,n,Playback(invalid)
exten => num-not-connected,1,Waitexten => num-not-connected,n,Playback(ss-noservice)
exten => num-BUSY,1,Waitexten => num-BUSY,n,Playback(vm-isonphone)
exten => num-NOANSWER,1,Waitexten => num-NOANSWER,n,Voicemail(${dstNUM},u)
exten => num-CHANUNAVAIL,1,Waitexten => num-CHANUNAVAIL,n,Playback(vm-isunavail)
;Звонок на внешний номер
exten => _XXX.,1,Dial(SIP/${EXTEN}@397945)
include => handup-sip Я во всех звонках установил время ожидания ответа 15 секунд. Если вы считаете, что нужно больше, измените этот параметр.
Обращаю ваше внимание, что в контексте голосового меню я не сделал обработку статусов состояния телефона секретаря, хотя это может быть нужно, если у вас будет один секретарь принимать звонки. Ему и голосовая почта может пригодиться. В следующем пункте я расскажу про случай, когда в офисе работают 2 секретаря и обработкой звонков будет заниматься очередь (queue), поэтому статусы в том виде, как они реализованы здесь будут не нужны. Вы можете использовать любую конфигурацию, которая вам подойдет. Например, использовать очередь, но с одним секретарем в ней. Настраивайте по аналогии, я даю базовый функционал. Все возможные случаи разобрать невозможно.
Перечитывайте диалплан и тестируйте конфигурацию. При звонке абоненту и его неответе, звонящий услышит в трубке сообщение о том, что номер не отвечает и предложение оставить голосовую почту. Если звонивший оставит сообщение, то получатель получит это сообщение по email и сможет его прослушать там, либо позвонить на номер 500, ввести свой номер и пароль, заданные в voicemail.conf
и послушать сообщение по телефону.
Я сталкивался с ошибкой, когда у пользователя в настройках отключена голосовая почта, но он все равно получал сообщения. У него мигало оповещение на телефонном аппарате. Нужно было оперативно удалить все оставленные сообщения без прослушивания. Как удалить голосовую почту в астериск
я написал в отдельной заметке.
На этом настройка голосовой почты окончена. Можно пользоваться, не забывая добавлять новых пользователей в voicemail.conf и перечитывая конфигурацию голосовой почты.

