Установка Asterisk 16 на Debian 10

Установка Asterisk 16 на Debian 10

Установка Asterisk 16 на Debian 10 – в этой статье, надо полагать, мы рассмотрим как установить Asterisk 16 LTS в Debian 10 / Ubuntu 18 “под ключ”. Что это значит? То есть, мы выполним следующее:

  1. Настройка ОС Debian 10.
  2. Установку всех необходимых компонентов и приложений.
  3. Инсталляция средств администрирования Linux.
  4. Интеграция с БД MariaDB.
  5. Установку Asterisk 16 LTS.
  6. Настройка Asterisk 16 LTS.
  7. Подключение Asterisk 16 через драйвер unixODBC к MariaDB.
  8. Выполним настройку безопасности Asterisk!

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

Введение

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

Далее, мы будем производить установку без дополнительных отступлений, комментариев почему мы делаем так, а не иначе, так как мы рассчитываем на знание среды Linux. Ранее, мы уже рассматривали установку Asterisk на различные операционные системы, но за это время вышло множество обновлений, поэтому мы решили обновить знания по установке Asterisk.

Исходные данные

  1. Физический сервер с ОС Debian 10.
  2. VoIP-шлюзы и IP-телефоны в локальной сети.
  3. Voice VLAN = 192.168.0.0/16, 172.16.0.0/16.
  4. Asterisk 16 LTS (*CLI).
  5. LAMP (Linux Apache2 + MariaDB 10.3 + PHP 7.3 + PhpMyAdmin).
  6. IPtables.
  7. IPset.

Asterisk 16 на Debian 10

Подготовка системы

Первым делом исправим файл  с репозиториями  /etc/apt/sources.list.

echo "# Copyright (C) 2019, PRO-VOIP.RU <info@pro-voip.ru>
# All rights reserved
#------------------------------------------------------------------------------#
#					OFFICIAL DEBIAN 10 REPOS
#------------------------------------------------------------------------------#

###### Debian Main Repos
deb http://ftp.debian.org/debian/ buster main contrib non-free
deb-src http://ftp.debian.org/debian/ buster main contrib non-free

deb http://ftp.debian.org/debian/ buster-updates main contrib non-free
deb-src http://ftp.debian.org/debian/ buster-updates main contrib non-free

deb http://security.debian.org/debian-security buster/updates main contrib non-free
deb-src http://security.debian.org/debian-security buster/updates main contrib non-free

deb http://ftp.debian.org/debian buster-backports main contrib non-free
" > /etc/apt/sources.list
Обновление системы

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

apt-get autoremove -y
apt-get update && apt-get upgrade -y
apt-get install -y ntp ntpdate
sed -i 's/\(NTPSERVERS=\).*/\NTPSERVERS="0.ru.pool.ntp.org 1.ru.pool.ntp.org 2.ru.pool.ntp.org 3.ru.pool.ntp.org"/' /etc/default/ntpdate
Установка зависимостей
apt-get install -y git wget curl sudo apt-transport-https lsb-release systemd systemd-sysv ca-certificates dialog nano vim dirmngr libtiff5-dev libtiff-tools openssh-server
apt-get install -y bash bash-completion htop iftop nmap unzip bzip2 mc telnet pwgen
apt-get install -y libvpb1 aptitude aptitude-common aptitude-doc-en libclass-accessor-perl libcwidget3v5 libio-string-perl libparse-debianchangelog-perl libsub-name-perl debtags apt-xapian-index libcwidget-dev libhtml-parser-perl libhtml-template-perl libxml-simple-perl

Установка LAMP

MariaDB
apt-get install -y mariadb-server mariadb-client libmariadb3 libmariadbclient-dev screen
systemctl start mariadb
systemctl enable mariadb

Во время установки необходимо задать пароль пользователя root к БД MariaDB, поэтому следует указать более сложный пароль.

