Решение ошибки Asterisk «Context ‘local’ tries to include nonexistent context ‘parkedcalls'»

Прикручивал как-то DAHDI плату и заметил следующую ошибку при входящем вызове с аналоговой линии:

WARNING[7238]: pbx.c:12314 ast_context_verify_includes: Context ‘local’ tries to include nonexistent context ‘parkedcalls’

Ошибка возникала из-за того что не загружен модуль res_parking, чтобы его загрузить, откроем консоль asterisk и выполним команду:

sudo asterisk -vvr
module load res_parking

Чтобы он автоматически загружался при запуске Asterisk, в файле /etc/asterisk/modules.conf, в блоке [modules] добавим строку:

load => res_parking.so

Мониторинг Asterisk в Zabbix

Наблюдать за Asterisk будем через Zabbix агент, для этого установим его на той же машине что и Asterisk.
Как устанавливать Zabbix агент я описывал в этих статьях:
Установка и настройка Zabbix агента в Ubuntu
Установка и настройка Zabbix агента в Windows

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

Следующий код добавим в файл конфигурации Zabbix агента /etc/zabbix/, на той же машине что и Asterisk:

# total number of asterisk extensions
UserParameter=asterisk.extensions_total,asterisk -rx "database show" | grep DEVICE | grep dial | wc -l
# number of registered extensions
UserParameter=asterisk.extensions_online,asterisk -rx "database show" | grep Registry | wc -l
# number of offline extensions
UserParameter=asterisk.extensions_offline,asterisk -rx "sip show peers" | grep -v trunk | grep -v --text -i "sip peers" | grep -v Forceport | grep UNKNOW | wc -l
# total number of trunks
UserParameter=asterisk.trunks_total,asterisk -rx "sip show registry" | grep -v "registrations" | grep -v "Reg.Time" | wc -l
# number of registered trunks
UserParameter=asterisk.trunks_online,asterisk -rx "sip show registry" | grep -v "registrations" | grep -v "Reg.Time" | grep Registered | wc -l
# number of offline trunks
UserParameter=asterisk.trunks_offline,asterisk -rx "sip show registry" | grep -v "registrations" | grep -v "Reg.Time" | grep -v Registered | wc -l
# number of active calls
UserParameter=asterisk.active_calls,asterisk -rvvvvvx 'core show channels'| grep --text -i 'active call'| cut -c1
# number of seconds since last asterisk start
UserParameter=asterisk.uptime,asterisk -rx "core show uptime seconds" | grep --text -i "System uptime:" | gawk '{print $3}'
# number of asterisk processes
UserParameter=asterisk.asterisk_running,ps cax | grep asterisk | wc -l
# number of fail2ban processes
UserParameter=asterisk.fail2ban_running,ps cax | grep fail2ban | wc -l
# number of fail2ban active chains
UserParameter=asterisk.fail2ban_active,iptables -nL | grep Chain | grep -E 'f2b|fail2ban' | wc -l

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

asterisk -rx "database show" | grep DEVICE | grep dial | wc -l

И т.д., так как для некоторых команд нужны привилегии root, то разрешим выполнение от его имени указав параметр AllowRoot=1 в конфигурации Zabbix агента.
И перезапустим Zabbix агент чтобы применить изменения, в Ubuntu это так:

sudo /etc/init.d/zabbix-agent restart

Теперь осталось создать шаблон на Zabbix сервере и добавить в него элементы данных, триггеры и графики.
Можете также скачать и импортировать в Zabbix мой шаблон Template_App_Asterisk_Service (это еще не готовый вариант, так как постоянно его дописываю).

Запись телефонных разговоров в Asterisk

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

Подключимся к консоли Asterisk и посмотрим/загрузим модули следующими командами:

sudo asterisk -r
module show like МОДУЛЬ
module load МОДУЛЬ

Для автозагрузки модули указываются в файле /etc/asterisk/modules.conf, открыть его можно например текстовым редактором nano (в нем клавиши Ctrl+X для выхода, y/x и Enter для сохранения или отмены изменений):

