Установка Asterisk 16 на Debian 10 или Centos 7, 8
установка subversion, speex-devel, wget, bzip2, pjproject, nano
yum install epel-release gcc gcc-c++ subversion speex-devel wget bzip2 pjproject nano openssl
отключить SELINUX:
nano /etc/selinux/config
SELINUX=disabled
перезагрузить
reboot now
загрузить asterisk
# cd /usr/src
# wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-16-current.tar.gz
распаковка
# tar xzvf asterisk-16-current.tar.gz
перейти в распакованную директорию
# cd asterisk-16.*
Установка зависимостей
Установка пакетов для шифрования TLS:
# yum install http://repo.okay.com.mx/centos/7/x86_64/release/okay-release-1-1.noarch.rpm
# yum install libsrtp-devel
или скачать и установить:
для Centos 7:
libsrtp-1.4.4-11.20101004cvs.el7.x86_64.rpm
libsrtp-devel-1.4.4-10.20101004cvs.el7.x86_64.rpm
для Centos 8:
libsrtp-1.5.4-8.el8.x86_64.rpm
libsrtp-devel-1.5.4-8.el8.x86_64.rpm
Установка jansson:
# yum install https://disweb.ru/files/rpm/jansson-2.11-2.2.x86_64.rpm https://disweb.ru/files/rpm/jansson-devel-2.11-2.2.x86_64.rpm
установить все зависимости
# contrib/scripts/install_prereq install
При установке на Centos 7 не было найдено 3 пакета: speexdsp-devel, iksemel-devel, hoard
Вместо speexdsp-devel, установить пакет speex-devel.
Для установки пакета iksemel-devel не нашел решения.
скачать исходники mp3
# contrib/scripts/get_mp3_source.sh
Установка
подготовка исходников к компиляции
# ./configure
На Centos 7 подготовка исходников закончилась с ошибкой:
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'
При проверке на существование пакета:
# rpm -qa | grep jansson
jansson-2.10-1.el7.x86_64
jansson-devel-2.10-1.el7.x86_64
Версия пакетов не подходит.
Установка подходищих версий:
# yum install https://disweb.ru/files/rpm/jansson-2.11-2.2.x86_64.rpm https://disweb.ru/files/rpm/jansson-devel-2.11-2.2.x86_64.rpm
выбрать компоненты asterisk для установки
# make menuselect
- на первой вкладке выбрать format_mp3.
- вкладка Core Sound Packages выбрать RU-WAV
- вкладка Extras Sound Packages выбрать EN-WAV
Для работы TLS нужно проверить, что установлено Resource Modules -> res_srtp
нажать Save & Exit
запуск компиляции (-j<количество задействованных ядер процесора>)
# make -j2
ошибка при компиляции:
[CC] res_hep.c -> res_hep.o
[CC] res_ari_device_states.c -> res_ari_device_states.o
[CC] ari/resource_device_states.c -> ari/resource_device_states.o
[CC] res_sorcery_memory_cache.c -> res_sorcery_memory_cache.o
[CC] res_srtp.c -> res_srtp.o
[CC] res_pjsip_outbound_publish.c -> res_pjsip_outbound_publish.o
[CC] res_timing_timerfd.c -> res_timing_timerfd.o
[CC] res_fax_spandsp.c -> res_fax_spandsp.o
res_fax_spandsp.c: In function ‘set_logging’:
res_fax_spandsp.c:452:2: warning: passing argument 2 of ‘span_log_set_message_handler’ from incompatible pointer type [enabled by default]
span_log_set_message_handler(state, spandsp_log);
^
In file included from /usr/include/spandsp.h:53:0,
from res_fax_spandsp.c:67:
/usr/include/spandsp/logging.h:123:20: note: expected ‘message_handler_func_t’ but argument is of type ‘void (*)(int, const char *)’
SPAN_DECLARE(void) span_log_set_message_handler(logging_state_t *s, message_handler_func_t func, void *user_data);
^
res_fax_spandsp.c:452:2: error: too few arguments to function ‘span_log_set_message_handler’
span_log_set_message_handler(state, spandsp_log);
^
In file included from /usr/include/spandsp.h:53:0,
from res_fax_spandsp.c:67:
/usr/include/spandsp/logging.h:123:20: note: declared here
SPAN_DECLARE(void) span_log_set_message_handler(logging_state_t *s, message_handler_func_t func, void *user_data);
^
res_fax_spandsp.c: In function ‘set_ecm’:
res_fax_spandsp.c:482:44: error: ‘T30_SUPPORT_T4_1D_COMPRESSION’ undeclared (first use in this function)
t30_set_supported_compressions(t30_state, T30_SUPPORT_T4_1D_COMPRESSION | T30_SUPPORT_T4_2D_COMPRESSION | T30_SUPPORT_T6_COMPRESSION);
^
res_fax_spandsp.c:482:44: note: each undeclared identifier is reported only once for each function it appears in
res_fax_spandsp.c:482:76: error: ‘T30_SUPPORT_T4_2D_COMPRESSION’ undeclared (first use in this function)
t30_set_supported_compressions(t30_state, T30_SUPPORT_T4_1D_COMPRESSION | T30_SUPPORT_T4_2D_COMPRESSION | T30_SUPPORT_T6_COMPRESSION);
^
res_fax_spandsp.c:482:108: error: ‘T30_SUPPORT_T6_COMPRESSION’ undeclared (first use in this function)
t30_set_supported_compressions(t30_state, T30_SUPPORT_T4_1D_COMPRESSION | T30_SUPPORT_T4_2D_COMPRESSION | T30_SUPPORT_T6_COMPRESSION);
^
res_fax_spandsp.c: In function ‘spandsp_fax_start’:
res_fax_spandsp.c:969:2: warning: passing argument 2 of ‘t30_set_phase_e_handler’ from incompatible pointer type [enabled by default]
t30_set_phase_e_handler(p->t30_state, t30_phase_e_handler, s);
^
In file included from /usr/include/spandsp.h:122:0,
from res_fax_spandsp.c:67:
/usr/include/spandsp/t30_api.h:557:20: note: expected ‘t30_phase_e_handler_t’ but argument is of type ‘void (*)(struct t30_state_t *, void *, int)’
SPAN_DECLARE(void) t30_set_phase_e_handler(t30_state_t *s, t30_phase_e_handler_t handler, void *user_data);
^
res_fax_spandsp.c: In function ‘load_module’:
res_fax_spandsp.c:1259:2: error: too few arguments to function ‘span_set_message_handler’
span_set_message_handler(NULL);
^
In file included from /usr/include/spandsp.h:53:0,
from res_fax_spandsp.c:67:
/usr/include/spandsp/logging.h:125:20: note: declared here
SPAN_DECLARE(void) span_set_message_handler(message_handler_func_t func, void *user_data);
^
make[1]: *** [res_fax_spandsp.o] Error 1
make[1]: *** Waiting for unfinished jobs....
make: *** [res] Error 2
устранил данную ошибку отключив библиотеку: Resource Modules -> res_fax_spandsp
установка asterisk и всех его модулей
# make install
формирование образцов файлов конфигурации
# make samples
создание init скрипта
# make config
обновить кэш используемых динамических библиотек
# /sbin/ldconfig
Запуск
создать пользователя
# /sbin/adduser --system --group --home /var/lib/asterisk --no-create-home --gecos "Asterisk" asterisk
# /sbin/usermod -a -G dialout,audio asterisk
для Centos
# useradd --system --home-dir /var/lib/asterisk --no-create-home --comment "Asterisk" asterisk
# usermod -a -G dialout,audio asterisk
раскомментировать в конфиге: Centos: /etc/sysconfig/asterisk; Ubuntu: /etc/default/asterisk
AST_USER="asterisk"
AST_GROUP="asterisk"
назначить пользователю права на директории asterisk
# chown -R asterisk: /var/{lib,log,run,spool}/asterisk /usr/lib/asterisk /etc/asterisk
запуск астериска
# systemctl start asterisk
проверка статуса работы
# systemctl status asterisk
добавить в автозапуск
# systemctl enable asterisk
Открыть CLI консоль астериска:
# /usr/sbin/asterisk -rvvvvv
Firewalld
Открыть в Firewall (в большинстве случаев используются эти порты):
firewall-cmd --zone=public --add-port=5060/tcp --permanent
firewall-cmd --zone=public --add-port=5060/udp --permanent
firewall-cmd --zone=public --add-port=5061/tcp --permanent
firewall-cmd --zone=public --add-port=5061/udp --permanent
firewall-cmd --zone=public --add-port=4569/udp --permanent
firewall-cmd --zone=public --add-port=5038/tcp --permanent
firewall-cmd --zone=public --add-port=10000-20000/udp --permanent
Применить изменения:
firewall-cmd --reload
ИЛИ можно разрешить порты через скрипт BASH (firewalld-asterisk.sh):
#!/bin/bash
PORTS=('5060/tcp' '5060/udp' '5061/tcp' '5061/udp' '4569/udp' '5038/tcp' '10000-20000/udp')
SERVICE_FILE="/etc/firewalld/services/asterisk.xml"
if [ ! -e "${SERVICE_FILE}" ]; then
firewall-cmd --permanent --new-service=asterisk
fi
for PORT in ${PORTS[@]}; do
firewall-cmd --permanent --service=asterisk --add-port=${PORT}
done
firewall-cmd --permanent --zone=public --add-service=asterisk
firewall-cmd --reload
firewall-cmd --list-all-zones
iptables
Открыть порты, если UDP:
iptables -A INPUT -p udp -m udp --dport 5060 -j ACCEPT
iptables -A INPUT -p udp -m udp --dport 5061 -j ACCEPT
iptables -A INPUT -p udp -m udp --dport 10000:20000 -j ACCEPT
iptables -A INPUT -p udp -m udp --dport 4569 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 5038 -j ACCEPT
Для TCP:
iptables -A INPUT -p tcp -m tcp --dport 5060 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 5061 -j ACCEPT
Пример разрешение с определенных IP:
iptables -A INPUT -p udp -m udp -s 123.123.123.123 --dport 5060 -j ACCEPT
Пример с определенной подсети:
iptables -A INPUT -p udp -m udp -s 192.168.0.0/24 --dport 5060 -j ACCEPT
Применить изменения:
service iptables save
Настройка NAT в Asterisk, нет звука или звук есть в одну сторону
Ошибки
если в статусе есть ошибка:
radcli: rc_read_config: rc_read_config: can't open /etc/radiusclient-ng/radiusclient.conf: No such file or directory
в /etc/asterisk/cdr.conf раскомментировать и отредактировал строки:
[radius]
radiuscfg => /etc/radcli/radiusclient.conf
то же самое в /etc/asterisk/cel.conf:
[radius]
radiuscfg => /etc/radcli/radiusclient.conf
перезагрузить астериск и проверить статус
# systemctl restart asterisk
# systemctl status asterisk
При попытки открыть консоль CLI:
# asterisk -rvvvvv
Unable to connect to remote asterisk (does /var/run/asterisk/asterisk.ctl exist?)
Для решения данного вопроса нужно открыть на редактирование:
# nano /etc/selinux/config
Отключить SELINUX
SELINUX=disabled
перезагрузить компьютер:
# reboot
Ошибка при звонке:
Matched device setup to use SRTP, but request was not!
Если подключаеться другая Asterisk то параметрах пользователя установить:
encryption=yes
Ошибка при подключении SIP клиента:
[Jun 26 15:35:03] WARNING[2194]: chan_sip.c:17118 parse_register_contact: Domain '192.168.0.100:5060' disallowed by contact ACL (violating IP 192.168.0.100)
В параметрах sip.conf или у пользователя к примеру в user.conf установлено ограничение для подключаемой подсети:
contactpermit=192.168.1.0/255.255.255.0
Нужно добавить в исключение IP адрес или подсеть (в данном случае посеть):
contactpermit=192.168.0.0/255.255.255.0
Нет прав у Apache выполнить команды CLI Asterisk
к примеру данный запрос с Apache возвращает пустой результат:
asterisk -rx "sip show peers"
для решения данной ситуации нужно открыть файл конфигурации /etc/asterisk/asterisk.conf и раскоментировать данные строки:
;...
[files]
astctlpermissions = 0660
astctlowner = root
astctlgroup = apache
astctl = asterisk.ctl
при необходимости можно указать иных пользователей для кого будут доступны CLI команды