Apache2
apt-get install -y apache2 apache2-utils
systemctl reload apache2
systemctl enable apache2
PHP
apt-get install -y php libapache2-mod-php php-cli php-cgi php-pear php-common php-phpseclib php-mbstring php-gettext php-fpm php-json php-pdo php-mysql php-mysqli php-imagick php-zip php-gd php-curl php-mbstring php-curl php-xml php-pear php-bcmath
php -v
a2enmod php7.3
a2enmod rewrite
PhpMyAdmin
cd /usr/src/
wget https://files.phpmyadmin.net/phpMyAdmin/4.9.1/phpMyAdmin-4.9.1-all-languages.tar.gz
tar xvf phpMyAdmin-4.9.1-all-languages.tar.gz
mv phpMyAdmin-4.9.1-all-languages /usr/share/phpmyadmin
mkdir -p /var/lib/phpmyadmin/tmp
chown -R www-data:www-data /var/lib/phpmyadmin
chown -R www-data:www-data /usr/share/phpmyadmin
mkdir /etc/phpmyadmin/
cp /usr/share/phpmyadmin/config.sample.inc.php  /usr/share/phpmyadmin/config.inc.php

Далее, сгенерируем шифр Blowfish:

pwgen -s 32 1

На следующем шаге установим полученное значение в файл конфигурации PhpMyAdmin, а значит вместо значения Your_Blowfish_Secret нужно вставить полученный выше шифр:

sed -i "s/$cfg['blowfish_secret'] = .*/$cfg['blowfish_secret'] = 'Your_Blowfish_Secret' /" /usr/share/phpmyadmin/config.inc.php
echo "//$cfg['TempDir'] = '/var/lib/phpmyadmin/tmp';" >> /usr/share/phpmyadmin/config.inc.php

Необходимо настроить службу Apache2, чтобы она работала совместно с PhpMyAdmin, следовательно правил следующий файл:

cat > /etc/apache2/conf-enabled/phpmyadmin.conf << 'EOF'
Alias /phpmyadmin /usr/share/phpmyadmin

<Directory /usr/share/phpmyadmin>
    Options SymLinksIfOwnerMatch
    DirectoryIndex index.php

    <IfModule mod_php5.c>
        <IfModule mod_mime.c>
            AddType application/x-httpd-php .php
        </IfModule>
        <FilesMatch ".+\.php$">
            SetHandler application/x-httpd-php
        </FilesMatch>

        php_value include_path .
        php_admin_value upload_tmp_dir /var/lib/phpmyadmin/tmp
        php_admin_value open_basedir /usr/share/phpmyadmin/:/etc/phpmyadmin/:/var/lib/phpmyadmin/:/usr/share/php/php-gettext/:/usr/share/php/php-php-gettext/:/usr/share/javascript/:/usr/share/php/tcpdf/:/usr/share/doc/phpmyadmin/:/usr/share/php/phpseclib/
        php_admin_value mbstring.func_overload 0
    </IfModule>
    <IfModule mod_php.c>
        <IfModule mod_mime.c>
            AddType application/x-httpd-php .php
        </IfModule>
        <FilesMatch ".+\.php$">
            SetHandler application/x-httpd-php
        </FilesMatch>

        php_value include_path .
        php_admin_value upload_tmp_dir /var/lib/phpmyadmin/tmp
        php_admin_value open_basedir /usr/share/phpmyadmin/:/etc/phpmyadmin/:/var/lib/phpmyadmin/:/usr/share/php/php-gettext/:/usr/share/php/php-php-gettext/:/usr/share/javascript/:/usr/share/php/tcpdf/:/usr/share/doc/phpmyadmin/:/usr/share/php/phpseclib/
        php_admin_value mbstring.func_overload 0
    </IfModule>

</Directory>

# Authorize for setup
<Directory /usr/share/phpmyadmin/setup>
    <IfModule mod_authz_core.c>
        <IfModule mod_authn_file.c>
            AuthType Basic
            AuthName "phpMyAdmin Setup"
            AuthUserFile /etc/phpmyadmin/htpasswd.setup
        </IfModule>
        Require valid-user
    </IfModule>
</Directory>

# Disallow web access to directories that don't need it
<Directory /usr/share/phpmyadmin/templates>
    Require all denied
</Directory>
<Directory /usr/share/phpmyadmin/libraries>
    Require all denied