sudo nano /etc/asterisk/modules.conf

Следующие строки нужны для загрузки модулей:

load => res_monitor.so
load => func_strings.so
load => func_callerid.so
load => app_dial.so
load => func_periodic_hook.so
load => format_wav.so

Откроем конфигурационный файл extensions.conf например тем же редактором nano:

sudo nano /etc/asterisk/extensions.conf

Добавим в нужный диалплан две строки, в первой укажем с каким именем сохранять файл, а во второй куда сохранять, третья ваша стандартная и т.д.(вместо wav можно указать другой кодек, например gsm чтоб файлы были меньшего размера, кстати gsm можно воспроизводить используя QuickTime):

[sip-dialout]
exten => 6000,1,Set(fname=${STRFTIME(${EPOCH},,%Y-%m-%d-%H%M)}-${CALLERID(number)}-${EXTEN})
exten => 6000,2,Monitor(wav,/home/andrew/monitor/${fname},mb)
exten => 6000,3,Dial(SIP/6000)

Подключимся к Asterisk и перезагрузим конфигурацию диалплана:

sudo asterisk -r
dialplan reload

Теперь при звонках на номер 6000 будет записываться разговор в указанную директорию, например с именами в виде 201610281731-6001-6000.wav (дата-звонящий_номер-номер_куда_звонят).

Команды Asterisk

Опишу возможные команды Asterisk которые можно вводить после подключения к консоли:

sudo asterisk -r

Список команд:
sip show peers (просмотр всех абонентов)
sip show registry (просмотр текущих SIP регистраций)
sip reload (перезагрузка модуля sip, обычно это делается после внесения изменений в файл sip.conf)
sip show channels (просмотр активных SIP каналов)
sip show settings (просмотр настоек SIP)
sip set debug on/off (включение или выключение режима отладки, можно указать конкретные IP или пользователя, например sip set debug on ip 192.168.1.10)

module load/reload/unload (загрузка/перезагрузка/выгрузка модуля)
module show (просмотр списка загруженных модулей)

dialplan show (просмотр текущего диалплана)
dialplan reload (перезагрузка диалплана)
dialplan save (сохранение текущиго диалплана в файл)
dialplan show globals (просмотр параметров диалплана)

core show codecs (просмотр установленных кодеков в Asterisk)
core show applications (просмотр загруженных приложений в Asterisk, указываются в extensions.conf)
core restart now (перезагрузка Asterisk)
core restart gracefully (перезагрузка Asterisk после завершения всех разговоров)
core show help (просмотр встроенной справки)

Настройка Fail2Ban под Asterisk

На тесте буду использовать Asterisk 13.1.0 и Fail2Ban 0.9.3-1 установленные в Ubuntu Server 16.04.1 LTS.

Установим Fail2Ban как я писал в этой статье — Установка и настройка Fail2ban

Откроем конфигурационный файл Asterisk отвечающий за логирование событий в /var/log/asterisk/messages:

sudo nano /etc/asterisk/logger.conf

Добавим security в messages:

messages => notice,warning,error,security

Перезапустим систему логирования asterisk:

sudo asterisk -rvv
logger reload
quit

Добавим файл настроек Asterisk в директорию с конфигурацией Fail2Ban тем самым активировав наблюдение его логов:

sudo nano /etc/fail2ban/jail.d/asterisk.conf

где 86400 в секундах = 24 часа, то есть злоумышленник будет блокироваться на сутки.

[asterisk]
enabled = true
bantime = 86400

Либо изменим в файле /etc/fail2ban/jail.conf где [asterisk-tcp] и [asterisk-udp] параметр false на true.

Перезапустим fail2ban чтобы новый файл настроек загрузился:

sudo fail2ban-client reload

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

sudo fail2ban-client status asterisk

Все, теперь Fail2Ban будет блокировать IP-адреса с которых не верно вводятся пароли к аккаунтам Asterisk.

Добавление SIP клиентов в Asterisk

SIP клиенты в Asterisk указываются в файле sip.conf, поэтому откроем его например в текстовом редакторе nano (Ctrl+X для выхода из редактора, y или n для сохранения или отмены изменений):

