Страница 1 из 1

PJSIP Asterisk17+RealTime+CentOS8+MariaDB10+OpenVPN2.4

Добавлено: 16 фев 2021, 19:29
gopstopochka
Установка IP Телефонии PJSIP Asterisk 17.6 в режиме RealTime для CentOS 8.2 и MariaDB 10.5.4 с применением защищённого канала OpenVPN 2.4.9 и межсетевого экрана nftables 0.9.3

Если IP Телефония Астериск будет ставиться с консоли, то её необходимо будет локализовать.
В файле /etc/vconsole.conf правим строки:

Код: Выделить всё

KEYMAP="ru"
FONT="cyr-sun16"
Чтобы активировать шрифт cyr-sun16, необходимо перезагрузить операционную систему

Код: Выделить всё

systemctl reboot
Отключаем SELinux
В файле /etc/selinux/config правим строку:

Код: Выделить всё

SELINUX=disabled
Накатываем все обновления и перезагружаем операционную систему

Код: Выделить всё

yum update
systemctl reboot
Устанавливаем репозитории EPEL и PowerTools

Код: Выделить всё

yum install epel-release.noarch
yum config-manager --set-enabled PowerTools
Устанавливаем MariaDB SQL Server. Создаем файл /etc/yum.repos.d/MariaDB.repo и в него прописываем следующие строки

Код: Выделить всё