</Directory>
<Directory /usr/share/phpmyadmin/setup/lib>
    Require all denied
</Directory>
EOF

После этого, устанавливаем БД, потому что для PhpMyAdmin необходима собственная база, где:

  • Your_Mariadb_Password – пароль пользователя root от БД MariaDB;
  • Phpmyadmin_User – имя пользователя для доступа к PhpMyAdmin;
  • Phpmyadmin_User_Password – пароль пользователя Phpmyadmin_User для доступа к PhpMyAdmin.
mariadb < /usr/share/phpmyadmin/sql/create_tables.sql -uroot -pYour_Mariadb_Password
mariadb -uroot -pYour_Mariadb_Password <<MY_QUERY
GRANT ALL PRIVILEGES ON *.* TO 'Phpmyadmin_User'@'localhost' IDENTIFIED BY 'Phpmyadmin_User_Password' WITH GRANT OPTION;
FLUSH PRIVILEGES;
MY_QUERY
systemctl restart apache2

Для доступа к WEB прежде всего следует настроить Apache2:

sed -i "s/\(upload_max_filesize = \).*/\120M/" /etc/php/7.3/apache2/php.ini
sed -i "s/post_max_size = .*/post_max_size = 80M /" /etc/php/7.3/apache2/php.ini
sed -i "s/memory_limit = .*/memory_limit = 512M /" /etc/php/7.3/apache2/php.ini
sed -i 's%;date.timezone =%date.timezone = Europe/Moscow%g' /etc/php/7.3/apache2/php.ini
cp /etc/apache2/apache2.conf /etc/apache2/apache2.conf_orig
sed -i 's/AllowOverride None/AllowOverride All/' /etc/apache2/apache2.conf
systemctl restart php7.3-fpm.service
systemctl restart apache2.service

Установка Asterisk

Необходимые зависимости для Asterisk
apt-get autoremove -y
apt-get install -y linux-headers-`uname -r` libapache2-mod-log-sql-ssl libfreetype6-dev doxygen yasm nasm gdb cmake build-essential make automake autoconf 'libtool-bin|libtool' python python-dev uuid uuid-dev 'libjpeg8-dev|libjpeg62-turbo-dev' libncurses5-dev libssl-dev libpcre3-dev libcurl4-openssl-dev libldns-dev libedit-dev libspeexdsp-dev libsqlite3-dev perl libgdbm-dev libdb-dev ccache libpng-dev libopenal-dev libcodec2-dev libsoundtouch-dev libmagickcore-dev liblua5.2-dev libsndfile-dev libopencv-dev libavformat-dev libx264-dev erlang-dev libldap2-dev libperl-dev
apt-get install -y libpq-dev subversion gcc lynx bison flex memcached libshout3-dev libvpx-dev mpg123 libmpg123-dev libmp3lame-dev libncurses5-dev libpng16-16 libxml2-dev libxml2 libcurl4 libnewt-dev sqlite3
apt-get install -y libasound2-dev sox pkg-config libedit-dev libcppdb-odbc0 unixodbc unixodbc-dev libogg-dev libvorbis-dev libcurl4-openssl-dev libical-dev libneon27-dev libsrtp2-1 libspandsp-dev sendmail sendmail-bin sendmail-cf
apt-get install -y haveged odbcinst
apt-get update && apt-get upgrade -y
cd /usr/src
Инсталляция дополнительных библиотек
apt-get install -y nodejs dahdi dahdi-linux dahdi-source libpri1.4 libpri-dev
Установка Asterisk
wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-16-current.tar.gz
tar xvfz asterisk-16-current.tar.gz
cd asterisk-16.*
contrib/scripts/get_mp3_source.sh
contrib/scripts/install_prereq install
./configure NOISY_BUILD=yes --with-crypto --with-ssl=ssl --with-srtp --with-jansson-bundled
make menuselect

