Home » Asterisk » Asterisk - SIP АТС для офиса, пошаговая инструкция по настройке с нуля

Asterisk - SIP АТС для офиса, пошаговая инструкция по настройке с нуля

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

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

Данная статья является частью единого цикла статьей про сервер Centos.

Введение

Не буду останавливаться на описании сервера asterisk, в интернете много информации на эту тему. Да и сам я кратко рассказывал в своих предыдущих статьях про установку. Материал будет объемный, поэтому сразу перейдем к сути.

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

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

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

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

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

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

Для настройки я буду использовать учетную запись сервиса zadarma.com (отделились в РФ и работают под брендом Новофон). Неплохой оператор voip связи. Беру его для примера, потому что удобно использовать для тестирования конфигурации. Сразу после регистрации вам дают аккаунт, пример настроек для asterisk. Вы можете позвонить на прямой городской номер, ввести добавочный и совершить звонок на свой аккаунт. Это полностью эмулируер работу sip подключения от какого-нибудь провайдера.

В качестве операционной системы у меня выступает CentOS 8. Но для данной статьи это не имеет принципиального значения. Конфигурация астериск кроссплатформенная, без проблем переносится между системами.

Приступаем к нашей работе по настройке сервера телефонии.

Быстрая установка из репозитория

Centos 7

У 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

Установка asterisk из репозитория

Установка из исходников

Centos 8

Вопроса установки asterisk я уже касался ранее в одной из прошлых статей. Но там я использовал связку с панелью управления freepbx. Здесь же мы будем использовать голый астериск, без обвязок. Более того, я не буду использовать никаких дополнительных плат расширения и модемов. Будет только софтовая АТС, которая легко переносится с одного сервера на другой при желании. Считаю, что такой подход наиболее эффективен и к нему стоит стремиться. Настроив виртуальную машину, вы навсегда будете отвязаны от конкретного железа и спокойно можете переносить свой сервер куда угодно, заменив только сетевые настройки.

Таким образом, нам нужно установить непосредственно asterisk и pjproject с jansson. На первоначальном этапе этого достаточно. Если вы предпочитаете сервер debian, то воспользуйтесь отдельной инструкцией по установке asterisk 16 на debian 10. После этого можете сразу же переходить на следующий этап настройки. Приступим.

Первым делом обновляем систему и отключаем SELinux, как рассказано в статье про настройку centos. Установим теперь пакеты, которые нам понадобятся для сборки. В первую очередь подключим репозиторий epel.

# dnf install epel-release

Дальше идет мета пакет Development Tools со всем необходимым для сборки из исходников.

# dnf groupinstall "Development Tools"

Установка 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

Установка зависимостей asterisk 16 Настройте 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

Установка Jansson

# 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

Установка pjsip Все готово к установке непосредственно 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

Собираем asterisk.

# ./configure --libdir=/usr/lib64
# make menuselect

Установка Asterisk 16 на Centos 8 Выбирайте необходимые модули и звуки, в зависимости от того, что вам нужно. Я в общем случае указываю:

  • 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 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

Centos 7

Если вы хотите использовать для настройки Asterisk предыдущую версию системы, то смотрите мою статью по установке Asterisk 16 на Centos 7. Там нет принципиальных отличий, но имейте ввиду, что все дальнейшие действия были проделаны и проверены на 8-й вверсии Центос, так что я не ручаюсь, что это так же заработает и на 7-й. Полную проверку и адаптацию материала я сделал для CentOS 8.

Настройка iptables, asterisk за NAT, проброс портов

Сразу же уделим внимание настройке iptables для работы астериск. У нас может быть 2 ситуации, которые требуют двух принципиально различных настроек:

  1. Сервер телефонии имеет свой внешний ip адрес и напрямую смотрит через него в интернет.
  2. Сервер стоит за шлюзом, не имеет своего внешнего адреса, доступ в интернет с помощью NAT.

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

Я не могу привести универсальные настройки для всех случаев. У каждого будут свои нюансы. Кто-то, к примеру, будет пользоваться phpmyadmin для настройки базы mysql для хранения статистики звонков. Потом эту же статистику будет просматривать через cdr viewer, установленный на веб сервере. Доступ к этому веб серверу можно открыть через внешний IP адрес, а можно только через локальную сеть. Настройки 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
$WAN_IP Внешний IP адрес на шлюзе
192.168.1.25 Локальный адрес сервера астериск

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

Если вы делаете тестовую установку и настройку asterisk, можете совсем отключить firewalld:

# systemctl stop firewalld
# systemctl disable firewalld
# dnf remove firewalld

Подключение абонентов и проверка внутренних звонков

Астериск у нас установлен, 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

sip show users

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

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

Пример подключения телефона к asterisk Я сразу открываю дебаг окно для отладки. Корректное подключение к серверу будет выглядеть вот так: Подключение 3CXPhone к астериск Проверим на сервере список подключенных пиров с помощью команды:

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 мы сделали. Будем двигаться дальше.

Настройка sip trunk (транка) и добавление номера

Регистрируемся у какого-нибудь sip провайдера и получаем настройки транков для подключения. Как я говорил выше, я буду использовать провайдера zadarma. После регистрации в личном кабинете в разделе Настройки -> Подключение по SIP я вижу свой логин, пароль для подключения и адрес сервера. Там же можно узнать пример настройки подключения для астериска и номера для тестовых звонков:

  • Номер для эхо-теста: 4444.
  • Информация про остаток на счету: 1111
  • Прямой звонок: Москва +7 (495) 777-66-75 и внутренний номер клиента (логин)

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

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

В данном случае 397945 мой внутренний номер в сервисе, password - пароль. Сохраняем файл и даем команду астеру перечиать его:

CLI> sip reload

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

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

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

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

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

Dial-plan - пример маршрутизации звонков

Начало построения диалплана для маршрутизации звонков мы уже положили, когда настраивали внутренние звонки. Теперь нужно дополнить dial-plan для совершения исходящих и приема входящих звонков. Редактируем 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}@397945)

include => handup-sip

;Входящие звонки
[call-in]
exten => 397945,1,Dial(SIP/100)

Я выложил полную версию файла, а не только то, что добавил. Добавленные строки выделил цветом.

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

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

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

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

CLI> sip reload
CLI> dialplan reload

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

Я проверил, без проблем дозвонился и по исходящему номеру, и по входящему. В файле Master.csv появилась информация о совершенных звонках:

"","100","4444","call-out","""Number 100"" <100>","SIP/100-00000002","SIP/397945-00000003","Dial","SIP/4444@397945","2020-02-27 14:13:18","2020-02-27 14:13:20","2020-02-27 14:13:25",6,5,"ANSWERED","DOCUMENTATION","1582812798.3",""
"","79689056505","397945","call-in","""79689056505"" <79689056505>","SIP/397945-00000004","SIP/100-00000005","Dial","SIP/100","2020-02-27 14:14:11",,"2020-02-27 14:14:16",4,0,"BUSY","DOCUMENTATION","1582812851.6",""

После звонков в консоли астера и в логе /var/log/asterisk/messages вы увидите множество ошибок:

res_hep.c: Unable to send packet: Address Family mismatch between source/destination

Чтобы их не было, вам нужно на сервере отключить протокол ipv6.

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

Приветствие и голосовое меню (ivr)

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

Для простоты настройки и отладки, поделюсь способом, который использую я. У проекта zadarma есть клиент под андроид - Zadarma SIP. Скачиваете его на телефон и регистрируете еще одну учетную запись в проекте. Логинитесь под ней в телефоне и можете звонить на свой астериск, просто набирая 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:

CLI> dialplan reload

Теперь при звонке на любой из номеров 350-359 вы услышите бип, после которого начнется запись всего, что сказано в трубку. Чтобы завершить запись, нажмите #. После этого вы прослушаете то, что было записано. Файл с записью будет сохранен в папку /temp. Если вы позвоните на номер 351, то файл будет иметь имя music1.wav, если на 355, то music5.wav. Можно записать до 10-ти разных вариантов и потом из них выбирать.

Сохраните подходящую запись с именем 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 => 397945,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}@397945)
include => handup-sip

[call-in]
exten => 397945,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(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)

Включаем голосовую почту

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

На практике я не видел, чтобы голосовую почту активно использовали. Но для полноты картины расскажу про нее, возможно вам она пригодится. Открываем файл voicemail.conf на редактирование. Я не трогал настройки по-умолчанию, просто добавляем в секцию [default] ящики голосовой почты для нужных нам сотрудников в следующем виде:

130 => 1234,Number 130,user130@mail.ru
100 => 1234,Number 100,user100@mail.ru
130 внутренний номер абонента
1234 пароль доступа к ящику голосовой почты
user130@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, Wait(2)
exten => _35X, n, Playback(beep)
exten => _35X, n, Record(/tmp/music${EXTEN:2}:wav)
exten => _35X, n, Wait(1)
exten => _35X, n, Playback(/tmp/music${EXTEN:2})
exten => _35X, n, Wait(2)
exten => _35X, n, Hangup()
;Управление голосовой почтой
exten => 500,1,VoiceMailMain()
;Звонок на внутренний номер
exten => _XXX,1,Dial(SIP/${EXTEN},15)
;Звонок на внешний номер
exten => _XXX.,1,Dial(SIP/${EXTEN}@397945)

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

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

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

  1. Номера вообще не существует на сервере. В нашем случае, к примеру, это любой номер не из диапазона 100-130.
  2. Номер существует, но он не зарегистрирован на АТС, то есть аппарат с этим номером не подключен.
  3. Номер существует, зарегистрирован, но при звонке на него никто не отвечает.
  4. Номер существует, зарегистрирован, но в данный момент занят.

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

Обработка этих событий не такая простая, как кажется на первый взгляд. Я сразу же столкнулся с трудностью следующего характера. С параметром call-limit=1 при звонке на номер, который занят в данный момент, астериск возвращает статус CHANUNAVAIL, что может означать, к примеру, что канал недоступен. На статус занято BUSY это совсем не похоже. Для разрешения этой ситуации я воспользуюсь функцией ChanIsAvail, которая проверяет не статус пира, а статус канала и возвращает значение 2 или 3, когда он занят.

Для различения несуществующих и не подключенных пиров я буду использовать функцию SIPPEER. Если она ничего не возвращает, значит номера не существует, если значение UNKNOWN, значит номер не подключен. С отсутствием ответа какое-то время проще всего. Если пир возвращает статус NOANSWER, включаем голосовую почту. Собираем все статусы в одно место и добавляем голосовую почту. Для этого в контекст [ivr-main] добавляем новые параметры и приводим его к следующему виду:

[ivr-main]
exten => s,1,Answer()
exten => s,2,Background(/etc/asterisk/ivr/ivr-main)
exten => s,3,WaitExten(5)
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(2)
exten => num-not-exist,n,Playback(invalid)
;Если номер не подключен, говорим "Набранный вами номер отключен, проверьте номер и повторите попытку
exten => num-not-connected,1,Wait(2)
exten => num-not-connected,n,Playback(ss-noservice)
;Если номер занят, говорим "Занято"
exten => num-BUSY,1,Wait(2)
exten => num-BUSY,n,Playback(vm-isonphone)
;Если номер не отвечает, включаем голосовую почту
exten => num-NOANSWER,1,Wait(2)
exten => num-NOANSWER,n,Voicemail(${dstNUM},u)
;Если еще по какой-то причине будет статус CHANUNAVAIL, говорим, что номер не доступен в данный момент
exten => num-CHANUNAVAIL,1,Wait(2)
exten => num-CHANUNAVAIL,n,Playback(vm-isunavail)
;Если в голосовом меню не выбрали внутренний номер, адресуем звонок секретарю
exten => t,1,Dial(SIP/100,15)

Если вам нужна обработка статусов номеров для внутренних звонков, то скопируйте обработку состояний в контекст [call-out], за исключением последней строки, которая отвечает за звонок секретарю. Полностью контекст внутренних звонков будет выглядеть вот так:

[call-out]
;Номер для записи звуков, окончание записи #
exten => _35X, 1, NoOp()
exten => _35X, n, Wait(2)
exten => _35X, n, Playback(beep)
exten => _35X, n, Record(/tmp/music${EXTEN:2}:wav)
exten => _35X, n, Wait(1)
exten => _35X, n, Playback(/tmp/music${EXTEN:2})
exten => _35X, n, Wait(2)
exten => _35X, n, Hangup()
;Управление голосовой почтой
exten => 500,1,VoiceMailMain()
;Звонок на внутренний номер
exten => _XXX,1,Dial(SIP/${EXTEN},15)
exten => _XXX,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,Wait(2)
exten => num-not-exist,n,Playback(invalid)
exten => num-not-connected,1,Wait(2)
exten => num-not-connected,n,Playback(ss-noservice)
exten => num-BUSY,1,Wait(2)
exten => num-BUSY,n,Playback(vm-isonphone)
exten => num-NOANSWER,1,Wait(2)
exten => num-NOANSWER,n,Voicemail(${dstNUM},u)
exten => num-CHANUNAVAIL,1,Wait(2)
exten => 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 и перечитывая конфигурацию голосовой почты.

Очереди (queues) входящих звонков

С помощью очередей в астериске можно управлять потоком входящих звонков, перераспределяя их по определенным правилам. В нашей конфигурации asterisk мы настроим очередь (queue) для направления звонка двум секретарям одновременно. Кто первый ответит, тот и будет разговаривать со звонящим. Если один секретарь уже разговаривает, новый звонок поступит к другому. Если оба секретаря будут заняты, звонящий будет слушать мелодию и ожидать, пока кто-нибудь не освободится. Как только один из секретарей освободится, звонящего из очереди направит на освободившийся номер.

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

Открываем файл queues.conf и добавляем в самый конец:

[secretary]
strategy = ringall
member => SIP/100
member => SIP/130

Все остальные настройки оставляю по-умолчанию. Параметр strategy может принимать следующие значения:

ringall вызываются все доступные участники до тех пор, пока кто-то из них не ответит на вызов (по умолчанию).
leastrecent Вызывается первый свободный участник, который меньше всего вызывался из этой очереди.
fewestcalls Вызывается первый свободный участник, который обработал наименьшее количество вызовов из данной очереди.
random случайным образом вызывается не занятый участник, обрабатывающий очередь.
rrmemory циклическое распределение с памятью, запоминается последний участник, ответивший на вызов.

Вы можете выбрать наиболее подходящую вам стратегию распределения звонков в очереди. Дальше нужно добавить в extensions.conf в созданный нами ранее контекст с голосовым меню отправку звонка в очередь с секретарями. Для этого меняем строку в [ivr-main]:

exten => t,1,Dial(SIP/100,15)

на новую:

exten => t,1,Queue(secretary,t)

Если раньше при звонке на внешний номер, звонящий не набирал внутренний номер абонента, то через 5 секунд он перенаправлялся к секретарю с номером 100. Теперь он будет отправляться в очередь secretary, в которую мы завели 2 номера - 100 и 130. Можно добавить и больше номеров, если есть необходимость.

Перечитываем полностью конфигурацию asterisk:

CLI> reload

Состояние созданной очереди:

CLI> queue show secretary
secretary has 0 calls (max unlimited) in 'ringall' strategy (0s holdtime, 0s talktime), W:0, C:0, A:0, SL:0.0% within 0s
Members:
SIP/100 (ringinuse enabled) (Not in use) has taken no calls yet
SIP/130 (ringinuse enabled) (Not in use) has taken no calls yet
No Callers

Теперь можете позвонить на внешний номер и дождаться перенаправления на секретаря. Зазвонят оба аппарата. Если оба заняты, звонок будет висеть в очереди и ждать освобождения. После звонка статистика очереди изменится:

CLI> queue show secretary
secretary has 0 calls (max unlimited) in 'ringall' strategy (0s holdtime, 2s talktime), W:0, C:1, A:1, SL:0.0% within 0s
Members:
SIP/100 (ringinuse enabled) (Not in use) has taken 1 calls (last was 63 secs ago)
SIP/130 (ringinuse enabled) (Not in use) has taken no calls yet
No Callers

Вот так легко организовать простую queue (очередь) в asterisk. Более сложные примеры я буду рассматривать в отдельных статьях.

Учет и просмотр статистики звонков (cdr viewer)

Важной и нужной возможностью современной АТС на базе asterisk является сбор и просмотр статистики звонков. По умолчанию, астериск ведет статистику в файле /var/log/asterisk/cdr-csv/Master.csv. Разобрать этот файл и передать куда-то в обработку не очень сложно, если у вас есть что-то или кто-то, кто способен написать на каком-нибудь языке программирования обработку.

Мы будем использовать готовые бесплатные инструменты для просмотра статистики звонков. Все необходимое для этого мы установили в самом начале. Перенесем сбор статистики в mysql базу. Для этого запускаем mariadb сервер, добавляем в автозагрузку и устанавливаем пароль администратора:

# systemctl start mariadb
# systemctl enable mariadb.service
# /usr/bin/mysql_secure_installation

Подключаемся к mysql и создаем пользователя и базу данных:

