ASTERISK - IP ТЕЛЕФОНИЯ

Asterisk logo

Сразу обозначу, что данная статья находится на стадии разработки, так что, пожалуйста, не удивляйтесь какой-нибудь ерунде, которую вы, вероятно, обнаружите в самом низу!

Проверить работу сервиса, настроенного по этой статье, можно по телефону +7 812 507 9602

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

Статья учебная, поэтому использовать будем голый asterisk без каких-либо web-панелей для управления, тем более что сервер с гуи - только у педиков. Выполнять настройку будем с нуля, то есть с самой начальной установки сервера телефонии и всех зависимостей.

Для примера опишем наш воображаемый офис:

  • Работает 30 сотрудников. Номера будут трехзначные, от 100 до 130.
  • У нас будут 3 отдела - менеджеры, техподдержка, руководство и все остальные.
  • Номер секретаря 100, менеджеры 101-110, техподдержка 111-120, руководство 121-130.
  • Мы будем использовать одного SIP провайдера для звонков.

Итак, приступим!

УСТАНОВКА ВСПОМОГАТЕЛЬНЫХ УТИЛИТ И БИБЛИОТЕК

sudo apt update

Затем установим пакеты, необходимые для успешной компиляции.

sudo apt install wget build-essential git autoconf subversion pkg-config libtool

cd ~/Downloads

Далее установим библиотеки.

DAHDI - это для взаимодействия с аналоговыми и цифровыми телефонами.

git clone -b next git://git.asterisk.org/dahdi/linux dahdi-linux

cd dahdi-linux

sudo make

sudo make install

cd ~/Downloads

git clone -b next git://git.asterisk.org/dahdi/tools dahdi-tools

cd dahdi-tools

sudo autoreconf -i

sudo ./configure

sudo make install

sudo make install-config

sudo dahdi_genconf modules

LibPRI - для подключений ISDN.

cd ~/Downloads

cd libpri

sudo make

sudo make install

УСТАНОВКА ASTERISK ИЗ ИСХОДНИКОВ

Честно говоря, в моем случае данный способ сработал, но как-то криво. Войдя в консоль управления сервисом, я почему-то получал ошибки на основные команды, типа sip show users и т. д. Насколько я понимаю, это из-за ошибок компиляции, и, наверно, их можно исправить, если хорошо постараться, ну такое... Лично я забил болт и перешел к установке из репозитория Ubuntu. Тем не менее, выложу здесь способ из исходников, потому что есть некоторая вероятность что дело не пошло из-за моей собственной криворукости. Когда это дело прояснится, поправлю статью.

cd ~/Downloads

git clone -b 18 https://gerrit.asterisk.org/asterisk asterisk-18

cd ~/Downloads/asterisk-18/contrib/scripts/

sudo ./get_mp3_source.sh

sudo ./install_prereq install

Появится такое окно:asterisk1

Тут, как я понимаю, нужно ввести семерку, это код страны. Если нет, в дальнейшем поправлю статью.

В конце установки будет что-то типа

#######################################
## install completed successfully
#######################################

 

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

sudo ./configure

configure: Menuselect build configuration successfully completed

               .$$$$$$$$$$$$$$$=..      
            .$7$7..          .7$$7:.    
          .$$:.                 ,$7.7   
        .$7.     7$$$$           .$$77  
     ..$$.       $$$$$            .$$$7 
    ..7$   .?.   $$$$$   .?.       7$$$.
   $.$.   .$$$7. $$$$7 .7$$$.      .$$$.
 .777.   .$$$$$$77$$$77$$$$$7.      $$$,
 $$$~      .7$$$$$$$$$$$$$7.       .$$$.