sudo nano /etc/asterisk/sip.conf

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

allowguest=no

Теперь в самом конце файла добавим клиента:

[6000]
type=friend
secret=ПАРОЛЬ 
nat=no
host=dynamic
dtmfmode=rfc2833
disallow=all
allow=ulaw
context=sip-dialout
callerid=6000
deny=0.0.0.0/0
permit=192.168.0.10/32

Кратко опишу параметры которые я указывал:
type — тип клиента, может быть user (идентификация по паролю), peer (идентификация по адресу хоста), fried (либо по паролю, либо по хосту).
secret — пароль пользователя.
nat=no — указывает, что клиент может быть за NAT, смотрите мою статью по поводу этого Звонок через NAT.
host=dynamic — нет привязки клиента к адресу хоста.
dtmfmode=rfc2833 — метод передачи dtmf тонов набора номера.
disallow=all — запрет всех кодеков.
allow=ulaw — разрешим только кодек ulaw
context=sip-dialout — имя диалплана (он описывается в extensions.conf)
callerid=6000 — внутренний номер телефона клиента.
deny=0.0.0.0/0 — запрещаем подключение со всех IP адресов.
permit=192.168.0.10/32 — разрешаем подключение только с указанного IP адреса.

После добавления клиента подключимся к Asterisk и обновим конфигурацию sip:

sudo asterisk -r
sip reload

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

sip show users

Для выхода из консоли Asterisk наберем:

quit

Теперь уже можно подключится добавленному клиенту к серверу Asterisk используя например программу X-Lite, Zoiper или VoIP телефон, но звонить пока некуда, поэтому добавим для теста второго клиента в sip.conf:

[6001]
type=friend
secret=ПАРОЛЬ
nat=no
host=dynamic 
dtmfmode=rfc2833
disallow=all
allow=ulaw
context=sip-dialout
callerid=6001
deny=0.0.0.0/0
permit=192.168.0.10/32

Откроем в редакторе файл extensions.conf:

sudo nano /etc/asterisk/extensions.conf

И укажем в его конце следующие строки, чтобы пользователи могли звонить друг другу:

[sip-dialout]
exten => 6000,1,Dial(SIP/6000)
exten => 6001,1,Dial(SIP/6001)

Перезапустим Asterisk чтобы применить изменения:

sudo service asterisk restart

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

Установка Asterisk в Ubuntu Server 16.04 LTS

Приведу пример быстрой установки Asterisk на Ubuntu Server 16.04 LTS.

Сначала проверим есть ли обновления для системы и установим их:

sudo apt-get update
sudo apt-get upgrade

Выполним установку Asterisk:

sudo apt-get install asterisk

Установим дополнительные компоненты:

sudo apt-get install dahdi asterisk-dahdi asterisk-mp3 asterisk-mysql asterisk-core-sounds-ru asterisk-core-sounds-ru-g722 asterisk-core-sounds-ru-gsm asterisk-dev asterisk-core-sounds-ru-wav lame

Посмотреть запущен ли Asterisk и его версию можно командами:

ps aux | grep asterisk
asterisk -V

Подключится к консоли Asterisk можно командой:

sudo asterisk -vvr

На этом установка Asterisk завершена, так как мы не ставили лишних веб-интерфейсов для управления, а для опытных пользователей и тонкой настройки они и не нужны, то все настройки необходимо выполнять в конфигурационных файлах которые находятся в директории /etc/asterisk/.

В файле sip.conf в блоке [general] изменим указанные параметры в целях безопасности:

alwaysauthreject=yes
allowguest=no

И перезапустим asterisk:

sudo service asterisk restart

Чтобы разрешить подключение SIP в IPTables, добавим правило (второе разрешает для конкретного IP или сети):

sudo iptables -A INPUT -p udp -m udp --dport 5060 -j ACCEPT
sudo iptables -A INPUT -p udp -m udp -s 192.168.1.50 --dport 5060 -j ACCEPT

Читайте другие мои статьи о настройках.