[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.5/centos8-amd64
module_hotfixes=1
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
Устанавливаем MariaDB SQL Server

Код: Выделить всё

yum install MariaDB-server
Переводим MariaDB SQL Server на поддержку локализации UTF-8 В файле /etc/my.cnf.d/server.cnf добавляем строку

Код: Выделить всё

[mysqld]
event_scheduler = on
character_set_server = utf8
Производим запуск MariaDB SQL Server

Код: Выделить всё

systemctl enable mariadb
systemctl start mariadb
Заходим в консоль управления SQL Server и выполняем SQL команды

Код: Выделить всё

mysql
CREATE DATABASE asterisk;
GRANT all ON asterisk.* TO asterisk@localhost IDENTIFIED BY 'asterisk';
Устанавливаем распределённую систему управления версиями git

Код: Выделить всё

yum install git
Скачиваем программный исходный код IP Телефонии Asterisk

Код: Выделить всё

cd /usr/local/src 
git clone -b 17.6 https://gerrit.asterisk.org/asterisk asterisk-17.6
Устанавливаем не достающие rpm пакеты, которые необходимы для сборки IP Телефонии Asterisk

Код: Выделить всё

cd /usr/local/src/asterisk-17.6/contrib/scripts
./install_prereq install
Проверяем требования программных продуктов для IP Телефонии Asterisk

Код: Выделить всё

cd /usr/local/src/asterisk-17.6
./configure
Используем MenuSelect для выбора параметров Asterisk В разделе "Core Sound Packages", выбираем русскую озвучку CORE-SOUNDS-RU-WAV

Код: Выделить всё

make menuselect
Производим компиляцию программного исходного кода IP Телефонии Asterisk

Код: Выделить всё

make
make install
make samples
make install-logrotate
make config
ldconfig
systemctl enable asterisk
systemctl start asterisk
Установка базовых таблиц RealTime

Код: Выделить всё

yum install python3-pip-9.0.3-16.el8.noarch
pip3 install alembic
pip3 install mysqlclient
cd /usr/local/src/asterisk-17.6/contrib/ast-db-manage
cp config.ini.sample config.ini
Файле config.ini приводим к виду

Код: Выделить всё

sqlalchemy.url = mysql://asterisk:asterisk@localhost/asterisk
Производим установку базовых таблиц RealTime в табличное пространство Asterisk MariaDB SQL Server

Код: Выделить всё

alembic -c config.ini upgrade head
Производим установку базовой таблицы биллинга CDR в табличное пространство Asterisk MariaDB SQL Server

Код: Выделить всё

cp cdr.ini.sample cdr.ini
Файл cdr.ini приводим к виду

Код: Выделить всё

sqlalchemy.url = mysql://asterisk:asterisk@localhost/asterisk

Код: Выделить всё

alembic -c cdr.ini upgrade head
Производим установку базовой таблицы постановки входящего вызова в очередь Queue в табличное пространство Asterisk MariaDB SQL Server

Код: Выделить всё

cp queue_log.ini.sample queue_log.ini
Файл queue_log.ini приводим к виду

Код: Выделить всё

sqlalchemy.url = mysql://asterisk:asterisk@localhost/asterisk

Код: Выделить всё

alembic -c queue_log.ini upgrade head
Установка ODBC драйвера для MariaDB SQL Server

Код: Выделить всё

cd /usr/local/src
mkdir odbc-3.1.7
cd odbc-3.1.7
wget
https://downloads.mariadb.com/Connectors/odbc/connector-odbc-3.1.7/mariadb-connector-odbc-3.1.7-ga-rhel8-x86_64.tar.gz
tar xvfz mariadb-connector-odbc-3.1.7-ga-rhel8-x86_64.tar.gz
cp lib64/libmaodbc.so /lib64
Конфигурация ODBC
В файле /etc/odbcinst.ini создаём

Код: Выделить всё

[MariaDB]
Description = ODBC for MariaDB
Driver = /usr/lib/libmaodbc.so
Driver64 = /usr/lib64/libmaodbc.so
FileUsage = 1
В файле /etc/odbc.ini создаём

Код: Выделить всё

[asterisk]
Description = MariaDB connection to 'asterisk' database
Driver = MariaDB
Server = localhost
Database = asterisk
UserName = asterisk
Password = asterisk
Socket = /var/lib/mysql/mysql.sock
Проверка доступности базы данных Asterisk через ODBC драйвер
isql asterisk

Код: Выделить всё

+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL>
Подключения IP Телефонии Asterisk к дескриптору базы данных через ODBC драйвер, который настроили
Файл /etc/asterisk/res_odbc.conf приводим виду

Код: Выделить всё

[asterisk]
enabled => yes
dsn => asterisk
username => asterisk
password => asterisk
pre-connect => yes
asterisk -rx reload
Проверка подключения IP Телефонии Asterisk к табличному пространству Asterisk MariaDB SQL Server

Код: Выделить всё

asterisk -rx "odbc show"

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

Name:   asterisk
DSN:    asterisk
  Number of active connections: 1 (out of 1)
Logging: Disabled
Настройка IP Телефонии Asterisk для загрузки его модуля ODBC на ранней стадии запуска
Файл /etc/asterisk/modules.conf приводим к такому виду

Код: Выделить всё

preload => res_odbc.so
preload => res_config_odbc.so
noload => chan_sip.so 

Код: Выделить всё

systemctl restart asterisk
Подключение канального драйвера PJSIP к базе данных в режиме реального времени
Файл /etc/asterisk/sorcery.conf приводим к виду

Код: Выделить всё

[res_pjsip]
aor=realtime,ps_aors
auth=realtime,ps_auths
contact=realtime,ps_contacts
domain_alias=realtime,ps_domain_aliases
endpoint_id_ip=realtime,ps_endpoint_id_ips
endpoint=realtime,ps_endpoints
global=realtime,ps_globals
registrations=realtime,ps_registrations
;resource_list=realtime,ps_resource_list
;subscription_persistence=realtime,ps_subscription_persistence
;systems=realtime,ps_systems
transport=realtime,ps_transports
[res_pjsip_endpoint_identifier_ip]
identify=realtime,ps_endpoint_id_ips
[res_pjsip_outbound_publish]
outbound-publish=realtime,ps_outbound_publishes
[res_pjsip_pubsub]
inbound-publication=realtime,ps_inbound_publications
[res_pjsip_publish_asterisk]
asterisk-publication=realtime,ps_asterisk_publications
Файл /etc/asterisk/extconfig.conf приводим к виду

Код: Выделить всё

[settings]
ps_aors => odbc,asterisk
ps_asterisk_publications => odbc,asterisk
ps_auths => odbc,asterisk
ps_contacts => odbc,asterisk
ps_domain_aliases => odbc,asterisk
ps_endpoint_id_ips => odbc,asterisk
ps_endpoints => odbc,asterisk
ps_globals => odbc,asterisk
ps_inbound_publications => odbc,asterisk
ps_outbound_publishes => odbc,asterisk
ps_registrations => odbc,asterisk
;ps_resource_list => odbc,asterisk
;ps_subscription_persistence => odbc,asterisk
;ps_systems => odbc,asterisk
ps_transports => odbc,asterisk
Установка OpenVPN

Код: Выделить всё

yum install openvpn
cd /etc/openvpn/
mkdir /etc/openvpn/tun0
cd /etc/openvpn/tun0
git clone https://github.com/OpenVPN/easy-rsa.git
cd /etc/openvpn/tun0/easy-rsa/easyrsa3
cp vars.example vars
Файл /etc/openvpn/server/easy-rsa/easyrsa3/vars приводим к виду

Код: Выделить всё

set_var EASYRSA_REQ_COUNTRY     "RU"
set_var EASYRSA_REQ_PROVINCE    "Sity obl"
set_var EASYRSA_REQ_CITY        "Sity"
set_var EASYRSA_REQ_ORG         "LTD"
set_var EASYRSA_REQ_EMAIL       "office@localhost"
set_var EASYRSA_REQ_OU          "IT"
Настройка OpenVPN Сервиса
Файл /etc/openvpn/tun0/server.conf приводим к виду

Код: Выделить всё

port 1194
proto udp
dev tun0
ca ca.crt
cert server.crt
key server.key
dh dh2048.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
client-config-dir ccd
keepalive 10 120
tls-auth ta.key 0
cipher AES-256-CBC
persist-key
persist-tun
status openvpn-status.log
verb 3
explicit-exit-notify 1
crl-verify /etc/openvpn/tun0/easy-rsa/easyrsa3/pki/crl.pem
Создаём общий секретный ключ ta.key

Код: Выделить всё

cd /etc/openvpn/tun0
openvpn --genkey --secret ta.key
Генерим серверные OpenVPN сертификаты

Код: Выделить всё

cd /etc/openvpn/tun0/easy-rsa/easyrsa3
. ./vars
./easyrsa init-pki
./easyrsa build-ca nopass
./easyrsa gen-dh
./easyrsa gen-req server nopass
./easyrsa sign-req server server
cp pki/ca.crt /etc/openvpn/tun0
cp pki/private/server.key /etc/openvpn/tun0
cp pki/issued/server.crt /etc/openvpn/tun0
cp pki/dh.pem /etc/openvpn/tun0/dh2048.pem
> pki/crl.pem
mkdir ../../ccd
cd /lib/systemd/system
cp openvpn-server\@.service openvpn-tun0\@server.service
В файле /lib/systemd/system/openvpn-tun0\@server.service корректируем строку

Код: Выделить всё

WorkingDirectory=/etc/openvpn/tun0
Запускаем сервис OpenVPN

Код: Выделить всё

systemctl enable openvpn-tun0@server
systemctl start openvpn-tun0@server
Готовим командный скрипт, который будет генерить клиентские OpenVPN сертификаты

Код: Выделить всё

cd /etc/openvpn/tun0/easy-rsa/easyrsa3
yum install expect
mkdir ovpn
chmod 755 gen-cert-req gen-cert-sig
Создаём в папке easyrsa3 файл gen-certs

Код: Выделить всё

#!/bin/bash
    # Порция сертификатов, которая будет сгенерирована
    PORTION=5

    PHOVPN=/etc/openvpn/tun0
    PHEASY=/easy-rsa/easyrsa3
    
    cd $PHOVPN$PHEASY
    . ./vars
    NETWORK="`sed -rn 's/^server +(.*)/\1/p' $PHOVPN/server.conf`"
    SEQPORTION=gen-cert-mem
    MINA=`ipcalc --minaddr $NETWORK|sed -r 's/.*=(.*)/\1/'`
    MAXA=`ipcalc --maxaddr $NETWORK|sed -r 's/.*=(.*)/\1/'`
    ADDR=`ipcalc --addresses $NETWORK|sed -r 's/.*=(.*)/\1/'`
    SUM=0;NCERT=0;IFS=.
    
    [ -f $SEQPORTION ] && . ./$SEQPORTION || read -a MINADDR <<< "$MINA"
    read -a MAXADDR <<< "$MAXA"
    
    IFS=$'\n'
    for IP1 in `seq ${MINADDR[0]} ${MAXADDR[0]}`;do
     for IP2 in `seq ${MINADDR[1]} ${MAXADDR[1]}`;do
      for IP3 in `seq ${MINADDR[2]} ${MAXADDR[2]}`;do
       for IP4 in `seq ${MINADDR[3]} 4 ${MAXADDR[3]}`;do
       
        [ $SUM -eq 0 ] && ((SUM=++SUM)) || {
         echo -e "MINADDR=($IP1 $IP2 $IP3 $IP4)\nNCERT=$((++NCERT))">$SEQPORTION
         FCERT=`printf "%0${#ADDR}d" $NCERT`
         ./gen-cert-req client-$FCERT
         ./gen-cert-sig client-$FCERT
         cp pki/issued/client-${FCERT}.crt ovpn
         cp pki/private/client-${FCERT}.key ovpn
         cp pki/ca.crt ovpn/client-${FCERT}-ca.crt
         cp $PHOVPN/ta.key ovpn/client-${FCERT}-ta.key

         # Формирование сlient-XXX.ovpn конфигурационного файла
         cat << EOF > ovpn/client-${FCERT}.ovpn
client
dev tun
proto udp
remote 128.71.188.17 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca client-${FCERT}-ca.crt
cert client-${FCERT}.crt
key client-${FCERT}.key
remote-cert-tls server
tls-auth client-${FCERT}-ta.key 1
cipher AES-256-CBC
verb 3
EOF
         
        # Формирование сlient-XXX конфигурационного файла
         cat << EOF > $PHOVPN/ccd/client-${FCERT}
ifconfig-push $IP1.$IP2.$IP3.$IP4 $IP1.$IP2.$IP3.$((IP4+1))
push "route 192.168.88.0 255.255.255.0"
EOF

         [ $((SUM++)) -eq $PORTION ] && exit 0
        }
       done
      done
     done
    done
Создаём в папке easyrsa3 файл gen-cert-sig

Код: Выделить всё

#!/usr/bin/expect -f
set ncert [lindex $argv 0];
set timeout 3
spawn ./easyrsa sign-req client $ncert
expect "Confirm request details:\r"
send -- "yes\r"
expect eof
Создаём в папке easyrsa3 файл gen-cert-req

Код: Выделить всё

#!/usr/bin/expect -f
set ncert [lindex $argv 0];
set pass [format %s%s%s $ncert mypaswd \r]
set timeout 3 
spawn ./easyrsa gen-req $ncert    
expect "Enter PEM pass phrase:\r"    
send -- $pass    
expect "Verifying - Enter PEM pass phrase:\r"    
send -- $pass    
send -- "\r"    
expect eof
Делаем эти командные файлы выполняемыми

Код: Выделить всё

chmod 770 gen-cert-req gen-cert-sig gen-certs
Запуск генерации клиентских OpenVPN сертификатов

Код: Выделить всё

cd /etc/openvpn/tun0/easy-rsa/easyrsa3
./gen-certs
Описание результата работы командного файла gen-certs
1. Сертификаты client-XXX.crt, формируются в папке easyrsa3/pki/issued
2. Ключи client-XXX.key, формируются в папке easyrsa3/pki/private
3. Для каждого client-XXX формируется в папке /etc/openvpn/tun0/ccd конфигурационный файл, в котором прописан его IP адрес и доступные ему подсети
4. Конфигурационные файлы client-XXX.ovpn и принадлежащие ему сертификаты, ключи, формируются в папке easyrsa3/ovpn

Описание алгоритма формирования порции для каждого клиентского OpenVPN сертификата
Порция формирования сертификатов задаётся в командном файле gen-certs в строке PORTION=5. При окончании выполнения командного файла gen-certs, формируется конфигурационный файл gen-cert-mem. В нём сохраняется информация с какого IP и с какой порции начать следующее формирование группы сертификатов

Описание алгоритма формирования пароля для каждого клиентского OpenVPN сертификата
Формирования пароля для каждого клиентского сертификата OpenVPN, происходит в двух командных файлах:
1. В файле gen-certs в строке ./gen-cert-req client-$FCERT
2. В файле gen-cert-req в строке set pass [format %s%s%s $ncert mypaswd \r]

В итоге получается личный алгоритмический пароль для каждого клиентского сертификата:
client-XXXmypaswd
где XXX порядковый номер сертификат, длина которого зависит от назначаемой подсети серверной части сервиса OpenVPN

Пример:
Для конфигурационного файла client-001.ovpn для его сертификата будет сформирован пароль client-001mypaswd

Если клиентские сертификаты OpenVPN , будут генериться в ручном варианте, прилагается памятка назначения IP адресов:
[ 1, 2] [ 5, 6] [ 9, 10] [ 13, 14] [ 17, 18]
[ 21, 22] [ 25, 26] [ 29, 30] [ 33, 34] [ 37, 38]
[ 41, 42] [ 45, 46] [ 49, 50] [ 53, 54] [ 57, 58]
[ 61, 62] [ 65, 66] [ 69, 70] [ 73, 74] [ 77, 78]
[ 81, 82] [ 85, 86] [ 89, 90] [ 93, 94] [ 97, 98]
[101,102] [105,106] [109,110] [113,114] [117,118]
[121,122] [125,126] [129,130] [133,134] [137,138]
[141,142] [145,146] [149,150] [153,154] [157,158]
[161,162] [165,166] [169,170] [173,174] [177,178]
[181,182] [185,186] [189,190] [193,194] [197,198]
[201,202] [205,206] [209,210] [213,214] [217,218]
[221,222] [225,226] [229,230] [233,234] [237,238]
[241,242] [245,246] [249,250] [253,254]

Ограничения TAP драйвера OpenVPN
В настоящее время Android VPN API поддерживает только туннели в стиле TUN или маршрутизирующие туннели на Layer 3. Туннели в стиле TAP или мосты на Layer 2 невозможны на Android.
Это ограничение платформы Android.
Настройка меж сетевого экрана nftables
Останавливаем и отключаем текущий меж сетевой экран firewalld

Код: Выделить всё

systemctl stop firewalld
systemctl disable firewalld
nft flush ruleset
Разрешаем проброс сетевых пакетов между интерфейсами операционной системы
Файл /etc/sysctl.conf приводи к виду

Код: Выделить всё

net.ipv4.ip_forward = 1
Активируем этот динамический параметр ядра

Код: Выделить всё

sysctl -p
Создаем файл /etc/nftables/ipv4-firewall.nft и в него добавляем строки

Код: Выделить всё

flush ruleset

table ip filter {

    chain input {
            type filter hook input priority 0; policy drop;
            ct state established,related accept
            iifname "lo" accept
            ip protocol icmp accept
            udp dport 1194 accept
            ip saddr 10.8.0.0/24 iifname "tun0" udp dport { 5060, 10000-20000 } accept
            ip saddr 192.168.88.0/24 iifname "enp0s3" tcp dport 22 accept
            ip saddr 192.168.88.0/24 iifname "enp0s3" udp dport { 5060, 10000-20000 } accept
            ip saddr 192.168.89.0/24 iifname "enp0s8" udp dport { 5060, 10000-20000 } accept
            ip saddr 85.26.161.45 iifname "enp0s3" tcp dport 22 accept
            ip saddr 10.8.0.5 iifname "tun0" tcp dport 22 accepts
            counter drop
    }

    chain forward {
            type filter hook forward priority 0; policy drop;
            ct state established,related accept
            ip protocol icmp accept
            udp dport { 5060, 10000-20000 } accept
            counter drop
    }

    chain output {
            type filter hook output priority 0; policy accept;
    }
}
table ip nat {
        chain prerouting {
                type nat hook prerouting priority -100; policy accept;
                #ip saddr XXX.XXX.XXX.XXX iifname "enp0s3" udp dport { 5060, 10000-20000 } dnat 192.168.XXX.XX
        }

        chain input {
                type nat hook input priority 100; policy accept;
        }

        chain output {
                type nat hook output priority -100; policy accept;
        }

        chain postrouting {
                type nat hook postrouting priority 100; policy accept;
                #oifname "enp0s3" masquerade
        }
}
Создаём файл /etc/sysconfig/nftables.conf и в него добавляем строки

Код: Выделить всё

include "/etc/nftables/ipv4-firewall.nft"
Производим активацию правил межсетевого экрана nftables

Код: Выделить всё

systemctl start nftables
systemctl enable nftables
Настройка роутера Микротик

Код: Выделить всё

/ip route
    add dst-address=10.8.0.0/24 gateway=192.168.88.2

/ip firewall nat
    add action=masquerade chain=srcnat out-interface=l2tp-out1
    add action=dst-nat chain=dstnat dst-address-list="" dst-port=22 in-interface=\
            l2tp-out1 protocol=tcp src-address=85.26.161.45 src-port="" to-addresses=\
            192.168.88.2 to-ports=22
    add action=dst-nat chain=dstnat dst-port=1194 in-interface=l2tp-out1 protocol=\
            udp to-addresses=192.168.88.2 to-ports=1194
Обязательно отключите сервис SIP в Микротике, иначе не будет двух стороннего голоса от провайдера

Код: Выделить всё

/ip firewall service-port
    set sip disabled=yes
Конфигурация внутренних номеров PJSIP IP Телефонии Asterisk RealTime

Разрешаем IP Телефонии Asterisk прослушивать со всех сетевых интерфейсов UDP пакеты

Код: Выделить всё

mkdir -p /opt/asterisk/sql
cd /opt/asterisk/sql
Создаем командный файл transpors и приводим его к такому виду:

Код: Выделить всё

#!/bin/bash
mysql asterisk << EOF
     INSERT INTO ps_transports(id,bind,protocol)
     VALUES('transport-udp','0.0.0.0','udp');
EOF

Код: Выделить всё

asterisk -x reload
Делаем командный файл /opt/asterisk/sql/transpors, выполняемым и запускаем его

Код: Выделить всё

chmod 750 transports
./transports
Проверка

Код: Выделить всё

asterisk -x "pjsip show transports"
Создаём список ACL контроля доступа в IP Телефонию Asterisk, файл /etc/asterisk/acl.conf приводим к виду

Код: Выделить всё

[vpn]
deny=0.0.0.0/0.0.0.0
permit=10.8.0.0/24

[office]
deny=0.0.0.0/0.0.0.0
permit=192.168.89.0/24

Код: Выделить всё

asterisk -x "reload acl"
Проверка

Код: Выделить всё

asterisk -x "acl show vpn"
asterisk -x "acl show office"
Для создании процедуры на стороне SQL Сервера MariaDB, которая будет формировать офисную и удалённую номерную ёмкость в IP Телефонии Asterisk. Приводим файл /opt/asterisk/sql/numPhones.sql к виду

Код: Выделить всё

USE asterisk;

DELIMITER //

CREATE OR REPLACE PROCEDURE delPhone( IN num INT)
BEGIN
 DELETE FROM ps_aors WHERE id=num;
 DELETE FROM ps_auths WHERE id=num;
 DELETE FROM ps_endpoints WHERE id=num;
END;

CREATE OR REPLACE PROCEDURE addPhone( IN num INT, IN acl VARCHAR(30))
BEGIN
 SET @passwd='mypasswd';
 SELECT @@GLOBAL.hostname into @realm;
 INSERT INTO ps_aors(id, max_contacts) VALUES (num, 1);
 INSERT INTO ps_auths(id, auth_type, realm, username, md5_cred)
  VALUES(num, 'md5', @realm, num, MD5(CONCAT(num, ':', @realm, ':', @passwd)));
 INSERT INTO ps_endpoints(id, transport, aors, auth, context, disallow, allow, direct_media, callerid, acl)
  VALUES(num, 'transport-udp', num, num, CONCAT('from-', acl), 'all', 'ulaw', 'no', CONCAT(acl,' <', num, '>'), acl);
END;

//
DELIMITER ;

Код: Выделить всё

cd /opt/asterisk/sql
mysql < numPhones.sql
Командный файл /opt/asterisk/sql/numPhones приводим к виду

Код: Выделить всё

#!/bin/bash

for NUM in `seq 100 199`;do
 mysql asterisk -e "CALL addPhone($NUM, 'office')"
done

for NUM in `seq 200 299`;do
 mysql asterisk -e "CALL addPhone($NUM, 'vpn')"
done

cd /opt/asterisk/sql
./numPhones
Проверка

Код: Выделить всё

asterisk -x "pjsip show endpoints"
Пример создания и удаления номера из IP Телефонии Asterisk

Код: Выделить всё

mysql asterisk -e "CALL delPhone(100)"
mysql asterisk -e "CALL addPhone(101, 'office')"
mysql asterisk -e "CALL addPhone(102, 'vpn')"
Файл /etc/asterisk/extensions.conf приводим к виду

Код: Выделить всё

[from-office]
exten => _[12]XX,1,NoOp(${EXTEN})
    same => n,Dial(PJSIP/${EXTEN})
    
[from-vpn]
exten => _[12]XX,1,NoOp(${EXTEN})
    same => n,Dial(PJSIP/${EXTEN})

Код: Выделить всё

asterisk -x "dialplan reload"
Пример: вызова контекстной документации PJSIP параметра IP Телефонии Asterisk

Код: Выделить всё

asterisk -r
vm1*CLI> config show help res_pjsip auth auth_type
[auth]
auth_type = [Custom] (Default: userpass) (Regex: false)

Authentication type

 This option specifies which of the password style config options should be
read when trying to authenticate an endpoint inbound request. If set to
'userpass' then we'll read from the 'password' option. For 'md5' we'll read
from 'md5_cred'. If set to 'google_oauth' then we'll read from the
refresh_token/oauth_clientid/oauth_secret fields.
    md5
    userpass
    google_oauth

vm1*CLI>
Для записи билинговых соединений CDR записей в MariaDB SQL Server, файл /etc/asterisk/cdr_adaptive_odbc.conf приводим к виду

Код: Выделить всё

[first]
connection=asterisk
table=cdr
Отключаем в CDR время звонка в формате GMT, тет самым делаем его системным, файл /etc/asterisk/cdr.conf приводим к виду

Код: Выделить всё

usegmtime=no

Код: Выделить всё

systemctl restart asterisk
Организация планового удаления CDR файлов из базы данных SQL Server MariaDB

Код: Выделить всё

mysql asterisk

MariaDB [asterisk]> CREATE OR REPLACE EVENT `cdr_schedule`
    -> ON SCHEDULE EVERY 1 MONTH STARTS CURRENT_TIMESTAMP
    -> ON COMPLETION PRESERVE
    -> ENABLE
    -> COMMENT 'Удаление записей CDR, которые по дате больше 60-ти месяцев'
    -> DO DELETE FROM cdr WHERE `start` < DATE_ADD( SYSDATE(), INTERVAL - 60 MONTH )
    -> ;
Query OK, 0 rows affected, 1 warning (0.002 sec)

MariaDB [asterisk]> exit
Русификация голосовых уведомлений, которые поставляются с IP Телефонией Asterisk
Файл /etc/asterisk/asterisk.conf, приводим к виду

Код: Выделить всё

defaultlanguage = ru
Проверка

Код: Выделить всё

[from-office]
exten => _[12]XX,1,NoOp(${EXTEN})
    same => n,Playback(tt-somethingwrong&silence/1&tt-weasels&silence/1)
Для осуществления удаленного доступа к таблице CDR записей в MariaDB SQL Server, можно воспользоваться SQL GUI dbFoge Studio 2020 for MySQL (бесплатно для некоммерческого использования). Скачать бесплатную версию можно от сюда: https://www.devart.com/ru/dbforge/mysql ... nload.html

Предоставление удаленного доступа к рабочему компьютеру, который находится по IP адресу 192.168.88.10

Код: Выделить всё

mysql asterisk
GRANT SELECT ON asterisk.cdr TO 'cdr'@'192.168.88.10' IDENTIFIED BY 'mypasswd';
В межсетевом экране добавить правило

Код: Выделить всё

 nft insert rule filter input ip saddr 192.168.88.10 iifname "enp0s3" tcp dport 3306 accept
Организация записей разговоров в формате mp3

Код: Выделить всё

yum install https://download1.rpmfusion.org/free/el/rpmfusion-free-release-8.noarch.rpm
yum install https://download1.rpmfusion.org/nonfree/el/rpmfusion-nonfree-release-8.noarch.rpm
yum install ffmpeg
mkdir /opt/asterisk/monitor
mkdir /opt/asterisk/records
Файл /opt/asterisk/monitor/monitor_mp3, приводим к виду

Код: Выделить всё

#!/bin/bash

    PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
    
    MONITOR=/var/spool/asterisk/monitor
    DB=/opt/asterisk/records
    
    YEAR=`date '+%Y' -d '-5 year'`
    rm -rf $DB/$YEAR
    
    cd $MONITOR
    
    [ `pgrep -c \`basename $0\`` -ne 1 ] && exit 0
    
    ls *.wav | while read FILE;do
     [ -s $FILE ] && {
      [ "0`lsof -t $FILE`" -eq 0 ] && {
    #set -x
        NAME=${FILE%.wav}
        #nice -n 19 lame -V2 -S --silent $FILE $NAME.mp3 && {
        nice -n 19 ffmpeg -y -loglevel quiet -i $FILE -q:a 2 $NAME.mp3 && {
        Y=`date '+%Y' --date="@$NAME"`
        M=`date '+%m' --date="@$NAME"`
        D=`date '+%d' --date="@$NAME"`
        mkdir -p $DB/$Y
        mkdir -p $DB/$Y/$M
        mkdir -p $DB/$Y/$M/$D
        mv -f $NAME.mp3 $DB/$Y/$M/$D && rm -f $FILE
    #set +x
    #   exit
       }
      }
     }
    done
    
    exit 0

Код: Выделить всё

chmod 755 monitor_mp3
Файл /etc/cron.d/asterisk, приводим к виду

Код: Выделить всё

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
*/5 * * * * root /opt/asterisk/monitor/monitor_mp3
Файл /etc/asterisk/extensions.conf, приводим к виду

Код: Выделить всё

[from-office]
exten => _X.,1,MixMonitor(${UNIQUEID}.wav)
exten => _[12]XX,2,Dial(PJSIP/${EXTEN})
Каждые 5 мин. bash скрипт monitor_mp3, будет забирать из папки /var/spool/asterisk/monitor файлы разговоров формата WAV и сжимать в формат MP3 с переносом в папку /opt/asterisk/records
Для удобства поиска файлов разговоров, в папке records происходит автоматическое формирование вложенных каталогов
+ ГОД
- МЕСЯЦ
- ДЕНЬ
- Файл_Разговора.mp3

Развертывание музыкального проигрывателя с клиент(MPC) серверной(MPD) архитектурой и трансляция аудио потока в место гудков при исходящих до звонов сотрудниками офиса

Код: Выделить всё

yum install mpd
yum search mpg123
yum install meson.noarch
yum install cmake
yum install libmpdclient-devel
yum install sphinx
cd /usr/local/src
wget https://www.musicpd.org/download/mpc/0/mpc-0.33.tar.xz
tar xvfJ mpc-0.33.tar.xz
cd mpc-0.33
meson . output
ninja -C output
ninja -C output install
Файл /etc/mpd.conf, приводим к виду

Код: Выделить всё

audio_output {
    type            "httpd"
    name            "Asterisk HTTP Stream"
    encoder         "lame"
    port            "8000"
    bind_to_address "0.0.0.0"
    bitrate         "320"
    format          "44100:16:2"
    max_clients     "2"
}
В папку /var/lib/mpd/music копируем MP3 файлы

Код: Выделить всё

systemctl start mpd
systemctl enable mpd
mpc repeat on
mpc random on
mpc stop
mpc clear
mpc update
mpc ls | mpc add
mpc play
Для проверки работоспособности вещания плейлиста, в межсетевом экране nftables для офисных под сетей, открываем 8000 порт

Код: Выделить всё

nft insert rule filter input ip saddr 192.168.89.0/24 iifname "enp0s8" tcp dport 8000 accept
nft insert rule filter input ip saddr 192.168.88.0/24 iifname "enp0s3" tcp dport 8000 accept
Тестовое прослушивание вещания плейлиста, можно осуществлять через веб браузер по адресу http://192.168.88.2:8000 или http://192.168.89.2:8000

Конфигурация передачи вещания плейлиста аудио потока в IP Телефонию Asterisk
Файл /etc/asterisk/musiconhold.conf, приводим к виду

Код: Выделить всё

[radio]
mode=custom  
application=/usr/bin/mpg123 -q -r 8000 -f 8192 --mono -s http://localhost:8000
Файл /etc/asterisk/extensions.conf, приводим к виду

Код: Выделить всё

[from-office]
exten => _X.,1,MixMonitor(${UNIQUEID}.wav)
exten => _[12]XX,2,Dial(PJSIP/${EXTEN},,tTm(radio)S(2400))

Код: Выделить всё

systemctl restart asterisk
Установка OpenVPN в операционную систему MS-Windows, забирать тут:
https://build.openvpn.net/downloads/releases/
1. После установки OpenVPN, файлы сертификатов CRT, KEY и конфигурационный файл OVPN, копируются в папку C:\Program Files\OpenVPN\config
2. На рабочем столе, запускается программа Open VPN GUI
3. В правом нижнем углу MS-Windows в Панели задач, появится иконка Open VPN GUI
4. На ней нажимаем правую кнопку мышки, далее появится меню
5. Выбираем пункт Подключиться
6. В появившимся диалоговом окне, вводим пароль сертификата
7. При удачном соединении, иконка Open VPN GUI загорится Зелёным цветом
Установка программного SIP телефона MicroSIP в операционную систему MS-Windows, забирать тут:
https://www.microsip.org/downloads
1. На рабочем столе, запускается программа MicroSIP
2. В правом нижнем углу MS-Windows в Панели задач, появится иконка MicroSIP
3. На ней нажимаем правую кнопку мышки, далее появится меню
4. Выбираем пункт Добавить аккаунт...
6. В появившимся диалоговом окне, вводим реквизиты доступа SIP IP Телефонии
7. При удачном соединении, иконка MicroSIP загорится Голубым цветом
Установка OpenVPN в операционную систему Android
1. Забирать из Play Market программное обеспечение под названием OpenVPN Connect – Fast & Safe SSL VPN Client
2. Скопировать файлы сертификатов OpenVPN Connect - Пример: это client-002-ca.crt, client-002-ta.key, client-002.crt, client-002.key, client-002.ovpn в Смартфон в папку downloads
3. После запуска программы OpenVPN Connect открыть вкладку FILE
4. Выбрать файл client-002.ovpn и нажать кнопку IMPORT
5. Поставить галку Save Private Key Password, набрать пароль сертификата, потом подтвердить
6. Далее в разделе Profiles, нажать кнопку Connect
7. При успешном соединении текущего сертификата OpenVPN Connect, покажет статус соединения
Установка ZoilPer SIP Client в операционную систему Android
1. Забирать из Play Market программное обеспечение под названием Zoilper IAX SIP VOIP Softphone
2. В разделе Account setup введите Имя и Пароль SIP данных
3. Далее введите IP Адрес SIP Сервиса
4. Далее нажимаем кнопку Пропустить
5. Дожидаемся тестирование конфигураций сети SIP, нажимаем на кнопку Конец
Удачи!