Если вы следуете нашей инструкции следует, включить следующие модули:

  • chan_ooh323
  • chan_sip
  • app_macro
  • res_config_mysql
  • app_mysql
  • cdr_mysql
  • format_mp3
  • codec_g726
  • codec_g722
  • codec_opus
  • codec_silk
  • codec_siren7
  • codec_siren14
  • FILE_STORAGE
  • cdr_adaptive_odbc
  • cdr_csv
  • cdr_odbc
  • MOH-OPSOUND-WAV
  • CORE-SOUNDS-RU-WAV

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

  • chan_alsa
  • chan_console
  • chan_mgcp
  • chan_skinny
  • BUILD_NATIVE

Собираем:

make && make install && make config && make samples
ldconfig
Настройка Asterisk

Выполнять запуск службы Asterisk прежде всего следует от имени пользователя ‘asterisk‘. С точки зрения безопасности – это оптимальное решение, а значит следует выполнить:

adduser --system --group --home /var/lib/asterisk --no-create-home --disabled-password --gecos "Asterisk PBX" asterisk
usermod -a -G asterisk,dialout,audio asterisk
sed -i "s/#AST_USER="asterisk"/AST_USER=asterisk/" /etc/default/asterisk
sed -i "s/#AST_GROUP="asterisk"/AST_GROUP=asterisk/" /etc/default/asterisk
sed -i "s/;runuser = asterisk/runuser=asterisk/" /etc/asterisk/asterisk.conf
sed -i "s/;rungroup = asterisk/rungroup=asterisk/" /etc/asterisk/asterisk.conf
chown -R asterisk:asterisk /var/lib/asterisk
chown -R asterisk:asterisk /var/log/asterisk
chown -R asterisk:asterisk /var/run/asterisk
chown -R asterisk:asterisk /var/spool/asterisk
chown -R asterisk:asterisk /usr/lib/asterisk
chown -R asterisk:asterisk /etc/asterisk
chmod -R u=rwX,g=rX,o=rX /var/lib/asterisk
chmod -R u=rwX,g=rX,o=rX /var/log/asterisk
chmod -R u=rwX,g=rX,o=rX /var/run/asterisk
chmod -R u=rwX,g=rX,o=rX /var/spool/asterisk
chmod -R u=rwX,g=rX,o=rX /usr/lib/asterisk
chmod -R u=rwX,g=rX,o=rX /etc/asterisk

Настройка ODBC подключения к БД

Подключим Asterisk через драйвер unixODBC к БД MariaDB. Между тем, об этом мы писали ранее в статье.

Итак, запускаем Asterisk как службу:

systemctl enable asterisk
systemctl start asterisk

Проверяем статус службы:

systemctl status 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 stop asterisk && systemctl start asterisk
systemctl status asterisk
Создание БД для Asterisk

Чтобы подключаться к БД через WEB-интерфейс сделаем импор БД через PhpMyAdmin:

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;

--
-- База данных: 'asteriskcdrdb'
--
CREATE DATABASE IF NOT EXISTS asteriskcdrdb DEFAULT CHARACTER SET = 'utf8' COLLATE = 'utf8_general_ci';
USE asteriskcdrdb;

-- --------------------------------------------------------

--
-- Структура таблицы 'cdr'
--