# mysql -uroot -p
MariaDB [(none)]> create database asterisk;
MariaDB [(none)]> use asterisk;
MariaDB [asterisk]> CREATE TABLE `cdr` (   `id` int(9) unsigned NOT NULL auto_increment,   `calldate` datetime NOT NULL default '0000-00-00 00:00:00',   `clid` varchar(80) NOT NULL default '',   `src` varchar(80) NOT NULL default '',   `dst` varchar(80) NOT NULL default '',   `dcontext` varchar(80) NOT NULL default '',   `channel` varchar(80) NOT NULL default '',   `dstchannel` varchar(80) NOT NULL default '',   `lastapp` varchar(80) NOT NULL default '',   `lastdata` varchar(80) NOT NULL default '',   `duration` int(11) NOT NULL default '0',   `billsec` int(11) NOT NULL default '0',   `disposition` varchar(45) NOT NULL default '',   `amaflags` int(11) NOT NULL default '0',   `accountcode` varchar(20) NOT NULL default '',   `uniqueid` varchar(32) NOT NULL default '',   `userfield` varchar(255) NOT NULL default '',   PRIMARY KEY  (`id`),   KEY `calldate` (`calldate`),   KEY `accountcode` (`accountcode`),   KEY `uniqueid` (`uniqueid`),   KEY `dst` (`dst`),   KEY `src` (`src`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
MariaDB [asterisk]> grant all on asterisk.* to 'asterisk_user'@'localhost' identified by '12345678';
asterisk имя базы данных
asterisk_user пользователь базы данных
12345678 пароль пользователя бд

Теперь нам надо установить odbc коннектор для mysql - mysql-connector-odbc. С этим в Centos 8 есть некоторые трудности, так как нужных пакетов нет в базовых репозиториях. Я в итоге его взял из официальной репы mysql. Для этого скачиваем и подключаем их репозиторий.

# wget https://dev.mysql.com/get/mysql80-community-release-el8-1.noarch.rpm
# dnf localinstall mysql80-community-release-el8-1.noarch.rpm
# dnf makecache

Тут я получил ошибку:

Failed to download metadata for repo 'mysql-tools-community'
Error: Failed to download metadata for repo 'mysql-tools-community'

Не стал разбираться, почему этот репозиторий недоступен, так как он мне не нужен. Просто зашел в /etc/yum.repos.d/mysql-community.repo и закомментировал строки с этим репозиторием.

#[mysql-tools-community]
#name=MySQL Tools Community
#baseurl=http://repo.mysql.com/yum/mysql-tools-community/el/8/$basearch/
#enabled=1
#gpgcheck=1
#gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

После этого благополучно обновил кэш пакетов и установил mysql-connector-odbc на centos 8.

# dnf install mysql-connector-odbc

Теперь редактируем файлы конфигурации. Добавляем в самый конец /etc/asterisk/res_odbc.conf:

[asterisk]
enabled => yes
dsn => MySQL-asterisk
username => asterisk_user
password => 12345678

В конец файла /etc/asterisk/cdr_adaptive_odbc.conf:

[cdr_adaptive_connection]
connection=asterisk
table=cdr
alias start => calldate

Создаем файл /etc/odbc.ini следующего содержания:

[MySQL-asterisk]
Description = MySQL Asterisk database
Driver = MySQL
Server = localhost
User = asterisk_user
Password = 12345678
Socket = /var/lib/mysql/mysql.sock
Database = asterisk

Редактируем файл /etc/odbcinst.ini. Я его не трогал, оставил по-умолчанию, только в самый конец секции [MySQL] добавил две недостающие строки. Я не разбирался нужны они или нет, просто подсмотрел в другой инструкции. Вот как этот файл выглядит у меня:

[MySQL]
Description = ODBC for MySQL
Driver = /usr/lib/libmyodbc8.so
Setup = /usr/lib/libodbcmyS.so
Driver64 = /usr/lib64/libmyodbc8a.so
Setup64 = /usr/lib64/libodbcmyS.so
FileUsage = 1
CPTimeout =
CPReuse =

В последнем конфиге проверьте все пути. Имена файлов могут немного отличаться в зависимости от установленной версии коннектора. Актуализируйте пути и имена файлов. После этого проверьте работу odbc connector. Для этого запустите в консоли команду:

# odbcinst -q -d

Вы должны увидеть список всех настроенных коннекторов, в том числе [Mysql]. Настроим использование нашего часового пояса в записях cdr. По-умолчанию там стоит часовой пояс GTM. Для этого в файле /etc/asterisk/cdr.conf указываем параметр:

usegmtime=no

После этого перезапускаем астериск:

# systemctl restart asterisk

Заходим в консоль и проверяем подключение по odbc.

> odbc show all

Настройка odbc в asterisk

Совершаем звонок и проверяем таблицу mysql. У меня добавилась информация о звонке с номера 100 на 101, когда он был не подключен. Если сделать экспорт, то получится вот такая запись:

INSERT INTO `cdr` (`id`, `calldate`, `clid`, `src`, `dst`, `dcontext`, `channel`, `dstchannel`, `lastapp`, `lastdata`, `duration`, `billsec`, `disposition`, `amaflags`, `accountcode`, `uniqueid`, `userfield`) VALUES
(1, '2020-02-27 19:08:17', '\"Number 100\" <100>', '100', 'num-not-connected', 'call-out', 'SIP/100-0000000e', '', 'Dial', 'SIP/101,15', 6, 4, 'ANSWERED', 3, '', '1582819697.14', '');

Для удобства дальнейшей работы, я настроил web сервер на базе apache. Не буду на этом подробно останавливаться. Чтобы двигаться дальше нам нужен классический web сервер на базе php. Для удобства рекомендую сразу настроить phpmyadmin или любой другой клиент к mysql. Если привыкли работать с mysql через консоль, можете обойтись без него.

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

Запись (record) разговоров

Запись разговоров в asterisk настраивается относительно не сложно. Буквально нужно добавить несколько строк в dialplan. Но мы сразу сделаем более расширенную настройку. Мы будем не просто записывать все разговоры, но станем хранить информацию о звонках в mysql, чтобы их можно было прослушивать через удобную web панель просмотра статистики.

Хранить записи будем в mp3, потому нам понадобится утилита lame, для конвертации файлов из формата wav в mp3. Скачаем ее и установим.

# cd ~
# wget http://sourceforge.net/projects/lame/files/lame/3.100/lame-3.100.tar.gz
# tar zxvf lame-3.*
# cd lame-3.*
# ./configure
# make && make install

В качестве web панели я буду использовать Asterisk-CDR-Viewer-Mod. Очень простая и функциональная штука. Настраивается легко, пользоваться удобно. Скачиваем исходники с github:

# cd ~
# git clone https://github.com/prog-it/Asterisk-CDR-Viewer-Mod

Копируем содержимое репозитория в директорию cdr web сервера.

# mkdir /var/www/html/cdr
# cp -R ~/Asterisk-CDR-Viewer-Mod/* /var/www/html/cdr
# chown -R apache. /var/www/html/cdr

В папке docs подробная инструкция по настройке. Все дальнейшие действия делаются в соответствии с ней. Исправляются только некоторые особенности данной версии системы. Нам необходимо добавить дополнительное поле в таблицу cdr для хранения имени файла. Для этого либо в консоли mysql, либо через phpmyadmin выполните код:

alter table  `cdr` add column `filename` varchar(120) DEFAULT 'none' after `userfield`;

Редактируем файл /etc/asterisk/cdr_mysql.conf, добавляя в самый конец 2 строки:

alias realdst => realdst
alias filename => filename

Дальше редактируем диалплан. Открываем /etc/asterisk/extensions.conf и добавляем в секцию globals переменную, соответствующую папке, где будут храниться записи разговоров.

[globals]
DIR_RECORDS=/mnt/calls/

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

[recording]
exten => s,1,Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${ARG1}-${ARG2})
exten => s,n,Set(monopt=nice -n 19 /usr/local/bin/lame -b 32 --silent "${DIR_RECORDS}${fname}.wav" "${DIR_RECORDS}${fname}.mp3" && rm -f "${DIR_RECORDS}${fname}.wav" && chmod o+r "${DIR_RECORDS}${fname}.mp3")
exten => s,n,Set(CDR(filename)=${fname}.mp3)
exten => s,n,Set(CDR(realdst)=${ARG2})
exten => s,n,MixMonitor(${DIR_RECORDS}${fname}.wav,b,${monopt})
exten => s,n(no),Verbose(Exit record)
exten => s,n,Return()

И редактируем контексты входящих и исходящих разговоров, добавляя туда макрос на запись. Он идет самым первым, перед набором номера. Вот так у меня выглядит контекст локальных звонков и входящих через ivr меню с учетом всех сделанных ранее настроек:

[call-out]
;Номер для записи звуков, окончание записи #
exten => _35X, 1, NoOp()
exten => _35X, n, Wait(2)
exten => _35X, n, Playback(beep)
exten => _35X, n, Record(/tmp/music${EXTEN:2}:wav)
exten => _35X, n, Wait(1)
exten => _35X, n, Playback(/tmp/music${EXTEN:2})
exten => _35X, n, Wait(2)
exten => _35X, n, Hangup()
;Управление голосовой почтой
exten => 500,1,VoiceMailMain()
;Звонок на внутренний номер
exten => _XXX,1,GoSub(recording,s,1,(${CALLERID(num)},${EXTEN}))
exten => _XXX,n,Dial(SIP/${EXTEN},10)
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,Wait(2)
exten => num-not-exist,n,Playback(invalid)
exten => num-not-connected,1,Wait(2)
exten => num-not-connected,n,Playback(ss-noservice)
exten => num-BUSY,1,Wait(2)
exten => num-BUSY,n,Playback(vm-isonphone)
exten => num-NOANSWER,1,Wait(2)
exten => num-NOANSWER,n,Voicemail(${dstNUM},u)
exten => num-CHANUNAVAIL,1,Wait(2)
exten => num-CHANUNAVAIL,n,Playback(vm-isunavail)
;Звонок на внешний номер
exten => _XXX.,1,GoSub(recording,s,1,(${CALLERID(num)},${EXTEN}))
exten => _XXX.,n,Dial(SIP/${EXTEN}@397945)
include => handup-sip

[ivr-main]
exten => s,1,Answer()
exten => s,2,Background(/etc/asterisk/ivr/ivr-main)
exten => s,3,WaitExten(5)
exten => _XXX,1,GoSub(recording,s,1,(${CALLERID(num)},${EXTEN}))
exten => _XXX,n,Dial(SIP/${EXTEN},10)
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,Wait(2)
exten => num-not-exist,n,Playback(invalid)
exten => num-not-connected,1,Wait(2)
exten => num-not-connected,n,Playback(ss-noservice)
exten => num-BUSY,1,Wait(2)
exten => num-BUSY,n,Playback(vm-isonphone)
exten => num-NOANSWER,1,Wait(2)
exten => num-NOANSWER,n,Voicemail(${dstNUM},u)
exten => num-CHANUNAVAIL,1,Wait(2)
exten => num-CHANUNAVAIL,n,Playback(vm-isunavail)
exten => t,1,GoSub(recording,s,1,(${CALLERID(num)},${EXTEN}))
exten => t,n,Queue(secretary,t)

Создаем директорию для записи разговор и назначаем ей права.

# mkdir /mnt/calls
# chown -R asterisk. /mnt/calls

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

# systemctl restart asterisk

Осталось только указать настройки подключения к базе данных cdr viewer. Эти настройки находятся в файле inc/config.php. Для начала создадим его.

# cp /var/www/html/cdr/inc/config/config.php.sample /var/www/html/cdr/inc/config/config.php

Задаем там следующие параметры:

Mysql
$db_type = 'mysql';
$db_host = 'localhost';
$db_port = '3306';
$db_user = 'asterisk_user';
$db_pass = '12345678';
$db_name = 'asterisk';
$db_table_name = 'cdr';

$system_storage_format = 5;
$system_monitor_dir = '/mnt/calls';

Остальные параметры я оставил без изменений. Можно звонить и тестировать запись разговоров, просмотр статистики через Asterisk CDR Viewer Mod. Все записанные файлы складываются в одну папку /mnt/calls. В readme.txt описан пример, как настроить сортировку записей по папкам с датами. Если вам это нужно, сделайте, ничего сложного нет, все рассказано подробно. В web панель можно зайти просто набрав в браузере http://ip/cdr/.

Просмотр статистики и записей звонков

Музыка на ожидании (on hold)

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

За конфигурацию music on hold отвечает соответствующий файл настроек - /etc/asterisk/musiconhold.conf. Изначально он выглядит так:

[general]
[default]
mode=files
directory=moh

Директория указана как moh, полный ее путь /var/lib/asterisk/moh, мелодии проигрываются отсюда. Я не буду менять настройки по-умолчанию. Добавим еще один класс музыки и укажем его в свойствах очереди, где будем ее проигрывать.

Я привожу пример использования. Если у вас везде будет одна и та же мелодия, то отредактируйте канал default. Так вам не придется каждый раз указывать добавленный канал.

Копируем любым способом mp3 файл на сервер в домашнюю директорию root. Создаем директорию /var/lib/asterisk/mohmp3 и кодируем в нее мелодию из mp3 в wav:

# mkdir  /var/lib/asterisk/mohmp3
# lame --decode /root/music.mp3 /var/lib/asterisk/mohmp3/music.wav

Добавляем новый класс в musiconhold.conf в самый конец:

[mp3]
mode=files
directory=mohmp3

Теперь добавим эту мелодию в свойства очереди. Для этого в описание очереди добавьте новый параметр:

[secretary]
music = mp3
strategy = ringall
member => SIP/100
member => SIP/130

Теперь нужно перечитать настройки очереди и мелодии. Проще перезапустить сам астериск:

# systemctl restart asterisk

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

Чтобы добавить эту мелодию вместо длинного гудка, необходимо отредактировать dialplan, добавив новый параметр в правило набора. Если добавляете свой класс музыки, то указываете его в свойствах:

exten => _XXX,1,Dial(SIP/${EXTEN},15,m(mp3))

Если используете музыку по-умолчанию, то достаточно написать вот так:

exten => _XXX,1,Dial(SIP/${EXTEN},15,m)

Для отладки музыки на ожидании, я рекомендую добавить в dialplan в контекст локальных звонков такую конструкцию:

exten => 336,1,Answer
exten => 336,2,MusicOnHold()

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

Не забывайте перезагружать диалплан после редактирования. На этом настройка music on hold закончена. Можете добавлять разные мелодии и использовать в необходимых местах диалплана или очередях.

Настройка конференций

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

Создаем конфигурацию конференции. Для этого в файл confbridge.conf добавляем в самый конец:

[confer]
type=bridge
max_members=20
mixing_interval=10
internal_sample_rate=auto
record_conference=yes

В контекст исходящих звонков [call-out] добавляем в самое начало:

exten => 999,1,Answer()
exten => 999,n,ConfBridge(1,confer)

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

Как выполнять переводы и переадресации звонков я расскажу ниже.

Перевод, перехват, переадресация звонка

Рассмотрим несколько необходимых функций и возможностей телефонной станции asterisk. Начнем с перевода звонка. Как перевести звонок на другого абонента? По-умолчанию в астериске для трансфера звонка предусмотрена клавиша #. Посмотреть, так ли это в вашей конфигурации, введите в консоли астера команду:

CLI> features show
Builtin Feature               Default Current
---------------               ------- -------
Pickup                           *8     *8
Blind Transfer                    #      #
Attended Transfer
One Touch Monitor
Disconnect Call                   *      *
Park Call

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

exten => _XXX,n,Dial(SIP/${EXTEN},15,Tt)
T дать возможность звонящему (вызывающему) абоненту совершать перевод звонка на другой номер.
t дать возможность вызываемому абоненту сделать перевод звонка на другой номер

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

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

Кнопка перевода звонка

С включенным по-умолчанию Blind Transfer есть проблемы. Например, вы перенаправляете звонок на другой номер, а он не ответил или у него занято. Входящий вызов сбрасывается. В астериске есть другой режим перевода звонка, он называется Attended Transfer, по-умолчанию он выключен. Работает он более изящно. Сначала вы звоните тому, куда хотите перевести номер, разговариваете с ним, убеждаетесь, что он доступен и готов принять звонок. Только после этого переводите звонок на этого абонента. Чтобы включить такое перенаправление вызова, нужно раскомментировать в features.conf строку:

atxfer => *2

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

Теперь поговорим о перехвате звонка. Хотя говорить тут особо нечего. В asteerisk перехват работает из коробки и не требует никаких настроек. Для того, чтобы перехватить звонок, нужно снять трубку и нажать комбинацию *8. Комбинация задается в том же файле, что и перехват - features.conf. Перехватывать звонки могут только абоненты в одной группе. Это задается в свойствах пользователя, я об этом рассказывал в самом начале, когда мы создавали sip аккаунты. Напомню, что речь идет о параметрах callgroup и pickupgroup.

Разберем теперь переадресацию звонка на какой-то внешний номер, например, мобильный телефон. Многие телефоны имеют встроенный функционал по перенаправлению звонка. Читаете инструкцию к телефону, смотрите, можно ли на нем установить переадресацию и как, и делаете. Работает это только если ваш телефон подключен к АТС. Он принимает звонок и сам его переадресовывает на указанный номер. Это самый простой и быстрый вариант автоматической переадресации звонка на внешний номер.

Рассмотрим другой случай переадресации на мобильный телефон. Допустим, у нас есть номер 115, который вообще отсутствует в офисе, у него нет стационарного телефона. Нам нужно, чтобы при звонке на этот номер, вызов переадресовывался на внешний номер, а конкретно на мобильный сотрудника. Для этого в dialplan нужно добавить следующую строку:

exten => 115,n,Dial(SIP/89151234567@397945)

Если вы хотите, чтобы переадресация работала только при звонках с внутренних номеров офиса, то добавить эту строку нужно в контекст [call-out] перед общим правилом набора на внутренние номера:

exten => 115,n,Dial(SIP/89151234567@397945)
exten => _XXX,n,Dial(SIP/${EXTEN},15,Tt)

Для того, чтобы переадресация на внешний номер работала и для звонков из вне, правило перенаправления на мобильный нужно поставить в контекст с голосовым приветствием [ivr-main]. Ставим туда же, перед строкой набора на внутренние номера:

exten => 115,n,Dial(SIP/89151234567@397945)
exten => _XXX,n,Dial(SIP/${EXTEN},15,Tt)

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

Защита asterisk с помощью fail2ban

Если ваш астериск имеет внешний ip адрес, либо на него сделан проброс портов с внешнего ip, то необходимо обеспечить защиту от перебора учеток и прочих множественных подключений. Организуем защиту с помощью известного и популярного средства fail2ban. Сделать это не сложно, fail2ban поддерживает astersik из коробки. Достаточно просто установить его и активировать некоторые настройки.

Устанавливаем fail2ban на сервер с астериском:

# dnf install fail2ban

Включаем запись в лог файл событий типа security. Для этого открываем файл /etc/asterisk/logger.conf и раскомментируем строку:

security => security

Перечитываем настройки хранения логов:

# asterisk -x "logger reload"

В папке /var/log/asterisk появился новый файл security. Его записи мы будем передавать в fail2ban для анализа. Открываем файл /etc/fail2ban/jail.conf, ищем там секцию [asterisk] и меняем путь к логфайлу и добавляем строку активации джейла:

logpath  = /var/log/asterisk/security
enabled  = true

Запускаем fail2ban и добавляем в автозапуск:

# systemctl start fail2ban
# systemctl enable fail2ban

Чтобы fail2ban работал, у вас должен быть запущен и настроен iptables. Отмечу также, что по-умолчанию fail2ban в centos использует команды firewalld. Если вы его отключили и используете голые iptables, то вам необходимо удалить файл /etc/fail2ban/jail.d/00-firewalld.conf и перезапустить fail2ban. Если этого не сделать, работать он не будет.

На этом подробная и многофункциональная настройка asterisk закончена. Я рассказал все, что запланировал, выделив наиболее востребованные функции.

Заключение

Не понравилась статья и хочешь научить меня администрировать? Пожалуйста, я люблю учиться. Комментарии в твоем распоряжении. Расскажи, как сделать правильно!

Время подвести итог проделанной работы. На всякий случай приведу полный конфиг основного файла, с которым мы работали - extensions.conf. Я писал статью почти 2 месяца, что-то добавляя, проверяя, редактируя. Она актуальна полностью на момент написания. Можно простым копипастом переносить конфигурацию и все заработает. Я проверил перед публикацией. Со временем что-то может измениться, но не думаю, что сильно. Синтаксис конфигурационных файлов почти не меняется в разных версиях астера, это позволяет без проблем переносить настройки между версиями, и тем более между операционными системами.

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

Напоминаю, что данная статья является частью единого цикла статьей про сервер Centos.

Другие материалы по asterisk:

Если у вас есть желание научиться администрировать системы на базе Linux, но вы с ними никогда не работали и не знакомы, то рекомендую начать с онлайн-курса «Linux для начинающих» в OTUS. Курс для новичков, для тех, кто с Linux не знаком. Цена за курс минимальная (символическая). Информация о курсе и цене.

Помогла статья? Подписывайся на telegram канал автора

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

Автор Zerox

Владимир, системный администратор, автор сайта. Люблю настраивать сервера, изучать что-то новое, делиться знаниями, писать интересные и полезные статьи. Открыт к диалогу и сотрудничеству. Если вам интересно узнать обо мне побольше, то можете послушать интервью. Запись на моем канале - https://t.me/srv_admin/425 или на сайте в контактах.

554 комментария

  1. У вас в инструкции в Mixmonitor стоит ключ b, но записи всё равно сохраняются, даже если трубку не сняли.

  2. Татьяна

    Ошибка загрузки конфигурации в телефон уже больше 2-х месяцев мучает нас....несколько телефонов asterisk не загружается по сети - unknown
    Из N-го колличества (примерно 220 аппаратов) штук 15 пишут - unspecified , ip выдает dhcp.
    Можете подсказать где искать проблему? или посоветовать специалиста, что поможет решить вопрос. Спасибо

  3. Анатолий

    Использовал наработки из этой статьи и предыдущих для установки Asterisk на Ubuntu. Но при установке выбрал дистрибутив самого последнего Asterisk, версии 20 и самую последнюю Ubuntu. Следуя инструкции автора настроил sip.conf потом extension.conf дошел до пункта проверка пользователей CLI> sip show users и тут приехали..... Система вообще не знает команд начинающихся на слово sip. Начал гуглить и почти на всех форумах пишут ( -- не стоит использовать chan_sip в 2020 году на новых установках. Пора приучать людей к pjsip, так как chan_sip устаревший и в ближайших выпусках от него откажутся окончательно --) Похоже пришло время обновлять инструкцию под новые версии Asterisk.

    • От chan_sip уже лет 10 отказываются, ещё когда я только начал изучать Asterisk от него уже отказывались. Думаю, ещё столько же будут отказываться. Объективно, с ним нет никаких проблем для типового применения, которое описано в статье.

  4. Андрей

    Доброго
    Не подскажете , используя chan_pjsip возможно настроить на один номер два аппарата, с одновременной возможностью и звонить на этот номер, и с этих аппаратов этим номером?

  5. Веталь

    Огоромное спасибо автору за толковую статью с понятными обьяснениями.
    Прошу помощи, проблема заключается в следующем:
    На астере добавил несколько транков, создал группу внутренних номеров и очередь.
    Звонки из внутренних номеров по исходящему маршруту идут в транки все ок.
    Дальше поставил модуль коллцентр (issabel) и имею проблемку...
    когда колцентр дозванивает абонентов и закидівает их в очередь я не могу совершать звонки наружу из внутренних номеров(хотя изредка пробивает раза с 30го) можно ли как-то віставить приоритет доступа к транкам для внутренних номеров перед автодиалером?

    • Я так сходу не могу продумать решение, тем более с таким модулем никогда не работал. Для абонентов можно устанавливать call-limit, который ограничивает количество возможных линий. Возможно в эту сторону нужно смотреть. Ну и учитывать, что dialplan читается по порядку, сверху вниз. Абонентов с наименьшим приоритетом надо выделять в отдельные маски и ставить в самый низ.

      • Веталь

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

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

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

        • Решение этой задачи требует определённых навыков и понимания работы Asterisk. Я не помогу решить эту задачу в рамках ответов на комментарии. С учётом того, что решение я тоже не знаю, его надо придумать и отладить.

  6. Подскажите, пожалуйста, деревянному, как привязать один внешний номер и 3 внутренних. И как настроить сценарий когда звонят на внешний, то звонок на Линии 1, после на 5 сек переадресация на Линию 2 и Линию 3?

    Зарание благодарен!

  7. Евгений

    Добрый день! Кто нибудь ставил на Debian11? Проблема odbc коннектором, asterisk не подключается к базе

  8. Василий Васильевич

    Сложно. А на Бейсике можно перепрограммировать астерикс?

  9. Здравствуйте, столкнулся с проблемой! У меня развернута телефония на базе FreePBX. Каждый день падает внешний телефон, то есть звонки из вне не могут пройти в организацию, идут короткие гудки. А внутренние звонки, просто тишина в трубке. После перезагрузки всё работает в штатном режиме. Подскажите в чём может быть проблема?

    • Логи надо смотреть. Как можно заочно сказать, в чём проблема? Возможно транки отваливаются, может ещё что-нибудь, какие-то сетевые проблемы и т.д.

      • Подскажите какой лог смотреть? В веб версии с самом FreePBX, ни каких ошибок не наблюдал!

        • Имеет смысл вот эти посмотреть:
          /var/log/asterisk/full
          /var/log/asterisk/freepbx.log
          /var/log/messages
          Сопоставить события там с временем, когда падает внешняя связь.

  10. Алексей

    Здравствуйте.
    Разворачиваю на Proxmox VE 7.2-3 с Версия ядра Linux 5.15.30-2-pve #1 SMP PVE 5.15.30-3 (Fri, 22 Apr 2022 18:08:27 +0200) контейнер LXC для установки: АТС asterisk. На Debian GNU/Linux 11 \n \l.

    root@proxmox:/etc# dpkg --get-selections | grep ^pve-kernel
    pve-kernel-5.15 install
    pve-kernel-5.15.30-2-pve install
    pve-kernel-helper install

    Возникла проблема с установкой dahdi:
    cd /usr/src/dahdi-linux-complete-2.10*/
    root@asteriks:/usr/src/dahdi-linux-complete-2.10.2+2.10.2# make all && make install && make config
    make -C linux all
    make[1]: Entering directory '/usr/src/dahdi-linux-complete-2.10.2+2.10.2/linux'
    make -C drivers/dahdi/firmware firmware-loaders
    make[2]: Entering directory '/usr/src/dahdi-linux-complete-2.10.2+2.10.2/linux/drivers/dahdi/firmware'
    make[2]: Leaving directory '/usr/src/dahdi-linux-complete-2.10.2+2.10.2/linux/drivers/dahdi/firmware'

    You do not appear to have the sources for the 5.15.30-2-pve kernel installed.

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

    make[1]: Leaving directory '/usr/src/dahdi-linux-complete-2.10.2+2.10.2/linux'

    make: *** [Makefile:9: all] Error 2

    пробовал и так apt install linux-headers*
    Failed to restart dahdi.service: Unit dahdi.service not found.

    Смотрел версию ядра, точно такая как на proxmox.

    Делал обновление на контейнере и на proxmox: sudo apt update && sudo apt dist-upgrade
    результата нет.

    Пробовал установить последнюю версию dahdi-linux-complete-3.2.0+3.2.0 тоже нет результата:

    wget http://downloads.asterisk.org/pub/telephony/dahdi-linux-complete/dahdi-linux-complete-3.2.0+3.2.0.tar.gz
    root@asteriks:/usr/src/dahdi-linux-complete-3.2.0+3.2.0# systemctl restart dahdi
    Failed to restart dahdi.service: Unit dahdi.service not found.
    root@asteriks:/usr/src/dahdi-linux-complete-3.2.0+3.2.0# make all && make install && make config
    make -C linux all
    make[1]: Entering directory '/usr/src/dahdi-linux-complete-3.2.0+3.2.0/linux'
    make -C drivers/dahdi/firmware firmware-loaders
    make[2]: Entering directory '/usr/src/dahdi-linux-complete-3.2.0+3.2.0/linux/drivers/dahdi/firmware'
    make[2]: Leaving directory '/usr/src/dahdi-linux-complete-3.2.0+3.2.0/linux/drivers/dahdi/firmware'
    You do not appear to have the sources for the 5.15.30-2-pve kernel installed.
    make[1]: *** [Makefile:72: modules] Error 1
    make[1]: Leaving directory '/usr/src/dahdi-linux-complete-3.2.0+3.2.0/linux'
    make: *** [Makefile:9: all] Error 2

    Подскажите пожалуйста в чем ошибка? Есть предположение, что проблема в proxmox. Но куда копать не знаю.

  11. Добрый день. Интересно, как решаете вопрос постепенного заполнения выделенного каталога под записи входящих/исходящих звонков. В сети много инструкций и примеров. Может какой-то свой способ или подход к этой теме порекомендуете?

  12. Александр

    Добрый день!
    Пробовали ли интегрировать сервисы YANDEX.SPEECHKIT? Ari или Agi пробовали использовать?

  13. Михаил

    Добрый день, Владимир
    Спасибо большое за подробно описанную статью по настройке.
    Есть такая проблема при звонке, иногда возникает редко. не знаю куда дальше копать, везде перерыл все и не нашел ответа на свой вопрос
    При исходящих звонках периодически выскакивает в дебаге астерикса следующая ошибка, автоответчик сообщает "На данный момент все линии заняты, перезвоните позже"
    ЛОГ ошибки;
    [2022-08-17 12:02:01] WARNING[3009][C-00001213] chan_sip.c: Received response: "Forbidden" from ';tag=as1514e78c'
    Подскажите пожалуйста, где копать информация по истреблении данной проблемы?

    • Это скорее всего ограничение вашего провайдера. Он выдаёт ответ вашему серверу:
      Received response: "Forbidden" from ';tag=as1514e78c'
      Напишите им в поддержку, точно ответят их ли это проблема.

  14. у вас в настройке cdr viewer ошибка, в экстеншене [recording]:
    exten => s,n,Set(CDR(filename)=${fname}.mp3) нужно изменить на .wav, т.к. он в базу данных сохраняет неверный формат, из-за чего на веб-морде не подтягиваются аудиозаписи.
    За статью спасибо.

    • Александр

      Добрый день. Прочитал вашу инструкцию в возможности решения своей проблемы, но не нашел, хотя бы намека, где искать.
      подскажите куда копать, проблема с отображением номера звонившего мне на АТС.
      прописано два номера один пусть 74953000001, второй 88001001001
      так вот при звонке на номер 8800, номер звонившего отображается как 9204404040
      при звонке на 7495, отображается 79204404040, 7 перед номером.
      но если позвонить на 7495 из-за заграницы, пусть будет Польша или Казахстан, то номер будет без 7 впереди, то есть 9204404040. и привяжет звонок к 8800.
      номера арендованы у двух разных провайдеров.
      Это особенность самого астериска или нужно где то искать в консоле, в ГУИ все пересмотрел, не нашел.

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

  15. Николай

    Добрый день.
    Подскажите пожалуйста, выявилась одна любопытная проблема. При звонке от нас на внешний городской номер, когда трубку поднимает один человек, а потом хочет меня перевести на другого, то меня выкидывает в моё голосовое меню. Именно в моё, на мой астериск. Не подскажите куда копать?

    • Чего-то в диалплане напутали явно. Так трудно сказать, в чём проблема. Можно включить debug лог и посмотреть, что там в момент перенаправления в ivr. Должны быть какие-то записи по теме.

  16. Здраствуйте Zerox можете подсказать у меня установлено астериск мод изабел у меня на данном моменте работает 4 сип транка с одного оператора но еще дополнительно хочу купить из другого провайдера 4 номера но как с исходяшем звонком быт ? Я данный момент исползую перхикс для каждого номера если в астериск такой функции при каждом исходном вызове астериск помещал номера для исходящего звонка ? Например 1 оператор 100 звонит на номеру +5985611641 и 2 оператор в тот же момент звонит с 200 на +55998514231 но при это 1ый оператор выходить из +592000000 а 2ой оператор выходить из +592001111

  17. Аноним

    подскажите, что за ошибка, при записи в базу данных, и соответственно дата и время не записываются, показывает нули
    WARNING[9317]: cdr_adaptive_odbc.c:731 odbc_log: Column type 9 (field 'asterisk:cdr:calldate') is unsupported at this time.

    • Хм, это на какой версии Asterisk? Я недавно по статье настраивал Aterisk 18, всё гладко прошло. Такой ошибки не получал.

    • Владимир

      Добрый день! Вы решили проблему? Сейчас столкнулся с такойже проблемой. Пытаюсь гуглить, пока ничего вразумительного не нашел. Дайте пожалуйста ответ в случае если найдете решение или хотябы путь в сторону решения) Спасибо)

      • Аноним

        /etc/asterisk/cdr_odbc.conf

        [asterisk]
        enabled => yes
        dsn => asterisk-connector
        username => asteriskcdr
        password => b!2^qWq12Z
        pre-connect => yes

        /etc/asterisk/res_odbc.conf

        [asterisk]
        enabled => yes
        dsn => asterisk-connector
        username => asteriskcdr
        password => b!2^qWq12Z
        pooling => no
        limit => 99999
        pre-connect => yes

        /etc/asterisk/cdr_mysql.conf:

        ​[global]
        hostname=localhost;    - ip адрес где располагается сервер MySQL
        dbname=asteriskcdrdb;  – название базы данных где будут храниться cdr
        table=cdr;             - название таблицы
        password=b!2^qWq12Z;   - пароль для пользователя asteriskuser
        user=asteriskcdr;      - имя пользователя для базы данных
        port=3306
        sock=/var/run/mysqld/mysqld.sock
        ;timezone=UTC ; Previously called usegmtime

        с такими настройками удалось запустить, /etc/asterisk/cdr_adaptive_odbc.conf дефолтный

  18. Не проигрывает ivr. Я уже весь гугл перерыл, ничего не могу найти.
    Executing [s@ivr-main:2] BackGround("SIP/rtk-00000005", "/etc/asterisk/ivr/music") in new stack
    [Mar 1 13:39:52] WARNING[6176][C-00000004]: file.c:804 ast_openstream_full: File /etc/asterisk/ivr/music does not exist in any format
    [Mar 1 13:39:52] WARNING[6176][C-00000004]: file.c:1277 ast_streamfile: Unable to open /etc/asterisk/ivr/music (format (alaw)): No such file or directory
    [Mar 1 13:39:52] WARNING[6176][C-00000004]: pbx_builtins.c:1239 pbx_builtin_background: ast_streamfile failed on SIP/rtk-00000005 for /etc/asterisk/ivr/music

    Как-будто ругается на формат, но и на любой другой звук в папке /var/lib/asterisk/sound/{en,ru} он выдаёт такую же ошибку.

  19. Доброго времени суток. Для Debian 11 есть такие статьи ? или можно истользовать Вашу для Debian 10 и там все идентично ?

    • Есть некоторые отличия. Я недавно настраивал на Debian 11, пришлось повозиться только с настройкой odbc для хранения статистики в mysql. А так всё остальное в статье актуально и для 18-й версии Asterisk + Debian 11.

    • Richard Faraday

      Я не советую использовать для Астериска Debian дистрибутывы, я сталкивался уже, были проблемы с отсутствием дополнительных модулей, особенно при использовании freePBX. Чем больше примочек добавляешь, тем больше проблем и костылей. Centos лучше всего подходит...

      • С базовым Asterisk никаких проблем в Debian нет. Вы советуете Centos Stream? Обычной Centos больше нет.

        • Richard Faraday

          Ну да. Я в принципе разворачивал базовый Астериск на Дебиан, соглашусь в вами, вполне всё отлично. Но когда ставил вручную freePBX вдруг бросил, потому что всё требовало RHEL, и я просто скачал freePBX Distro и это видимо было правильно. Подкорректирую свой коммент - для базового Астериска Дебиан норм.

          • Всё правильно. FreePBX создан на базе Centos, поэтому именно там он и работает без проблем. Вручную ставить его нет большого смысла, тем более на Debian. Надо действительно брать готовый FreePBX Distro и разворачивать из него.

  20. Алексей

    Продолжаем разбираться

    Создаем директорию для записи разговор и назначаем ей права.

    # mkdir /mnt/calls
    # chown -R asterisk. /mnt/calls

    что за пользователь "asterisk."?
    не понятно откуда он взялся...

  21. Алексей

    Статья крутая! Работа проделана большая. Большое спасибо!
    Но к сожалению много "белых" пятен и частично информация устарела.
    Особенно "запнулся" на моменте настройке сервера apache+php - проблема в том что следуя инструкции не запускается php
    Далее настройка cdr так же не без танцев с бубном.

  22. Интересно, кто-нибудь пытался установить и настроить данный сервер на CentOS Stream?
    Мой CentOS 8 после 1.01.22 перестал иметь доступ к репозитариям, dnf или yum update пустота...

  23. Здравствуйте.
    asterisk сбрасывает входящий вызов после 30 секунд
    как решить проблему?
    Спасибо!!!

  24. Здравствуйте Zerox! Спасибо за подробное руководство. Единственный вопрос, по голосовой почте. Как сделать так, чтобы по почте ничего не отправлять (нет желания настраивать сервер пересылки). Т.е запись разговора хранились только в Asterisk, без отправки куда-либо. Заранее спасибо, уважением= Олег-

  25. Виктор

    Спасибо за статьи, это наверное самые подробные и полные описания установок и настроек, что мне попались.
    По крайней мере установить, настроить CentOS и Asterisk получилось не обращаясь к другим ресурсам.
    Только с Asterisk не совсем сладил :) , уперся вот в какой момент.
    После установки и первичной настройки Астериска.
    Установил софтфон скачанный по Вашей ссылке и установил на iPhone - SessionTalk SIP Softphone.
    Соединение с Астериском есть
    Name/username Host Dyn Forcerport Comedia ACL Port Status Description
    100/100 192.168.41.240 D No No 53380 OK (124 ms)
    101 (Unspecified) D No No 0 UNKNOWN
    111/111 192.168.41.209 D No No 34872 OK (49 ms)
    при наборе с софтфона звонок на iPhone проходит, но при ответе на телефоне соединения не происходит.
    при обратном звонке телефон-софтфон соединение происходит, но речи по ним - нет, то есть алокаешь что в микрофон компьютера, что в смартфон , этого алло не слышно.
    и в терминале такие сообщения
    [Nov 30 16:56:47] NOTICE[1298]: chan_sip.c:25001 handle_response_peerpoke: Peer '111' is now Reachable. (48ms / 2000ms)
    [Nov 30 18:00:11] NOTICE[1298]: chan_sip.c:30537 sip_poke_noanswer: Peer '111' is now UNREACHABLE! Last qualify: 371

    Подскажите куда рыть?

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

  26. Александр

    Доброго дня
    при переходе с sip на pjsip, при звонке на старую (неизвестную) модель телефона (всё что про него известно - это "АБВ-телефон") вылетает ошибка, при следующих звонках на него идет только звонок

    [Oct 26 14:28:40] ERROR[45805]: pjproject: : sip_transport.c Error processing 361 bytes packet from UDP 192.168.2.16:5060 : PJSIP syntax error exception when parsing 'Event' header on line 7 col 11:
    SIP/2.0 487 Request Terminated
    Via: SIP/2.0/UDP 192.168.3.150:5060;rport;branch=z9hG4bKPj426c6d50-b90a-48ff-846e-690acaef151e
    From: 1001 ;tag=0754a29f-4d3e-4b31-8766-e45a641a3fda
    To: ;tag=323742653
    Call-ID: 97d3c60d-cc4b-41e8-9886-5bcb0650d9de
    CSeq: 20476 INVITE
    Event: Mic=0,Speaker=0
    Content-Length: 0

  27. Александр

    Возник вопрос по Asterisk CDR Viewer Mod: как правильно сделать запись в файле подсчёта расхода денежных средств (my_callrates.csv) по такому ТП: Столицы, первые 100 минут бесплатно, потом 1.98 руб с посекундной тарификацией? Пробовал написать так: 7495,0.00,Столицы,6000s+s,1.98
    Ну или так: 7495,0.00,Столицы,100m+s,1.98
    Не работает! Считает деньги (расход) сразу с первой секунды. В чём ошибка?, как написать правильно?

  28. Алексей

    Думаю в будущем были бы полезны статьи с описанием перехода на pjsip и апгрейда астериска на 17/18/19

  29. Алексей

    Владимир, огромное спасибо за статью. Очень помогла, с ее помощью запустил полноценную телефонию.
    Спасибо и удачи!

  30. У меня не появляются записи звонков в папке /mnt/calls

  31. Добрый день!
    Пробовали установку на rocky linux?

  32. Кирилл

    Подскажите, пожалуйста, как в веб-морде Asterisk CDR Viewer Mod v2.6.4, корректно отображался пункт "Кто звонил"
    Т.к. сейчас там всегда отображается только мой собственный номер, и на какой номер он звонил, а не реальный номер звонящего

  33. Кирилл

    Статья по-прежнему улет!
    Но есть небольшой у меня затык и непонятки.
    Как правильно в блок ниже натыкать запись звонков строчкой
    exten => t,1,GoSub(recording,s,1,(${CALLERID(num)},${EXTEN}))

    Сам блок:

    [ivr-main]
    exten => s,1,Answer()
    exten => s,2,Background(/etc/asterisk/ownsounds/hello)
    exten => s,3,WaitExten(15)
    exten => 1,1,Goto(priem,s,1)
    exten => 2,1,Dial(SIP/219)
    exten => 3,1,Dial(SIP/224)
    exten => 4,1,Dial(SIP/216)
    exten => 0,1,Queue(reception,t)
    exten => _XXX,1,Dial(SIP/${EXTEN})
    exten => _XXX,2,Playback(privacy-incorrect)
    exten => _XXX,3,Goto(ivr-main,s,1)
    exten => t,1,GoSub(recording,s,1,(${CALLERID(num)},${EXTEN}))
    exten => t,n,Queue(reception,t)

    • Кирилл

      Когда отправил, вариант натыкивания пришел в голову такой:

      exten => s,1,Answer()
      exten => s,2,Background(/etc/asterisk/ownsounds/hello)
      exten => s,3,WaitExten(15)
      exten => 1,1,Goto(priem,s,1)
      exten => 2,1,GoSub(recording,s,1,(${CALLERID(num)},${EXTEN}))
      exten => 2,2,Dial(SIP/219)
      exten => 3,1,GoSub(recording,s,1,(${CALLERID(num)},${EXTEN}))
      exten => 3,2,Dial(SIP/224)
      exten => 4,1,GoSub(recording,s,1,(${CALLERID(num)},${EXTEN}))
      exten => 4,2,Dial(SIP/216)
      exten => 0,1,Queue(reception,t)
      exten => _XXX,1,Dial(SIP/${EXTEN})
      exten => _XXX,2,Playback(privacy-incorrect)
      exten => _XXX,3,Goto(ivr-main,s,1)
      exten => t,1,GoSub(recording,s,1,(${CALLERID(num)},${EXTEN}))
      exten => t,n,Queue(reception,t)

      Есть ли у него минусы?

  34. Здравствуйте, интересует вопрос - можно ли настроить Voicemail для отправки с разной темой письма и тела?
    Задача вообще такова: сотрудник звонит в службу поддержки, оставляя голос.сообщение -- голосовое сообщение пересылается на почту -- обработчик в Jira из письма создает задачу в проекте.

    Делали с помощью модуля RecordEmail (в нем можно и тему и тело указать для разных типов задач) - все хорошо создается, но вложение НЕ прикрепляется, с помощью модуля VoiceMail - тоже задача создается и вложение прикрепляется! Что смогли выяснить - отличие писем в "" - если глянуть оригинал письма от VoiceMail - то имя файла заключено в "", а при RecordEmail (хоть " и прописаны в модуле) - в оригинале письма отсутствуют. То ли команда System (exten => submodule,n,System(echo "Content-Disposition: attachment\; filename=\"recording-6689bb50ebba833b431922090425679c.wav\"" >> /tmp/email-${UNIQUEID})) не так обрабатывает, то ли ...

    Буду благодарен за любую помощь!
    Заранее спасибо!

  35. Здравствуйте! Спасибо вам за вашу статью!!!
    После этого этапа пытаюсь записать приветствие с 3схphone6, например с номера 355, после происходит 5 сек и он сбрасывается, в чём может быть проблема?
    лог: "," "100", "355", "call-out", "Number 100" "", "SIP/100-0000006", "Hangup", "","2021-05-29 05:05:52", "2021-05-29 05:05:29 05:05:58",5,3, "ANSWERED","DOCUMENTATION","1622264752.10",""

    • С консоли , пишет, что нет такой директории с консоли при вызове на номер 355
      > 0x7f5c200352d0 -- Strict RTP learning after remote address set to: 192.168.56.1:40024 -- Executing [355@call-out:1] NoOp("SIP/100-00000006", "") in new stack
      -- Executing [355@call-out:2] Wait("SIP/100-00000006", "2") in new stack
      -- Executing [355@call-out:3] Playback("SIP/100-00000006", "beep") in new stack
      > 0x7f5c200352d0 -- Strict RTP switching to RTP target address 192.168.56.1:40024 as source
      -- Playing 'beep.alaw' (language 'ru')
      -- Executing [355@call-out:4] Record("SIP/100-00000006", "/tmp/musicEXTEN:2:wav") in new stack
      -- Playing 'beep.alaw' (language 'ru')
      [May 29 22:23:09] WARNING[1651][C-00000004]: file.c:1504 ast_writefile: No such format '2:wav'[May 29 22:23:09] WARNING[1651][C-00000004]: app_record.c:396 record_exec: Could not create file /tmp/musicEXTEN
      -- Executing [355@call-out:5] Wait("SIP/100-00000006", "1") in new stack
      -- Executing [355@call-out:6] Playback("SIP/100-00000006", "/tmp/musicEXTEN:2") in new stack
      [May 29 22:23:10] WARNING[1651][C-00000004]: file.c:789 ast_openstream_full: File /tmp/musicEXTEN:2 does not exist in any format[May 29 22:23:10] WARNING[1651][C-00000004]: file.c:1262 ast_streamfile: Unable to open /tmp/musicEXTEN:2 (format (alaw)): No such file or directory
      [May 29 22:23:10] WARNING[1651][C-00000004]: app_playback.c:497 playback_exec: Playback failed on SIP/100-00000006 for /tmp/musicEXTEN:2
      -- Executing [355@call-out:7] Wait("SIP/100-00000006", "2") in new stack
      > 0x7f5c200352d0 -- Strict RTP learning complete - Locking on source address 192.168.56.1:40024
      -- Executing [355@call-out:8] Hangup("SIP/100-00000006", "") in new stack
      == Spawn extension (call-out, 355, 8) exited non-zero on 'SIP/100-00000006'
      pc-call*CLI>

      • Вы явно в конфиге что-то напутали. У вас создается файл с таким именем - /tmp/musicEXTEN:2. Где-то какой-то символ потеряли и у вас EXTEN не переводится в реальный номер.

  36. Настроил запись и статистику звонков, но появилась проблема, собеседники перестали слышать друг друга. Если прослушать запись звонка, то слышно как они "алекают" друг другу. Диалплан был самый простой, звонки внутри сети, исх. звонок на внешний номер, до добавления макроса на запись звонилось на ура.

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

      • Аноним

        По идее, если в записи звонка слышно голоса, то он нормально проходит. Есть сомнения в софтовой звонилке 3CX. Завтра попробую телефон украсть у кого-нибудь.

        • Виновата оказалась софтовая звонилка, после ее удаления и выковыривания остатков из реестра все заработало.
          И еще, чтобы удалить из CDR Viewer ненужные записи их нужно удалить из VariaDB?

  37. Кирилл

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

    Подключал транк без регистрации
    [2000000]
    type=friend
    host=10.16.150.20
    registersip=no
    trunkname=2000000
    fromuser=8122000000
    callerid=812000000
    callbackextension=2000000
    disallow=all
    allow=alaw
    contex=call-in
    insecure=invite
    relaxdtmf=yes
    dtmfmode=RFC2833 ; без relaxdtmf не помогает
    canreinvite=no
    port=5060

    Прописал extentions.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}@2000000)

    include => handup-sip

    ;Входящие звонки
    [call-in]
    exten => 2000000,1,Dial(SIP/100)

    Наружу звонки идут, при попытке набрать номер, получаю ошибку на астере:
    [May 6 23:29:16] NOTICE[1902][C-00000023]: chan_sip.c:26793 handle_request_invite: Call from '2000000' (10.16.150.20:5060) to extension '2000000' rejected because extension not found in context 'default'.

    Не очень понимаю, как он ее не находит, ведь мы его прописывали нижней строчкой. Подскажите. на что он может ругатся?

    • Кирилл

      АААА, опечатка в слове context... на contex.....
      Вот пример, почему надо отдыхать, спасибо, Зерокс)

  38. Алексей

    Добрый день! Подскажите пожалуйста, после ввода команды "sip show users" выдает "No such command 'sip show users' " В чем может быть проблема

  39. Доброго времени суток! Вот пытаюсь разобраться в написанном поподробнее и возник вопрос:

    callbackextension - я так понимаю, что эта настройка в sip.conf говорит о том, что данный peer может совершать исходящие звонки?

    Поискал в сети описание данной настройки и конкретного ответа - прав я или нет, так и не нашел.
    Зарание прошу прощения, если вопрос глупый.

    • Александр

      Здравствуйте! Можно пример как сделать исходящий звонок с любого свободного транка если их 4 и больше?

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

    • Нет, callbackextension с входящими звонками не связан. За это отвечает настройка dialplan и context, в который помещен peer.

  40. В общем у меня активных коннекторов показывает 0 из 1. Делал всё по статье...

  41. А почему коннектор MySQL, когда у нас ставится MariaDB...?!?

    • Друг как я тебя понимаю мы просто купаемся в этом океане обсурда и ничего поделать не можем !!!
      мария это тоже sql

      • Это не просто sql. Так то postgresql тоже sql. MariaDB форк Mysql с полной обратной совместимостью. Как и другой известный форк - percona.

  42. Подскажите а как обработать события после dial когда кто-то из сторон положил трубку, нужно отправить curl в софт, но все команды после соединения в диал не обрабатываются, только в случаи не удачи соединится?

    • Разобрался как обработать поднял трубку вызываемый опция U(), отклонил вызов вызываемый опция g, но не могу обработать сброс вызова звонящим может кто подскажет. Знаю про exten => h , но не совсем подходит может есть другой способ? не разобрался еще с опцией F() не пойму как работает

  43. Дмитрий

    Добрый день.
    Такая же ошибка, как и одного из комментаторов и никак дальше не продвинуться
    [Mar 26 16:31:34] NOTICE[3024][C-00000005]: chan_sip.c:26805 handle_request_invite: Call from '101' (192.168.0.130:62506) to extension '100' rejected because extension not found in context 'call-out'.

    Проверил и extensions.conf и sip.conf - все как в статье
    Перезапускал сервис.
    Все безрезультатно. Клиенты подключаются, в системе видятся, но позвонить друг другу не могут.
    Что еще можно проверить?

    • В тексте ошибки точно указано, в чем проблема. Кроме как внимательно проверять конфиг, не знаю, что посоветовать. Обычно это все же ошибки в конфигурации. Я сам бывало так же ошибался и получал эту ошибку.

    • Дмитрий

      Все перепроверил, все конфиги.
      Не работает. Та же ошибка.
      Софтофоны конектятся:

      Asterisk*CLI> sip show peers
      Name/username             Host                                    Dyn Forcerport Comedia    ACL Port     Status      Description
      100/100                   192.168.1.121                            D  No         No             51387    OK (104 ms)
      101/101                   192.168.0.130                            D  No         No             58926    OK (110 ms)

      Сократил оба конфига до минимума:
      sip.conf:

      [100]
      type=friend
      regexten=100
      secret=123
      context=outcalling
      host=dynamic
      callerid="100"
      disallow=all
      allow=alaw
      language=ru
      callgroup=1
      pickupgroup=1
      qualify=yes
      canreinvite=yes
      call-limit=4
      nat=no
      
      [101]
      type=friend
      regexten=101
      secret=123
      context=outcalling
      host=dynamic
      callerid="101"
      disallow=all
      allow=alaw
      language=ru
      callgroup=1
      pickupgroup=1
      qualify=yes
      canreinvite=yes
      call-limit=4
      nat=no

      extentions.conf:

      [outcalling]
      exten => _XXX,1,Dial(SIP/${EXTEN},,m)

      Проще уже некуда,
      и все равно ошибки при попытке звонка в обе стороны:

      [Mar 30 12:07:59] NOTICE[1224][C-00000009]: chan_sip.c:26805 handle_request_invite: Call from '101' (192.168.0.130:58926) to extension '100' rejected because extension not found in context 'outcalling'.
      [Mar 30 12:08:14] NOTICE[1224][C-0000000a]: chan_sip.c:26805 handle_request_invite: Call from '100' (192.168.1.121:51387) to extension '101' rejected because extension not found in context 'outcalling'.

      Asterisk 16.16.2, CentOS Linux release 8.3.2011

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

        Далее попробуйте в контексте явно прописать номера, без масок:
        exten => 100,1,Dial(SIP/100)
        exten => 101,1,Dial(SIP/101)

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

        • Дмитрий

          Добрый день.
          Спасибо, что уделили мне столько времени.
          Это я болван!!! Создал файл с неправильным именем "extentions.conf".
          Исправил, перезапустил - все работает.
          Ошибку нашел, когда начал проверять права на файлы.
          Два дня бился, даже разные клиенты X-Lite пробовал - оказалось все просто...
          Еще раз спасибо!!!

      • И еще dialplan show покажите, когда все сделаете.

  44. Дмитрий

    Я только начинаю разбираться в командах Linux и перепроверяю все, что написано в статье.
    Такой вопрос. В команде chown вы намеренно поставили точку между пользователем и группой?
    # chown -R asterisk.asterisk /etc/asterisk /var/{lib,log,spool}/asterisk /usr/lib64/asterisk
    В синтаксисе команды они должны разделяться двоиточием.
    Как-то так
    # chown -R asterisk:asterisk /etc/asterisk /var/{lib,log,spool}/asterisk /usr/lib64/asterisk
    Я ввел именно свой вариант. Ошибок не было.
    Спасибо.

    • Насколько я понимаю, разницы нет. Я обычно использую либо двоеточие asterisk:asterisk, либо для краткости точку - asterisk. Это то же самое, что предыдущая запись. Подходит, когда имя пользователя и группы совпадают. Не нужно писать группу.

  45. Дмитрий

    Добрый день.
    На CentOS 8 команда
    # dnf config-manager --set-enabled PowerTools
    Выдала ошибку
    Error: No matching repo to modify: PowerTools.
    Решение оказалось - убрать заглавные буквы. Правильное написание команды:
    # dnf config-manager --set-enabled powertools

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

  46. Алексей

    Простите!
    Придерусь с первых строк. Номера от 100 до 130 это 31 сотрудник.
    Ничего страшного конечно нет. Но глаз "режет" )
    А в целом статья на пятерочку!

  47. Дмитрий

    Владимир, а не могли бы Вы дополнить статью разделом по настройке с использованием PJSIP?

  48. Александр

    Здравствуйте.

    1. Входящий звонок приходит на один внутренний номер.
    2. Входящий звонок приходит на пару внутренних номеров
    (queues.conf :

    [secretary]
    strategy = ringall / randov
    member => SIP/100
    member => SIP/130)

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

    • Первый случай простой. Делается примерно так:
      exten => 150,1,Dial(SIP/${EXTEN},2,Tt)
      exten => 150,n,Dial(SIP/89151234567@397945)

      Второй сходу не скажу, давно не настраивал подобное, надо думать и тестировать.

  49. Добрый подскажите подключаю yeastar tg как VoIP-канал как правильно прописать конфиги то все примеры под Freepbx а я не пойму куда прописывать входящею и исходящею маршрутизацию (Out/Incoming Route)

    • Voip шлюз yeastar подключается как обычный пир и дальше через него настраивается маршрутизация в dialplan. В чем конкретно проблема? Я настраивал yeastar, не было никаких проблем и нюансов.

  50. александр

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

    • В формате комментария трудно ответить. Общий смысл такой. Формируете номера по группам, в одной те, кому можно звонить по межгороду, во второй те, кому нельзя. Разные группы привязываете к разным контекстам. В контексте, где разрешен межгород и мобильные, разрешаете все звонки по маске _X. А в группе, где не разрешены, делаете более узкие маски так, чтобы они не включали в себя номера на _810. и _89ХХ. То есть будет разрешено только _8495XXXXXXX и _8499XXXXXXX. Это городские московские номера. Они звонить смогут только по ним. Примерно так.

  51. александр

    asterisk при определении номера срезает первую цифру 8. Как сделать чтобы правильно работал определитель номера?

    • Не понял, что значит срезает? Он по умолчанию ничего не срезает, если это не настроить в диалплане. При каких звонках это происходит? Может провайдер так передает входящий номер?

      • Аноним

        номер приходит в виде 93700000 не хватает или +7 или 8

        • Так это ваш астериск восьмерку отрезает или от провайдера такой номер приходит? От этого зависит исправление. Просто добавить 8 к номеру не проблема. Нужно callerid поправить. Вот тут пример, как это делать - https://serveradmin.ru/vyivod-tranka-vmeste-s-nomerom-zvonyashhego/ Только там я название транка добавляю, а вам надо цифру 8 добавить. Хотя я не очень понимаю, зачем это делать. И так понятно, какой номер звонил.

          • Аноним

            добавил во входящие "exten => _XXXXXXXXXX,1,Set(CALLERID(number)=8${CALLERID(number)}) exten => _XXXXXXXXXX,n,goto(ext-did,${EXTEN},1)". А нужно это чтобы из не принятых набрать абоненту который звонил

  52. Евгений

    Здравствуйте. А что за ошибка после запуска asterisk.service: Can't open PID file /var/run/asterisk/asterisk.pid (yet?) after start: No such file or directory

    Она тоже у вас есть на скрине.

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

  53. DenisNIkolaich

    Доброго времени суток уважаемый Zerox! Прежде всего хочу выразить огромную благодарность за Ваш труд, так как с Asterisk имею дело первый раз, а Ваша статья очень помогает разобраться. Но есть вопрос, не могли бы Вы подсказать, как переадресовывать вызов на голосовую почту, если выключены телефоны секретарей, которые находятся в queue? Или же если это не возможно, то подскажите пожалуйста по этому ("Обращаю ваше внимание, что в контексте голосового меню я не сделал обработку статусов состояния телефона секретаря, хотя это может быть нужно, если у вас будет один секретарь принимать звонки."), желательно пример))) Заранее премного благодарен.

    • По таким нюансам уже не подскажу. Давно не погружался в voip тему. Подзабыл многое.

  54. Сергей

    Доброго времени суток! Наверное начну с того, что данная инструкция одна из лучших среди тех, которые я смотрел и изучал.

    С Linux я знаком мало, как-то не было нужды изучать, но тут обстоятельства так сложились, что я стал изучать Linux из-за необходимости поднять сервер Asterisk'a. Все шло по инструкции до момента сборки Asterisk'a, а именно возникла трудность с Jannson:

    checking for JANSSON... no
    checking for json_sprintf in -ljansson... no
    configure: *** Asterisk requires libjansson >= 2.11 and no system copy was found.
    configure: *** Please install the 'libjansson' development package or
    configure: *** use './configure --with-jansson-bundled'

    Покопавшись в сети я так и не нашел ответа как обновить Jannson до версии 2.11. Я подозреваю, что Jannson 2.11 необходим из-за того, что я взял Asterisk 18, а не как указано 16. Сервер CentOS 7.
    Может быть вы подскажете как мне все таки обновить или установить Jannson 2.11? Заранее благодарен за ответ и весьма подробную, понятную инструкцию.

    • Я бегло погуглил и не нашел простого решения. Готового пакета с Jannson 2.11 для Centos 7, как я понял, не существует. Надо либо от других версий пробовать rpm пакеты ставить, но могут быть проблемы с зависимостями. Либо собирать самому из исходников, но тоже не факт, что получится. С учетом того, что в линуксе вы новичок, я бы вам не советовал тратить на это время. Это может оказаться непосильной задачей.

      Советую остановиться пока на 16-й версии и сделать все по моей статье. У этой версии поддержка еще 3 года будет. Вам хватит, чтобы освоиться и войти в тему. Потом без проблем перенесете все на 18-ю или какую-то другую версию. Там еще и на pjsip переходить надо будет. Так что переезда не избежать. А моя статья все равно использует старый sip, так что 16-я версия тут лучше всего смотрится.

      • Сергей

        Ну я пробовал собрать из исходников Jannson 2.11 и 2.13.1 - в системе остается Jannson 2.10, смотрел через № rpm -qa. Я так понимаю, что на CentOS 7 они просто не встают. Хотя я может и ошибаюсь. Большое спасибо за ответ, пойду щупать Asterisk 16. ;)

      • Сергей

        Уважаемый Zerox, вот тут, как говориться "Либо я дурак, либо лыжи не едут..." Дело в том, что при попытке установить Asterisk 16.15.0 на моменте сборки Asteriska вылазит та же самая чертовщина с Jannson и вот тут я совсем запутался... У вас есть какие-то мысли по таком№у рзавитию событий? Ну как у более опытного пользователя.

        • Не зная всех подробностей, не могу что-то сказать конкретное. Когда последний раз проверял статью, все работало. Попробуйте все начать с нуля на чистом сервере.

  55. Виталий

    Все конечно хорошо и красиво вот только pjsip тут установлен а настройка проходит через sip.conf. Как понимать сие чудо?

  56. Здравствуйте, я в линухах поный ноль , но очень хочется самому ручками все настроить
    подскажите пожалуйста, в чем может быть проблема, все сделал по вашей инструкции до момента усановки Asterisk-CDR-Viewer-Mod все получалось.
    Тут же проблема в том, что если все делать точно по инструкции , то после настройки, при попытке перехода по http://ваш ip/cdr/.

    браузер ругается

    Not Found
    The requested URL /cdr/ was not found on this server.

    если смотреть по аналогии настройку z.serveradmin.ru ( ваша статья по установке апача и php), то в директорию /etc/httpd/conf.d/ кладется файл конфигурации z.serveradmin.ru.conf
    и апач понимает, где живет z.serveradmin.ru и что с ним надо делать.

    В случае же с установкой Asterisk-CDR-Viewer-Mod
    по инструкции никаких файлов в /etc/httpd/conf.d/ класть не надо
    Но оно не работает в таком случае, либо же настройки лежат где то в другом месте, если да , то где ?

    В общем подскажите куда копать

    • В данном случае в статье подразумевается, что используется дефолтная настройка web сервера, который доступен по ip адресу и отдает исходные файлы из директории /var/www/html/, тогда в случае создания там папки cdr, можно обращаться к ней напрямую через http://ваш ip/cdr/.

      Если вы все делали по статье, то по идее, у вас все должно получиться. Убедитесь, что исходники панели реально лежат в /var/www/html/cdr, а директория /var/www/html/ это корень веб сервера.

      Это азы настройки веб сервера, мне трудно пояснить подробнее. Никакие файлы z.serveradmin.ru.conf вам не нужны и не могут быть примером, так как там речь идет о виртуальных серверах, а тут все это не используется.

      • Да, исходники точно лежат по адресу /var/www/html/cdr
        А еще, у меня по адресу "мойIP" открывается не дефолтная страница , а страница виртуального хоста PhpMyAdmin, который я настроил опять же для asteriska и живет он в директории web/sites/pma.aster.ru/

        в папке /etc/httpd/conf.d соответственно лежит конфиг pma.aster.ru.conf
        больше никаких хостов нет

        Что мне нужно настроить, чтоб он увидел панель ?

      • В итоге создал файл конфигурации в папке /etc/httpd/conf.d следующего содержания
        Alias /cdr/ "/var/www/html/cdr/"

        #
        # AuthName "Asterisk-CDR-Stat"
        # AuthType Basic
        # AuthUserFile /var/www/asterisk-cdr-viewer/.htpasswd
        # AuthGroupFile /dev/null
        # require valid-user
        #

        - заработало
        авторизацию правда не настраивал еще, но уже радует))

  57. Спасибо за статью, по данному описанию собрал рабочую сеть внутри сети.
    Но дело дошло до zadrama и пошли тормоза.
    Выходит ошибка: WARNING[1542]: chan_sip.c:16217 transmit_register: Probably a DNS error for registration to 843987@sip.zadarma.com, trying REGISTER again (after 20 seconds)
    Сделал telnet, проверил открыт у меня порт или нет, порт открыть. попытался ввести
    sip.zadarma.com ввиде IP адреса, тоже не выходит.
    nc -vnzu 185.45.152.174 5060 все работает, но эта ошибка не уходит.

    Связался с техподдержкой, там меня попросили сменить внешний порт на TCP 5065.....
    Тут пошли еще больше проблемы....где его сменить....меняю в sip.conf но он не меняется...
    sip show peers показывает что используется 5060 порт.

    Как решить эту проблему?

    • Провайдер не может блокировать sip трафик? Я много раз с подобным сталкивался.

      • а это каким образом проверить можно?

      • Дело в том что порт открыт, я проверял.

        Неужели они трафик режут?

        • Да, могут мешать именно нормальному хождению трафика. Порт при этом будет открыт. Я с таким сталкивался, приходилось по vpn подключаться sip телефонию. Провайдер просто продавал сам услуги voip, поэтому другим не давал пользоваться чем-то со стороны. Проверить легко - попробуйте подключиться к какому-то другому voip провайдеру. Например, через софтовый клиент на своем компьютере.

  58. Спасибо за статью - реально помогла решить проблему: сервер телефонии - за NAT (сеть офиса) на входе - программный шлюз, телефон в другой локальной сети (офис2) - , тоже за NAT (шлюз на pfsense)! Между сетями поднят OPENVPN - клиенты друг друга видят, все прекрасно. Внешний офис не единственный (уже был ранее настроен доступ из туннеля "офис3 - офис1", но.. В механизм не сработал... Телефон на сервере регистрируется, SIP (5060) проходит из одной локальной сети в другую через канал замечательно, а RTP от сервера идет напрямую через туннель в офис2, а обратно - сигнал хоть тресни отправляется на внешний адрес, указанный в настройках телефонии Х.Х.Х.Х Как итог: в офисе2 звук слышен, от сервера (офис1) приходит, а в офисе1 - в трубке полная тишина...
    И ведь было написано правило прероутинга... Все отличие, что вместо --dst X.X.X.X. стояло -i ensYY - WAN и порты прописаны все одним правилом как -m multiport --dport 5060,10000:20000 НЕ РАБОТАЛО! стоило переписать правила - голос пошел в обе стороны!

    • Круто, что это помогло. Я бы так сходу и не догадался поменять правила. Не очевидно, что ваше не будет работать.

      • nkudrich@gmail.com

        Вот и мне было не очевидно целых две недели))). До правила по SIP, TCPDUMP показывал прохождение пакетов чисто между локальными интерфейсами: офис2_lan:5060 - офис1_lan: 5060. Rtp было асинхронным. Теперь все идёт так: офис2_lan - офис1_wan. (5060, и rtp). И все работает.

  59. Здравствуйте! Изучаю по Вашей инструкции asterisk, за что огромное спасибо! У меня возник вопрос: я записываю(через Record()) сообщения, которое оставляет клиент (тот, кто позвонил нам) и хочу распознать через google cloud stt записанный файл формата wav, но столкнулся с проблемой плохого качества записи (8000 Hz, 1 channels, s16, 128 kb/s) и последующих проблем с распознаванием. Попытался записать в формате mp3, но астер мне сказал, что он умеет только "читать" mp3, но не записывать. Можно ли как то улучшить качество записываемого файла? Или записывать не через Record, а что-нибудь другое, которое записывает в лучшем качестве. Спасибо.

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

    • Да сейчас столо проще держать переговоры в текстовых файлах!
      Залейте на ютуб и проверьте там распознаваемость.

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

      ;exten => s,n,system(curl -X POST "https://api.telegram.org/bot0000000000:hkjhUIYIUHJK_hkjhUIYIUHJK_gCrOfBU/SendMessage" -d "chat_id=98789798&text=(С Номера: ${DIAL_ID}} дата: ${STRFTIME(${EPOCH},,%d.%m.%Y)} время)
      ;exten => s,n,system(curl -X POST "https://api.telegram.org/bot0000000000:hkjhUIYIUHJK_hkjhUIYIUHJK_gCrOfBU/SendAudio" -F "chat_id=98789798" -F "audio=@/home/record/${fname}" --insecure)

  60. Я не пойму, нужно или нет загружать в mysql /var/www/html/cdr/docs/mysql_cdr.sql?
    Я дошел до "В папке docs подробная инструкция по настройке. Все дальнейшие действия делаются в соответствии с ней." и не пойму, что делать дальше?
    Вроде по данной статье , мы создали таблицу cdr и колонки.

  61. Аноним

    Здравствуйте,
    При звонке с alcatel на asterisk (v16 + freepbx v15), на экране телефона alcatel отображается "SIP", а при поднятии трубку на asteriske, на телефоне alcatel отображется "вызываемый номер" и "SIP". Скажите пожалуйста, в чем может проблема.

    • Сам alcatel куда подключен? К этому же asterisk? Вообще, за информацию на дисплее аппаратов отвечает CALLERID. Надо копать в эту сторону.

      • Аноним

        Да, asterisk подключен к alcatel по sip транку

      • Zerox, здравствуйте,

        Спасибо большое за подсказку, нашли решение.

        Возник другой момент, при внутреннем звонке из астериска на alcatel, на аппарате алкателя звонок поступает на "isdn", вместо "внутренней линии". Нужно чтобы внутренние звонки поступали по внутренней линии. Скажите пожалуйста где в астериске можно настроить это? Есть ли какой-нибудь параметр в астериске, отвечающий за данный процесс?

  62. Василий

    Добрый день. Установил астериск 13 и при перезагрузке диалплана не вижу ошибок. всегда пишет pbx_config successfully loaded 33 contexts. Причем я намеренно сделал синтаксическую ошибку, чтобы увидеть в консоле как он про нее пишет. С астром 11 такого не было. Что нужно включить, чтобы он выводил в консоле ошибки в диалпланах?

  63. Здравствуйте.
    Вроде нашёл небольшой недочёт в инструкции.
    Нужно добавить каталог "run" в команду chown -R asterisk.asterisk /etc/asterisk /var/{lib,log,spool,run}/asterisk /usr/lib64/asterisk
    В 17ой версии Asterisk на CentOS8 после этого проблем нету, стартует без ошибок.
    Спасибо.

    • В инструкции всё хорошо, просто я не отключал SELinux.
      Для тех кому интересно как его настроить, ниже напишу команды.
      Не знаю на счёт "правильности", зато работает.
      semanage fcontext -a -t asterisk_var_run_t '/var/{lib,log,spool,run}/asterisk(/.*)?'
      restorecon -Rv '/var/{lib,log,spool,run}/asterisk'

      • При старте сервиса вот это сообщение "asterisk.service: Can't open PID file /var/run/asterisk/asterisk.pid (yet?) after start: No such file or directory" никуда не делось, просто asterisk работает и так.

  64. Здравствуйте Zerox.

    Наблюдаю "интересную" ситуацию с подменой статуса внутреннего номера после звонка. Не могу понять что не правильно.

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

    После обработки этой строки:
    exten => _XXX,n,GotoIf($[${ISNULL(${REDIRECTNUM})}]?redirect)
    сигнал BUSY, NOANSWER меняется на CHANUNAVAIL. И как следствие, ситуационное ветвление не отрабатывается.
    Возможно и другие сигналы тоже меняются на CHANUNAVAIL, не проверяла.

    Подскажите пожалуйста что не правильно.
    Спасибо.

    Привожу код диалплана:

    [call-out]
    ; Установить с телефона переадресацию *21
    exten => *21,1,Playback(hello)
    same => n,Playback(vm-enter-num-to-call)
    same => n,Read(cfwd)
    same => n,Playback(beep)
    same => n,Set(DB(REDIRECT/${CALLERID(num)})=${cfwd})
    same => n,Set(DB(REDIRTIMER/TIMER)=5)
    same => n,Playback(you-entered)
    same => n,SayDigits(${DB(REDIRECT/${CALLERID(num))}})
    same => n,Playback(enabled)

    ; Отменить переадресацию с телефона *22
    exten => *22,1,Set(NOREDIRNUM=${DB_DELETE(REDIRECT/${CALLERID(num)})=${cfwd}})
    ;exten => *22,1,Set(NOREDIRNUM=${DB_DELETE(REDIRECT/${CALLERID(num)})})
    same => n,Playback(disabled)

    ;Звонок на внутренний номер
    exten => _XXX,1,GoSub(recording,s,1,(${CALLERID(num)},${EXTEN}))
    exten => _XXX,n,Dial(SIP/${EXTEN},5,m,Tt)
    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} ===========)
    ; Если установлена переадресация *21
    exten => _XXX,n,Set(REDIRECTNUM=${DB(REDIRECT/${EXTEN})})
    exten => _XXX,n,GotoIf($[${ISNULL(${REDIRECTNUM})}]?redirect)
    exten => _XXX,n(redirect),Dial(SIP/12345678/${REDIRECTNUM})
    ;end
    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,Playback(vm-dialout) ;пожалуйста подождите происходит соединение
    exten => num-not-exist,n,Wait(1)
    exten => num-not-exist,n,Queue(secretary,t)
    exten => num-not-connected,1,Wait(2)
    ; номер отключен
    exten => num-not-connected,n,Playback(vm-nobodyavail) ;в данный момент никто не может принять Ваш звонок
    exten => num-not-connected,n,Wait(2)
    exten => num-not-connected,n,Voicemail(${dstNUM},u)
    exten => num-BUSY,1,Wait(2)
    exten => num-BUSY,n,Playback(telephone-number) ;телефонный номер
    exten => num-BUSY,n,Playback(vm-isonphone) ;занят
    exten => num-BUSY,n,Playback(pls-try-call-later) ;попробуйте позвонить познее
    exten => num-BUSY,n,Wait(1)
    exten => num-NOANSWER,1,Voicemail(${dstNUM},u)
    exten => num-CHANUNAVAIL,1,Wait(2)
    exten => num-CHANUNAVAIL,n,Playback(vm-isunavail)

    ;Звонок на внешний номер
    exten => _XXX.,1,GoSub(recording,s,1,(${CALLERID(num)},${EXTEN}))
    exten => _XXX.,n,Dial(SIP/${EXTEN}@12345678)

    include => handup-sip

    • Я так понимаю решения нет?

      • Наверняка есть, но у меня нет возможности в этом разбираться и решать вопрос.

        • Да, есть, спасибо, нашла ответ в Вашей статье "Оповещение о занятости второй линии в asterisk". Увеличила кол-во линий на 2 и всё заработало). Вы в ней как раз про этот нюанс рассказываете.
          Ещё раз Спасибо за Ваш труд!

  65. Исправление: Добрый день, как я могу с уважением поменять язык на испанский или английский с ASTCDR?

    • Не очень понял, о каком языке идет речь? В web панели со статистикой звонков?

      • Да, веб-панель «Asterisk CDR Viewer Mod».
        Я из Латинской Америки, все устанавливаю хорошо, но панель на русском.
        Как я могу изменить его на испанский? Спасибо.

        • Эта панель русскоязычная. У нее нет перевода на другие языки. Так что только вручную переводить. Тут не так много текста, не трудно сделать самому.

          • Спасибо за ваш вклад, я надеюсь, вы настроите биллинг A2 со звездочкой 16 и freepbx. Ура!

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

  67. Здравствуйте Zerox.
    Еще раз огромное спасибо за развёрнутую статью по настройке с нуля!

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

    Спасибо.

    • Для удаленных подключений каких-то особенных настроек делать не надо. Если в свойствах пиров не настроены ограничения по ip для подключения, то они будут разрешены всем. Дальше вам нужно будет пробросить порт 5060 на свой asterisk.

      • Спасибо!
        Ещё вопрос, Лет семь назад пробовала ip телефонию на аппаратном уровне, станции поддерживала. Кол-во запросов от "халявщиков" забивали интернет.

        Как обстоит дело с безопасностью у астериска сейчас? Перенос порта? Эхо запрос от порта имеет режимы вещания? Можно ли его включить так, что бы сканеры не определяли его как voip?

        Спасибо!

        • В общем случае с безопасностью проблем нет. Я не делаю ничего особенного, кроме настройки fal2ban. Астериски смотрят напрямую в интернет. Единственное, на всякий случай не раздаю удаленный доступ к пирам без необходимости. Если удаленно никто не подключается, то регистрация пиров ограничивается списком локальных ip адресов.

          • Т.е. имеет смысл привязать все локальные телефоны по ip что бы сократить вероятность подбора?
            Или достаточно указать nat=no? У меня астериск с одним ethernet портом.

            Спасибо.

  68. Здравствуйте помогите пожалуйста.
    Создал Веб-интерфейс через Asterisk-CDR-Viewer-Mod. Все работает кроме записи, не могу прослушать. Стоит типа нет доступа( что делать?
    У Вас есть группа в телеграмме?

    • Кто и где говорит, что нет доступа? Записи реально создаются в папке?

      • Да создается запись. Не могу прослушать.

      • В столб се где запись стоит знак круглый внутри черточка, типа не возможно прослушать. Мне нужно прослушать запись и скачать. как могу это сделать?

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

          Скачать можно программой WinSCP.

  69. Спасибо за подробный материал!

    Музыка на ожидании (on hold), нет примера для установки lame. Мелочь, но ... не приятно

    cd ~
    wget http://sourceforge.net/projects/lame/files/lame/3.100/lame-3.100.tar.gz
    tar -xvfz lame-*
    cd lame-3.100
    ./configure –-prefix=/usr/
    make && make install

  70. Шильке Александр

    Большая работа. Спасибо.

  71. Как сделать две очереди? у меня есть два городских номера, в queues.conf прописываю так
    [general]
    persistentmembers=yes
    [queue_callcenter]
    music=default
    strategy=ringall
    ringinuse=yes
    wrapuptime=1
    servicelevel=60
    announce-frequency=60
    announce-holdtime=yes
    reportholdtime=yes
    setqueueentryvar=yes
    member => SIP/101
    member => SIP/102
    member => SIP/106
    [queue_callcenter1]
    music=default
    strategy=ringall
    ringinuse=yes
    wrapuptime=1
    servicelevel=60
    announce-frequency=60
    announce-holdtime=yes
    reportholdtime=yes
    setqueueentryvar=yes
    member => SIP/103
    member => SIP/104
    member => SIP/105
    Когда захожу в asterisk -r и пишу queue show queue_callcenter1 и queue show queue_callcenter
    показывает что есть две очереди, но когда звоню с двух этих городских номеров попадают в одну и туже очередь а именно в [queue_callcenter1], как можно из разделить?

  72. Почему нету кнопки воспроизведения записи в web cdr в папке запись есть, а на сайте нету пути все прописал сделал тупо все как на вашем сайте у вас на скрине видно что можно воспроизвести запись у меня нет. Не могу понять в чем дело подскажите пожалуйста.

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

      • У меня та же проблема. Запись хранится в mnt/calls
        но на WEB CDR не могу прослушать.
        в настройках var/www/html/cdr/inc/config есть два файла php и php.sample там в (monitor_dir==> прописал mnt/calls) что я еще не правильно сделал ?

        • Может у вас браузер флеш блокирует? Не знаю как сейчас, но раньше там для прослушивания записей использовался flash, который сейчас все браузеры по-умолчанию блокируют.

  73. Когда оператор начинает разговор выходит следующая ошибка Can't send 10 type frames with SIP write, это никак не мешает работе, но получается, что засераются логи, как можно избавиться от данного сообщения версия астера 16

  74. Пишу asterisk -r потом core reload все прекрасно работает, потом куда-нибудь ухожу, приходу через 3 часа пробую позвонить на номер ничего не работает, опять пишу core reload звоню все норм, в чем может быть проблема?

  75. Подскажите пожалуйста. Где копать? почему не записываются разговоры с транка на cdr . Я уже наверно перепробовал все варианты sip.conf и в диалплане. Просто может я не там вообще копаю. транк зарегистрирован как подключенного пользователя астериск видит, но запись не записывается...

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

      • Так запись идет, но только внутри сети, а по транку от ростелеком записи нету, а понять в чем проблема вообще не могу.
        exten => _XXX.,n,Dial(SIP/${EXTEN}@397945) 397945 - это то что я пишу в sip.conf в fromdomain и host ?

        • Должно быть так:
          exten => _XXX.,1,GoSub(recording,s,1,(${CALLERID(num)},${EXTEN}))
          exten => _XXX.,n,Dial(SIP/${EXTEN}@397945)
          У меня же в примере показано.

          • exten => _XXX.,1,GoSub(recording,s,1,(${CALLERID(num)},${EXTEN}))
            exten => _XXX.,n,Dial(SIP/${EXTEN}@397945)
            так у меня то не 397945 поэтому и спрашиваю сюда пишется то что квадратных скобках [397945] или то что я прописываю в fromdomain

            в диал план они вообще предлагают написать так
            exten ? admin,1,Dial(SIP/78461,12,t)
            exten ? admin,n,Dial(SIP/78462,12,t)
            exten ? admin,n,Dial(SIP/78463,12,t)
            exten ? admin,n,Hangup()
            что ставить вместо знаков вопроса тоже не понятно... хотя на сколько я понимаю => я просто пробывал и так и так один фиг запись именно с транка не идет, может вы хотя бы скажите какие строчки отвечают за запись именно разговоров, а то как на стройки не меняй в диал плане и sip.conf один фиг транк работает, а запись нет.

  76. Добрый день! Сделал все как у вас в статье, но почему-то в CDR не записываются разговоры с транка от ростелеком, получается звоню внутри сети к примеру с 101 на 102 все норм, но когда звоню с транка( извините может не правильно выражаюсь) запись не идет, хотя астериск видит подключенного пользователя. Получается что когда набираю sip show registry все норм, в пользователях тоже все норм

    • на сколько я понимаю в cdr идут все записи которые находятся в паке mnt/calls, но почему то звонки по транку туда не записываются, я вот не могу понять как заставить астериск записывать разговоры по транку

    • на сколько я понимаю все записывается в папку mnt/calls , но почему-то при звонке по транку ростелекома в эту папку запись не происходит, подскажите что можно сделать , настройки полностью брал с вашей статьи. то есть получается с 100 на 101 все записывается с транка нет

    • /var/log/asterisk/cdr-csv/Master.csv записи звонка с транка тоже нету почему-то, есть все кроме как с трнка...
      не могу понять в чем проблема может быть

  77. Александр

    Добрый день. Помогите плизз. Года 4 назад настроил ip телефонию, все работало как надо(вроде), а на днях обнаружили сотрудники, что перестал работать Voicemail. Сервер к Интернет не подключен почтовые ящики телефонов находятся на самом сервере. Настройки никто не трогал как я 4 года назад настроил так никто туда не заходил. Я думал место на диске кончилось, но нет мета выше крыши. Стоит asterisk 13.7.1 и freepbx 13.0.115. Обнаружил,что если удалить файл unavail.wav, Voicemail начинает нормально работать. Сравнение логов с файлом и бе выявили, что при отсутствии файла выполняется файла вызов воспроизведения стандартных звуковых файлов, а потом:
    2020-05-22 00:56:49] VERBOSE[4332][C-0000006d] app_voicemail.c: Recording the message
    [2020-05-22 00:56:49] VERBOSE[4332][C-0000006d] app.c: x=0, open writing: /var/spool/asterisk/voicemail/default/2/tmp/VnO0MO format: wav, 0x7f06d0789908
    [2020-05-22 00:56:57] VERBOSE[4332][C-0000006d] app.c: User hung up

    в случае с файлом, происходит его воспроизведение(реально воспроизводится) но вышеуказанные команды не выполняются. Что может быть не так? Последующие команды идентичны в обоих случаях. Спасибо.

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

      • Александр

        Я думаю как раз наоборот, что то происходит после воспроизведения вызывается исключение и блок:
        2020-05-22 00:56:49] VERBOSE[4332][C-0000006d] app_voicemail.c: Recording the message
        [2020-05-22 00:56:49] VERBOSE[4332][C-0000006d] app.c: x=0, open writing: /var/spool/asterisk/voicemail/default/2/tmp/VnO0MO format: wav, 0x7f06d0789908
        [2020-05-22 00:56:57] VERBOSE[4332][C-0000006d] app.c: User hung up
        пропускается ибо остальной лог в обоих случаях абсолютно идентичен.
        Интересно в каком файле указывается использование unavail.wav
        И почему внезапно перестало работать

        • Ну попробуй не wavа другой формат

          • Александр

            У меня на все голосовые сообщения записаны диктором сообщения они все в wav или Voicemail какойто особенный? надо будит в понедельник попробовать.

  78. здраствуйте
    при проброске портов командой:
    iptables -t nat -A PREROUTING -p udp --dst $WAN_IP --dport 5060 -j DNAT --to 192.168.1.25:5060
    выбивает ошибку "bad argument 5060"
    подскажите пожалуйста что тут надо сделать

  79. сергей

    Добрый день!
    Редкой подробности и структурированности статья. Благодарен вам.
    Можно вопрос - можно ли установить астериск на удаленный сервер - типа на такой на котором хостинг предоставляют. Второй вопрос - для каких целей такая установка может потребоваться? или лучше ставить на собственный сервер?

    • 1. Да, можно установить asterisk на арендуемый vps. Единственный нюанс, если вы живете в России, то и арендовать лучше тут же, чтобы были минимальные задержки. Не стоит заказывать в Европе или Америке.
      2. Для целей надежности и стабильности. Это вопрос не в плоскости астериска, а в плоскости темы, где лучше хранить сервера, у себя в серверной или у облачного провайдера. Каждый решает по месту, как ему удобнее. Если у вас арендуется внешний сервер, то при его падении или проблемами с интернетом, внутренней связи тоже не будет.

      • Zerox приветствую:может уделим вниманеи на вашем сайте настройку pjsip:и tls и может быть отключим все ненужные службы у кстериска

        • Я рассматривал недавно вопрос с pjsip. Лично для себя не увидел каких-то явных преимуществ от перехода на него. На обычном sip все работает так, как надо. Так что пока не вижу смысла тратить на него свое время. Если совсем уберут sip из астериска, тогда буду думать. PJSIP просто сложнее настраивать. Должна быть явная выгода от увеличения времени на настройку. А если выгоды нет, зачем тратить время?

  80. Здравствуйте,
    Не могу найти отличия в параметрах externip и externip.
    Когда какой применяется.

  81. Здрассте. У вас в sip.conf есть "[authentication]"
    для чего она и как работает?

  82. Виталий

    Интересно,кто то осилил видеозвонки и видеоконференцию на астере на 16...17 версиях,или это гиблое дело.зависящее от клиента и прочих плюшек астера?

  83. Большое спасибо за подробную статью!
    Не подскажете ли, как настроить видеоконференцию?

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

  85. Анатолий

    Здравствуйте! Подскажите если внутренний номер совпадает с внешним, например 102 внутренний и 102 Полиция как зарезервировать 102 как городской номер чтобы при наборе 102 уходили через городской номер, 102 внутренний отключен пытаюсь сделать его как городской.
    exten => _XXX,1,Dial(SIP/${EXTEN},15) шаблон же _ХХХ , как это победить?

  86. Доброе утро! Подскажите пожалуйста, хотел настроить cdr, сделал по инструкции за исключением того, при вводе команды "dnf localinstall mysql80-community-release-el8-1.noarch.rpm" и "dnf makecache" выдавало ошибку:
    Asterisk Common Requirement Packages @ tucny.com 113 B/s | 153 B 00:01
    Failed to download metadata for repo 'asterisk-common'
    Error: Failed to download metadata for repo 'asterisk-common'

    Потом я закомментировал все строки в файле репозитория tucny.com, и все у меня без проблем установилось. Но теперь проблема:
    localhost*CLI> odbc show all

    ODBC DSN Settings
    -----------------

    Name: asterisk
    DSN: MySQL-asterisk
    Last fail connection attempt: 2020-03-13 10:57:39
    Number of active connections: 0 (out of 1)
    Logging: Disabled
    Выдает ошибку. Помогите исправить. К слову я с линуксом впервые сталкиваюсь, не судите строго))

    • В статье все есть. Проверяйте внимательно настройки. Они рабочие. Скорее всего где-то ошиблись.

    • у меня тоже самое, не нашли решение?
      localhost*CLI> odbc show all

      ODBC DSN Settings
      -----------------

      Name: asterisk
      DSN: MySQL-asterisk
      Last fail connection attempt: 2020-04-30 15:58:52
      Number of active connections: 0 (out of 1)
      Logging: Disabled

      • разобрался, нужно сверить пути до библиотек, в /etc/odbcinst.ini
        в секции [MySQL], у меня почему то некоторые пути отличались, вставил как у автора и заработало.

  87. Алексей

    Знаете чего вам не хватает? Кнопочки: "Скачать инструкцию" в PDF :D

    • Алексей

      Знаете чего вам не хватает? Кнопочки: "Скачать инструкцию" в PDF :D
      А кнопочка то есть!!!
      Блин а как коменты удалять??? :D

      • Там, к сожалению, без картинок. После того, как перешел на формат картинок webp, плагин сломался.

  88. Евгений

    Всем привет.
    Когда не чем заняться, можно и Asterisk из исходников собирать, без FreePBX. А потом в VI редактировать sip.conf.
    Но это, как то попахивает прошлым веком.
    Проще скачать ISO образ для установки Asterisk+FreePBX и получить готовую АТС через 15 минут.
    Последний образ от Sangoma за февраля 2020 года.
    Дополнительно , вы получаете возможность обновления Asterisk, через yum update, по мере выхода новых версий LTS.
    Не понятно, ради чего отказываться от FreePBX. Потому, что он не совместим с CentOS 8?
    У меня уже лет 5 работает АТС на CentOS 6, и ничего , функцию свою выполняет.
    Условно к недостаткам такой установки, можно отнести:
    CentOS 7.6
    Устанавливаются коммерческие модули FreePBX(не нужные можно удалить, но жить они не мешают)
    После регистрации Системы, периодически приходя от Sangoma приглашения на вебинары.
    Для справки:
    Sangoma Technologies в 2018 году купил Digium, и теперь ведет Asterisk и FreePBX.

    • Это обсуждения в стиле, зачем настраивать nginx и php-fpm, если можно поставить панель VestaCP. Если вам подходит и устраивает функционал Freepbx, пользуйтесь на здоровье. Мне лично этот продукт не нравится. Я его обслуживал и у него свои недостатки. Многие вещи на чистом asterisk реализовать быстрее и проще.

      С Freepbx вы не сэкономите время настройки, если не знакомы с продуктом. Там тоже нужно потратить время на освоение и настройку. Лично я голый астериск настраиваю быстрее, чем Freepbx. Тут всего-то пару конфигов набросать из готового шаблона и все работает. Страшно может выглядеть, если делаешь первый раз. Но так и с freepbx будет. Когда освоишься, уже другое дело.

      • Евгений

        Ну если пару конфигов, и потом не нужно ни чего делать, тогда GUI не нужен.
        У меня 4 АТС, и приходится постоянно их контролировать.
        А FreePBX значительно проще чем VI.
        И повторюсь, у меня всегда есть возможность обновить Asterisk до последней LTS

        • Во-первых, лично я vi не использую. Во-вторых, тут тоже нет проблем с обновлением до последней LTS.

    • Ох и намаялся я с этим Sangoma Technologies с одной стороны вроде действительно за 15 минут установил а дальше погружаешся в бездну настроек которые не всегда коректно работают... Сюрпризы практически на каждом повороте так как логика разработчиков не всегда понятно и надо убить кучу времени дабы понять как оно работает. Про то что они навыдумывали с защитой я просто умалчу, так как для понимания надо выкурить и выпить много :)
      В результате я лично пришел к выводу что лучше потратить время на изучение чистого Asterisk и иметь действительно стабильныю в работе систему чем ловить вечные сюрпризы и изучать пробукт который сильно заграмажден. Конечно это все относится к тому что использовать свободную версию.
      Все такие поделки которые называются свободные на самом деле мнимая свобода. Разработчики делают свободную версию не для того чтобы вы ей спокойно пользовались а для того чтобы вы ловили глюки им говарили а потом устав приобретали платную версию.

      Еще раз спасибо Владимер за такую хорошую инструкцию.

  89. Добавьте пожалуйста в статью информацию о требованиях к ресурсам, согласно заявленного кол-ва абонентов, для комфортной работы всех и стабильных конференций. И также информацию о ресурсах для минимального кол-ва абонентов, например 10.

    Спасибо большое за статью!

    • У меня нет такой информации, так как она зависит от множества факторов. Но в общем и целом asterisk потребляет очень мало ресурсов в своей работе. Для среднего офиса на 30-50 человек будет достаточно виртуальной машины с 1-2 Cpu и 2-4 Ram.

  90. Обновил и актуализировал полностью статью под Centos 8 и Asterisk 16. Заменил в dialplan Macro, который объявлен deprecated, на GoSub.

  91. Евгений

    Спасибо за статью, остался один вопрос но ivr меню:

    Закольцовка срабатывает только если набирают 3-х значный неверный добавочный номер, если количество цифр другое звонок просто сбрасывается. Как сделать чтобы на любое количество цифр была закольцовка?

  92. Здравствуйте!
    Надо заметить, что устанавливая asterisk на клиента OpenVPN на debian 10, ваша рекомендация при переадресации не внешний номер добавить строку
    exten => 115,n,Dial(SIP/89151234567@397945)
    в контекст [call-out] перед общим правилом набора на внутренние номера - не верна.
    В таком случае, при наборе внутреннего номера, в CLI астериска выпадает сообщение:
    -- Auto fallthrough, channel 'SIP/122-00000000' status is 'UNKNOWN'
    и вызов сбрасывается. А вот если строку с переадресацией вставить после общего правила набора на внутренние номера, то - работает. Но я это заметил только в случае установки внутри OpenVPN. Так и не понял - почему так?

    • Я вообще не понял, при чем тут openvpn. Dialplan вещь в себе и от openvpn точно не зависит.

      • Здравствуйте Zerox. Спасибо за статью по установке и настройке Asterisk. Установил Аsterisk в CentOS 8, зарегистрировался в сервисе Zadarma. Связь между абонентами внутри сети OK. Звонок с мобильного телефона на +74957776675+добавочный - OK! Но звонок с 100 или101 на мобильный, либо 4444 длится 7 сёк разговорного времени, дальше сброс (вызов до поднятия трубки не обрывается, только обрывается разговор). Подскажите в каком направлении осуществлять поиск? Грешу на интернет-соединение, использую 4g-модем с провайдером Мегафон, раздача через роутер. Sip- порты 5060 и 10000-2000 udp открыты. Какой модуль asteriskотвечает за качество голосовой передачи? Уважением= Олег

        • Это я даже не знаю, куда смотреть. Причин может быть море. Для начала смотреть полный debug лог астериска в момент разговора и обрыва. Потом анализировать sip трафик во время разговора и обрыва, например с помощью sngrep - https://serveradmin.ru/analiz-sip-trafika-v-asterisk-s-pomoshhyu-sngrep/

          Дальше уже думать, в зависимости от полученных на предыдущих этапах информации.

          • Спасибо, займусь. самое интересное, что cent os и asterisk устанавливались на 2 разных физических PC и у обеих исходящий обрывается через 6-7 сек. Клиент с 100-м номером тоже разный - Win и Android - безрезультатно.

  93. Добрый день,

    Спасибо за статью, настроил по ней астериск 16 на Ubuntu 18, c поправками конечно.

    Вопрос по статистике звонков.

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

    С точки зрения статистики, все входящие звонки попадающие в голосовое меню считаются отвеченными.
    Как сделать так чтобы отвеченными считались только звонки с которыми общался оператор?

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

    • https://github.com/revall/queue-stats/ Для статистики колл-центов - за глаза, берите только с гитхаба, ибо у автора только на старом php заведется.

  94. Вопрос таков? Могут ли на сервере блокироваться/переадресовываться и тому подобные вещи происходить с клиентами? А то уж оооооооочень большая конверсия недозвонов, и есть подозрение на воровство клиентов. Заранее благодарен!

    --end msg--
    19:54:25.329    tsx05CBE8EC  ....State changed from Null to Calling, event=TX_MSG
    19:54:25.329    dlg05CBC8CC  .....Transaction tsx05CBE8EC state changed to Calling
    19:54:25.381 sip_endpoint.c !Processing incoming message: Response msg 200/BYE/cseq=25759 (rdata05C3A91C)
    19:54:25.381   pjsua_core.c  .RX 513 bytes Response msg 200/BYE/cseq=25759 (rdata05C3A91C) from UDP 149.202.66.110:5060:
    SIP/2.0 200 OK
    Via: SIP/2.0/UDP 10.9.15.48:5060;branch=z9hG4bKPjb8eb3dae3f5c44c69a385ac15b964562;received=10.9.15.48;rport=1035
    From: ;tag=68d2a21807844208a1a9670dfa7a43c5
    To: "78125000934" ;tag=as3e457d82
    Call-ID: 313ccc305394ef802968b7f91dccd5aa@149.202.66.110:5060
    CSeq: 25759 BYE
    Server: MOR Softswitch
    Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH, MESSAGE
    Supported: replaces, timer
    Content-Length: 0
    
    
    --end msg--
    19:54:25.382    tsx05CBE8EC  .Incoming Response msg 200/BYE/cseq=25759 (rdata05C3A91C) in state Calling
    19:54:25.382    tsx05CBE8EC  ..State changed from Calling to Completed, event=RX_MSG
    19:54:25.382    dlg05CBC8CC  ...Received Response msg 200/BYE/cseq=25759 (rdata05C3A91C)
    19:54:25.382    dlg05CBC8CC  ...Transaction tsx05CBE8EC state changed to Completed
    19:54:25.382    pjsua_aud.c  .....Destroying recorder 0..
    19:54:25.388  pjsua_media.c  .....Call 3: deinitializing media..
    19:54:25.388   strm05C57E54  .......JB summary:
      size=0/eff=0 prefetch=0 level=4
      delay (min/max/avg/dev)=20/240/135/88 ms
      burst (min/max/avg/dev)=2/24/2/1 frames
      lost=10 discard=2 empty=272
    19:54:25.388  pjsua_media.c  .......Media stream call03:0 is destroyed
    19:54:25.389    dlg05CBC8CC  .....Session count dec to 1 by mod-invite
    19:54:25.390    pjsua_aud.c !Creating file player: C:\Users\Zver\AppData\Local\MicroSIP\hangup.wav..
    19:54:25.390   wav_player.c  .File player 'C:\Users\Zver\AppData\Local\MicroSIP\hangup.wav' created: samp.rate=8000, ch=1, bufsize=3KB, filesize=3KB
    19:54:25.390    pjsua_aud.c  .Player created, id=0, slot=1
    19:54:25.390    pjsua_aud.c  Conf connect: 1 --> 0
    19:54:25.390   conference.c  .Port 1 (C:\Users\Zver\AppData\Local\MicroSIP\hangup.wav) transmitting to port 0 (Wave mapper)
    19:54:25.604   wav_player.c !File port C:\Users\Zver\AppData\Local\MicroSIP\hangup.wav EOF
    19:54:25.604    pjsua_aud.c !Conf disconnect: 1 -x- 0
    19:54:25.604   conference.c  .Port 1 (C:\Users\Zver\AppData\Local\MicroSIP\hangup.wav) stop transmitting to port 0 (Wave mapper)
    19:54:25.604    pjsua_aud.c  Destroying player 0..
    19:54:30.382    tsx05CBE8EC !Timeout timer event
    19:54:30.382    tsx05CBE8EC  .State changed from Completed to Terminated, event=TIMER
    19:54:30.382    dlg05CBC8CC  ..Transaction tsx05CBE8EC state changed to Terminated
    19:54:30.382    dlg05CBC8CC  ...Dialog destroyed!
    19:54:30.384    tsx05CBE8EC  Timeout timer event
    19:54:30.384    tsx05CBE8EC  .State changed from Terminated to Destroyed, event=TIMER
    19:54:30.384   tdta05CE5A34  ..Destroying txdata Request msg BYE/cseq=25759 (tdta05CE5A34)
    19:54:30.384    tsx05CBE8EC  Transaction destroyed!
    19:54:38.451    pjsua_acc.c  Sending 2 bytes keep-alive packet for acc 1 to 149.202.66.110:5060
    19:54:38.451   tdta05CE5A34  Destroying txdata raw
    19:54:53.451    pjsua_acc.c  Sending 2 bytes keep-alive packet for acc 1 to 149.202.66.110:5060
    19:54:53.451   tdta05CE1A14  Destroying txdata raw
    19:55:08.451    pjsua_acc.c  Sending 2 bytes keep-alive packet for acc 1 to 149.202.66.110:5060
    19:55:08.451   tdta05CE3A24  Destroying txdata raw
    19:55:23.451    pjsua_acc.c  Sending 2 bytes keep-alive packet for acc 1 to 149.202.66.110:5060
    19:55:23.451   tdta05CE1A14  Destroying txdata raw
    19:55:31.669 sip_endpoint.c  Processing incoming message: Request msg INVITE/cseq=102 (rdata05C3A91C)
    19:55:31.669   pjsua_core.c  .RX 860 bytes Request msg INVITE/cseq=102 (rdata05C3A91C) from UDP 149.202.66.110:5060:
    INVITE sip:140034@10.9.15.48:5060;ob SIP/2.0
    Via: SIP/2.0/UDP 149.202.66.110:5060;branch=z9hG4bK627e43c4;rport
    Max-Forwards: 70
    From: "74997540051" ;tag=as1ceed9e2
    To: 
    Contact: 
    Call-ID: 59e5c79c715b019f0e449e4756daa84c@149.202.66.110:5060
    CSeq: 102 INVITE
    User-Agent: MOR Softswitch
    Date: Tue, 04 Feb 2020 16:55:31 GMT
    Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH, MESSAGE
    Supported: replaces, timer
    Content-Type: application/sdp
    Content-Length: 265
    
    v=0
    o=root 1792084525 1792084525 IN IP4 149.202.66.110
    s=Asterisk PBX 1.8.32.4
    c=IN IP4 149.202.66.110
    t=0 0
    m=audio 12774 RTP/AVP 8 0 101
    a=rtpmap:8 PCMA/8000
    a=rtpmap:0 PCMU/8000
    a=rtpmap:101 telephone-event/8000
    a=fmtp:101 0-16
    a=ptime:20
    a=sendrecv
    
    --end msg--
    19:55:31.669   pjsua_call.c  .Incoming Request msg INVITE/cseq=102 (rdata05C3A91C)
    19:55:31.670    tsx05CBC8CC  ...Transaction created for Request msg INVITE/cseq=102 (rdata05C3A91C)
    19:55:31.670    tsx05CBC8CC  ..Incoming Request msg INVITE/cseq=102 (rdata05C3A91C) in state Null
    19:55:31.670    tsx05CBC8CC  ...State changed from Null to Trying, event=RX_MSG
    19:55:31.670    dlg05CBA8AC  ....Transaction tsx05CBC8CC state changed to Trying
    19:55:31.670    dlg05CBA8AC  ..UAS dialog created
    19:55:31.670    dlg05CBA8AC  ..Module mod-invite added as dialog usage, data=05C4294C
    19:55:31.670    dlg05CBA8AC  ...Session count inc to 3 by mod-invite
    19:55:31.670    inv05CBA8AC  ..UAS invite session created for dialog dlg05CBA8AC
    19:55:31.670    dlg05CBA8AC  ...Session count inc to 3 by mod-pjsua
    19:55:31.670  pjsua_media.c  ..Call 0: initializing media..
    19:55:31.673  pjsua_media.c  ...RTP socket reachable at 10.9.15.48:4034
    19:55:31.673  pjsua_media.c  ...RTCP socket reachable at 10.9.15.48:4035
    19:55:31.673   srtp05C92498  ...SRTP keying SDES created
    19:55:31.673  pjsua_media.c  ...Media index 0 selected for audio call 0
    19:55:31.673  pjsua_media.c  ...Call 0: media transport initialization complete: Success
    19:55:31.673    dlg05CBA8AC  ...Session count dec to 3 by mod-pjsua
    19:55:31.674   pjsua_call.c  ..Call 0: remote NAT type is 0 (Unknown)
    19:55:31.674       endpoint  ...Response msg 100/INVITE/cseq=102 (tdta05CDFA04) created
    19:55:31.674    dlg05CBA8AC  ...Initial answer Response msg 100/INVITE/cseq=102 (tdta05CDFA04)
    19:55:31.674    inv05CBA8AC  ...Sending Response msg 100/INVITE/cseq=102 (tdta05CDFA04)
    19:55:31.674    dlg05CBA8AC  ....Sending Response msg 100/INVITE/cseq=102 (tdta05CDFA04)
    19:55:31.674    tsx05CBC8CC  ....Sending Response msg 100/INVITE/cseq=102 (tdta05CDFA04) in state Trying
    19:55:31.674   pjsua_core.c  .....TX 315 bytes Response msg 100/INVITE/cseq=102 (tdta05CDFA04) to UDP 149.202.66.110:5060:
    SIP/2.0 100 Trying
    Via: SIP/2.0/UDP 149.202.66.110:5060;rport=5060;received=149.202.66.110;branch=z9hG4bK627e43c4
    Call-ID: 59e5c79c715b019f0e449e4756daa84c@149.202.66.110:5060
    From: "74997540051" ;tag=as1ceed9e2
    To: 
    CSeq: 102 INVITE
    Content-Length:  0
    
    
    --end msg--
    19:55:31.674    tsx05CBC8CC  .....State changed from Trying to Proceeding, event=TX_MSG
    19:55:31.674    dlg05CBA8AC  ......Transaction tsx05CBC8CC state changed to Proceeding
    19:55:31.674   pjsua_call.c !Answering call 0: code=200
    19:55:31.674 sip_transport.  ..Tx data Response msg 100/INVITE/cseq=102 (tdta05CE5A34) cloned
    19:55:31.674    inv05CBA8AC  ..SDP negotiation done: Success
    19:55:31.674   pjsua_call.c  ...Call 0: remote NAT type is 0 (Unknown)
    19:55:31.674  pjsua_media.c  ...Call 0: updating media..
    19:55:31.674  pjsua_media.c  .....Media stream call00:0 is destroyed
    19:55:31.674    pjsua_aud.c  ....Audio channel update..
    19:55:31.674          rtp.c  .....pjmedia_rtp_session_init: ses=05CCC2F4, default_pt=8, ssrc=0x2f2a2425
    19:55:31.674          rtp.c  .....pjmedia_rtp_session_init: ses=05CBEE7C, default_pt=8, ssrc=0x2f2a2425
    19:55:31.674       stream.c  .....Stream strm011B3B2C created
    19:55:31.674   strm011B3B2C  .....Encoder stream started
    19:55:31.674   strm011B3B2C  .....Decoder stream started
    19:55:31.674  pjsua_media.c  ....Audio updated, stream #0: PCMA (sendrecv)
    19:55:31.674    pjsua_aud.c  ...Conf connect: 1 --> 0
    19:55:31.674   conference.c  ....Port 1 (sip:140034@149.202.66.110) transmitting to port 0 (Wave mapper)
    19:55:31.674    pjsua_aud.c  ...Conf connect: 0 --> 1
    19:55:31.674   conference.c  ....Port 0 (Wave mapper) transmitting to port 1 (sip:140034@149.202.66.110)
    19:55:31.674    inv05CBA8AC  ..Sending Response msg 200/INVITE/cseq=102 (tdta05CE5A34)
    19:55:31.674    dlg05CBA8AC  ...Sending Response msg 200/INVITE/cseq=102 (tdta05CE5A34)
    19:55:31.674    tsx05CBC8CC  ...Sending Response msg 200/INVITE/cseq=102 (tdta05CE5A34) in state Proceeding
    19:55:31.675   tdta05CDFA04  ....Destroying txdata Response msg 100/INVITE/cseq=102 (tdta05CDFA04)
    19:55:31.675   pjsua_core.c  ....TX 869 bytes Response msg 200/INVITE/cseq=102 (tdta05CE5A34) to UDP 149.202.66.110:5060:
    SIP/2.0 200 OK
    Via: SIP/2.0/UDP 149.202.66.110:5060;rport=5060;received=149.202.66.110;branch=z9hG4bK627e43c4
    Call-ID: 59e5c79c715b019f0e449e4756daa84c@149.202.66.110:5060
    From: "74997540051" ;tag=as1ceed9e2
    To: ;tag=9599af85fd224309be317df6c2b3c9d5
    CSeq: 102 INVITE
    Contact: 
    Allow: PRACK, INVITE, ACK, BYE, CANCEL, UPDATE, INFO, SUBSCRIBE, NOTIFY, REFER, MESSAGE, OPTIONS
    Supported: replaces, 100rel, timer, norefersub
    Content-Type: application/sdp
    Content-Length:   309
    
    v=0
    o=- 3789834931 3789834932 IN IP4 10.9.15.48
    s=pjmedia
    b=AS:84
    t=0 0
    a=X-nat:0
    m=audio 4034 RTP/AVP 8 101
    c=IN IP4 10.9.15.48
    b=TIAS:64000
    a=rtcp:4035 IN IP4 10.9.15.48
    a=sendrecv
    a=rtpmap:8 PCMA/8000
    a=rtpmap:101 telephone-event/8000
    a=fmtp:101 0-16
    a=ssrc:791290917 cname:1c0409e126fd0840
    
    --end msg--
    19:55:31.675    tsx05CBC8CC  ....State changed from Proceeding to Completed, event=TX_MSG
    19:55:31.675    dlg05CBA8AC  .....Transaction tsx05CBC8CC state changed to Completed
    19:55:31.675    pjsua_aud.c  Creating file player: C:\Users\Zver\AppData\Local\MicroSIP\ringing2.wav..
    19:55:31.675   wav_player.c  .File player 'C:\Users\Zver\AppData\Local\MicroSIP\ringing2.wav' created: samp.rate=8000, ch=1, bufsize=3KB, filesize=3KB
    19:55:31.675    pjsua_aud.c  .Player created, id=0, slot=2
    19:55:31.675    pjsua_aud.c  Conf connect: 2 --> 0
    19:55:31.675   conference.c  .Port 2 (C:\Users\Zver\AppData\Local\MicroSIP\ringing2.wav) transmitting to port 0 (Wave mapper)
    19:55:31.684   strm011B3B2C !Jitter buffer is bufferring (prefetch=0)
    19:55:31.684   strm011B3B2C  Start talksprut..
    19:55:31.699    pjsua_aud.c !Conf disconnect: 2 -x- 0
    19:55:31.699   conference.c  .Port 2 (C:\Users\Zver\AppData\Local\MicroSIP\ringing2.wav) stop transmitting to port 0 (Wave mapper)
    19:55:31.699    pjsua_aud.c  Destroying player 0..
    19:55:31.723 sip_endpoint.c !Processing incoming message: Request msg ACK/cseq=102 (rdata05C3A91C)
    19:55:31.723   pjsua_core.c  .RX 426 bytes Request msg ACK/cseq=102 (rdata05C3A91C) from UDP 149.202.66.110:5060:
    ACK sip:10.9.15.48:5060 SIP/2.0
    Via: SIP/2.0/UDP 149.202.66.110:5060;branch=z9hG4bK61f9b725;rport
    Max-Forwards: 70
    From: "74997540051" ;tag=as1ceed9e2
    To: ;tag=9599af85fd224309be317df6c2b3c9d5
    Contact: 
    Call-ID: 59e5c79c715b019f0e449e4756daa84c@149.202.66.110:5060
    CSeq: 102 ACK
    User-Agent: MOR Softswitch
    Content-Length: 0
    
    
    --end msg--
    19:55:31.723    dlg05CBA8AC  .Received Request msg ACK/cseq=102 (rdata05C3A91C)
    19:55:31.723    tsx05CBC8CC  ..Request to terminate transaction
    19:55:31.723    tsx05CBC8CC  ...State changed from Completed to Terminated, event=USER
    19:55:31.723    dlg05CBA8AC  ....Transaction tsx05CBC8CC state changed to Terminated
    19:55:31.723    pjsua_aud.c  ...Creating recorder C:\Users\Zver\Desktop\Recordings\20200204-195531-140034-incoming-140034.wav..
    19:55:31.724   wav_writer.c  ....File writer 'C:\Users\Zver\Desktop\Recordings\20200204-195531-140034-incoming-140034.wav' created: samp.rate=8000, bufsize=4KB
    19:55:31.724    pjsua_aud.c  ....Recorder created, id=0, slot=2
    19:55:31.724    pjsua_aud.c  ...Conf connect: 1 --> 2
    19:55:31.724   conference.c  ....Port 1 (sip:140034@149.202.66.110) transmitting to port 2 (C:\Users\Zver\Desktop\Recordings\20200204-195531-140034-incoming-140034.wav)
    19:55:31.724    pjsua_aud.c  ...Conf connect: 0 --> 2
    19:55:31.724   conference.c  ....Port 0 (Wave mapper) transmitting to port 2 (C:\Users\Zver\Desktop\Recordings\20200204-195531-140034-incoming-140034.wav)
    19:55:31.724    tsx05CBC8CC  Timeout timer event
    19:55:31.724    tsx05CBC8CC  .State changed from Terminated to Destroyed, event=TIMER
    19:55:31.724   tdta05CE5A34  ..Destroying txdata Response msg 200/INVITE/cseq=102 (tdta05CE5A34)
    19:55:31.724    tsx05CBC8CC  Transaction destroyed!
    19:55:34.863 sip_endpoint.c  Processing incoming message: Request msg BYE/cseq=103 (rdata05C3A91C)
    19:55:34.863   pjsua_core.c  .RX 456 bytes Request msg BYE/cseq=103 (rdata05C3A91C) from UDP 149.202.66.110:5060:
    BYE sip:10.9.15.48:5060 SIP/2.0
    Via: SIP/2.0/UDP 149.202.66.110:5060;branch=z9hG4bK12deb1b7;rport
    Max-Forwards: 70
    From: "74997540051" ;tag=as1ceed9e2
    To: ;tag=9599af85fd224309be317df6c2b3c9d5
    Call-ID: 59e5c79c715b019f0e449e4756daa84c@149.202.66.110:5060
    CSeq: 103 BYE
    User-Agent: MOR Softswitch
    X-Asterisk-HangupCause: Normal Clearing
    X-Asterisk-HangupCauseCode: 16
    Content-Length: 0
    
    
    --end msg--
    19:55:34.863    dlg05CBA8AC  .Received Request msg BYE/cseq=103 (rdata05C3A91C)
    19:55:34.863    tsx05CB8084  ...Transaction created for Request msg BYE/cseq=103 (rdata05C3A91C)
    19:55:34.863    tsx05CB8084  ..Incoming Request msg BYE/cseq=103 (rdata05C3A91C) in state Null
    19:55:34.863    tsx05CB8084  ...State changed from Null to Trying, event=RX_MSG
    19:55:34.863    dlg05CBA8AC  ....Transaction tsx05CB8084 state changed to Trying
    19:55:34.863       endpoint  .....Response msg 200/BYE/cseq=103 (tdta05CDE9FC) created
    19:55:34.863    dlg05CBA8AC  ......Sending Response msg 200/BYE/cseq=103 (tdta05CDE9FC)
    19:55:34.863    tsx05CB8084  ......Sending Response msg 200/BYE/cseq=103 (tdta05CDE9FC) in state Trying
    19:55:34.863   pjsua_core.c  .......TX 345 bytes Response msg 200/BYE/cseq=103 (tdta05CDE9FC) to UDP 149.202.66.110:5060:
    SIP/2.0 200 OK
    Via: SIP/2.0/UDP 149.202.66.110:5060;rport=5060;received=149.202.66.110;branch=z9hG4bK12deb1b7
    Call-ID: 59e5c79c715b019f0e449e4756daa84c@149.202.66.110:5060
    From: "74997540051" ;tag=as1ceed9e2
    To: ;tag=9599af85fd224309be317df6c2b3c9d5
    CSeq: 103 BYE
    Content-Length:  0
    
    
    --end msg--
    19:55:34.863    tsx05CB8084  .......State changed from Trying to Completed, event=TX_MSG
    19:55:34.863    dlg05CBA8AC  ........Transaction tsx05CB8084 state changed to Completed
    19:55:34.863    pjsua_aud.c  ......Destroying recorder 0..
    19:55:34.872  pjsua_media.c  ......Call 0: deinitializing media..
    19:55:34.872   strm011B3B2C  ........JB summary:
      size=0/eff=0 prefetch=0 level=0
      delay (min/max/avg/dev)=0/0/0/0 ms
      burst (min/max/avg/dev)=0/0/0/0 frames
      lost=0 discard=0 empty=160
    19:55:34.872  pjsua_media.c  ........Media stream call00:0 is destroyed
    19:55:34.872    dlg05CBA8AC  ......Session count dec to 3 by mod-invite
    19:55:34.875    pjsua_aud.c !Creating file player: C:\Users\Zver\AppData\Local\MicroSIP\hangup.wav..
    19:55:34.875   wav_player.c  .File player 'C:\Users\Zver\AppData\Local\MicroSIP\hangup.wav' created: samp.rate=8000, ch=1, bufsize=3KB, filesize=3KB
    19:55:34.875    pjsua_aud.c  .Player created, id=0, slot=1
    19:55:34.875    pjsua_aud.c  Conf connect: 1 --> 0
    19:55:34.875   conference.c  .Port 1 (C:\Users\Zver\AppData\Local\MicroSIP\hangup.wav) transmitting to port 0 (Wave mapper)
    19:55:35.084   wav_player.c !File port C:\Users\Zver\AppData\Local\MicroSIP\hangup.wav EOF
    19:55:35.092    pjsua_aud.c !Conf disconnect: 1 -x- 0
    19:55:35.092   conference.c  .Port 1 (C:\Users\Zver\AppData\Local\MicroSIP\hangup.wav) stop transmitting to port 0 (Wave mapper)
    19:55:35.092    pjsua_aud.c  Destroying player 0..
    19:55:38.451    pjsua_acc.c !Sending 2 bytes keep-alive packet for acc 1 to 149.202.66.110:5060
    19:55:38.451   tdta05CE5A34  Destroying txdata raw
    19:55:48.738 sip_endpoint.c  Processing incoming message: Request msg INVITE/cseq=102 (rdata05C3A91C)
    19:55:48.738   pjsua_core.c  .RX 860 bytes Request msg INVITE/cseq=102 (rdata05C3A91C) from UDP 149.202.66.110:5060:
    INVITE sip:140034@10.9.15.48:5060;ob SIP/2.0
    Via: SIP/2.0/UDP 149.202.66.110:5060;branch=z9hG4bK74bd4fab;rport
    Max-Forwards: 70
    From: "78124542279" ;tag=as751b3850
    To: 
    Contact: 
    Call-ID: 107994fe7c2662dc393a3c3d7dd842ab@149.202.66.110:5060
    CSeq: 102 INVITE
    User-Agent: MOR Softswitch
    Date: Tue, 04 Feb 2020 16:55:48 GMT
    Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH, MESSAGE
    Supported: replaces, timer
    Content-Type: application/sdp
    Content-Length: 265
    
    v=0
    o=root 1031988256 1031988256 IN IP4 149.202.66.110
    s=Asterisk PBX 1.8.32.4
    c=IN IP4 149.202.66.110
    t=0 0
    m=audio 13466 RTP/AVP 8 0 101
    a=rtpmap:8 PCMA/8000
    a=rtpmap:0 PCMU/8000
    a=rtpmap:101 telephone-event/8000
    a=fmtp:101 0-16
    a=ptime:20
    a=sendrecv
    
    --end msg--
    19:55:48.738   pjsua_call.c  .Incoming Request msg INVITE/cseq=102 (rdata05C3A91C)
    19:55:48.739    tsx05CBE8EC  ...Transaction created for Request msg INVITE/cseq=102 (rdata05C3A91C)
    19:55:48.739    tsx05CBE8EC  ..Incoming Request msg INVITE/cseq=102 (rdata05C3A91C) in state Null
    19:55:48.739    tsx05CBE8EC  ...State changed from Null to Trying, event=RX_MSG
    19:55:48.739    dlg05CBC8CC  ....Transaction tsx05CBE8EC state changed to Trying
    19:55:48.739    dlg05CBC8CC  ..UAS dialog created
    19:55:48.739    dlg05CBC8CC  ..Module mod-invite added as dialog usage, data=05C455FC
    19:55:48.739    dlg05CBC8CC  ...Session count inc to 3 by mod-invite
    19:55:48.739    inv05CBC8CC  ..UAS invite session created for dialog dlg05CBC8CC
    19:55:48.739    dlg05CBC8CC  ...Session count inc to 3 by mod-pjsua
    19:55:48.739  pjsua_media.c  ..Call 1: initializing media..
    19:55:48.741  pjsua_media.c  ...RTP socket reachable at 10.9.15.48:4036
    19:55:48.741  pjsua_media.c  ...RTCP socket reachable at 10.9.15.48:4037
    19:55:48.741   srtp05C97940  ...SRTP keying SDES created
    19:55:48.741  pjsua_media.c  ...Media index 0 selected for audio call 1
    19:55:48.741  pjsua_media.c  ...Call 1: media transport initialization complete: Success
    19:55:48.741    dlg05CBC8CC  ...Session count dec to 3 by mod-pjsua
    19:55:48.741   pjsua_call.c  ..Call 1: remote NAT type is 0 (Unknown)
    19:55:48.741       endpoint  ...Response msg 100/INVITE/cseq=102 (tdta05CDFA04) created
    19:55:48.741    dlg05CBC8CC  ...Initial answer Response msg 100/INVITE/cseq=102 (tdta05CDFA04)
    19:55:48.741    inv05CBC8CC  ...Sending Response msg 100/INVITE/cseq=102 (tdta05CDFA04)
    19:55:48.741    dlg05CBC8CC  ....Sending Response msg 100/INVITE/cseq=102 (tdta05CDFA04)
    19:55:48.741    tsx05CBE8EC  ....Sending Response msg 100/INVITE/cseq=102 (tdta05CDFA04) in state Trying
    19:55:48.741   pjsua_core.c  .....TX 315 bytes Response msg 100/INVITE/cseq=102 (tdta05CDFA04) to UDP 149.202.66.110:5060:
    SIP/2.0 100 Trying
    Via: SIP/2.0/UDP 149.202.66.110:5060;rport=5060;received=149.202.66.110;branch=z9hG4bK74bd4fab
    Call-ID: 107994fe7c2662dc393a3c3d7dd842ab@149.202.66.110:5060
    From: "78124542279" ;tag=as751b3850
    To: 
    CSeq: 102 INVITE
    Content-Length:  0
    
    
    --end msg--
    19:55:48.742    tsx05CBE8EC  .....State changed from Trying to Proceeding, event=TX_MSG
    19:55:48.742    dlg05CBC8CC  ......Transaction tsx05CBE8EC state changed to Proceeding
    19:55:48.742   pjsua_call.c !Answering call 1: code=200
    19:55:48.742 sip_transport.  ..Tx data Response msg 100/INVITE/cseq=102 (tdta05CE3A24) cloned
    19:55:48.742    inv05CBC8CC  ..SDP negotiation done: Success
    19:55:48.742   pjsua_call.c  ...Call 1: remote NAT type is 0 (Unknown)
    19:55:48.742  pjsua_media.c  ...Call 1: updating media..
    19:55:48.742  pjsua_media.c  .....Media stream call01:0 is destroyed
    19:55:48.742    pjsua_aud.c  ....Audio channel update..
    19:55:48.742          rtp.c  .....pjmedia_rtp_session_init: ses=05C58144, default_pt=8, ssrc=0x23d045f2
    19:55:48.742          rtp.c  .....pjmedia_rtp_session_init: ses=05CBF684, default_pt=8, ssrc=0x23d045f2
    19:55:48.742       stream.c  .....Stream strm011B3B2C created
    19:55:48.742   strm011B3B2C  .....Encoder stream started
    19:55:48.742   strm011B3B2C  .....Decoder stream started
    19:55:48.742  pjsua_media.c  ....Audio updated, stream #0: PCMA (sendrecv)
    19:55:48.742    pjsua_aud.c  ...Conf connect: 1 --> 0
    19:55:48.742   conference.c  ....Port 1 (sip:140034@149.202.66.110) transmitting to port 0 (Wave mapper)
    19:55:48.742    pjsua_aud.c  ...Conf connect: 0 --> 1
    19:55:48.742   conference.c  ....Port 0 (Wave mapper) transmitting to port 1 (sip:140034@149.202.66.110)
    19:55:48.742    inv05CBC8CC  ..Sending Response msg 200/INVITE/cseq=102 (tdta05CE3A24)
    19:55:48.742    dlg05CBC8CC  ...Sending Response msg 200/INVITE/cseq=102 (tdta05CE3A24)
    19:55:48.742    tsx05CBE8EC  ...Sending Response msg 200/INVITE/cseq=102 (tdta05CE3A24) in state Proceeding
    19:55:48.742   tdta05CDFA04  ....Destroying txdata Response msg 100/INVITE/cseq=102 (tdta05CDFA04)
    19:55:48.742   pjsua_core.c  ....TX 869 bytes Response msg 200/INVITE/cseq=102 (tdta05CE3A24) to UDP 149.202.66.110:5060:
    SIP/2.0 200 OK
    Via: SIP/2.0/UDP 149.202.66.110:5060;rport=5060;received=149.202.66.110;branch=z9hG4bK74bd4fab
    Call-ID: 107994fe7c2662dc393a3c3d7dd842ab@149.202.66.110:5060
    From: "78124542279" ;tag=as751b3850
    To: ;tag=06e98e5e044c47a391fedf901c045d13
    CSeq: 102 INVITE
    Contact: 
    Allow: PRACK, INVITE, ACK, BYE, CANCEL, UPDATE, INFO, SUBSCRIBE, NOTIFY, REFER, MESSAGE, OPTIONS
    Supported: replaces, 100rel, timer, norefersub
    Content-Type: application/sdp
    Content-Length:   309
    
    v=0
    o=- 3789834948 3789834949 IN IP4 10.9.15.48
    s=pjmedia
    b=AS:84
    t=0 0
    a=X-nat:0
    m=audio 4036 RTP/AVP 8 101
    c=IN IP4 10.9.15.48
    b=TIAS:64000
    a=rtcp:4037 IN IP4 10.9.15.48
    a=sendrecv
    a=rtpmap:8 PCMA/8000
    a=rtpmap:101 telephone-event/8000
    a=fmtp:101 0-16
    a=ssrc:600851954 cname:4dad01517a4f44c4
    
    --end msg--
    19:55:48.742    tsx05CBE8EC  ....State changed from Proceeding to Completed, event=TX_MSG
    19:55:48.742    dlg05CBC8CC  .....Transaction tsx05CBE8EC state changed to Completed
    19:55:48.743    pjsua_aud.c  Creating file player: C:\Users\Zver\AppData\Local\MicroSIP\ringing2.wav..
    19:55:48.743   wav_player.c  .File player 'C:\Users\Zver\AppData\Local\MicroSIP\ringing2.wav' created: samp.rate=8000, ch=1, bufsize=3KB, filesize=3KB
    19:55:48.743    pjsua_aud.c  .Player created, id=0, slot=2
    19:55:48.743    pjsua_aud.c  Conf connect: 2 --> 0
    19:55:48.744   conference.c  .Port 2 (C:\Users\Zver\AppData\Local\MicroSIP\ringing2.wav) transmitting to port 0 (Wave mapper)
    19:55:48.744   Master/sound !Underflow, buf_cnt=17, will generate 1 frame
    19:55:48.744   strm011B3B2C  Jitter buffer is bufferring (prefetch=0)
    19:55:48.744   strm011B3B2C  Start talksprut..
    19:55:48.766    pjsua_aud.c !Conf disconnect: 2 -x- 0
    19:55:48.766   conference.c  .Port 2 (C:\Users\Zver\AppData\Local\MicroSIP\ringing2.wav) stop transmitting to port 0 (Wave mapper)
    19:55:48.766    pjsua_aud.c  Destroying player 0..
    19:55:48.786 sip_endpoint.c !Processing incoming message: Request msg ACK/cseq=102 (rdata05C3A91C)
    19:55:48.786   pjsua_core.c  .RX 426 bytes Request msg ACK/cseq=102 (rdata05C3A91C) from UDP 149.202.66.110:5060:
    ACK sip:10.9.15.48:5060 SIP/2.0
    Via: SIP/2.0/UDP 149.202.66.110:5060;branch=z9hG4bK489963ff;rport
    Max-Forwards: 70
    From: "78124542279" ;tag=as751b3850
    To: ;tag=06e98e5e044c47a391fedf901c045d13
    Contact: 
    Call-ID: 107994fe7c2662dc393a3c3d7dd842ab@149.202.66.110:5060
    CSeq: 102 ACK
    User-Agent: MOR Softswitch
    Content-Length: 0
    
    
    --end msg--
    19:55:48.786    dlg05CBC8CC  .Received Request msg ACK/cseq=102 (rdata05C3A91C)
    19:55:48.786    tsx05CBE8EC  ..Request to terminate transaction
    19:55:48.786    tsx05CBE8EC  ...State changed from Completed to Terminated, event=USER
    19:55:48.786    dlg05CBC8CC  ....Transaction tsx05CBE8EC state changed to Terminated
    19:55:48.786    pjsua_aud.c  ...Creating recorder C:\Users\Zver\Desktop\Recordings\20200204-195548-140034-incoming-140034.wav..
    19:55:48.787   wav_writer.c  ....File writer 'C:\Users\Zver\Desktop\Recordings\20200204-195548-140034-incoming-140034.wav' created: samp.rate=8000, bufsize=4KB
    19:55:48.787    pjsua_aud.c  ....Recorder created, id=0, slot=2
    19:55:48.787    pjsua_aud.c  ...Conf connect: 1 --> 2
    19:55:48.787   conference.c  ....Port 1 (sip:140034@149.202.66.110) transmitting to port 2 (C:\Users\Zver\Desktop\Recordings\20200204-195548-140034-incoming-140034.wav)
    19:55:48.787    pjsua_aud.c  ...Conf connect: 0 --> 2
    19:55:48.787   conference.c  ....Port 0 (Wave mapper) transmitting to port 2 (C:\Users\Zver\Desktop\Recordings\20200204-195548-140034-incoming-140034.wav)
    19:55:48.787    tsx05CBE8EC  Timeout timer event
    19:55:48.787    tsx05CBE8EC  .State changed from Terminated to Destroyed, event=TIMER
    19:55:48.787   tdta05CE3A24  ..Destroying txdata Response msg 200/INVITE/cseq=102 (tdta05CE3A24)
    19:55:48.787    tsx05CBE8EC  Transaction destroyed!
    19:55:51.206   strm011B3B2C !RTP status: badpt=0, badssrc=0, dup=0, outorder=0, probation=-1, restart=0
    19:55:51.224   strm011B3B2C !Jitter buffer starts returning normal frames (after 124 empty/lost)
    19:55:52.145   strm011B3B2C  Jitter buffer empty (prefetch=0), plc invoked
    19:55:52.244   strm011B3B2C  Jitter buffer starts returning normal frames (after 5 empty/lost)
    19:55:53.452    pjsua_acc.c !Sending 2 bytes keep-alive packet for acc 1 to 149.202.66.110:5060
    19:55:53.452   tdta05CE5A34  Destroying txdata raw
    19:55:54.460   pjsua_call.c !Call 1 hanging up: code=0..
    19:55:54.460       endpoint  ..Request msg BYE/cseq=407 (tdta05CE1A14) created.
    19:55:54.460    inv05CBC8CC  ..Sending Request msg BYE/cseq=407 (tdta05CE1A14)
    19:55:54.460    dlg05CBC8CC  ...Sending Request msg BYE/cseq=407 (tdta05CE1A14)
    19:55:54.460    tsx05CBE8EC  ....Transaction created for Request msg BYE/cseq=406 (tdta05CE1A14)
    19:55:54.460    tsx05CBE8EC  ...Sending Request msg BYE/cseq=406 (tdta05CE1A14) in state Null
    19:55:54.460  sip_resolve.c  ....Target '149.202.66.110:5060' type=Unspecified resolved to '149.202.66.110:5060' type=UDP (UDP transport)
    19:55:54.460   pjsua_core.c  ....TX 414 bytes Request msg BYE/cseq=406 (tdta05CE1A14) to UDP 149.202.66.110:5060:
    BYE sip:140034@149.202.66.110:5060 SIP/2.0
    Via: SIP/2.0/UDP 10.9.15.48:5060;rport;branch=z9hG4bKPj188bd5c9ab6e4d24ae22406a7748503c
    Max-Forwards: 70
    From: ;tag=06e98e5e044c47a391fedf901c045d13
    To: "78124542279" ;tag=as751b3850
    Call-ID: 107994fe7c2662dc393a3c3d7dd842ab@149.202.66.110:5060
    CSeq: 406 BYE
    User-Agent: MicroSIP/3.19.18
    Content-Length:  0
    
    
    --end msg--
    19:55:54.460    tsx05CBE8EC  ....State changed from Null to Calling, event=TX_MSG
    19:55:54.460    dlg05CBC8CC  .....Transaction tsx05CBE8EC state changed to Calling
    19:55:54.503 sip_endpoint.c !Processing incoming message: Response msg 200/BYE/cseq=406 (rdata05C3A91C)
    19:55:54.503   pjsua_core.c  .RX 511 bytes Response msg 200/BYE/cseq=406 (rdata05C3A91C) from UDP 149.202.66.110:5060:
    SIP/2.0 200 OK
    Via: SIP/2.0/UDP 10.9.15.48:5060;branch=z9hG4bKPj188bd5c9ab6e4d24ae22406a7748503c;received=10.9.15.48;rport=1035
    From: ;tag=06e98e5e044c47a391fedf901c045d13
    To: "78124542279" ;tag=as751b3850
    Call-ID: 107994fe7c2662dc393a3c3d7dd842ab@149.202.66.110:5060
    CSeq: 406 BYE
    Server: MOR Softswitch
    Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH, MESSAGE
    Supported: replaces, timer
    Content-Length: 0
    
    
    --end msg--
    19:55:54.503    tsx05CBE8EC  .Incoming Response msg 200/BYE/cseq=406 (rdata05C3A91C) in state Calling
    19:55:54.503    tsx05CBE8EC  ..State changed from Calling to Completed, event=RX_MSG
    19:55:54.503    dlg05CBC8CC  ...Received Response msg 200/BYE/cseq=406 (rdata05C3A91C)
    19:55:54.503    dlg05CBC8CC  ...Transaction tsx05CBE8EC state changed to Completed
    19:55:54.503    pjsua_aud.c  .....Destroying recorder 0..
    19:55:54.511  pjsua_media.c  .....Call 1: deinitializing media..
    19:55:54.512   strm011B3B2C  .......JB summary:
      size=0/eff=0 prefetch=0 level=2
      delay (min/max/avg/dev)=20/20/20/0 ms
      burst (min/max/avg/dev)=2/2/2/0 frames
      lost=0 discard=2 empty=129
    19:55:54.512  pjsua_media.c  .......Media stream call01:0 is destroyed
    19:55:54.513    dlg05CBC8CC  .....Session count dec to 1 by mod-invite
    19:55:54.515    pjsua_aud.c !Creating file player: C:\Users\Zver\AppData\Local\MicroSIP\hangup.wav..
    19:55:54.515   wav_player.c  .File player 'C:\Users\Zver\AppData\Local\MicroSIP\hangup.wav' created: samp.rate=8000, ch=1, bufsize=3KB, filesize=3KB
    19:55:54.515    pjsua_aud.c  .Player created, id=0, slot=1
    19:55:54.515    pjsua_aud.c  Conf connect: 1 --> 0
    19:55:54.515   conference.c  .Port 1 (C:\Users\Zver\AppData\Local\MicroSIP\hangup.wav) transmitting to port 0 (Wave mapper)
    19:55:54.724   wav_player.c !File port C:\Users\Zver\AppData\Local\MicroSIP\hangup.wav EOF
    19:55:54.724    pjsua_aud.c !Conf disconnect: 1 -x- 0
    19:55:54.724   conference.c  .Port 1 (C:\Users\Zver\AppData\Local\MicroSIP\hangup.wav) stop transmitting to port 0 (Wave mapper)
    19:55:54.724    pjsua_aud.c  Destroying player 0..
    19:55:59.503    tsx05CBE8EC !Timeout timer event
    19:55:59.503    tsx05CBE8EC  .State changed from Completed to Terminated, event=TIMER
    19:55:59.503    dlg05CBC8CC  ..Transaction tsx05CBE8EC state changed to Terminated
    19:55:59.503    dlg05CBC8CC  ...Dialog destroyed!
    19:55:59.503    tsx05CBE8EC  Timeout timer event
    19:55:59.503    tsx05CBE8EC  .State changed from Terminated to Destroyed, event=TIMER
    19:55:59.503   tdta05CE1A14  ..Destroying txdata Request msg BYE/cseq=406 (tdta05CE1A14)
    19:55:59.503    tsx05CBE8EC  Transaction destroyed!
  95. Здравствуйте, Владимир! Спасибо вам за ваши туториалы! Но, кажется, в части настройки записи разговоров (record) закралась ошибка. После рестарта астериска и попытки позвонить в командной строке появляется ворнинг -
    [Feb 2 21:59:20] WARNING[1824][C-00000001]: pbx.c:2927 pbx_extension_helper: No application 'Macro' for extension (call-out, 100, 1)
    И, конечно, звонок сбрасывается. При звонке из вне тот же эффект -
    [Feb 2 21:59:55] WARNING[1826][C-00000002]: pbx.c:2927 pbx_extension_helper: No application 'Macro' for extension (ivr-main, 122, 1)
    При проверке после предыдущего этапа (Учет и просмотр статистики звонков (cdr viewer)) всё работало, записи в базу производились.
    Подскажите, может ли это быть от того, что вместо mysql используется mariadb? Там, где надо, конфиги подправил, и база, повторюсь, работала. Или это всё-таки /etc/asterisk/extensions.conf не правильный? Хотя он как у вас - один в один.

    • Mariadb или Mysql точно не имеет значения. У вас ошибка в диалплане где-то. Вот она:

      No application ‘Macro’ for extension (call-out, 100, 1)

      Статья немного устарела в каких-то деталях, могут быть мелкие ошибки. Я планирую полное обновление на современные версии, но пока никак не доходят руки.

    • No application ‘Macro’ for extension - у вас выключен модуль app_macro.so. он признан устаревшим. Его можно добавить, пересобрав астер. Но в консоли он тогда валит предупреждения: ахтунгахтунг оно старое. Замена - GoSub, там все легко и понятно.
      Было на 13 астере Macro(macro-recording,/mnt/ISCSI/call/,${UNIQUEID})
      стало на 16 астере GoSub(macro-recording,s,1(${CALLERID(num)},${EXTEN}))

      внутри макроса тоже изменения больше косметические, в конце надо добавлять
      same => n,Return(), если планируется возврат в exten.

      • Спасибо вам! Насчёт "ахтунгов" - это точно, пересобрал астер и посыпались мол: в следующей версии не будет Macro. Но сделал как вы сказали и... Вуаля! Всё работает без "ахтунгов".

      • Спасибо за информацию. Нужно будет актуализировать статью под свежие lts версии asterisk.

  96. Андрей

    Владимир, а можно вопрос насколько сильно отличаются настройка sip и pjsip или это ничего принципиального в астериске не меняет ?

  97. Евгений

    ошибка команды yum install -y mysql-connector-odbc.x86_64 unixODBC-devel.x86_64

    выдает Отсутствуют совпадения для аргумента: mysql-connector-odbc.x86_64
    Пакет unixODBC-devel-2.3.7-1.el8.x86_64 уже установлен.
    Ошибка: Совпадений не найдено: mysql-connector-odbc.x86_64

    • попробуйте установить mariadb коннектор, либо подсунуть rpm от MYSQL. потом вносите изменения в коннекторы и вуаля. все работает.

      • кстати комментируя автора статьи - "Параметр callerid можно задать кириллицей, но могут возникнуть проблемы с некоторыми телефонами и точно возникнут проблемы, когда вы будете вести статистику звонков в mysql. Я не смог победить эту проблему с кодировками, поэтому использую только латиницу в этом параметре. Туда можно писать либо должность, либо ФИО человека." Если использовать коннектор ODBC mariadb то проблемы с callerid исчезают.

  98. При компиляции ошибка подскажите

    make
    [LD] abstract_jb.o acl.o adsi.o alaw.o alertpipe.o aoc.o app.o ast_expr2.o ast_expr2f.o asterisk.o astfd.o astmm.o astobj2.o astobj2_container.o astobj2_hash.o astobj2_rbtree.o audiohook.o autochan.o autoservice.o backtrace.o bridge.o bridge_after.o bridge_basic.o bridge_channel.o bridge_roles.o bucket.o callerid.o channel.o channel_internal_api.o chanvars.o cli.o codec.o codec_builtin.o config_options.o conversions.o core_local.o core_unreal.o crypt.o data_buffer.o datastore.o db.o devicestate.o dial.o dns.o dns_core.o dns_naptr.o dns_query_set.o dns_recurring.o dns_srv.o dns_system_resolver.o dns_test.o dns_tlsa.o endpoints.o event.o features_config.o file.o fixedjitterbuf.o format.o format_cache.o format_cap.o format_compatibility.o frame.o framehook.o fskmodem.o global_datastores.o hashtab.o heap.o image.o io.o iostream.o jitterbuf.o json.o loader.o lock.o manager_bridges.o manager_channels.o manager_endpoints.o manager_mwi.o manager_system.o max_forwards.o md5.o media_cache.o media_index.o message.o mixmonitor.o mwi.o named_locks.o netsock2.o optional_api.o options.o parking.o pbx.o pbx_app.o pbx_builtins.o pbx_functions.o pbx_hangup_handler.o pbx_ignorepat.o pbx_include.o pbx_sw.o pbx_switch.o pbx_timing.o pbx_variables.o pickup.o poll.o presencestate.o privacy.o rtp_engine.o say.o sched.o sdp_srtp.o security_events.o sem.o sha1.o sip_api.o slinfactory.o smoother.o sorcery.o srv.o stasis.o stasis_bridges.o stasis_cache.o stasis_cache_pattern.o stasis_channels.o stasis_endpoints.o stasis_message.o stasis_message_router.o stasis_system.o stdtime/localtime.o strcompat.o stream.o stringfields.o strings.o stun.o syslog.o taskprocessor.o tcptls.o tdd.o term.o test.o threadpool.o threadstorage.o timing.o translate.o ulaw.o uri.o utils.o uuid.o version.o xml.o xmldoc.o ccss.o cdr.o cel.o config.o dnsmgr.o dsp.o enum.o features.o http.o indications.o logger.o manager.o named_acl.o plc.o sounds.o udptl.o -> asterisk
    [CC] app_mysql.c -> app_mysql.o
    [LD] app_mysql.o -> app_mysql.so
    [CC] cdr_mysql.c -> cdr_mysql.o
    cdr_mysql.c: In function ‘mysql_log’:
    cdr_mysql.c:177:2: error: unknown type name ‘my_bool’; did you mean ‘bool’?
    my_bool my_bool_true = 1;
    ^~~~~~~
    bool
    cdr_mysql.c: In function ‘my_connect_db’:
    cdr_mysql.c:464:2: error: unknown type name ‘my_bool’; did you mean ‘bool’?
    my_bool my_bool_true = 1;
    ^~~~~~~
    bool

    • Эта ошибка в модуле mysql, который давно уже объявлен deprecated и использовать его большого смысла нет. Вместо него надо настраивать подключение к mysql через odbc.

  99. Не сможет заработать статистика пока вы будите видеть эти ошибки

    core reload
    -- Reloading module 'extconfig' (Configuration)
    -- Reloading module 'logger' (Logger)
    Asterisk Queue Logger restarted
    -- Reloading module 'res_odbc.so' (ODBC resource)
    [Jan 11 13:08:58] WARNING[1659]: res_odbc.c:606 load_odbc_config: The 'pooling', 'shared_connections', 'limit', and 'idlecheck' options were replaced by 'max_c onnections'. See res_odbc.conf.sample.
    [Jan 11 13:08:58] WARNING[1659]: res_odbc.c:1067 odbc_obj_connect: res_odbc: Error SQLConnect=-1 errno=0 [unixODBC][Driver Manager]Can't open lib '/usr/lib64/l ibmyodbc5.so' : file not found
    [Jan 11 13:08:58] NOTICE[1659]: res_odbc.c:706 load_odbc_config: Registered ODBC class 'asterisk' dsn->[MySQL-asterisk]
    -- Reloading module 'res_config_ldap.so' (LDAP realtime interface)

    asterisk-16.6.2 make menuselect
    1 add-ans -> выбрать app_mysql и cdr_mysql

    save
    make
    и вываливаемся в такую ошибку
    make
    [CC] cdr_mysql.c -> cdr_mysql.o
    cdr_mysql.c: In function ‘mysql_log’:
    cdr_mysql.c:177:2: error: unknown type name ‘my_bool’; did you mean ‘bool’?
    my_bool my_bool_true = 1;
    ^~~~~~~
    bool
    cdr_mysql.c: In function ‘my_connect_db’:
    cdr_mysql.c:464:2: error: unknown type name ‘my_bool’; did you mean ‘bool’?
    my_bool my_bool_true = 1;
    ^~~~~~~
    bool
    make[1]: *** [/usr/src/asterisk-16.6.2/Makefile.rules:164: cdr_mysql.o] Error 1
    make: *** [Makefile:383: addons] Error 2

    dnf install unixodbc unixodbc-devel libtool-ltdl libtool-ltdl-devel mysql-connector-odbc
    Last metadata expiration check: 0:45:44 ago on Sat 11 Jan 2020 12:41:30 PM +05.
    No match for argument: unixodbc
    * Maybe you meant: unixODBC
    No match for argument: unixodbc-devel
    * Maybe you meant: unixODBC-devel
    Package libtool-ltdl-2.4.6-25.el8.x86_64 is already installed.
    No match for argument: mysql-connector-odbc
    Error: Unable to find a match

    yum install -y mysql-connector-odbc.x86_64 unixODBC-devel.x86_64
    Last metadata expiration check: 0:48:11 ago on Sat 11 Jan 2020 12:41:30 PM +05.
    No match for argument: mysql-connector-odbc.x86_64
    Package unixODBC-devel-2.3.7-1.el8.x86_64 is already installed.
    Error: Unable to find a match

    libmyodbc5.so

    есть мысли ?

    • в 8 centOS

      Редактируем файл /etc/odbcinst.ini. Я его не трогал, оставил по-умолчанию, только в самый конец секции [MySQL] добавил две недостающие строки. Я не разбирался нужны они или нет, просто подсмотрел в другой инструкции. Вот как этот файл выглядит у меня:

      [MySQL]
      Description = ODBC for MySQL
      Driver = /usr/lib/libmyodbc5.so
      Setup = /usr/lib/libodbcmyS.so
      Driver64 = /usr/lib64/libmyodbc5a.so
      Setup64 = /usr/lib64/libodbcmyS.so
      FileUsage = 1
      CPTimeout =
      CPReuse =

      поменяли с /usr/lib64/libmyodbc5.so на /usr/lib64/libmyodbc5a.so

  100. Сделал все правильно, но один софт фон пишет что нет подключения к серверу другой тупо пишет регистрация и ничего не происходит, делал астериск на WMvare и Hyper-v, пинги идут со всех сторон, но не работает.

    Вот логи которые пишет после перезагрузки астериска:

    localhost*CLI> core reload
    [Dec 7 13:32:48] NOTICE[17799]: res_config_ldap.c:1830 parse_config: No directory user found, anonymous binding as default.
    [Dec 7 13:32:48] ERROR[17799]: res_config_ldap.c:1856 parse_config: No directory URL or host found.
    [Dec 7 13:32:48] NOTICE[17799]: res_config_ldap.c:1774 reload: Cannot reload LDAP RealTime driver.
    [Dec 7 13:32:48] WARNING[17799]: res_config_pgsql.c:1445 parse_config: PostgreSQL RealTime: Not connected
    [Dec 7 13:32:48] NOTICE[17799]: cdr.c:4517 cdr_toggle_runtime_options: CDR simple logging enabled.
    [Dec 7 13:32:48] NOTICE[17823]: sorcery.c:1334 sorcery_object_load: Type 'system' is not reloadable, maintaining previous values
    [Dec 7 13:32:48] WARNING[17799]: res_phoneprov.c:1230 get_defaults: Unable to find a valid server address or name.
    [Dec 7 13:32:48] NOTICE[17799]: chan_skinny.c:8459 config_load: Configuring skinny from skinny.conf
    [Dec 7 13:32:48] ERROR[17799]: ari/config.c:312 process_config: No configured users for ARI
    [Dec 7 13:32:48] NOTICE[17799]: cel_custom.c:95 load_config: No mappings found in cel_custom.conf. Not logging CEL to custom CSVs.
    [Dec 7 13:32:48] NOTICE[17799]: app_queue.c:9144 reload_queue_rules: queuerules.conf has not changed since it was last loaded. Not taking any action.

  101. Добрый день. Не проходят исходящие, подскажите пожалуйста.

    строка регистрации

    register => 1002@user.cnt.ru:password@qwerty.cnt.ru:5060/1002

    [1002]
    defaultuser=1002
    secret=1q2w#E$R
    type=peer
    insecure=port,invite
    host=qwerty.cnt.ru
    fromuser=1002
    fromdomain=qwerty.cnt.ru
    outboundproxy=qwerty.cnt.ru
    context=incoming
    canreinvite=no
    disallow=all
    allow=ulaw
    allow=alaw
    allow=g729
    dtmfmode = rfc2833

    строка в дуалплане

    exten => _XXX.,1,Dial(SIP/${EXTEN}@1002)
    include => handup-sip

    что может быть не нак

    • Нужно лог в первую очередь смотреть, чтобы понять, почему звонки не проходят.

      • При наборе выдаёт такую ошибку:
        Received response: "Forbidden" from

        при перезагрузки:

        NOTICE[1067]: res_config_ldap.c:1830 parse_config: No directory user found, anonymous binding as default.
        [Nov 26 15:53:42] ERROR[1067]: res_config_ldap.c:1856 parse_config: No directory URL or host found.
        [Nov 26 15:53:42] NOTICE[1067]: res_config_ldap.c:1774 reload: Cannot reload LDAP RealTime driver.
        [Nov 26 15:53:42] WARNING[1067]: res_config_pgsql.c:1445 parse_config: PostgreSQL RealTime: Not connected
        [Nov 26 15:53:42] NOTICE[1067]: cdr.c:4501 cdr_toggle_runtime_options: CDR simple logging enabled.
        [Nov 26 15:53:42] NOTICE[1068]: sorcery.c:1334 sorcery_object_load: Type 'system' is not reloadable, maintaining previous values
        [Nov 26 15:53:42] WARNING[1067]: res_phoneprov.c:1230 get_defaults: Unable to find a valid server address or name.
        [Nov 26 15:53:42] NOTICE[1067]: chan_skinny.c:8459 config_load: Configuring skinny from skinny.conf
        [Nov 26 15:53:42] ERROR[1067]: ari/config.c:312 process_config: No configured users for ARI
        [Nov 26 15:53:42] NOTICE[1067]: cel_custom.c:95 load_config: No mappings found in cel_custom.conf. Not logging CEL to custom CSVs.
        [Nov 26 15:53:42] NOTICE[1067]: app_queue.c:9144 reload_queue_rules: queuerules.conf has not changed since it was last loaded. Not taking any action.

  102. Здравствуйте! уже подключена виртуальная АТС. Телефоны поддерживают работу в двух sip (1,2). Возможно ли по второму каналу подключить только внутреннею телефонию без выхода в интернет. т. е не настраивать iptables И так далее, а только прописать номера внутренних телефонов и все. Получится так что по одной линии телефон подключен к виртуальной атс, а по второй только внутрення аст (астерикс). надеюсь понятно объяснил)).

    • Объяснили понятно. Это без проблем можно сделать, но пользоваться будет не так удобно, потому что нужно будет линии каждый раз на аппарате выбирать, по которым звонить. Если это устраивает, то можно настраивать.

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

  103. Outsider2019

    Добрый день. Спасибо за статью. Я новичек и настроил астериск самым примитивным образом конечно, в одном флаконе с дистрибутива с Linux Sagnoma 7, так как предыдущая старая атс "рухнула", а вопрос с атс и звонками в офисе необходимо было решить в кратчайшие сроки. Через несколько дней работы, видимо какой-то из лог-файлов (пока не знаю, какой именно) переполнился и при входе через веб выдает ошибку: file_put_contents(): Only 0 of 96 bytes written, possibly out of free disk space
    И похоже, что эта проблема в самой платформе linux sagnome 7. Отсюда вопрос, как его можно почистить, если мне доступна консоль только freePBX ?
    Или всё же не остается никаких вариантов, кроме установки на Debian, который Вы описали в статье?

    • В статье у меня Centos. Про sagnoma вообще ни разу не слышал, даже не знаю, что это такое. Переставлять не обязательно, если все нормально настроено. Надо просто зайти на сервер и освободить занятое место. Через web интерфейс Freepbx скорее всего это сделать не получится. Нужна консоль сервера.

      • Аноним

        Добрый день.Спасибо за ответ. Но переустановить мне всё таки придётся. Что-то видимо я с разметкой диска при первоначальной установке я напортачил.

  104. Добрый день, подскажите пожалуйста
    При заходе на Asterisk CDR Viewer Mod выдает ошибку PDO::errorInfo(): could not find driver
    https://sun9-56.userapi.com/c855728/v855728551/14e736/hv8SmHRNEmE.jpg
    Centos 7
    php 7.1.33
    php-mysql установлен
    mysqlnd 5.0.12-dev

  105. Алексей

    Покупаете Raspberry PI 3 с гигом памяти в ДНС, ставите на него Астериск (желательно по этой статье с компилированием из исходников), настраиваете транк IAX2 с головным сервером, внутри подключаете по sip внутренние телефоны, настраиваете маршрутизацию (через головной офис или напрямик - это в диалплане).
    Если открываете порты наружу, то включайте fail2ban. Если не открываете - fail2ban будет только мешать.

  106. Алексей

    Имея большой опыт работы с sip протоколом за натом, могу посоветовать товарищам, соединяющим офисы микротиками через l2tp или pptp vpn, не связываться с открытием портов и пытаться через все это напрямик цеплять телефоны удаленных подразделений.
    Sip для телефонов, транки на sip непредсказуемо виснут. Для связи удаленных подразделений делайте транки на основе IAX2, там один порт и его проще контролировать. Когда виснет sip, хрен поймешь где что зависло и когда отвиснет.

    • Я обычно использую openvpn для объединения сетей. Проблем с sip при этом не наблюдаю. Все настраивается просто и очевидно.

      • Алексей

        Ну да, это пока сетей меньше десятка, они стабильно доступны и когда на головном сервере с астериском не отрубают питание.
        А когда все это начнет случаться (а по другому при GSM-доступе и не бывает), сессии начинают зависать в астериске и новые он принимать не хочет, микротик блочит разрешенные вроде бы порты, продажники жалуются директорам, а для меня жизнь обретает новые краски.
        Зачем нужен этот карнавал? Сделал транки через IAX2 и все перестало ломаться. Ну в общем каждый сам выбирает.

  107. Спасибо за статью. Хотелось бы видеть изменения в настройках конфигов астериска с учётом перехода на PJSIP.

  108. Спасибо за статью!

  109. Возникает такая ошибка, подскажите, пожалуйста, как ее решить.

    Can't open PID file /var/run/asterisk/asterisk.pid (yet?) after start: No such file or directory
    asterisk.service: Supervising process 1147 which is not our child. We'll most likely not notice when it exits.

  110. Скажите почему могут не отображаться записи на веб-форме?
    Фильтрации никакой нет. В папке аудио файлы есть, а веб-форма чистая. Может я куда то забыл дать права? Что проверить можно?

    • У меня не поднялось ODBC
      ODBC DSN Settings
      -----------------

      Name: asterisk
      DSN: MySQL-asterisk
      Last fail connection attempt: 2019-09-30 08:34:41
      Number of active connections: 0 (out of 1)

      Как его можно поднять вручную командой? или что нужно сделать? Почему при загрузке не поднялся автоматически?

      • Перезапустил через service asterisk restart, соединение появилось, но веб-форма все равно пустая.

  111. Алексей

    Добрый день.
    Владимир, а не подскажите какие настройки требуется добавить к группе, чтобы состоящие в ней номера могли звонить на 2-3 заранее известных внутренних номера?

    P.S.: Сервер установил, все завелось, все работает! Спасибо!

    • Это не настройки надо добавить, а составить диалплан под это требование. Номера с указанными ограничениями должны быть в отдельном контексте. Это настраивается в конфиге с пирами. А дальше в диалплане в этом контексте настраивается разрешение по звонкам, примерно так:

      [local-zvonok]
      exten => 155,1,Dial(SIP/${EXTEN})
      exten => 156,1,Dial(SIP/${EXTEN})

      Пиры, которые будут входить только в контекст local-zvonok смогут звонить только на номера 155 и 156.

  112. Подскажите, есть связка Астериск и DVG6004s. Все работало прекрасно несколько лет, вдруг ни с того ни с сего перестало. а именно: мы звоним с софтфона через астериск в город, но нас не слышат (вообще ни звука), а мы слышим абонента на другом конце. При этом со внутреннего софтфона на внутренний софтфон все работает.
    На шлюз приходят 3 аналоговые линии из города, далее к WAN шлюза подключена сетевуха сервера с астериском. Вторая сетевуха на астериске подключена в локальную сеть в которой у нас софтфоны.
    Помогите пожалуйста разобраться.

    лог с астериска:

    [Sep 5 14:44:31] VERBOSE[3729] chan_sip.c: -- Registered SIP '107' at 192.168.0.233:5060
    [Sep 5 14:44:31] NOTICE[3729] chan_sip.c: Peer '107' is now Reachable. (17ms / 2000ms)
    [Sep 5 14:44:33] VERBOSE[3729] netsock2.c: == Using SIP RTP TOS bits 184
    [Sep 5 14:44:33] VERBOSE[3729] netsock2.c: == Using SIP RTP CoS mark 5
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [89*********@from-internal:1] Macro("SIP/107-00000000", "user-callerid,SKIPTTL,") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-user-callerid:1] Set("SIP/107-00000000", "AMPUSER=107") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-user-callerid:2] GotoIf("SIP/107-00000000", "0?report") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-user-callerid:3] ExecIf("SIP/107-00000000", "1?Set(REALCALLERIDNUM=107)") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-user-callerid:4] Set("SIP/107-00000000", "AMPUSER=107") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-user-callerid:5] Set("SIP/107-00000000", "AMPUSERCIDNAME=107") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-user-callerid:6] GotoIf("SIP/107-00000000", "0?report") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-user-callerid:7] Set("SIP/107-00000000", "AMPUSERCID=107") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-user-callerid:8] Set("SIP/107-00000000", "CALLERID(all)="107" ") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-user-callerid:9] ExecIf("SIP/107-00000000", "1?Set(CHANNEL(language)=)") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-user-callerid:10] GotoIf("SIP/107-00000000", "1?continue") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Goto (macro-user-callerid,s,19)
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-user-callerid:19] Set("SIP/107-00000000", "CALLERID(number)=107") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-user-callerid:20] Set("SIP/107-00000000", "CALLERID(name)=107") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-user-callerid:21] NoOp("SIP/107-00000000", "Using CallerID "107" ") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [89*********@from-internal:2] NoOp("SIP/107-00000000", "Calling Out Route: test") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [89*********@from-internal:3] Set("SIP/107-00000000", "MOHCLASS=none") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [89*********@from-internal:4] Set("SIP/107-00000000", "_NODEST=") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [89*********@from-internal:5] Macro("SIP/107-00000000", "record-enable,107,OUT,") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-record-enable:1] GotoIf("SIP/107-00000000", "1?check") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Goto (macro-record-enable,s,4)
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-record-enable:4] ExecIf("SIP/107-00000000", "0?MacroExit()") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-record-enable:5] GotoIf("SIP/107-00000000", "0?Group:OUT") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Goto (macro-record-enable,s,15)
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-record-enable:15] GotoIf("SIP/107-00000000", "0?IN") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-record-enable:16] ExecIf("SIP/107-00000000", "0?MacroExit()") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-record-enable:17] NoOp("SIP/107-00000000", "Recording enable for 107") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-record-enable:18] Set("SIP/107-00000000", "CALLFILENAME=OUT107-20190905-144433-1567669473.0") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-record-enable:19] Goto("SIP/107-00000000", "record") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Goto (macro-record-enable,s,23)
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-record-enable:23] MixMonitor("SIP/107-00000000", "OUT107-20190905-144433-1567669473.0.wav,,") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-record-enable:24] Set("SIP/107-00000000", "CDR(userfield)=audio:OUT107-20190905-144433-1567669473.0.wav") in new stack
    [Sep 5 14:44:33] VERBOSE[3823] app_mixmonitor.c: == Begin MixMonitor Recording SIP/107-00000000
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-record-enable:25] MacroExit("SIP/107-00000000", "") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [89*********@from-internal:6] Macro("SIP/107-00000000", "dialout-trunk,4,89*********,") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-dialout-trunk:1] Set("SIP/107-00000000", "DIAL_TRUNK=4") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-dialout-trunk:2] GosubIf("SIP/107-00000000", "0?sub-pincheck,s,1") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-dialout-trunk:3] GotoIf("SIP/107-00000000", "0?disabletrunk,1") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-dialout-trunk:4] Set("SIP/107-00000000", "DIAL_NUMBER=89*********") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-dialout-trunk:5] Set("SIP/107-00000000", "DIAL_TRUNK_OPTIONS=tr") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-dialout-trunk:6] Set("SIP/107-00000000", "OUTBOUND_GROUP=OUT_4") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-dialout-trunk:7] GotoIf("SIP/107-00000000", "0?nomax") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-dialout-trunk:8] GotoIf("SIP/107-00000000", "0?chanfull") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-dialout-trunk:9] GotoIf("SIP/107-00000000", "0?skipoutcid") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-dialout-trunk:10] Set("SIP/107-00000000", "DIAL_TRUNK_OPTIONS=") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-dialout-trunk:11] Macro("SIP/107-00000000", "outbound-callerid,4") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-outbound-callerid:1] ExecIf("SIP/107-00000000", "0?Set(CALLERPRES()=)") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-outbound-callerid:2] ExecIf("SIP/107-00000000", "0?Set(REALCALLERIDNUM=107)") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-outbound-callerid:3] GotoIf("SIP/107-00000000", "1?normcid") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Goto (macro-outbound-callerid,s,6)
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-outbound-callerid:6] Set("SIP/107-00000000", "USEROUTCID=107") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-outbound-callerid:7] Set("SIP/107-00000000", "EMERGENCYCID=") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-outbound-callerid:8] Set("SIP/107-00000000", "TRUNKOUTCID=******") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-outbound-callerid:9] GotoIf("SIP/107-00000000", "1?trunkcid") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Goto (macro-outbound-callerid,s,12)
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-outbound-callerid:12] ExecIf("SIP/107-00000000", "1?Set(CALLERID(all)=******)") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-outbound-callerid:13] ExecIf("SIP/107-00000000", "1?Set(CALLERID(all)=107)") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-outbound-callerid:14] ExecIf("SIP/107-00000000", "0?Set(CALLERID(all)=)") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-outbound-callerid:15] ExecIf("SIP/107-00000000", "0?Set(CALLERPRES()=prohib_passed_screen)") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-dialout-trunk:12] GosubIf("SIP/107-00000000", "0?sub-flp-4,s,1") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-dialout-trunk:13] Set("SIP/107-00000000", "OUTNUM=89*********") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-dialout-trunk:14] Set("SIP/107-00000000", "custom=SIP/******") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-dialout-trunk:15] ExecIf("SIP/107-00000000", "1?Set(DIAL_TRUNK_OPTIONS=M(setmusic^none))") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-dialout-trunk:16] Macro("SIP/107-00000000", "dialout-trunk-predial-hook,") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-dialout-trunk-predial-hook:1] MacroExit("SIP/107-00000000", "") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-dialout-trunk:17] GotoIf("SIP/107-00000000", "0?bypass,1") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-dialout-trunk:18] GotoIf("SIP/107-00000000", "0?customtrunk") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-dialout-trunk:19] Dial("SIP/107-00000000", "SIP/******/89*********,300,M(setmusic^none)") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] netsock2.c: == Using SIP RTP TOS bits 184
    [Sep 5 14:44:33] VERBOSE[3822] netsock2.c: == Using SIP RTP CoS mark 5
    [Sep 5 14:44:33] VERBOSE[3822] app_dial.c: -- Called SIP/******/89*********
    [Sep 5 14:44:37] VERBOSE[3822] app_dial.c: -- Call on SIP/******-00000001 placed on hold
    [Sep 5 14:44:37] VERBOSE[3822] channel.c: -- Music class default requested but no musiconhold loaded.
    [Sep 5 14:44:37] VERBOSE[3822] app_dial.c: -- SIP/******-00000001 is making progress passing it to SIP/107-00000000
    [Sep 5 14:45:01] VERBOSE[3563] asterisk.c: -- Remote UNIX connection
    [Sep 5 14:45:01] VERBOSE[3872] asterisk.c: -- Remote UNIX connection disconnected
    [Sep 5 14:45:06] VERBOSE[3822] app_macro.c: == Spawn extension (macro-dialout-trunk, s, 19) exited non-zero on 'SIP/107-00000000' in macro 'dialout-trunk'
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: == Spawn extension (from-internal, 89*********, 6) exited non-zero on 'SIP/107-00000000'
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Executing [h@from-internal:1] Macro("SIP/107-00000000", "hangupcall") in new stack
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Executing [s@macro-hangupcall:1] GotoIf("SIP/107-00000000", "0?endmixmoncheck") in new stack
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Executing [s@macro-hangupcall:2] Set("SIP/107-00000000", "MIXMON_CALLFILENAME=/var/spool/asterisk/monitor/OUT107-20190905-144433-1567669473.0.wav") in new stack
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Executing [s@macro-hangupcall:3] GotoIf("SIP/107-00000000", "1?defaultmixmondir") in new stack
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Goto (macro-hangupcall,s,5)
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Executing [s@macro-hangupcall:5] System("SIP/107-00000000", "test -e /var/spool/asterisk/monitor/OUT107-20190905-144433-1567669473.0.wav") in new stack
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Executing [s@macro-hangupcall:6] NoOp("SIP/107-00000000", "SYSTEMSTATUS = SUCCESS") in new stack
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Executing [s@macro-hangupcall:7] GotoIf("SIP/107-00000000", "1?endmixmoncheck") in new stack
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Goto (macro-hangupcall,s,9)
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Executing [s@macro-hangupcall:9] NoOp("SIP/107-00000000", "End of MIXMON check") in new stack
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Executing [s@macro-hangupcall:10] GotoIf("SIP/107-00000000", "1?nomeetmemon") in new stack
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Goto (macro-hangupcall,s,28)
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Executing [s@macro-hangupcall:28] NoOp("SIP/107-00000000", "End of MEETME check") in new stack
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Executing [s@macro-hangupcall:29] GotoIf("SIP/107-00000000", "1?noautomon") in new stack
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Goto (macro-hangupcall,s,34)
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Executing [s@macro-hangupcall:34] NoOp("SIP/107-00000000", "TOUCH_MONITOR_OUTPUT=") in new stack
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Executing [s@macro-hangupcall:35] GotoIf("SIP/107-00000000", "1?noautomon2") in new stack
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Goto (macro-hangupcall,s,41)
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Executing [s@macro-hangupcall:41] NoOp("SIP/107-00000000", "MONITOR_FILENAME=") in new stack
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Executing [s@macro-hangupcall:42] GotoIf("SIP/107-00000000", "1?skiprg") in new stack
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Goto (macro-hangupcall,s,45)
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Executing [s@macro-hangupcall:45] GotoIf("SIP/107-00000000", "1?skipblkvm") in new stack
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Goto (macro-hangupcall,s,48)
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Executing [s@macro-hangupcall:48] GotoIf("SIP/107-00000000", "1?theend") in new stack
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Goto (macro-hangupcall,s,50)
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Executing [s@macro-hangupcall:50] AGI("SIP/107-00000000", "hangup.agi") in new stack
    [Sep 5 14:45:06] VERBOSE[3822] res_agi.c: -- Launched AGI Script /var/lib/asterisk/agi-bin/hangup.agi
    [Sep 5 14:45:06] VERBOSE[3822] res_agi.c: -- AGI Script hangup.agi completed, returning 0
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Executing [s@macro-hangupcall:51] Hangup("SIP/107-00000000", "") in new stack
    [Sep 5 14:45:06] VERBOSE[3822] app_macro.c: == Spawn extension (macro-hangupcall, s, 51) exited non-zero on 'SIP/107-00000000' in macro 'hangupcall'
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: == Spawn extension (from-internal, h, 1) exited non-zero on 'SIP/107-00000000'
    [Sep 5 14:45:06] VERBOSE[3823] app_mixmonitor.c: == MixMonitor close filestream
    [Sep 5 14:45:06] VERBOSE[3823] app_mixmonitor.c: == End MixMonitor Recording SIP/107-00000000
    [Sep 5 14:45:27] VERBOSE[3729] chan_sip.c: -- Unregistered SIP '107'
    • В логе я каких-то явных ошибок не заметил. Обычно, когда кого-то не слышно, это сетевые проблемы, особенно если asterisk за nat работает. Чудес не бывает, если много лет работало, а потом перестало, значит что-то изменилось. Если нет специалиста по настройке астериск, ищите, что изменилось за последнее время и возвращайте как было.

      • нат не при чем, потому что на шлюз идут аналоговые линии 3 штуки из города, заходят на шлюз, из шлюза патчкорд напрямую идет на сетевуху астериска. и со второй сетевухи астериска уже идет в сеть в которой софтфоны наши.
        по логам с железяки (шлюза) говорится что RTP S=2745 R=0 Lost=-1
        т.е. ресивд-а нет пакетов.

  113. Француз

    Камрад, а подскажите насколько сложно будет после того как вы настроено по Вашему мануалу перевести в базу? Ну т.е. чтобы конфиг были не в файлах а в базе, чтобы изменения применялись сразу и не приходилось грузить диалплан и т.д. Реально ли это исправить на текущей стадии или нужно изначально поднимать по другому?

    • Я не знаю, никогда не хранил конфиги в базе. Подозреваю, что это не должно быть проблемой. Логика настроек одна и та же. А перенос в разные форматы вопрос чисто технический. Это по идее :)

  114. Владимир, подскажите пожалуйста, это нормально, что при выполнении команды:
    contrib/scripts/install_prereq install

    вылазит сообщение, что
    Пакета с названием speexdsp-devel не найдено.
    Пакета с названием iksemel-devel не найдено.
    Пакета с названием libresample-devel не найдено.
    Пакета с названием hoard не найдено.
    Разрешение зависимостей

    и эти пакеты так и не устанавливаются в систему - даже при разрешении зависимостей?

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

      • Астериск собрался и запустился успешно - без ошибок. Но вот эти указанные пакеты пока не дают покоя...
        Функционал пока используется самый простой, без излишеств - ВМ-ка с чистым CentOS.
        Спасибо Вам за понятный ответ!

  115. Вроде всё настроил по статье. iptables отключён и включать пока не буду. Группы создал свои по аналогии с примеров. Настраиваю телефоны, но они не регистрируются - "время вышло". Не понимаю, что не так.

    • Всё, разобрался. Оказывается фаервол мешал. Добавьте в статью заметку о том, что если сразу с вопросом фаервола не разобраться, то телефоны регистрироваться не будут.

      • А какой именно вопрос с файрволом? У меня та же ситуация. Все установлено и настроено по инструкции, но при попытке регистрации софтфона не происходит ничего, т.е. запросы на астер приходят, но сам сервак ничего не отвечает. Что нужно сделать?

        • Точно не помню, но по-моему я его то ли вырубил, то ли порты пробросил. Короче, работе Астера мешал именно фаервол. На этом сайте есть инструкция по нему.

          • Спасибо, Марат. А Астер у вас на реальном серваке стоит или на виртуалке? У меня на виртуалке и в принципе проблем как бы быть не должно. Selinux и iptables отключены, по ssh заходит, звонилка стоит на хосте. Интересно то, что видно, что запросы приходят от моего хоста на регистрацию, на нужный порт, но сам астер никаких ответов не дает. Перерыл уже весь интернет, задолбал своих коллег-специалистов по астеру, проблему так и не нашли. В общем мистика

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

              • В общем разобрался. Оказалось, что просто systemctl stop iptables не достаточно. Нужно также вырубить firewalld. Запустил tcpdump -u и регистрацию в софтфоне, наткнулся на эту строку icmp host asterisk is unreachable admin prohibited filter. Через 5 минут ответ нашелся https://unixspace.wordpress.com/2013/06/12/35/comment-page-1/

  116. Француз

    Zerox, Камрад, ну подтолкните еще в правильном направлении!!!!
    Изменил первую строчку в экстеншене записи и сделал вот так:
    exten => s,1,Set(fname=${STRFTIME(${EPOCH},,%Y/%m/%d)}/${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${ARG1}-${ARG2});
    Это позволяет теперь писать в заданную по дефолту директорию по папкам /2019/07/17 к примеру. Все проверено. Папка создалась, записи кидаются в нее, НО не идет отображение на веб-форме.
    Я зашел в конфиг и выбрал 4-ый пункт в разделе формата хранения:
    ## Если 4, то файлы записей должны распределяться по папкам Asterisk-ом в соответствии с датой "/home/calls/2015/12/01".
    'storage_format' => 4,
    НО как я понял это работает только если записи кидаются в дефолтную папку "/home/calls/", но у меня она другая, поэтому прослушать записи на форме не возможно.
    Как можно подкорректировать конфиг форму чтобы он смотрел не в /home/calls/, а в другой указанной папке ?

    • Там в конфиге где-то настраивается папка. Посмотри повнимательнее. Я настраивал это последний раз несколько лет назад. Уже не помню подробностей, но там не сложно.

      • Француз

        Блин, невнимательно читаю описание. Путь я указал там, выбрал не тот пункт в storage.

  117. Француз

    Камрад, а подскажите касательно записи сразу в папки с указанием дня, а не просто в корень указанной.
    В мануале мы указывает просто папку, куда будут кидать сконвертированные в мр3 файлы. И даете приписку что в редми прописано как сделать чтобы записи раскидывались по папкам. Но там обычный скрипт, который в начале каждого дня раскидывает файлы предыдущего дня в папку в названии которого указан нужный день, но в базе то это не меняется. И получается: сегодня все записи кидаются в общую, на утро след. дня они скриптов перемещаются в созданную папку с номером дня, но на веб-форме ломаются ссылки. Если я захочу прослушать вчерашний день, то записей не будет. Он же будет искать в старой папке, а их там уже нет.
    Как можно подкорректировать скрипт или может сразу макрос, чтобы они писали записи сразу в папку с указание дня, а не просто в кучу, а то уже порядка 20 тыс файлов.

  118. Андрей

    Добрый день!

    лог текстовый пишется в astrerisk-cdr-viewer

    Но аудио файлы не прикрепляются

    по завершению разговора вижу ошибку:

    cdr_mysql.c:219 mysql_log: Cannot connect to database server localhost: (1044) Access denied for user 'asteriskcdruser'@'localhost' to database 'asteriskcdrdb'

    • Тут прямым текстом написано, в чем проблема:
      Cannot connect to database server localhost: (1044) Access denied for user ‘asteriskcdruser’@’localhost’ to database ‘asteriskcdrdb’

  119. Никита

    Доброго времени суток! Мануал отличны настроил все пашет, но почему то вместо DID получаю S

    Executing [s@ivr-main:2] NoOp("SIP/Tele2_XXXXXXXXXXX", "s") in new stack

    Кто может подсказать почему так

  120. Француз

    Я настроил запись, там есть кнопка удаление записи разговора. Но когда я нажимаю на нее выдается ошибка что нет правда на папку. Как понять под каким пользователем веб-формы пытается удалить файл из папки, чтобы потом дать права?

    • Француз

      Вопрос закрыт. Дал права на Apache и вроде удаляются записи.

      • Все правильно. Панель работает под web сервером. Для удаления файлов надо дать доступ пользователю, под которым запущен web сервер apache.

  121. Макросы как я понял будут убираться из астериска, нужно переписывать код на Gosub?

    [Jun 28 12:47:39] WARNING[24566][C-00000001]: app_macro.c:274 _macro_exec: Macro() is deprecated and will be removed from a future version of Asterisk.
    [Jun 28 12:47:39] WARNING[24566][C-00000001]: app_macro.c:275 _macro_exec: Dialplan should be updated to use Gosub instead.

  122. Осталось только указать настройки подключения к базе данных cdr viewer. Эти настройки находятся в файле inc/config.inc.php. Задаем там следующие параметры:

    Подскажите пожалуйста , о каком файле идет речь?

    sudo find / -name config.inc.php
    /etc/phpMyAdmin/config.inc.php
    /usr/share/phpMyAdmin/setup/frames/config.inc.php
    /usr/share/phpMyAdmin/test/test_data/config.inc.php

  123. Здравствуйте. Помогите пожалуйста советом. Имеется сервер Asterisk, большая часть абонентов сидит в локальной сети, абонентов много. Но требуется одного подключить снаружи, через интернет. Порты на шлюзе открыл, но коннекта всё равно нет. Как-то можно подключить одного абонента снаружи, не переделывая всю конфигурацию?

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

      • Смотрит через NAT, в роли которого выступает отдельная машина. Ок, а где именно это настраивать, и какой параметр за это отвечате?

  124. Столкнулись с проблемой /asterisk: error while loading shared libraries: libasteriskssl.so.1

    после этого /configure
    make
    make install

    и как то все заработало может кому поможет

  125. Подскажите, как запихнуть преобразование записей mp3 в конференцию. Я пытался сделать по аналогии в confbridge с тем что мы делали за для записи обычных телефонов, но не работает. А если по дефолту ставить значение на запись yes и указать путь то конфу пишет в wav.
    МОжет не стоит лезть в конфу и записывать через диалплан, т.е. как то добавить запись перед:
    exten => 999,1,Answer()
    exten => 999,n,ConfBridge(1,confer)

    Подскажите как правильно сделать?

  126. Сергей

    уже нашел cd -

  127. Сергей

    Нажал на F12 и сохранилось. Вначале я был в директории с исходниками. cd asterisk* . После установки Asterisk программа не вернулась в исходную директорию.
    make[1]: Вход в каталог `/home/maxcim/asterisk-16.3.0/menuselect'
    make[1]: `makeopts' не требует обновления.
    make[1]: Выход из каталога `/home/maxcim/asterisk-16.3.0/menuselect'
    /bin/sh: main/version.c.tmp: Отказано в доступе
    make: *** [main/version.c] Ошибка 1
    [maxcim@localhost asterisk-16.3.0]$
    Как вручную вернуться в исходную директорию? Так как требуется дальше: "Настроим запуск астериск от системного пользователя asterisk"

  128. Сергей

    Приветствую. Окно выборов компонентов сборки. Выбрал компоненты. А как сохранить? По книге "Завершив работу с окном выбора компонентов сборки, введите символ Х , чтобы сохранить изменения и закрыть окно." Непонятно как закрыть. Не проходит команда sudo make . Получаю в ответ : "make: *** Не заданы цели и не найден make-файл. Останов." Наверно вопросы простые кто нибудь ответьте.

  129. >Параметр callerid можно задать кириллицей, но могут возникнуть проблемы с некоторыми телефонами и точно возникнут проблемы, когда вы будете вести статистику звонков в mysql. Я не смог победить эту проблему с кодировками, поэтому использую только латиницу в этом параметре. Туда можно писать либо должность, либо ФИО человека.

    На сегодняшний день не нашли решение проблемы с кириллицей?

  130. Андрей

    Добрый день.
    Имеем Сип транк с 2 номерами. Городской и мобильный.
    Транк поднимается без проблем дозвоны идут на городской номер. А мобильный никак не работает. Пишет все абоненты заняты.
    Приписывал входящие маршруты с указанием разных номеров. Никаких результатов.
    Как правильно прописать 2 номера?

  131. Андрей

    Добрый день. Имеем Asterisk + Freepbx , SIP транк с 2 номерами . 1 городской, 2 мобильный. У них 1 учетка. И она привязана к городскому. В Астериске сип поднимается и происходят дозвоны только на городской номер. На мобильном постоянно : На данный момент операторы заняты. Пробывал прописывать в поле from= оба номера. Никаких изменений. Запрашивал у провайдера ответили тоже самое 1 учетка на 2 номера. Не могли бы подсказать как прописать в настройках второй номер.

  132. Выяснилось, пропало соединение с ODBC, поэтому ничего не пишется в базу. Я не силен в базах данных не подскажете как вернуть соединение или проверить почему оно не конектится. Базовые логи чистые. Настраивалось все по 11 пункту и до перезагрузки работало. Что могло отключиться после ребута сервера?

  133. Почему может не работать детализация?
    Настроил, открыл веб-морду сделал пробный звонок: есть детали и есть запись. Грузанул сервак. Снова позвонил. Детализации нету при поиске звонок не находит, но аудиозапись в папке есть. Но на веб морде нет самого звонка, как будто в базу запись не сделалась, что был звонок. Я мог что-то упустить в автозагрузке?

    • Апну вопросик с вашего позволения. За выходные так и не разобрался. Вроде повторно все проделал, но в детализации всего один звонок. Как можно проверить пишутся ли данные в базу?

    • Для начала проверьте, если ли ваш звонок в дефолтном логе звонков астериска - /var/log/asterisk/cdr-csv/Master.csv
      Дальше посмотрите, есть ли информация о звонке в mysql базе, зайдя в таблицу с записями.
      Если все везде есть, то обратите внимание на web панель. Я видел в ней такие глюки и не раз, когда звонки не отображались. Сразу под настройками фильтрации появляется надпись "Найдено 48, отфильтровано 2 записей", хотя никаких фильтров нет. И этих двух звонков реально нет в веб панели, хотя они есть в статистике.
      Скрин

      • В базе нету записей, только одна запись, которая была до перезагрузки. Новые туда не пишутся. Они должны переносится из дефолтного лога или вносятся при каждом звонке?
        Я перепроверил все файлы и все данные в пункте "11 Учет и просмотр статистики звонков (cdr viewer)" Все что вы расписали у меня записано и добавлено. Есть какой-то механизм для проверки почему не идет запись в базу? в 11 и 12 пункте вроде бы нет никаких автозагрузок при старте системы, которые я мог бы упустить.

  134. Можете подсказать с переводом звонка на внешку? Вопрос на тостере, чтобы не писать в комментарии кучу текста с логами. Буду признателен за направление куда копать - toster.ru/q/604395
    Вроде добавлял строку, которую там говорят сделать, но тогда звонок просто в никуда уходит.

  135. Камрад!
    MACRO выпилили из астериска и с ним уже не работает. Предлагают использовать Gosub, но я пробовал заменить Macro на Gosub и macro-recording на sub-recording. Выдается ошибка app_stack.c:592 gosub_exec: Attempt to reach a non-existent destination for Gosub: (Context:recording, Extensions:105, Priority:101)

    • Печальные новости. Не понятно, чем MACRO не угодил. Куча готовых конфигов с ним, теперь все переделывать. Я пока не делал новых установок со свежими версиями, поэтому не сталкивался.

      • Понял, спасибо.
        Еще такой вопрос: Почему на вебморде может не отображаться вариант проигрывания записи?
        Сделал все по мануалу на 13-ой версии - все окей. Когда захожу на вебморду в детализацию, показываются звонки, но в столбце "Запись", стоит перечеркнутый кругляшок при наведении на который показывается "Нет".
        Но при этом запись есть и в папке mnt/calls находятся, но на веб морде их нет. Куда копать?

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

          • Да, спасибо! Была опечатка в пути, исправил все заработало.
            По MACRO я вас немного обманул в 16-ом пока просто выдается предупреждение что МАКРО устарело и вследующей версии будет удалено. Просят использовать GoSub.

  136. Привет! Статья отличная, но есть вопросы именно по установке из репозитория. Все вроде и хорошо и складно, но не все модули присутствуют (app_directory.so app_ices.so app_mp3.so app_page.so app_voicemail.so format_jpeg.so func_audiohookinherit.so) вот этих вот никак нету(((( Ставлю 16-ю версию. Почему из репы, а не собираю из сырцов? Потму что необходимо обновлять систему (ставлю на centos 7). При раворачивании из сырцов - все гуд, все модули на месте. При подкладывании файлов модулей отдельно - ругань на то что модули не иницилизированны. Спасибо за ответ.

  137. Я не робот

    Отличный материал, спасибо! Настройки астериска копипастом заработали и на OpenBSD, вот прям как есть, только IP изменил в соответствии со своим. Но это уже просто для проверки, я тут в виртуалке кручу OpenBSD для всяких экспериментов, проверяю на применимость в моих сценариях использования. А в продакшн пошёл Debian 8, с астериском, установленным по вашей статье.

    На вашем сайте блокировщик рекламы отключил, хоть как-то отблагодарить за труды.

  138. Алексей

    Очень нравится язык, которым написана статья.
    Большое спасибо за ваши труды.
    В тексте несущественная опечатка: "часовой пояс GTM"
    Похоже, имелось ввиду "GMT".

  139. Здравствуйте, прошу помочь с настройкой обработки # в меню ivr, есть freepbx с настроенным меню ivr, в нем говорится что при нажатии * повторно проговаривается сообщение, а при нажатии # перебрасывается в главное меню, но почему то при нажатии # на английском произносится слово transfer, потом длинный гудок секунд 15 и звонок сбрасывается

    • В asterisk клавиша # закреплена как команда blindtransfer (перевод звонка без согласования). Либо менять клавишу для перевода звонков в /etc/asterisk/features.conf секция [featuremap], либо в IVR использовать другую клавишу для перехода в меню. Например 0.
      Удачи=)

  140. Сергей

    Прошу помочь с ошибкой возникшей при подключении 3CXPhone.
    в окне дебаг 3CXPhone следующая ошибка подключения:
    not connected: authentication failed
    phone has been disconnected - error:401
    Phone is no longer connected
    в логах Asterisk:
    [2018-10-26 09:59:19] NOTICE[9155]: res_pjsip/pjsip_distributor.c:649 log_failed_request: Request 'REGISTER' from '"101" ' failed for '192.168.100.30:55392' (callid: ODhmNDU5YzlkNGY4MzhhYmY5ZmRkYjFkMWVkNGRiMDg.) - No matching endpoint found
    [2018-10-26 09:59:19] NOTICE[9155]: res_pjsip/pjsip_distributor.c:649 log_failed_request: Request 'REGISTER' from '"101" ' failed for '192.168.100.30:55392' (callid: ODhmNDU5YzlkNGY4MzhhYmY5ZmRkYjFkMWVkNGRiMDg.) - No matching endpoint found
    [2018-10-26 09:59:19] NOTICE[9155]: res_pjsip/pjsip_distributor.c:649 log_failed_request: Request 'REGISTER' from '"101" ' failed for '192.168.100.30:55392' (callid: ODhmNDU5YzlkNGY4MzhhYmY5ZmRkYjFkMWVkNGRiMDg.) - Failed to authenticate
    iptelephone*CLI>

  141. Андрей

    Приветствую!!! Большое тебе спасибо!!! Статья класс, с никс системами вообще не знаком но с твоей помощью получилось поднять мини-АТС.

  142. Камрад, а не планируется ли актуальный мануал по Astersik 16.0 + Centos 7 в ближайшее время ?

    • А там есть какие-то принципиальные отличия, кроме процесса установки? Обычно у астериск хорошая обратная совместимость. Старые диалпланы работают в новых версиях. А это самое главное, что есть в настройках.

      • Да есть малец. Я в линуксе еще слабо шарю и ошибки для меня это просто жесть.
        Вот к примеру ставил астериск на 10 maria а не на 5 в комплекте, который идет.
        Поставил pjsip по мануалу, потом jansson, потом астериск 16. При сборке ./configure он выдает предупреждение:
        https://cdn1.savepice.ru/uploads/2018/10/13/2507f4ffedccc9ccec3493850bd3ab23-full.png

        Ну тут вроде очевидно было и я просто добавил эту строку с jansson. Собрался нормально. Пошел выбирать меню и все выбрал что в мануале, начал делать make и он не может установить app_sql
        https://cdn1.savepice.ru/uploads/2018/10/13/8a582338d74b5b0b8803fa7c2a071b6f-full.png

        Вероятно он не понимает что это надо делать с 10.3 Maria, а он может пытается делать с 5, и вот пока дальше могу двинуть, хз как установить этот модуль .so

        • А зачем астериску maria 10? Я бы просто поставил на mysql 5 и не тратил время на решение этой проблемы. В данном случае разницы никакой не будет.

          • Ну хотелось как бы все последнее поставить и не заморачиваться. Смысл ставить 5-ую версию, когда уже 10.3 есть. Может она как нибудь лучше оптимизирована. Или астер под нее лучше заточен.

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

              • Ну в принципе да, тогда получается по сути можно не устанавливать все что связано с рнр и бд, т.е убрать из установки след.:
                mariadb-server mariadb php php-mysql php-mbstring tftp-server httpd php-pear phpmyadmin php-process php-xml

                Поставить pjproject, jansson и сам астериск. Запустить меню, собрать и прсот добавить диалпланы.
                Всякие CDR и прочее можно опустить ?

  143. Благодарю за помощь!

  144. Здравствуйте! Все выполнил по шагово по вашей статье однако сервис не запускается ystemctl status asterisk
    ● asterisk.service - LSB: Asterisk PBX
    Loaded: loaded (/etc/rc.d/init.d/asterisk; bad; vendor preset: disabled)
    Active: failed (Result: resources) since Ср 2018-07-25 10:07:07 +06; 5s ago
    Docs: man:systemd-sysv-generator(8)
    Process: 22496 ExecStart=/etc/rc.d/init.d/asterisk start (code=exited, status=0/SUCCESS)

    июл 25 10:07:07 localhost.localdomain systemd[1]: Starting LSB: Asterisk PBX...
    июл 25 10:07:07 localhost.localdomain asterisk[22496]: Starting asterisk:
    июл 25 10:07:07 localhost.localdomain systemd[1]: PID file /var/run/asterisk/ast....
    июл 25 10:07:07 localhost.localdomain systemd[1]: Failed to start LSB: Asterisk PBX.
    июл 25 10:07:07 localhost.localdomain systemd[1]: Unit asterisk.service entered ....
    июл 25 10:07:07 localhost.localdomain systemd[1]: asterisk.service failed.
    Hint: Some lines were ellipsized, use -l to show in full

    Будто такого сервиса и нет. Помогите в рещении проблемы.
    Астериск - asterisk-13.22.0
    CentOS - Linux localhost.localdomain 3.10.0-862.9.1.el7.x86_64 #1 SMP Mon Jul 16 16:29:36 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

    • Дмитрий

      Подтверждаю.
      service asterisk start
      Starting asterisk (via systemctl): Job for asterisk.service failed because a configured resource limit was exceeded. See "systemctl status asterisk.service" and "journalctl -xe" for details.
      [FAILED]

      [root@localhost asterisk-13.22.0]# systemctl status asterisk.service
      ● asterisk.service - LSB: Asterisk PBX
      Loaded: loaded (/etc/rc.d/init.d/asterisk; bad; vendor preset: disabled)
      Active: failed (Result: resources) since Tue 2018-07-31 09:00:54 MSK; 27s ago
      Docs: man:systemd-sysv-generator(8)
      Process: 21055 ExecStart=/etc/rc.d/init.d/asterisk start (code=exited, status=0/SUCCESS)

      Jul 31 09:00:54 localhost.localdomain systemd[1]: Starting LSB: Asterisk PBX...
      Jul 31 09:00:54 localhost.localdomain asterisk[21055]: ERROR: /usr/sbin/asterisk not found
      Jul 31 09:00:54 localhost.localdomain systemd[1]: PID file /var/run/asterisk/asterisk.pid not readable (yet?) after start.
      Jul 31 09:00:54 localhost.localdomain systemd[1]: Failed to start LSB: Asterisk PBX.
      Jul 31 09:00:54 localhost.localdomain systemd[1]: Unit asterisk.service entered failed state.
      Jul 31 09:00:54 localhost.localdomain systemd[1]: asterisk.service failed.

      • Руслан

        Такая же проблема

        • Сейчас проверю.

        • Проблему увидел. Только что попробовал собрать астериск и получил ошибку. Исправляется она добавлением ключа with-pjproject-bundled при конфигурации астериска. У меня в статье было:

          ./configure --libdir=/usr/lib64

          а теперь надо:

          ./configure --libdir=/usr/lib64 --with-pjproject-bundled

          После этого астериск собирается и запускается. Странно, что вы все пытались запустить астериск, хотя он просто не собрался и не установился. Ошибка была раньше.

          Подробнее об этой ошибке - https://community.asterisk.org/t/solved-compile-asterisk-13-22-0/75411/5

          • актуальнее:
            ./configure --with-pjproject-bundled --with-jansson-bundled
            - обе эти библиотеки рекомендуется устанавливать именно bundled с 13 Астера..

  145. Появилось парочка вопросов. Первый - как обновить? я говорю не про переход с 13 на 14 или 15, а про переход с 13.14 до 13.21 допустим (точно не помню какая щас там версия)
    И такой вопрос. Переодически стала выскакивать ошибка

    Call from peer '205' rejected due to usage limit of 1
    Failed to place call for device 205, too many calls

    При этом ни входящая ни исходящая связь не работает
    В гугле ничего внятного не нашёл по этому вопросу.

    Решается либо перенастройкой телефона, либо увелечением значения call-limit в настройках группы

    • Уточню что связь не работает именно на этом телефоне -_- По крайней мере звонки из наружи и наружу. Внутри как то не догадался проверить

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

      Call from peer ‘205’ rejected due to usage limit of 1
      Из текста ошибки понятно, что стоит ограничение на одну линию на пир. Эта линия чем-то занята. Надо либо смотреть, чем занята, либо увеличивать этот лимит.

      • не подскажите чем и как смотреть?

        • Если линия занята, значит по телефону кто-то разговаривает. Или работает какая-то служба на телефоне, которая занимает линию. Можно логи астериска посмотреть, можно просто на телефон глянуть, что там с ним не так. Линия просто так не может быть занята.

  146. И еще вопрос... Если схема такая: VPS где поднят asterisk -> Internet -> роутер -> 2 пк с софтофоном 3cx. Будут ли нормально работать звонки с одного пк на другой?
    Просто на моменте "Если у вас так же, то все в порядке. Чтобы протестировать звонки, нам нужно подключить двух абонентов. Настраивайте еще один телефон или софтофон. Проверяйте в списке подключенных пиров чтобы было 2 подключения и попробуйте позвонить друг другу. Если вы все сделали правильно, то локальные звонки должны работать." сложилась такая картина - если позвонить с одного номера на другой, то звонок проходит. Но - при нажатии на кнопку "ответить" в софтофоне на входящий вызов - на исходящем начинает идти время звонка, а на принимающем продолжается "вызов"... Сброс звонка проходит нормально при этом...

    • Почитав форумы возможно понял в чем причина... Возможно из-за роутера (MikroTik) - но так и не смог решить проблему (пробовал разные пробросы \ открытие портов). Перепробовал что советовали - но результата нет. Даже подключив trunk - звонки идут в обе стороны, но без возможности нормально "ответить" при входящих, и нет звука при исходящих звонках (например через zadarma на номер 1111). Что я делаю не так и как это исправить? :(

      • В общем разобрался - сейчас звонки нормально проходят как внутри сети (типа "локальные"), так и входящие \ исходящие через trunk.
        Вылечилось в моем случае (VPS где поднят asterisk -> Internet -> роутер -> 2 пк с софтофоном 3cx) через установку в sip.conf в [general] nat=yes, и удаление в шаблонах пользователей nat=no...

  147. При установке столкнулся с проблемой - make посл make menuselect, когда выбрали необходимые модули, не проходил и вываливался с ошибкой. Долго промучался, перечитал кучу форумов - как оказалось (или я все таки что-то не так делал) asterisk не устанавливается нормально на mariadb-10.*... В итоге установил с нуля систему и все нормально дальше установилось.
    А интересно - в борьбе со всякими ботами \ сканерами поможет назначение нестандартных портов для asterisk'a? И какие могут быть последствия \ подводные камни \ проблемы?

  148. Подскажите пожалуйста, как побороть эхо!

  149. Ох, не кидайте тапками. Статья годная.
    Не хотите проапгрейдить или написать ещё одну с WebRTC и тонкими клиентами на браузерах?
    Было бы очень интересно более опытными глаза почитать про ICE STUN сервера, и как эту муть настраивать.
    В голове только куски необработанной инфы, о sipml5, jssip и прочем)

  150. aleks.tyumen

    Один вопрос конфигурационные файлы sip и extensions вам удобнее будет посмотреть прямо на самом форуме, либо добавить их ссылкой предварительно сохранив в txt?

  151. aleks.tyumen

    Извиняюсь, сейчас все исправлю

  152. aleks.tyumen

    что то я вам писал писал сейчас сообщение со всеми конфигами оно не ушло и пустое. секунду

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

  153. Александр

    Локальные проходят а входящие нет. Абонент не доступен. Я вообще думаю что ошибка может в диал плане? С вами можно как то поговорить по этому поводу? Может icq или только через форум? Странно транк сам регистрируется нормально. Мне б разобраться сначала с настройками для исходящего. В файле sip.conf прописана регистрация у провайдера и два внутренних номера. В екстеншинс.конф прописан данный диалплан, между собой все работает а исходящие не работают. Уже неделю бьюсь.

    • Ошибка в диалплане. Я думаю, у вас транк, который зарегистрирован у провайдера назван одним именем, а обращаетесь вы к нему по другому имени. Поэтому он корректно регистрируется у провайдера, но звонки при этом не работают. Можете на форум выложить все свои конфиги (sip.conf и extensions.conf) Когда у меня будет время, я посмотрю их.

  154. Александр

    Всем доброго дня! Люди добрые, помогите , очень нуждаюсь в помощи, не понимаю уже в чем тут может быть дело. В общем пытаюсь с нуля установить и настроить самым примитивным вещам vicibox. версия ПО OpenSuSE Leap v.42.3 64-bit.Asterisk v.11.20.0-vici,ViciDial SVN Trunk v.2.14-628a build 170913-0908 revision 2815. В общем настраиваю sip телефонию Билайн. Вот на примере Самого элементарного у меня не получается. TRUNK поднял в конфигурации. файл extension создаю с нуля по вашей статье.
    [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}@9698033***)

    include => handup-sip

    ;Входящие звонки
    [call-in]
    exten => 9698033***,1,Dial(SIP/123)
    где 123, мой внутрений номер в этой системе, к которому я подключился через zoiper.

    при попытке куда либо позвонить выдает
    [May 8 17:19:46] -- Executing [89995496380@call-out:1] Dial("SIP/123-0000000e", "SIP/89995496380@9698033453") in new stack
    [May 8 17:19:46] WARNING[8505][C-00000016]: chan_sip.c:6066 create_addr: Purely numeric hostname (9698033453), and not a peer--rejecting!
    [May 8 17:19:46] WARNING[8505][C-00000016]: app_dial.c:2455 dial_exec_full: Unable to create channel of type 'SIP' (cause 20 - Subscriber absent)
    [May 8 17:19:46] == Everyone is busy/congested at this time (1:0/0/1)
    [May 8 17:19:46] -- Auto fallthrough, channel 'SIP/123-0000000e' status is 'CHANUNAVAIL'

    буду рад любой помощи, бьюсь уже неделю

    • Судя по логу, какая-то проблема с транком. Что-то где-то напутано с названиями. Ошибка в поиске ищется легко, вариантов ошибки может быть много. разбирайтесь аккуратно в конфигурации. Локальные звонки проходят? Входящие?

  155. Владимир

    Заинтересовал пункт про переадресацию на мобильный телефон, у вас описан случай если нету телефона, а можно ли реализовать когда есть номер, есть телефон, но по каким-то причинам он не ответил в заданное по умолчанию время и тогда звонок уходил на сотовый (например человек в отпуске или командировке)?
    Попробовал с помощью FoolowMe, но видимо не то делаю и отрабатывает общее правило call-out

    • Конечно можно. Вот пример:

      exten => 120,1,Dial(SIP/120,10,t)
      exten => 120,2,GotoIf($["${DIALSTATUS}" = "NOANSWER"]?:3)
      exten => 120,3,Dial(SIP/89161111111@mcn

      Звонок идет на внутренний номер 120, если 10 секунд никто не ответил, то идет переадресация на мобильный через транк mcn.
      Через DIALSTATUS можно на любой статус в линии выполнить какое-то действие. Я в своем примере при статусе нет ответа - NOANSWER, перехожу на 3-й шаг, где указано позвонить на мобильный. Можно, к примеру, на статус занято - BUSY, выполнить какое-то действие. Либо сказать что-то, либо перезвонить куда-то. В общем, тут можно очень сильно кастомизировать поведение астериска.

      • Владимир

        Я примерно что-то такое и делал, только не понял куда это вставлять чтобы для него срабатывало именно это правило а для других стандартное (вставлял перед общим правилом в call-out), в итоге у меня получалось что для всех и для него только стандартное и срабатывало или нужно вообще до call-out вставлять?

      • Владимир

        Попробовал и в call-out и до него и даже создал отдельную otpusk и все равно почему-то срабатывает общее правило call-out.
        Может я забыл упомянуть что должно не только при внешних но и при внутренних срабатывать это правило.

  156. Приветствую. Появился такой вопрос. Мейби поможешь - пользуемся астериском уже некоторое время. Зашёл разговор чтобы всю контору перевести на IP телефонию. Поднялся вопрос по покупке IP телефонов. Была кем то предложена идея использовать софтофон. Но у нас приимущественно используются терминальные машины. 3cx 6 вроде получилось запустить так(потестил на 2-х сеансах пока), но мейби есть другое какое то решение? )мейби встречал или использовал что то?

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

      • Можно использовать комп. наушники бюджетные :) рассматрвиаем просто разные варианты. У нас есть операторы которым предпочтительна гарнитура.
        Ещё такой вопрос. Какнибудь реализовывали телефонную книгу? Забил абонента 1 раз, и на всех аппаратах он определялся.

        • Адресная книга задача не простая. Зависит от аппаратов. Я делал так. В одних аппаратах была возможность загружать адресную книгу через xml файл. В качестве пути можно было указать web сервер. В итоге я в локальной сети положил на веб сервер xml файл и на всех аппаратах прописал к нему путь. Для изменения адресной книги редактировал этот xml файл, изменения забирали телефоны сами. В окончательном варианте файл формировался выгрузкой из офисной crm.

          • Я видел костыль через мускуль и диалплан:
            В мускуле ведётся база с номерами и именами.
            В идалплане прописывается преобразование номера в международный формат (О_о) и сравнение его с мускулем. Но как то сомневаюсь на счёт таких костылей.
            По поводу удалённого файла тоже читал, но такой способ подходит только для аппаратов с такой плюшкой. Если будут всё таки софтофоны - не пойдёт.

            • Так а как это сделать централизованно? Адресная книга зависит от типа аппарата, который используется. Везде она разная.

              Историю с mysql я видел, в том числе реализацию такую. Но это не адресная книга. Это просто красивое отображение имени звонящего, которое будет на экране аппарата. Хранение в mysql позволяет легко редактировать это имя, не залезая в настройки юзеров в астериск.

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

  157. Станислав

    После установки надо еще selinux вырубить. В статье по установке с freepbx это есть, а тут нет.
    В /etc/sysconfig/selinux прописать SELINUX=disabled и перезагрузить или выполнить setenforce 0

  158. Аноним

    Огромное спасибо за статью!

  159. Андрей

    Всем, здрасти! Кто нибудь знает, что делаю не так:

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

    Какие варианты я тестировал:
    exten => _103,n,Goto(${EXTEN}-${DIALSTATUS},1)
    exten => _103-ANSWER,1,Hangup
    exten => _103-NOANSWER,1,Playback(user-not-answer)
    и
    exten => _103,n,NoOp(Dial Status: ${DIALSTATUS})
    exten => _103,n,GotoIf($["${DIALSTATUS},1"="BUSY"]?busy:unavail)
    exten => _103,n(unavail),Hangup()

    • Мне тоже интересно решение этой задачи. Актуальная тема. Но готового решения у меня нет. Когда все получится, поделитесь рабочим вариантом.

  160. Отличная статья, спасибо автору! Подскажите такой момент, есть ли смысл Астер устанавливать из официальных репов (дистрибутив дебиан 9), или собирать вручную, как описали в статье? Какие плюсы собранного ?

    • В принципе, никаких, просто самая свежая версия. Если версия, расположенная в репозитории устраивает, лучше использовать именно ее.

  161. Здравствуйте! Вы бы могли мне сказать, а на виртуальном сервере с прямым внешним IP без NAT - как настроить порты?
    И второй вопрос, на виртуальном сервере могу ли я подключить несколько внешних линий? Спасибо!

    • 1. Порты не надо как-то особенно настраивать, если у вас внешний ip. Просто откройте их на фаерволе, или вообще его отключите, если не планируете настраивать ограничения доступа.
      2. Да, можете подключить сколько угодно внешних линий.

  162. Help! Застрял на соединении локальных абонентов, скопипастил листинги sip.conf и extensions.conf, клиенты подключаются нормально:

    debian-asterisk*CLI> sip show peers
    Name/username Host Dyn Forcerport Comedia ACL Port Status Description
    100/100 192.168.0.55 D No No 64812 OK (103 ms)
    101/101 192.168.0.31 D No No 55873 OK (111 ms)
    ...
    129 (Unspecified) D No No 0 UNKNOWN
    130 (Unspecified) D No No 0 UNKNOWN
    31 sip peers [Monitored: 2 online, 29 offline Unmonitored: 0 online, 0 offline]

    Yо при звонке один другому пишет:

    [Dec 15 13:45:02] NOTICE[897][C-0000001c]: chan_sip.c:26407 handle_request_invite: Call from '100' (192.168.0.55:64812) to extension '101' rejected because extension not found in context 'call-out'.

    Помогите разобраться.

    • В extensions.conf либо контекст называется не [call-out], либо он неправильно настроен. Этот же контекст настроен абоненту 100 в sip.conf.

      То есть ошибка означает, что не получается позвонить на номер 101, потому что в контексте call-out не описано правило, как позвонить.

    • Вы отредактировали скорее всего - extconfig.conf
      А нужно - extensions.conf
      Два дня бился сам)

    • Дмитрий

      Добрый день.
      Такая же ошибка и никак дальше не продвинуться
      [Mar 26 16:31:34] NOTICE[3024][C-00000005]: chan_sip.c:26805 handle_request_invite: Call from '101' (192.168.0.130:62506) to extension '100' rejected because extension not found in context 'call-out'.

      Проверил и extensions.conf и sip.conf - все как в статье
      Перезапускал сервис.
      Все безрезультатно. Клиенты подключаются, в системе видятся, но позвонить друг другу не могут.
      Help!

  163. Александр

    Отбой. Разобрался (была опечатка).

  164. Александр

    Добрый день!
    Сначала хотел сказать спасибо за ваш труд! Ваши материалы очень помогают.
    Во время настройки, было ли у вас такое:
    Файл Wav во время записи имеет всего 1кб, соответственно и MP3 получается размером в 1кб. Файлы сохраняются по пути:
    /var/www/html/calls
    Так-то все остальное работает(web панель показывает звонки и если в конфигурационном файле указать минимальный размер 0кб для отображения, то появляется кнопка воспроизведения). На что можно обратить внимание.
    Заранее спасибо!

  165. Сергей

    Странная какаая то ситуация. На входящем звук пишется в файл, все нормально.
    В исходящем на внешку и на внутренних звонках файл записи создается, но он пустой. Пробовал убрать из скрипта [macro-recording] убрать все что относится к преоброзованию на mp3. Wav создается таким же пустым (какой то мусор в заголовке)

    Вот приложил лог звонка (внутрений), может что подскажите?

    -- Executing [100@call-out:1] Macro("SIP/101-00000017", "recording,101,100") in new stack
    -- Executing [s@macro-recording:1] Set("SIP/101-00000017", "fname=1511269586.34-2017-11-21-18_06-101-100") in new stack
    -- Executing [s@macro-recording:2] Set("SIP/101-00000017", "monopt=nice -n 19 /usr/local/bin/lame -b 32 --silent "/mnt/calls/1511269586.34-2017-11-21-18_06-101-100.wav" "/mnt/calls/1511269586.34-2017-11-21-18_06-101-100.mp3" && rm -f "/mnt/calls/1511269586.34-2017-11-21-18_06-101-100.wav" && chmod o+r "/mnt/calls/1511269586.34-2017-11-21-18_06-101-100.mp3"") in new stack
    -- Executing [s@macro-recording:3] Set("SIP/101-00000017", "CDR(filename)=1511269586.34-2017-11-21-18_06-101-100.mp3") in new stack
    -- Executing [s@macro-recording:4] Set("SIP/101-00000017", "CDR(realdst)=100") in new stack
    -- Executing [s@macro-recording:5] MixMonitor("SIP/101-00000017", "/mnt/calls/1511269586.34-2017-11-21-18_06-101-100.wav,b,nice -n 19 /usr/local/bin/lame -b 32 --silent "/mnt/calls/1511269586.34-2017-11-21-18_06-101-100.wav" "/mnt/calls/1511269586.34-2017-11-21-18_06-101-100.mp3" && rm -f "/mnt/calls/1511269586.34-2017-11-21-18_06-101-100.wav" && chmod o+r "/mnt/calls/1511269586.34-2017-11-21-18_06-101-100.mp3"") in new stack
    -- Executing [s@macro-recording:6] Verbose("SIP/101-00000017", "Exit record") in new stack
    Exit record
    -- Executing [100@call-out:2] Dial("SIP/101-00000017", "SIP/100,10") in new stack
    == Begin MixMonitor Recording SIP/101-00000017
    == Using SIP RTP CoS mark 5
    -- Called SIP/100
    -- SIP/100-00000018 is ringing
    -- SIP/100-00000018 answered SIP/101-00000017
    -- Channel SIP/100-00000018 joined 'simple_bridge' basic-bridge
    -- Channel SIP/101-00000017 joined 'simple_bridge' basic-bridge
    -- Channel SIP/100-00000018 left 'simple_bridge' basic-bridge
    -- Channel SIP/101-00000017 left 'simple_bridge' basic-bridge
    == Spawn extension (call-out, 100, 2) exited non-zero on 'SIP/101-00000017'
    == MixMonitor close filestream (mixed)
    == Executing [nice -n 19 /usr/local/bin/lame -b 32 --silent "/mnt/calls/1511269586.34-2017-11-21-18_06-101-100.wav" "/mnt/calls/1511269586.34-2017-11-21-18_06-101-100.mp3" && rm -f "/mnt/calls/1511269586.34-2017-11-21-18_06-101-100.wav" && chmod o+r "/mnt/calls/1511269586.34-2017-11-21-18_06-101-100.mp3"]
    == End MixMonitor Recording SIP/101-00000017

    • А сами звонки нормально проходят? В логе никакого криминала не вижу.

      • Сергей

        Абсолютно норимально,никаких проблем.... в чем и заковырка. Может как то можно дополнительно в диалплане на логирование ловушек наставить?

        • Сергей

          Вопрос снят. Проблема была банальная, не докрутил по настройкам iptales. Сам себе злобный Буратино...
          Извиняюсь за беспокойство.

          • Не понимаю связи с iptables. В чем конкретно была проблема? Разговоры же нормально шли.

  166. Как сделать, чтобы отображался статус присуствия, как в скайп?

  167. Да действительно выход был через 7, но удобнее помоему пользоваться через 8.

  168. Настроил всё по инструкции, но почему то не идут исходящие звонки, на эхо тест звоню всё отлично а вот на любой городской или мобильный через 8 не идёт, если на мобильный то говорит что "направление не существует". Со входящими всё ОК!

    • Логи надо смотреть. Кто это говорит, сам астер или оператор связи. Если астер, то диалплан проверять, если оператор связи, то смотреть, какие у него правила набора. Возможно он ждет звонок через 7, а он идет через 8. Так часто бывает.

  169. Имелся установленный mssql, решил задействовать. Для меня пока линукс новое...? надо попробовать mysql

    • Если настройку астериска осилили, то уж поставить и подключить его к mysql дело несложное. К тому же на сайте все есть, да даже в этой статье.

  170. И кстати вопрос ещё. :) я использую ms sql server туда заливаю статистику звонков. У меня не получилось добавлять имя файла записи, это нельзя сделать или я не смог разобраться?

    • Думаю можно, просто не так, как у меня описано в статье. Я с mssql никогда не снюхивал ничего из линукс, так что не подскажу. Да я и смысла не вижу использовать какую-то внешнюю БД. Тут нагрузки никакой нет, но зато удобно, когда и сам сервер астера и бд находятся на одной виртуалке. Забэкапил и развернул всю систему, она сразу же готова к работе. А какой смысл во внешней базе mssql, кроме лишних проблем? Я бы установил локально mysql и не мучался.

  171. Через очереди.

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

    • А как на разных секретарей идет перенаправление? Через очередь? Или они просто перечислены один за другим в диалплане? Тут я не знаю, как подсказать, надо пробовать. Думаю, это можно как-то исправить, но надо разбираться.

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

  173. Добрый день.

    Ситуация такая, если мне звонят снаружи, если не вводить добавочный номер, то входящий звонок переводится на секретаря, в логах вместо номера на кого переведен входящий вызов указан символ "t", как сделать что бы указывался конечный номер?

    В остальных случаях все корректно фиксируется.

    • Так а какой номер вы хотите увидеть? Они же номер не вводят, звонок уходит на секретаря, номер которого и так известен. Если нужно изменить вывод вместо "t" на номер секретаря, то тут простого решения я не вижу. В данном случае "t" это направление звонка, которое и фиксируется в статистике, ведь звонок на самом деле на "t" и уходит.

  174. Владимир

    Автору огромнейший респект, такой подробной и внятно написанной статьи я еще не встречал!!!
    Не нашел правда ответа на один вопросик, а как нибудь можно с консоли или еще как создать 3cxconfig для android 3CX? Все мне известные методы это прикручивать веб морду, чего я честно не очень хочу.

  175. Алексей

    Наткнулся на вашу инструкцию, и прочитав подумал, в старых инструкциях везде был пак такой - астер + libpri + dahdi, тут у вас иначе...объясните, что давал libpri и dahdi и почему сейчас он не используется для работы в новых версиях астера (например как в вашем случае 13) и зачем pjproject с jansson? (p.s. только начал изучать VOIP телефонию и поэтому от стольких мануалов, что я пересмотрел, голова кругом)

    • Алексей

      Кстати в предыдущей статье про астер и pbx libpri и dahdi использовался

    • libpri и dahdi используются для подключения к астериску плат расширения. Лично мне все это уже не нужно. Я стараюсь всю телефонию настраивать исключительно на sip. Подобные платы были популярны раньше, в переходный период, когда астериск стыковали с аналоговой и цифровой телефонией. Сейчас все в основном переходят на IP.

      • Алексей

        получается если я буду использовать аналоговые устройства мне данные пакеты пригодятся? в принципе понял зачем jansson - во время компиляции астера версии 13/14 он нужен был :))

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

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

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

  176. Михаил

    Здравствуйте, спасибо за статью, на многое открыли глаза.
    Единственное что: не показывает сохраненный звонок на web интерфейсе.
    в config.php изменил на свою папку и все равно без изменений.

    • Михаил

      Если ввести ip Сервера/records то файлы видны хоть и в wav.
      А вот через веб сервер их не видно

      • Михаил

        заработало. теперь проблема осталась только в том, что не конвертирует из wav в mp3

  177. сама разобралась. все ок.

  178. Добрый день. Вы можете подсказать, как должны выглядеть настройки sip.conf, если я не подключаюсь к провайдеру, а внешние номера прокидываю на sip-шлюз (плата TM.IP) в нашей АТС. Для одного номера (2055) работает, а вот как сделать чтобы и на другие номера можно было звонить? номера серии 7XXX - sip, 2055 - номер УПАТС. конфиг выглядит так:
    Extensions.conf

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

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

    [call-out]

    exten => _XXXX,1,Dial(SIP/${EXTEN})
    include => handup-sip
    exten => _XXXX.,1,Dial(SIP/${EXTEN}@2055)

    [call-in]
    exten => 2055,1,Dial(SIP/7000)

    sip.conf

    [general]
    externaddr=192.168.0.140: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

    [7000](managers-phones)
    callerid="Number 7000"
    [7001](managers-phones)
    callerid="Number 7001"
    [7002](managers-phones)
    callerid="Number 7002"

    [2055]
    host=192.168.0.140
    insecure=invite,port
    type=friend
    fromdomain=192.168.0.140
    disallow=all
    allow=alaw
    dtmfmode=auto
    secret=123
    defaultuser=2055
    trunkname=2055
    fromuser=2055
    callbackextensions=2055

  179. tar -xjvf pjproject-2.*
    у меня не отрабатывает, не подскажите что это?
    пишет
    [root@MiWiFi-R1CL-srv src]# wget http://www.pjsip.org/release/2.4/pjproject-2.4.tar.bz2
    --2017-09-15 18:25:41-- http://www.pjsip.org/release/2.4/pjproject-2.4.tar.bz2
    Resolving http://www.pjsip.org (www.pjsip.org)... 207.38.94.48
    Connecting to http://www.pjsip.org (www.pjsip.org)|207.38.94.48|:80... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 4631778 (4.4M) [application/x-bzip2]
    Saving to: ‘pjproject-2.4.tar.bz2.4’

    100%[======================================>] 4,631,778 853KB/s in 5.9s

    2017-09-15 18:25:47 (763 KB/s) - ‘pjproject-2.4.tar.bz2.4’ saved [4631778/4631778]

    [root@MiWiFi-R1CL-srv src]# tar -xjvf pjproject-2.* tar (child): bzip2: Cannot exec: No such file or directory
    tar (child): Error is not recoverable: exiting now
    tar: Child returned status 2
    tar: Error is not recoverable: exiting now

    • Напишите полностью имя файла - pjproject-2.4.tar.bz2.4. Не понял только, почему на конце .4, скорее всего вы этот файл скачали уже 4 раза, поэтому команда tar -xjvf pjproject-2.* не понимает, какой из этих файлов нужно распаковать.

      • таже беда, переустановил cent
        php-pdo.x86_64 0:5.4.16-42.el7
        php-php-gettext.noarch 0:1.0.12-1.el7
        php-tcpdf.noarch 0:6.2.13-1.el7
        php-tcpdf-dejavu-sans-fonts.noarch 0:6.2.13-1.el7
        php-tidy.x86_64 0:5.4.16-7.el7
        pixman.x86_64 0:0.34.0-1.el7
        pixman-devel.x86_64 0:0.34.0-1.el7
        procmail.x86_64 0:3.22-36.el7
        pulseaudio-libs.x86_64 0:10.0-3.el7
        rsync.x86_64 0:3.0.9-18.el7
        slang-devel.x86_64 0:2.2.4-11.el7
        subversion-libs.x86_64 0:1.7.14-11.el7_4
        t1lib.x86_64 0:5.1.2-14.el7
        trousers.x86_64 0:0.3.14-2.el7
        unbound-libs.x86_64 0:1.4.20-34.el7
        uuid.x86_64 0:1.6.2-26.el7
        vim-common.x86_64 2:7.4.160-2.el7
        vim-filesystem.x86_64 2:7.4.160-2.el7
        wavpack.x86_64 0:4.60.1-9.el7
        xorg-x11-proto-devel.noarch 0:7.7-20.el7
        xz-devel.x86_64 0:5.2.2-1.el7
        zlib-devel.x86_64 0:1.2.7-17.el7

        Complete!
        [root@MiWiFi-R1CL-srv ~]# cd /usr/src
        [root@MiWiFi-R1CL-srv src]# wget http://www.pjsip.org/release/2.4/pjproject-2.4.tar.bz2
        --2017-09-15 12:56:00-- http://www.pjsip.org/release/2.4/pjproject-2.4.tar.bz2
        Resolving http://www.pjsip.org (www.pjsip.org)... 207.38.94.48
        Connecting to http://www.pjsip.org (www.pjsip.org)|207.38.94.48|:80... connected.
        HTTP request sent, awaiting response... 200 OK
        Length: 4631778 (4.4M) [application/x-bzip2]
        Saving to: ‘pjproject-2.4.tar.bz2’

        100%[======================================>] 4,631,778 1.27MB/s in 3.6s

        2017-09-15 12:56:04 (1.22 MB/s) - ‘pjproject-2.4.tar.bz2’ saved [4631778/4631778]

        [root@MiWiFi-R1CL-srv src]# tar -xjvf pjproject-2.*
        tar (child): bzip2: Cannot exec: No such file or directory
        tar (child): Error is not recoverable: exiting now
        tar: Child returned status 2
        tar: Error is not recoverable: exiting now
        [root@MiWiFi-R1CL-srv src]# tar xjvf pjproject-2.*
        tar (child): bzip2: Cannot exec: No such file or directory
        tar (child): Error is not recoverable: exiting now
        tar: Child returned status 2
        tar: Error is not recoverable: exiting now
        [root@MiWiFi-R1CL-srv src]#

        на 6.4 отрабатывали следующие
        wget http://downloads.asterisk.org/pub/telephony/dahdi-linux-complete/dahdi-linux-complete-current.tar.gz
        wget http://downloads.asterisk.org/pub/telephony/libpri/old/libpri-1.4.15.tar.gz
        wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-11-current.tar.gz
        d) Распаковываем скаченные архивы:
        tar zxvf dahdi-linux-complete*
        tar zxvf libpri*
        tar zxvf asterisk*

        • Я же написал, используйте полное имя файла в команде распаковки, а не маску со звездочкой на конце.

          • да, но перед этим советую проделать следующее, тогда точно будет работать
            yum install -y gcc gcc-c++ lynx bison mariadb-devel mariadb-server mariadb gmime-devel psmisc php php-mysql php-pear php-mbstring yum install tftp-server httpd make ncurses-devel libtermcap-devel sendmail sendmail-cf caching-nameserver sox newt-devel libxml2-devel libtiff-devel audiofile-devel gtk2-devel subversion kernel-devel yum install kernel-devel-$(uname -r) git subversion kernel-devel php-process crontabs cronie cronie-anacron wget vim php-xml uuid-devel libtool sqlite-devel libuuid-devel bzip2
            systemctl enable mariadb.service systemctl start mariadb.service

  180. Добрый день!
    очень помогают ваши статьи. Спасибо вам за этот труд.
    Все получалось до пункта "запись разговора", а именно на команде
    # tar zxvf lame-3.*
    текст ошибки:
    /usr/src# tar zxvf lame-3.*
    tar (child): lame-3.98.4: Функция read завершилась с ошибкой: Это каталог
    tar (child): Начало ленты, завершение работы
    tar (child): Error is not recoverable: exiting now

    gzip: stdin: unexpected end of file
    tar: Child returned status 2
    tar: Error is not recoverable: exiting now

    Я новичок и в основном делаю все по вашим командам, большинство не понимая. но все таки пытаюсь разобраться.
    Не могли бы вы мне помочь, что пошло не так?
    и если не трудно можете привести пример файла extensions.conf в варианте, если звонки будут просто писаться в какую-то папку, без конвертирования в mp3 и без заморочек с БД.

    • tar (child): lame-3.98.4: Функция read завершилась с ошибкой: Это каталог

      Эта ошибка говорит о том, что имя файла с маской "lame-3.*" возвращает имя каталога, а не файл архива. Вместо lame-3.* напишите полностью имя скачанного файла.

      • Спасибо помогло.
        но теперь ошибка на команде #make

        Makefile:306: ошибка выполнения рецепта для цели «xmm_quantize_sub.lo»
        make[3]: *** [xmm_quantize_sub.lo] Ошибка 1
        make[3]: выход из каталога «/usr/src/lame-3.98.4/libmp3lame/vector»
        Makefile:489: ошибка выполнения рецепта для цели «all-recursive»
        make[2]: *** [all-recursive] Ошибка 1
        make[2]: выход из каталога «/usr/src/lame-3.98.4/libmp3lame»
        Makefile:312: ошибка выполнения рецепта для цели «all-recursive»
        make[1]: *** [all-recursive] Ошибка 1
        make[1]: выход из каталога «/usr/src/lame-3.98.4»
        Makefile:240: ошибка выполнения рецепта для цели «all»
        make: *** [all] Ошибка 2

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

          • В любом случае спасибо. в остальном проблем не возникло.
            Для таких новичков как я, не хватает пояснений по каждой команде. Но тогда статья удвоится в объеме...
            Успехов Вам.

  181. На виртуальной машине поднял сервер Астерикса за натом. При звонке с одного софтофона на другой случилась проблема. Не было слышно 1 абонента. Звонил шел через внешний ип по внутреннему номеру. 100 слышно, 101 нет. пробовал directmedia, пробросы портов на роутере, отрубал iptables, а помогло указание внутренней под сети сервера в sip.conf - localnet=192.168.1.0/255.255.255.0 над externaddr

    • дополнение для sip.conf для поддержки видео звонков.

      [general]
      videosupport=yes

      [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
      allow=h261
      allow=h263
      allow=h263p

  182. Здравствуйте! Столкнулся с такой проблемой: при попытке состыковать астериск и MySql через ODBC, по написанному в Вашей статье образцу, получаю ошибку: res_odbc.c:962 odbc_obj_connect: res_odbc: Error SQLConnect=-1 errno=-201315904 [iODBC][Driver Manager]MySQL: cannot open shared object file: No such file or directory. При этом isql -v MYSQL-asterisk asterisk_user 12345678 спокойно соединяется с БД.

  183. Статья супер! Пройдя поэтапно получилось разобраться в астере, и начал понимать конфиги. Перед этим пробовал freepbx, так и не смог совладать, с конфигами както проще, знаешь где что. Поставили задачу по переезду коллцентра на свое железо, благо всего 6 опеаторов работает.

    Один вопрос. Не играет приветствие, ни Background, ни Playback. В трубке тишина, гудков тоже нет.
    wav конвертил, брал готовые, нет звука. В чем проблема может быть? Ставил все по статье, ничего лишнего, из коробки.

    ;голосовое приветствие
    [ivr-main]
    exten => s,1,Set(CALLERID(name)=ZADARMA)
    exten => s,2,Answer()
    exten => s,n,Playback(queue-callswaiting) ;/etc/asterisk/ivr/welcome
    exten => s,n,Queue(queue-5zvezd,Tt)

    • Надо включить full лог и посмотреть на сообщения в момент, когда должно проигрываться приветствие. Скорее всего что-то с музыкальными файлами - либо формат не тот, либо путь к файлу не правильно указан.

      • Подставлял родные мелодии из самого астера. Также тишина. В логах написано что типа играет.
        == Using SIP RTP CoS mark 5
        -- Executing [zadarma@zadarma-in:1] BackGround("SIP/zadarma-00000015", "/etc/asterisk/ivr/welcome_sold") in new stack
        -- Playing '/etc/asterisk/ivr/welcome_sold.slin' (language 'ru')
        -- Executing [zadarma@zadarma-in:2] Dial("SIP/zadarma-00000015", "SIP/100") in new stack
        == Using SIP RTP CoS mark 5
        -- Called SIP/100
        -- SIP/100-00000016 is ringing
        == Spawn extension (zadarma-in, zadarma, 2) exited non-zero on 'SIP/zadarma-00000015'
        в папке лежит wav файл, в логах slin. Вот это пока не понятно, вроде как на лету декодит астер.

  184. Большое спасибо за подробную статью! Очень познавательно и полезно.
    Скажите пожалуйста, правильно ли я понимаю, что использование внешнего SIP-провайдера (zadarma в примере) опционально? Т.е., как я понял, необходимо для связи нашего Астерикса с ТФОП?
    Например, можно ли поднять Астерикс на машине с белым IP, абоненты А и Б через интернет подключены к этому Астериксу. Возможно ли абоненту А звонить через городскую линию абонента Б?

  185. виктор

    и спасибо за суперский мануал!

  186. Виктор

    + exten => _X!,1,HangUp() это же наверное можно вписать в блок [default] и не испоьовать include верно?

  187. Виктор

    День добрый в инете не нешел подробностей по этой строчки exten => _X!,1,HangUp()
    почему именно так вешаете трубку?
    конкретно два вопроса
    1) что даёт восклецательный знак?
    2) почему приоретет 1 а не n ?
    заранее спасибо

  188. Александр

    Здравствуйте.
    А не могли бы вы написать такую же подробную статью по отправке и приему факсов ..и при]м факса на емейл? спасибо

    • Я с факсами вообще не связываюсь. Мороки много - толку мало. Факс отжившая технология, вообще не вижу смысла ими пользоваться. Самый простой вариант - купить voip шлюз с аналоговой линией и подключить факс к нему. Хотя еще проще - воспользоваться онлайн сервисом каким-нибудь по приему факса. Я делал так, когда факс просили. Но обычно я отговариваю от факса. Зачем он нужен?

      • Аноним

        Аналоговая линия вообще не вариант. Факс все еще востребован в глубинке. А вот любой SIP провайдер с нормальной поддержкой T38 поможет, + допиливаение астериска

  189. Здравствуйте. Подскажите пожалуйста, у нас настроена атс Астериск. настроено 6 удаленных офисов. через впн. Телефоны грандстрим. Так вот сегодня на одной точке, возникла проблема. Если во время входящего разговора, приходит ещё один внешний звонок, то оператор перестаёт слышать абонента с которым уже разговаривает.
    Куда смотреть? интересно то. что если звонить внутри сети. т.е. разговаривает оператор точки 1 с оператором точки 2 и звонит на точку1 оператор точки3, то никаких проблем со звуком нет. Только при внешних звонках.

    • Даже нет идей. Если раньше все работало, то надо смотреть, что изменилось за последнее время.

      • Ничего не менялось. в CDR репортсе, в это время нет записей о том. что я по внутренниму номеру разговаривал с проблемной точкой. А мы говорили и не раз и не по 10 секунд.
        А сегодня история повторилась. Я попытался с внешнего телефона дозвониться до точки, сработал автоответчик и когда подняли трубку, я кроме оператора. слышал длинные гудки. как будто мне ещё не ответили.

  190. Здравствуйте!
    Хотелось бы в первую очередь поблагодарить автора за действительно замечательную статью - СПАСИБО!
    Как полный новичок в IP-телефонии хотел бы спросить у гуру "куда и где копать" чтобы у локального пользователя заработал телефон в следующей ситуации:
    После выхода с больничного у локального абонента перестала работать связь (ни туды и ни сюды). Забрался через браузер в FreePBX и в логах по нему нашел такую запись:
    "... LocalAddress="IPV4/TCP/0.0.0.0/5038",RemoteAddress="IPV4/TCP/127.0.0.1 ..."

  191. Дмитрий

    Я, конечно, извиняюсь, может быть вы мне подскажете, пол интернета перерыл.
    Мне нужно, чтобы ivr произносил числа (в т.ч. и отрицательные и дробные) из таблицы mysql на том же сервере (ну или на другом, значения не имеет).
    Сижу, всю голову поломал.
    Как можно написать это правило в extension.conf?
    Я бы туда ещё и рубли с копейками запихнул, которые в say.conf пытаюсь приделать.
    В интернете есть много примеров с произнесением времени и даты, но вот с деньгами проблема. Может, хоть немного поможете? Больше не к кому обратиться, за что зацепиться.
    Спасибо!

    • Даже не знаю, с какой стороны подходить к решению данной задачи. Ни разу не сталкивался.

    • Аноним

      Я думаю вам путь в AGI. На хабре есть описание автоматизации текстов 1С + Астериск

  192. Дмитрий

    А ещё, может кому-то потребуется, у меня никак asterisk не соединялся по odbc с mysql. Выдавал ошибку:
    res_odbc.c:958 odbc_obj_connect: res_odbc: Error SQLConnect=-1 errno=1045 [unixODBC][MySQL][ODBC 5.2(w) Driver]Access denied for user 'asterisk_user'@'localhost' (using pass
    Проблема оказалась в том, что пароль пользователя asterisk_user содержал точку с запятой.
    Я так, понял, спецсимволов быть не должно.

    • Они могут быть, но их надо экранировать. Если нет большой необходимости, лучше некоторые спецсимволы не использовать. Например, с # обычно проблем не бывает, а вот с запятыми, кавычками очень часто.

  193. Дмитрий

    Разобрался.
    Почему-то после изменении необходимых параметров логина/пароля в файлике /var/www/html/inc/config.inc.php всё устранилось.
    А я правил /etc/phpMyAdmin/config.inc.php :(
    Допишите пожалуйста в статье полный путь этого файла..

    И ещё... Огромное вам спасибо за ваш труд.

  194. Дмитрий

    Добрый день!
    Что только не делал, выскакивает ошибка в веб-интерфейсе детализации звонков:
    PDO::errorInfo(): SQLSTATE[28000] [1045] Access denied for user 'asterisk'@'localhost' (using password: YES)
    причём user у меня asterisk_user, всё делал по вашим конфигам.
    Где рыть, что копать? В логах ничего нет. Может, где-то можно включить режим логирования debug, и это что-то даст?...

  195. Вопрос дилетанта: "Вот поставили мы PJSIP и выбрали его в menuselect." Это означает что он по умолчанию на нем будет работать? Я просто почему спрашиваю, вот к примеру регистрирую ростелеком, не угадал с пароле и ошибка выдалась: " WARNING[2397]:chan_sip.c:24286 handle_response_register: Forbidden - wrong password on authentication for REGISTER for '213162' to '10.10.10.100'"
    И в ошибке четко видно "chan_sip.c", разве там не должен быть pjsip? Как проверить что все работает на PJSIP ?

    • Выбор зависит от конфига, как и где юзер заведен, но поверьте вам PJSIP не нужен:)

  196. Камрад! Замечательная статья, настроил нужное по ней, но остались ошибки. Часть ошибок я нагуглил, но часть осталась, не могу сообразить, как исправить. Не сталкивались с такими ошибками:

    [Feb 8 13:52:59] WARNING[9416]: res_odbc.c:526 load_odbc_config: The 'pooling', 'shared_connections', 'limit', and 'idlecheck' options were replaced by 'max_connections'. See res_odbc.conf.sample.
    [Feb 8 13:52:59] WARNING[9416]: res_odbc.c:526 load_odbc_config: The 'pooling', 'shared_connections', 'limit', and 'idlecheck' options were replaced by 'max_connections'. See res_odbc.conf.sample.
    [Feb 8 13:52:59] NOTICE[9416]: res_odbc.c:617 load_odbc_config: Registered ODBC class 'asterisk' dsn->[MySQL-asterisk]
    [Feb 8 13:52:59] NOTICE[9417]: sorcery.c:1409 sorcery_object_load: Type 'system' is not reloadable, maintaining previous values
    [Feb 8 13:52:59] WARNING[9416]: res_phoneprov.c:1231 get_defaults: Unable to find a valid server address or name.
    [Feb 8 13:52:59] ERROR[9416]: ari/config.c:314 process_config: No configured users for ARI
    [Feb 8 13:52:59] NOTICE[9416]: pbx_lua.c:1640 load_or_reload_lua_stuff: Lua PBX Switch loaded.
    [Feb 8 13:52:59] WARNING[9416]: res_config_pgsql.c:1355 parse_config: PostgreSQL RealTime: Not connected
    [Feb 8 13:52:59] NOTICE[9416]: chan_skinny.c:8424 config_load: Configuring skinny from skinny.conf
    [Feb 8 13:52:59] NOTICE[9416]: cel_custom.c:97 load_config: No mappings found in cel_custom.conf. Not logging CEL to custom CSVs.
    [Feb 8 13:52:59] NOTICE[9416]: app_queue.c:8839 reload_queue_rules: queuerules.conf has not changed since it was last loaded. Not taking any action.

    • Так это же не ошибки, а оповещения и предупреждения. В принципе, по тексту и так понятно, о чем идет речь. Это модули, которые не настроены. По хорошему их надо отключать и не загружать. Но у меня никак руки не доходят в них разобраться. И так работает :)

      • Понял, спасибо! Да все работает, но смущали эти предупреждения. А понял что это модули, тока часть отключить не получалось, но как это обычно бывает, как только я опубликовал вопрос, так тут же что-то нашлось в инете. Вот тут - http://wikiadmin.net/asterisk/ парень описал какие модули отключал у себя. Попробую сравнить имена в его списке и отключить у себя такие.

      • Смушают оставшиеся 3 строки:
        WARNING[9416]: res_odbc.c:526 load_odbc_config: The 'pooling', 'shared_connections', 'limit', and 'idlecheck' options were replaced by 'max_connections'. See res_odbc.conf.sample.
        NOTICE[9416]: res_odbc.c:617 load_odbc_config: Registered ODBC class 'asterisk' dsn->[MySQL-asterisk]
        ERROR[9416]: ari/config.c:314 process_config: No configured users for ARI

        по 1-му и 2-ому, мы же в мануале настраивали odbc конекты, если я отключу их, по идее работать не будет же то что настраивали с их помощью.
        по 3-ему Это ошибка непонятная, похожего модуля не нашел.

  197. Добавить стоить в sip.conf alwaysauthreject=yes, это при попытках брутфорса будет показывать всегда 401 Не авторизован. В связке с fail2ban который все же имеет ряд дырочек будет плюсом.

  198. А так вы молодец! Мне бы такую статью года 2 назад в руки! В общем всяческие похвалы!

  199. Только не пойму зашем вам pj если у вас только SIP, и зачем у вас в конфиге g729 коммерческий кодек которого, если мне склероз не изменяет, его в обычной поставке астериска нет :)

  200. 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

    И влетаем на самые распространенные грабли с астериском за Nat, а потом курим почему голос ходит в одну сторону, не? :)

    • А в чем тут проблема? Сейчас нет времени вникать в суть, но у меня с натом не было каких-то особых проблем с iptables.

      • Данный проброс дает возможность подключиться SIP клиенту из вне. Далее он подключился со своего IP(SIP_IP) к Вашему WAN_IP. Тут проблем нет.
        При звонке будет попытка установить соединение SIP_IP к WAN_IP это пройдет на ура. А в обратную сторону не пойдет потому что астериск будет отправлять "голос" на SIP_IP в ответ.
        А так проблема не в Nat. А с самим RTP.

        • ну кроме случаев если у вас SIP_IP это внешний белый IP. В таком случае проблем не будет

        • Вечером приведу примеры работающих серверов с реальными примерами iptables, сравним.

          • Да, я посмотрел потом на конфиг астера что Вы приводите и там стоит canreinvite=no, он как раз решает проблему. Правда он устарел еще в 11м астериске. Теперь используется Directmedia

            • Это не решение проблемы, так как трафик (s)rtp пойдет в обход астера, а это болт на запись. externip в руки.

  201. Zerox, благодарю за статью! Довольно доходчиво и понятно описаны основы. После прочтения за пару часов поднял тестовый астер, и что самое главное, я понял , что я сделал, и как это работает. (Я новичок, который никогда не занимался телефонией в принципе).
    Спасибо Вам огромное!

    • Спасибо за отзыв. Я рад, что у меня получилось задуманное. Целью было написать наиболее понятным для новичка языком, как настроить функциональную и законченную систему телефонии на базе asterisk.

      • Не очень получилось. Непонятно самое главное - взаимодействие со сторонними программами - Задарма и ЗСХ. Как чего и зачем. Лично я подошел к этому пункту и пошел искать в другом месте . (какая то глупая приписка про перс данные, кто вам ее посоветовал? )

  202. Александр

    Еще по записи звуков хотел бы поправить:
    1. Не понятно, зачем нужна первая строка? NoOp() в данном случае ничего не делает, вместо этой команды логичнее поставить Answer()
    2. Перед командой Record() нет смысла в Playback(beep). Команда Record, сгенерирует beep на канале, перед началом записи

    • Спасибо за содержательные замечания. Я проверю информацию и исправлю статью, как будет возможность.

    • NoOp() - Эта команда выводит содержимое переменной без ее выполнения, то есть, Вы можете написать так:
      NoOp(${CALLERID(num)}) - и при просмотре в консоли лога Астериска будет выведено содержимое этой переменной
      NoOp(${EXTEN}) - тоже самое, вы в консоли увидите вызываемый экстеншен. Для отладки в основном используется

  203. Вопрос снимается) переименовал каталог и авторизация ушла:) чтото в апачах и /var/www/html допилить забыл.

  204. Доброго дня. А можете подсказать откуда же запрашивается авторизация у свеже-установленного модуля статистики ? все перекопал. авторизацию сам не настраивал...

  205. Александр

    Отличная статья. Спасибо.
    в контексте [ivr-main]:
    ;Если введен не существующий номер, то говорим об этом и отправляем в начало приветствия
    exten => _XXX,2,Playback(privacy-incorrect)
    exten => _XXX,3,Goto(ivr-main,s,1)
    Есть специальный экстеншн "i" - Вызывается, при попытке вызова неизвестного екстеншена.

    • Спасибо за дополнение. Я знаю про него, иногда использую. Для остальных, речь идет вот о чем. Просто после:
      exten => t,1,Dial(SIP/100)
      можно добавить например вот так:
      exten => i,1,Dial(SIP/100).
      И звонок уйдет на номер 100, если ввели неправильно внутренний номер.
      Так даже более правильно будет, чем то, что у меня сейчас, но я почему-то в статье сделал таким образом. Не помню почему.

      • И почти правильно делали, exten => i,1,Dial(SIP/100). это не отработает и будет сброс звонка. Эта проблема ранее не однократно обсуждалась. В данном случае нужно выпольнить по ошибке переход в определенный контекст, и из него уже выполнить набор абонента.

  206. в конструкции
    exten => t,1,Macro(recording,${CALLERID(num)},${EXTEN})
    exten => t,n,Queue(secretary,t)
    есть один недостаток.
    Если в очереди 2 телефона секретаря, то в базу данных будет писаться два разговора.
    Для примера из статьи 100 и 130. Если трубку возьмет 100, то 130 будет отображаться в cdr viewer не отвеченным. Если два телефона - в принципе не проблема... если в очереди 10-20-30 тел, то при одном звонке - 9 лишних записей - немножко накладно по использованию ресурсов. Как обойти данную проблему еще не нашел решения. Если у кого-то есть наработки - намекните.

    • Да, любопытно. Я не сталкивался с этим. Я стараюсь запись не включать, там, где она явна не нужна. Не стоит забывать про УК РФ, Статья 138. Без ведома людей, записывать их нельзя. Нужно предупреждать об этом и сотрудников компании, и их абонентов.

    • Максрос использовать непосредственно в очереди как вариант. т.е. в queue.conf непосредственно

  207. Владимир

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

  208. точно так же все настроил но почему то выход в город только через +7 или 7, как 7ку заменить на 8ку?

    • Это от оператора связи зависит. Заменить 7 на 8 можно в диалплане. В интернете без проблем можно найти пример, у меня нет под рукой.

  209. Владимир

    запретить с них вызовы

    • exten => _8XX/_001xxxxx,1,Hangup()

      такой конструкцией отбей. первое номер на который звонят (в данном случае шаблон), второе номер с которого звонят (тоже шаблон) - отбить, или любое действие какое ты хочешь.
      В данном примере при звонке на номера с 800 по 899 с номеров 001(00000-99999) будет положена трубка. Если я не так тебя понял, то шаблоны можно поменять местами.
      Причем тут iptables вообще непонятно - он нужен только для разруливания кто может к твоему астериску получить доступ.

  210. Владимир

    Здравствуйте я новичек

    В Asteriske хочу блокировать все номера с префиксом 001xxxxx, как мне это сделать или это нужно с делать с помощью iptables?

    заранее спасибо

    • Что значит блокировать номера? Запретить на них звонить, или запретить с них вызовы?

    • и советую почитать Asterisk: The Future of Telephony.Хотя бы 5 главу - Основы диаплана. Книга конечно старенькая - последняя редакция 2009 года, если не ошибаюсь, но десяток страниц даст вам много пищи для размышлений и понимания того, что описано в статье. Написано конечно хорошо, но тупо копипастить не годится - вы должны понимать, что делаете. Тогда и ошибок не будет. И не забывайте, что это деньги. Были случаи, когда неправильные настройки и защита астериска приводили к многотысячным счетам за телефонию.
      Судя по вашему вопросу по iptables - почитайте обязательно по защите сервера.

  211. Разобрался и с отсутствием файлов... в config.inc.php устанавливается размер файла, с которого файл не считается отсутствующим. Поэтому мои коротенькие тестовые звонки и не отображались в панели.
    Спасибо огромное за статью. Весьма подробно, а ко всему еще и позволило не только тупо накопипастить, но еще и изучить некоторые вопросы самостоятельно, поняв смысл написанного выше.

  212. Все хорошо, кроме одного момента - вылезла ошибка с кодеками.
    [Nov 14 17:38:43] WARNING[28879][C-00000000]: translate.c:481 ast_translator_build_path: No translator path: (starting codec is not valid)
    [Nov 14 17:38:43] WARNING[28879][C-00000000]: translate.c:481 ast_translator_build_path: No translator path: (starting codec is not valid)
    [Nov 14 17:38:43] WARNING[28879][C-00000000]: translate.c:481 ast_translator_build_path: No translator path: (starting codec is not valid)
    [Nov 14 17:38:43] WARNING[28879][C-00000000]: translate.c:481 ast_translator_build_path: No translator path: (starting codec is not valid)
    Как исправить еще не доковырял.

    Плюс ко всему необходимо в modules.conf добавить
    MACRO & MIXMONITOR если их нет в арр

    • можно попросить ваш modules.conf, чтобы понять, что у меня не подгружено.

      • Это был тестовый стенд, его уже нет. Но файл modules.conf я не трогал вообще. Какой он был после установки, такой и оставался.

        • Разобрался.
          Таки нехватка кодека. Астериск ставил без установки примеров и т.д., файл modules.conf был пустой. Решилось загрузкой module load codec_alaw.so
          Теперь осталось разобраться с тем, что в панели отображает звонки, но вместо файла записи - знак отсутствия файла.

  213. Огромное спасибо за статью! Признаться я полный ноль не только в Asterisk но и VoIP, но хотел бы задать интересующий меня вопрос (надеюсь кто то ответит). Этот экстеншен: exten => _XXX.,1,Dial(SIP/${EXTEN}@397945) предназначен для звонков на внешние номера. Автор говорит что благодаря этому можно звонит на городские номера. Работает ли это для звонков на другие сервера Asterisk? Т.е. абонент набирает 6-и значный внутренний номер в сервисе zadarma и попадает на другой Asterisk сервер, правильно ли я понял?

  214. Александр

    Настройка в menuselect:
    # make menuselect
    пункт: Core Sound Packages: Выбираем русские звуки RU-WAV,
    - Оные отсутствуют. Имются только EN-WAV.
    Почему? Всё делалось по последовательно по пунктам статьи. Русская озвучка потом будет работать?
    Тема добавлена в форум.

    • Можно будет вручную скачать и установить. Возможно состав пакета установки изменился. Когда я последний раз настраивал астериск русский язык был по-умолчанию.

  215. Александр

    ОК

  216. Александр

    Статья правда хорошая, только вот столкнулся с проблемой:
    Сделал точно всё по приводимым в статье инструкциям, но входящие звонки с внешнего транка - не идут (Ошибка 486 : Busy Here, то бишь занято). Использовал сервис Zadarma. Внутренние звонки работают, исходящие наружу то же, а вот обратно нет. Пробовал отключать iptables - не помогло. В чём может быть проблема?

    • Может быть сам zadarma глючит? Либо с фаерволом проблемы. Если он отключен, то проброс портов надо проверять, если он есть. Отсутствие входящих с нормальными исходящими очень похоже на не проброшенный порт 5060.

      • Александр

        Имеется ввиду проброс порта на роутере?

        • Да. У меня такое было. Если неправильно проброшен порт, то исходящие звонки совершать можно, их инициирует сам астериск, если у него есть доступ в интернет, то он нормально позвонит. А вот входящие не проходят, соединение инициирует провайдер. Возможно он не может достучаться до сервера и выдает статус Занято.

        • Здравствуйте. Я хочу установить чистый астериск 16 на centos 7. В статье мне надо пропустить пункт "Быстрая установка из репозитория
          Centos 7" да?

  217. Отличная статья, Большое Спасибо!!!
    Были некоторые моменты неясные, дошло ))

Добавить комментарий

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

Нажимая кнопку "Отправить комментарий" Я даю согласие на обработку персональных данных.
Используешь Telegram? Подпишись на канал автора →
This is default text for notification bar