.$$7          .7$$$$$$$7:          ?$$$.
$$$          ?7$$$$$$$$$$I        .$$$7 
$$$       .7$$$$$$$$$$$$$$$$      :$$$. 
$$$       $$$$$$7$$$$$$$$$$$$    .$$$.  
$$$        $$$   7$$$7  .$$$    .$$$.   
$$$$             $$$$7         .$$$.    
7$$$7            7$$$$        7$$$      
 $$$$$                        $$$       
  $$$$7.                       $$  (TM)     
   $$$$$$$.           .7$$$$$$  $$      
     $$$$$$$$$$$$7$$$$$$$$$.$$$$$$      
       $$$$$$$$$$$$$$$$.                

configure: Package configured for: 
configure: OS type  : linux-gnu
configure: Host CPU : x86_64
configure: build-cpu:vendor:os: x86_64 : pc : linux-gnu :
configure: host-cpu:vendor:os: x86_64 : pc : linux-gnu :

sudo make install

Далее:

sudo make menuselect

asterisk2

Здесь выбираем необходимые модули и звуки, в зависимости от того, что нам нужно. Я в общем случае указываю:

Add-ons: format_mp3, res_config_mysql.

Core Sound Packages: русские звуки RU-WAV.

Music On Hold File Packages: звук WAV.

Extras Sound Packages: английский EN-WAV, русского к сожалению нет.

Выберите опцию “format_mp3” в меню, чтобы создать модуль MP3. Все остальные настройки оставляем по-умолчанию. Ставится много модулей. Все они не нужны, но мало ли, пригодится что-то в будущем. Неиспользуемые модули можно будет потом отключить в конфигурации. F12 - сохранить. Вывод терминала будет таким:

menuselect changes saved!
make[1]: Leaving directory '/home/linoxide/asterisk-18'

Чтобы начать компиляцию исходного кода, выполним команду make:

sudo make -j2

Здесь "2" - количество ядер процессора в нашей системе.

sudo make install

done
 +---- Asterisk Installation Complete -------+
 +                                           +
 +    YOU MUST READ THE SECURITY DOCUMENT    +
 +                                           +
 + Asterisk has successfully been installed. +
 + If you would like to install the sample   +
 + configuration files (overwriting any      +
 + existing config files), run:              +
 +                                           +
 + For generic reference documentation:      +
 +    make samples                           +
 +                                           +
 + For a sample basic PBX:                   +
 +    make basic-pbx                         +
 +                                           +
 +                                           +
 +-----------------  or ---------------------+
 +                                           +
 + You can go ahead and install the asterisk +
 + program documentation now or later run:   +
 +                                           +
 +               make progdocs               +
 +                                           +
 + **Note** This requires that you have      +
 + doxygen installed on your local system    +
 +-------------------------------------------+

Установим общие файлы конфигурации:

sudo make samples

А так же, установим основные файлы конфигурации АТС:

sudo make basic-pbx

И наконец, выполните следующие действия, чтобы установить сценарий инициализации Asterisk и обновить кэш общих библиотек:

sudo make config

sudo ldconfig

С базовой установкой на этом все, тперь создадим пользователя Asterisk:

sudo adduser --system --group --home /var/lib/asterisk --no-create-home --gecos "Asterisk PBX" asterisk

