ASTERISK - IP ТЕЛЕФОНИЯ
Сразу обозначу, что данная статья находится на стадии разработки, так что, пожалуйста, не удивляйтесь какой-нибудь ерунде, которую вы, вероятно, обнаружите в самом низу! Тем не менее, основа должна работать, это проверено!
Проверить работу сервиса, настроенного по этой статье, можно по телефону +7 812 507 9602 (сдох за неуплату 100 рублей)...
Сходил тут на очередное собеседование и понял, что необходимо разобраться в 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 upgrade -y
УСТАНОВКА ВСПОМОГАТЕЛЬНЫХ УТИЛИТ И БИБЛИОТЕК
DAHDI (Digium Asterisk Hardware Device Interface)
DAHDI — это набор драйверов и утилит для работы с телекоммуникационным оборудованием в Asterisk. Он изначально был разработан компанией Digium (теперь это часть Sangoma). DAHDI управляет аппаратными картами, которые подключают Asterisk к аналоговым и цифровым телефонным линиям. Если ты используешь аналоговые телефонные линии (POTS), цифровые линии (T1/E1), или ISDN, то DAHDI необходим.
Однако, если твоя телефонная станция будет работать только через SIP (например, через VoIP провайдеров) и не предполагает подключения к физическим телефонным линиям, DAHDI не понадобится.
sudo apt install asterisk dahdi
sudo dahdi_genconf
sudo systemctl restart dahdi
LibPRI (Primary Rate Interface Library)
LibPRI — это библиотека для работы с ISDN PRI (Primary Rate Interface), которая реализует протокол сигнализации ISDN. Она используется в основном для цифровых телефонных систем с большими потоками каналов (например, T1/E1 линии). LibPRI нужна, если ты собираешься подключаться к ISDN PRI линиям, которые позволяют одновременную передачу большого числа голосовых вызовов.
Как и в случае с DAHDI, если твоя система будет работать только через SIP или другие VoIP протоколы, LibPRI не понадобится.
sudo apt install libpri-dev
УСТАНОВКА ASTERISK ИЗ ОФИЦИАЛЬНОГО РЕПОЗИТОРИЯ
sudo apt install asterisk
sudo systemctl status asterisk
НАСТРОЙКА
Если наша АТС работает глобально, т. е., подключена к Интернету, звонит наружу и принимает входящие извне, то, вероятно, придется открыть/пробросить порты: 5060/udp, 10000:20000/udp, настроить файрволы и т. д. Далее приведу список команд управления сервисом.
Открыть порты в Ubuntu:
sudo ufw allow 5060/udp
sudo ufw allow 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
Видим всех наших пользователей, их пароли и контекст. Список отсортирован не по порядку, не пугайтесь, если не заметите какой-то номер.
Дальше устанавливайте любую софтовую звонилку на компьютер или можете сразу использовать телефон, если он у вас под рукой. С телефонами удобнее, но они не всегда имеются в наличии. У меня, например, нет. В операционной системе семейства Windows я могу вам предложить программку 3CXPhone (кто Винду поюзать рад - тот позорит наш отряд). Я же захожу в Windows только по большой нужде (то есть - либо по работе, либо в игрушки ), и в качестве софтфона предпочитаю использовать Twinkle.
sudo apt install twinkle
При первом запуске приложение предложит вам создать профиль пользователя. Для этого воспользуемся мастером.
Здесь все предельно ясно: в поле "Домен" указываем адрес нашего сервера, а пароль берем из таблички с предыдущего слайда, у нас это "123". Далее один нюанс. В следующем окне переходим во вкладку "Сеть" и меняем порт на 5060, иначе лыжи не поедут.
Здесь тоже все понятно. Чтобы позвонить другому абоненту, вводим его номер во поле "Позвонить" и нажимаем кнопочку "Набрать".
Теперь, когда мы подключили несколько телефонов, можно проверить связь, набрав на сервере команду
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"
У меня не так уж и много подружек с сексуальным голосом, который мог бы отвечать на звонки, а сам я стесняюсь, когда приходится что-нибудь играть перед камерой или микрофоном, поэтому для создания файла аудио-приветствия я решил воспользовать онлайн-сервисом для трансформации текста в речь.
На том же сайте есть и другие роботы, которые умеют читать гораздо лучше, но им не сравниться с ботом Максимом. А вообще, подобных сайтов довольно много. Вот, например, еще - тут можно даже расставлять ударения и если вам нужно озвучить больше текста, то можно докупить токенов за какие-то копейки. В общем, пишем текст, скачиваем файл, но дальше есть одна маленькая загвоздка: Asterisk воспроизводит файлы только определенного формата, а именно mono, 8 KHz, 16 bit. Пока вы не приведете его в такую кондицию, лыжи не поедут - я уже с этим напарился, проверил. Ну а для конвертации подойдет бесплатная программа Audocity. Там все довольно просто. В левом нижнем углу выставляете необходимую частоту проекта, затем идете во вкладку "Правка - настройки - качество", выставляете нужные параметры, после чего можно экспортировать файл как waw. Думаю, с этим справится любой дурачок.
Сохраните подходящую запись с именем 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...