DROP TABLE IF EXISTS cdr;
CREATE TABLE IF NOT EXISTS cdr (
  id int(10) NOT NULL,
  calldate datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  clid varchar(80) NOT NULL DEFAULT '',
  src varchar(80) NOT NULL DEFAULT '',
  realsrc varchar(80) DEFAULT NULL,
  dst varchar(80) NOT NULL DEFAULT '',
  realdst 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 '',
  start datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  answer datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  end datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  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,
  remoteip varchar(60) NOT NULL DEFAULT '',
  accountcode varchar(20) NOT NULL DEFAULT '',
  hangupcause varchar(50) DEFAULT NULL,
  peerip varchar(50) DEFAULT NULL,
  recvip varchar(50) DEFAULT NULL,
  useragent varchar(50) DEFAULT NULL,
  uri varchar(50) DEFAULT NULL,
  fromuri varchar(50) DEFAULT NULL,
  peeraccount varchar(20) NOT NULL DEFAULT '',
  uniqueid varchar(32) NOT NULL DEFAULT '',
  userfield varchar(255) NOT NULL DEFAULT '',
  did varchar(50) NOT NULL DEFAULT '',
  linkedid varchar(32) NOT NULL DEFAULT '',
  sequence int(11) NOT NULL DEFAULT 0,
  filename varchar(255) DEFAULT NULL,
  recordingfile varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  
--
-- Триггеры 'cdr'
--
DROP TRIGGER IF EXISTS t_cdr;
DELIMITER //
CREATE TRIGGER t_cdr BEFORE INSERT ON cdr
 FOR EACH ROW BEGIN
 IF ((NEW.dst = 's' OR NEW.dst = '~~s~~') AND NEW.realdst != '') THEN 
  SET NEW.dst = NEW.realdst;
 END IF;
END
//

-- --------------------------------------------------------
--
-- Структура таблицы cel
--

DROP TABLE IF EXISTS cel;
CREATE TABLE IF NOT EXISTS cel (
id int(11) NOT NULL,
  eventtype varchar(30) NOT NULL,
  eventtime datetime NOT NULL,
  cid_name varchar(80) NOT NULL,
  cid_num varchar(80) NOT NULL,
  cid_ani varchar(80) NOT NULL,
  cid_rdnis varchar(80) NOT NULL,
  cid_dnid varchar(80) NOT NULL,
  exten varchar(80) NOT NULL,
  context varchar(80) NOT NULL,
  channame varchar(80) NOT NULL,
  src varchar(80) NOT NULL,
  dst varchar(80) NOT NULL,
  channel varchar(80) NOT NULL,
  dstchannel varchar(80) NOT NULL,
  appname varchar(80) NOT NULL,
  appdata varchar(80) NOT NULL,
  amaflags int(11) NOT NULL,
  accountcode varchar(20) NOT NULL,
  uniqueid varchar(32) NOT NULL,
  linkedid varchar(32) NOT NULL,
  peer varchar(80) NOT NULL,
  userdeftype varchar(255) NOT NULL,
  eventextra varchar(255) NOT NULL,
  userfield varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Индексы сохранённых таблиц
--

--
-- Индексы таблицы 'cdr'
--
ALTER TABLE cdr
 ADD PRIMARY KEY (id),
 ADD KEY calldate (calldate),
 ADD KEY src (src),
 ADD KEY dst (dst),
 ADD KEY accountcode (accountcode),
 ADD KEY uniqueid (uniqueid),
 ADD KEY dcontext (dcontext),
 ADD KEY clid (clid),
 ADD KEY did (did),
 ADD KEY id (id);

--
-- Индексы таблицы 'cel'
--
ALTER TABLE cel
 ADD PRIMARY KEY (id),
 ADD KEY uniqueid_index (uniqueid),
 ADD KEY linkedid_index (linkedid);

--
-- AUTO_INCREMENT для сохранённых таблиц
--

--
-- AUTO_INCREMENT для таблицы 'cdr'
--
ALTER TABLE cdr
MODIFY id int(10) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=21758;
--
-- AUTO_INCREMENT для таблицы 'cel'
--
ALTER TABLE cel
MODIFY id int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=207114;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

Прежде всего создадим пользователя ‘asteriskcdruser‘ для доступа к БД ‘asteriskcdrdb‘ и, конечно, установим пароль для этого пользователя: ‘asteriskcdruser_password‘:

mysql -uroot -pYour_Mariadb_Password
CREATE USER 'asteriskcdruser'@'localhost' IDENTIFIED BY 'asteriskcdruser_password';
GRANT ALL PRIVILEGES ON asteriskcdrdb.* TO 'asteriskcdruser'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;

Настройка безопасности Asterisk

Установка пакетов безопасности Asterisk

В итоге, установим пакеты, обеспечивающие безопасность системы.

apt-get install -y iptables-persistent netfilter-persistent ipset fail2ban
Установка безопасности на уровне Asterisk

Безусловно, безопасность Asterisk – самый важный вопрос на этапе внедрения, поэтому мы делали на этом акцент в статье.

На этом все! Установка и настройка Asterisk 16 окончена. Тем не менее, пожелания, замечания, предложения просим оставлять в комментариях.


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