Adding system user asterisk' (UID 114) ... Adding new groupasterisk' (GID 120) …
Adding new user asterisk' (UID 114) with groupasterisk' …
Not creating home directory `/var/lib/asterisk'.

Чтобы настроить Asterisk для запуска от имени вновь созданного пользователя, откройте файл /etc/default/asterisk:

sudo nano /etc/default/asterisk

Раскомментируем следующие строки, просто удалив перед ними символ "#":

AST_USER="asterisk"
AST_GROUP="asterisk"

Затем добавим пользователя asterisk в следующие группы:

sudo usermod -a -G dialout,audio asterisk

Нам также необходимо изменить владельца всех файлов и папок asterisk, чтобы пользователь Asterisk мог получить доступ к этим файлам:

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

sudo chmod -R 750 /var/{lib,log,run,spool}/asterisk /usr/lib/asterisk /etc/asterisk

Запустим Asterisk и добавим в автозагрузку:

sudo systemctl start asterisk

sudo systemctl enable asterisk

Убедимся, что Asterisk запущен, подключившись к интерфейсу командной строки (CLI) Asterisk, введя:

sudo asterisk -vvvr

Результат будет примерно таким:

Connected to Asterisk GIT-18-804b1987fb currently running on linoxide (pid = 31426)
linoxide*CLI>

НАСТРОЙКА

Если наша АТС работает глобально, т. е., подключена к Интернету, звонит наружу и принимает входящие извне, то, вероятно, придется открыть/пробросить порты: 5060/udp, 10000:20000/udp, настроить файрволы и т. д. Далее приведу список команд управления сервисом.

Запустить:

sudo systemctl start asterisk

Перезапустить:

sudo systemctl restart asterisk

Остановить:

sudo systemctl stop asterisk

Включить в автозагрузку:

sudo systemctl enable asterisk

Показать статус:

sudo systemctl status asterisk

Теперь нам нужно сделать некоторые общие настройки и добавить пользователей. Работать будем с файлом конфигурации /etc/asterisk/sip.conf. Файлы настроек астера хорошо закомментированы и это может пригодиться в дальнейшем, но я предпочитаю чтобы конфиг был чистым, без лишней ерунды, чтобы не приходилось скролить от сих до сих, поэтому мы сделаем копию на будущее и создадим новый файл.

cd /etc/asterisk

sudo cp sip.conf sip_copy.conf

sudo rm sip.conf

sudo nano sip.conf

[general]
;Внешний ip адрес
externaddr=31.134.139.98: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=PASSWORD
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=PASSWORD
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=PASSWORD
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, то вы просто в его разделе указываете эти настройки. PASSWORD можно задать свой для каждой группы, и так будет безопасней, но я использую один, потому что мне так удобней.

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

  • Параметры callgroup и pickupgroup задают группы перехвата звонков. Люди из одной группы могут перехватывать звонки друг друга. Удобно заводить в одну группу людей, сидящих в одной комнате. Так они видят, что человека нет на месте и перехватывают его звонок. Эти параметры можно индивидуально задать для каждого пользователя в отдельности, если разбивка по шаблонам настроек не соответствует реальной рассадке людей в офисе.
  • Параметр callerid можно задать кириллицей, но могут возникнуть проблемы с некоторыми телефонами и точно возникнут проблемы, когда вы будете вести статистику звонков в mysql. Я не смог победить эту проблему с кодировками, поэтому использую только латиницу в этом параметре. Туда можно писать либо должность, либо ФИО человека.
  • call-limit=1 задает количество одновременных соединений на линию. Если у вас один человек = один телефонный аппарат, то разрешать больше одной линии на пользователя нет смысла. Ему будет идти новый звонок в тот момент, как он разговаривает. Конечно, если есть необходимость переключаться между разговорами и ставить кого-то на удержание, то можно делать и больше линий. Но мне кажется, это неудобно. Если ты разговариваешь, пусть звонящий лучше услышит занято и перезвонит.
  • Я всех добавляю в один context. В данном примере у нас будет только один номер телефона на всех. Если у вас их будет несколько, то контекстами можно будет разводить звонки на разные номера. Эту ситуацию я рассмотрю в отдельной статье.

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

cd /etc/asterisk

sudo cp extensions.conf extensions_copy.conf

sudo rm extensions.conf

sudo nano 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. Заходим в консоль и перезагружаем его:

sudo asterisk -r

CLI> reload
CLI> sip show users

asterisk3

Видим всех наших пользователей, их пароли и контекст. Список отсортирован не по порядку, не пугайтесь, если не заметите какой-то номер.

Дальше устанавливайте любую софтовую звонилку на компьютер или можете сразу использовать телефон, если он у вас под рукой. С телефонами удобнее, но они не всегда имеются в наличии. У меня, например, нет. В операционной системе семейства Windows я могу вам предложить программку 3CXPhone то Винду поюзать рад - тот позорит наш отряд). Я же захожу в Windows только по большой нужде (то есть - либо по работе, либо в игрушки ), и в качестве софтфона предпочитаю использовать Twinkle.

sudo apt install twinkle

 При первом запуске приложение предложит вам создать профиль пользователя. Для этого воспользуемся мастером.

asterisk4

Здесь все предельно ясно: в поле "Домен" указываем адрес нашего сервера, а пароль берем из таблички с предыдущего слайда, у нас это "123". Далее один нюанс. В следующем окне переходим во вкладку "Сеть" и меняем порт на 5060, иначе лыжи не поедут.

asterisk5

asterisk6

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

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

sip show peers

Должна быть строка с подключенным пиром:

104/104                   192.168.88.254                            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, там мне ответили. В файле отражены все основные данные этого звонка.

 

НАСТРОЙКА SIP TRUNK (ТРАНКА) И ДОБАВЛЕНИЕ НОМЕРА

Ну что ж, наша АТС-ка уже работает, теперь осталось только позаботиться о связи с внешнем миром. Регистрируемся у какого-нибудь sip провайдера и получаем настройки транков для подключения. В моем случае провайдером будет Новофон (в буржуйском вариенте zadarma). Небольшой анализ рынка таких услуг показал, что это реально дешман. Самый простой тариф предусматривает ежемесячную абонентскую плату где-то в пределах 130 р., 100 бесплатных минут на исходящие звонки и все входящие бесплатны, кроме номеров, начинающихся с 800. После регистрации в личном кабинете в разделе Настройки -> Подключение по SIP я вижу свой логин, пароль для подключения и адрес сервера. Там же можно узнать пример настройки подключения для астериска и номера для тестовых звонков:

  • Номер для эхо-теста: 4444.
  • Информация про остаток на счету: 1111
  • Прямой звонок: Санкт-Петербург +7 (812) 507 96 02 и внутренний номер клиента (логин)

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

Итак, добавим необходимые настройки sip транка, чтобы выполнить его регистрацию. Редактируем sip.conf, добавляем в самый конец нового пира в соответствии с инструкцией провайдера:

cd /etc/asterisk

sudo nano sip.conf

[366253]
host=sip.zadarma.com
insecure=invite,port
type=peer
fromdomain=sip.zadarma.com
disallow=all
allow=alaw
allow=ulaw
dtmfmode=auto
secret=PASSWORD
defaultuser=366253
trunkname=366253
fromuser=366253
callbackextension=366253
context=zadarma-in
qualify=400
directmedia=no
nat=force_rport,comedia

[100] ;внутренний номер нашего астериска, на который пойдет звонок извне
secret=PASSWORD
host=dynamic
type=friend
context=zadarma-out

В данном случае 366253 - это мой внутренний номер в сервисе, а PASSWORD - пароль, совпадающий, как уже говорилось, с группой абонента под номером 100. Естественно, чтобы он был такой же и для транка, его необходимо задать в настройках Новофон. Настройки - подключение по SIP - пароль.

Сохраняем файл и даем команду астеру перечиать конфиг:

sudo asterisk -r

CLI> sip reload

Если все в порядке, мы тут же получитм сообщение:

chan_sip.c:24403 handle_response_peerpoke: Peer '366253' is now Reachable. (55ms / 400ms)

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

CLI> sip show peers
397945/397945             185.45.152.161                              Auto (No)  No             5060     OK (54 ms)

Все, транк настроили, по сути подключили номер. Но этого не достаточно, чтобы совершать и принимать звонки. Надо отредактировать dial-plan.

DIAL-PLAN - ПРИМЕР МАРШРУТИЗАЦИИ ЗВОНКОВ

Начало построения диалплана для маршрутизации звонков мы уже положили, когда настраивали внутренние звонки. Теперь нужно дополнить dial-plan для совершения исходящих и приема входящих звонков. Редактируем extensions.conf и приводим его к следующему виду:

sudo nano extensions.conf

[general]
static=yes
writeprotect=no

[globals]

[default]

;Вешаем трубку
[handup-sip]
exten => _X!,1,HangUp()

;Исходящие звонки
[call-out]
;Звонок на внутренний номер
exten => _XXX,1,Dial(SIP/${EXTEN})
exten => _XXX.,1,Dial(SIP/${EXTEN}@366253) ; звонки на номера в которых четрые и более цифр через транк 366253
include => handup-sip


[zadarma-in]
exten => 366253,1, Dial(SIP/100)            ; все входящие звонки с транка 366253 направлены на внутренний номер 100

[zadarma-out]
exten => _XXX,1,Dial(SIP/${EXTEN})          ; звонки на трехзначные внутренние номера aстериска
exten => _XXX.,1,Dial(SIP/${EXTEN}@366253)  ; звонки на номера в которых четрые и более цифр через транк 366253 

Я выложил полную версию файла, а не только то, что добавил. Добавленные строки выделил жырным ("жи"  и "ши" пиши через "и", а "жы" и "шы" - через "ы").

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

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

Контекст [call-in] описывает поведение при входящем звонке. В нашем случае все входящие звонки с транка 366253 будут направляться на номер секретаря 100. К этому контексту мы еще вернемся позже, когда будем настраивать голосовое меню.

Сохраняем dial-plan и перезагружаем астериск единой командой reload, либо отдельно перезагружаем sip и dialplan командами:

CLI> sip reload
CLI> dialplan reload 

Теперь можно попробовать позвонить, к примеру, на тестовый номер zadarma - 4444 для эхотеста. Если все получилось, значит все настроено правильно. Если у вас что-то не получилось, то вам, конечно, не позавидуешь. Для проверки входящего звонка, позвоните в Москве на номер +7 (812) 5079602 и введите свой добавочный номер в виде логина. Звонок должен переключиться на номер 100. Чтобы это произошло, необходимо, чтобы peer с номером 100 был подключен к астериску.

Я проверил, без проблем дозвонился и по исходящему номеру, и по входящему.

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

ПРИВЕТСТВИЕ И ГОЛОСОВОЕ МЕНЮ (IVR)

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

Для простоты настройки и отладки используем смартфон. Я не гей и поэтому он у меня работает под управлением ОС семейства Linux, а точнее, под Android. Там есть такая программулина, которая называется Sipnetic. Скачиваете ее на вашу "балалайку" и регистрируете еще одну учетную запись в проекте. Логинитесь под ней в телефоне и можете звонить на свой астериск, просто набирая 6-ти значный номер аккаунта, который используете на сервере. Таким образом вы быстро, удобно и бесплатно эмулируете входящие звонки с внешних линий на свой сервер.

Начнем настройку с того, что создадим возможность для записи приветствия. Вы можете записать его где угодно и потом скопировать на сервер astersik. Но можно поступить удобнее - записать прямо с телефонного аппарата приветствие и использовать его в голосовом меню. Чтобы это сделать, необходимо добавить в 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()

Перезагружаем dialplan:

sudo asterisk -x "dialplan reload"

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

bot maxim

На том же сайте есть и другие роботы, которые умеют читать гораздо лучше, но им не сравниться с ботом Максимом. А вообще, подобных сайтов довольно много. Вот, например, еще - тут можно даже расставлять ударения и если вам нужно озвучить больше текста, то можно докупить токенов за какие-то копейки. В общем, пишем текст, скачиваем файл, но дальше есть одна маленькая загвоздка: Asterisk воспроизводит файлы только определенного формата, а именно mono, 8 KHz, 16 bit. Пока вы не приведете его в такую кондицию, лыжи не поедут - я уже с этим напарился, проверил. Ну а для конвертации подойдет бесплатная программа Audocity. Там все довольно просто. В левом нижнем углу выставляете необходимую частоту проекта, затем идете во вкладку "Правка - настройки - качество", выставляете нужные параметры, после чего можно экспортировать файл как waw. Думаю, с этим справится любой дурачок.

audiocityСохраните подходящую запись с именем ivr-main.wav и разместите его в какой-нибудь папке. Я положил ее в папку /etc/asterisk/ivr. Добавим пример голосового меню в нашу конфигурацию asterisk. Для этого снова открываем extensions.conf и добавляем в него новый контекст [ivr-main] следующего содержания:

[ivr-main]
exten => s,1,Answer()
;Проигрываем приветствие
exten => s,2,Background(/etc/asterisk/ivr/ivr-main)
;Ждем 5 секунд ввода добавочного номера
exten => s,3,WaitExten(5)
;Звоним по введенному добавочному
exten => _XXX,1,Dial(SIP/${EXTEN})
;Если введен не существующий номер, то говорим об этом и отправляем в начало приветствия
exten => _XXX,2,Playback(privacy-incorrect)
exten => _XXX,3,Goto(ivr-main,s,1)
;Если звонящий ничего не вводит, то звоним секретарю
exten => t,1,Dial(SIP/100)

В комментариях я сделал все пояснения. Мы создали контекст для ivr. Теперь его надо добавить в контекст входящих звонков. Для этого изменяем существующий контекст [call-in], заменяя в нем единственную строку на новую:

exten => 366253,1,Goto(ivr-main,s,1)

Перезапускаем диал план и звоним снаружи на внешний номер. Вы должны услышать голосовое приветствие ivr, которое мы только что настроили. После этого этапа ваш файл extensions.conf должен выглядеть примерно так (комментарии вырезал):

[general]
static=yes
writeprotect=no
[globals]
[default]

[handup-sip]
exten => _X!,1,HangUp()

[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 => _XXX,1,Dial(SIP/${EXTEN})
exten => _XXX.,1,Dial(SIP/${EXTEN}@366253)
include => handup-sip

[call-in]
exten => 366253,1,Goto(ivr-main,s,1)

[ivr-main]
exten => s,1,Answer()
exten => s,2,Background(/etc/asterisk/ivr/ivr-main)
exten => s,3,WaitExten(10)
exten => _XXX,1,Dial(SIP/${EXTEN})
exten => 107,2,Playback(/etc/asterisk/ivr/sysadmin)
exten => _XXX,2,Playback(privacy-incorrect)
exten => _XXX,3,Goto(ivr-main,s,1)
exten => t,1,Dial(SIP/101) 

ОТПРАВКА ТЕКСТОВЫХ СООБЩЕНИЙ

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

В sip.conf, в колонке general, добавим следующее:

accept_outofcall_message = yes
outofcall_message_context = meextensions.confssages
auth_message_requests = no

А в extensions.conf, в самый конец, вот это:

[messages]
exten => _XXX,1,MessageSend(sip:${EXTEN},"${CALLERID(name)}"${MESSAGE(from)})

Хотел научиться посылать сообщения с asterisk-сервера, чтобы информировать секретаря о заказанной услуге callback, но так и не нашел примеров реализации подобного функционала. Боюсь, если уж конкретно клинанет на этой теме, то придется писать свой собственный SIP-клиент. С другой стороны, можно ведь взять номер абонента из логов и послать куда-нибудь на почту или еще куда... Или даже специальную прогу написать которая будет подключаться с мобильника к Asterisk-серверу через TCP-сокет и выводить этот номер на экран в виде ссылки типа <a href="tel:+78125079602">... В общем, потом как-нибудь.

 ЗАЩИЩАЕМСЯ ОТ БАБУИНОВ ИЗ ЭТИХ ВАШИХ ИНТЕРНЕТОВ

Как известно, бабуины не могут сидеть на попе ровно, им всегда нужно куда-нибудь залезть своими шаловливыми ручонками, поковыряться там где их не просят и чего-нибудь сломать - поэтому глобальная сеть изобилует всякими малварями, ботами-брутфорсерами и т. д. Открыв порты наружу, долго ждать не придется - попытки взлома начнутся тут же, не пройдет и 5 минут. Стало быть, не помешает немножко защититься. Сделаем так, чтобы софтфон (или обычный телефон) мог подключаться к Asterisk ТОЛЬКО ЕСЛИ ОН НАХОДИТСЯ ВНУТРИ НАШЕЙ ЛОКАЛЬНОЙ СЕТИ. Для этого подредактируем sip.conf, где для каждого sip-клиента добавим  следующие строчки:

deny=0.0.0.0/0.0.0.0
permit=192.168.88.0/24
allowguest=no
call-limit=2;

 Здесь permit - доверенная сеть.

[366253]
deny=0.0.0.0/0
permit=192.168.88.0/24
allowguest=no call-limit=2;

host=sip.zadarma.com insecure=invite,port type=peer fromdomain=sip.zadarma.com disallow=all allow=alaw allow=ulaw dtmfmode=auto secret=PASSWORD defaultuser=366253 trunkname=366253 fromuser=366253 callbackextension=366253 context=zadarma-in qualify=400 directmedia=no nat=force_rport,comedia

А можно и не закрывать... На самом деле, я лично себе закрывать не стал, у меня мобильник подключен на номер 101. Как бы то ни было, не помешае еще одно правило, которое мы добавим в sip.conf, в колонку [general]:

alwaysauthreject=yes

УСТАНОВКА И НАСТРОЙКА FAIL2BAN

В астериске, по дефолту, нет такой системы, которая бы проверяла количество неверных попыток ввести пароль и блокировала бы человека по ip адресу. Как известно, если мы введем неправильный пароль по попытке подключиться по SSH, или неправильный пароль при попытке зарегистрировать SIP телефон - у нас в логах это отражается. Там будет написано "тот-то, с такого-то ip адреса не правильно ввел пароль". Причем у SSH свой лог, а у Asterisk свой. Так вот, программа fail2ban собирает всю информацию с этих лог-файлов (с логов SSH, Asterisk, веб-сервера, с любого) и блокирует по ip адресу злоумышленника, который несколько раз неправильно ввел пароль.

Если, например, мы подключились к SSH и 3 раза ввели неправильный пароль, то соответственно в логах SSH это отобразиться. Программа fail2ban это увидит и через iptables заблокирует ip адрес того человека, который 3 раза ввел неправильно пароль. Почему 3 раза могут неправильно ввести пароль? А потому, что существует специальные программы, брутофорсы, которые перебирают и подбирают пароль. Если никак и ничем это не ограничить, рано или поздно (за день, неделю, месяц, год) такого непрерывного перебора злоумышленник сможет подобрать пароль например к SSH. А если ip злоумышленника будет блокироваться на некоторое время, то такой фокус уже не пройдет.

Устанавливаем fail2ban.

sudo apt install fail2ban

sudo systemctl start fail2ban

sudo systemctl enable fail2ban

Переходим к редактированию главного конфигурационного файла этой программы:

sudo nano /etc/fail2ban/jail.conf

Рассмотрим структуру этого файла. Как видно, все они разделены на секции. Например [default] и [ssh-iptables]. Параметры из секции [default] применяются ко всем остальным секциям, если не будут переопределены. Секция [ssh-iptables] отвечает за защиту SSH от повторяющихся неудачных попыток авторизации на SSH–сервере, проще говоря, «brute–force (брутофорс, в переводе - перебор паролей). Теперь более подробно по параметрам, которые там есть:

ignoreip — IP–адреса, которые не должны быть заблокированы. Можно задать список IP-адресов разделённых пробелами, маску подсети, или имя DNS–сервера.
bantime — время бана в секундах, по истечении которого IP–адрес удаляется из списка заблокированных.
maxretry — количество неверных попыток ввода пароля, после которых применяется правило.
enabled — значение true указывает что данный jail активен, false выключает действие изолятора.
port — указывает на каком порту или портах запущен целевой сервис.
filter — имя .conf файла с шаблоном (который кладется по пути /etc/fail2ban/filter.d/) с регулярными
выражениями, по которым идёт поиск «подозрительных совпадений» в журналах сервиса. Например,
фильтру sshd соответствует файл /etc/fail2ban/filter.d/sshd.conf.
logpath — путь к файлу журнала, который программа Fail2ban будет обрабатывать с помощью
заданного ранее фильтра. Вся история удачных и неудачных входов в систему, в том числе и по SSH, по
умолчанию записывается в log–файл /var/log/secure.
findtime — определяет длительность интервала в секундах, за которое событие должно повториться определённое количество раз, после чего санкции вступят в силу. Если специально не определить этот параметр, то будет установлено значение по умолчанию равное 600 (10 минут). Проблема в том, что ботнеты, участвующие в «медленном брутфорсе», умеют обманывать стандартное значение. Иначе говоря, при maxretry равным 6, атакующий может проверить 5 паролей, затем выждать 10 минут, проверить ещё 5 паролей, повторять это снова и снова, и его IP забанен не будет. В целом, это не угроза, но всё же лучше банить таких ботов.

Насколько я понял, программа работает без каких-то особых настройках. Я практически не менял, лишь прошел поиском по всему файлу и установил максимально-допустимое количество попыток авторизации до 2-х. Больше не надо. А бан-тайм на 31536000 секунд, т. е., на год. Ну, и еще добавил свою сетку в белый лист (192.168.88.0/24).

После установки в каталоге /etc/fail2ban будет такая структура конфигурационных файлов:

  • /etc/fail2ban/jail.conf
  • /etc/fail2ban/jail.d/*.conf
  • /etc/fail2ban/jail.local
  • /etc/fail2ban/jail.d/*.local

Конфигурационные файлы считываются сверху вниз. Последний считанный файл имеет высший приоритет. Можно заморочиться и подредактировать jail.local

sudo nano /etc/fail2ban/jail.local

[DEFAULT]
maxretry = 2
findtime = 600
bantime = 31557600
action = firewallcmd-ipset
ignoreip = 192.168.88.0/24
 
[asterisk]
enabled = true
filter = asterisk
action = iptables-allports[name=asterisk, protocol=all]
logpath = /var/log/asterisk/fail2ban

sudo systemctl reload fail2ban

Через некоторое время посмотрим что в итоге получилось:

sudo fail2ban-client status asterisk

Status for the jail: asterisk
|- Filter
|  |- Currently failed:	2
|  |- Total failed:	74
|  `- File list:	/var/log/asterisk/fail2ban
`- Actions
   |- Currently banned:	4
   |- Total banned:	4
   `- Banned IP list:	51.159.95.157 121.36.36.79 134.122.114.234 147.135.202.11

Вот сколько наловил за 10 минут )

Если надо разблокировать IP, тогда используем следующий способ:

sudo fail2ban-client set asterisk unbanip 51.159.95.157

 ПОДКЛЮЧАЕМ ГОЛОСОВУЮ ПОЧТУ

Продолжаем наращивать функционал VoIP АТС. Если адресат звонка долго не отвечает, мы можем предложить звонящему оставить для него голосовое сообщение. Когда получатель вернется на место, он сможет прослушать оставленные ему сообщения. При этом, после записи голосового сообщения, будет отправлено письмо с записью этого сообщения на почтовый адрес получателя. Настройки по-умолчанию не трогаем, просто добавляем в секцию [default] ящики голосовой почты для нужных нам сотрудников в следующем виде:

130 => 1234,Number 130,Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript.
100 => 1234,Number 100,Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript.

130 - внутренний номер абонента

1234 - пароль доступа к ящику голосовой почты

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

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

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

CLI> voicemail reload
Reloading voicemail configuration...
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.

 

 

 To be continued...