Установка FreePBX13 Asterisk13 на Centos7

Установка FreePBX и Asterisk 13

В этой статье Вы найдёте полностью работоспособную инструкцию для установки и запуска собственной АТС на базе современного сервера IP телефонии Asterisk 13, а также системы управления им через веб-интерфейс FreePBX 13.

Почему FreePBX?

Многие недолюбливают FreePBX ссылаясь на его дырявость, кривую русификацию и местами непонятный интерфейс. Хочу сразу сказать, что в последней версии продукта исправлены многие ошибки, улучшено визуальное оформление и удобство навигации, даже перевод интерфейса выполнен на значительно новом качественном уровне. Не стоит забывать, что FreePBX позволит поднять сервер телефонии за считанные часы практически любому специалисту в том числе и с начальным уровнем знаний. В конфигурации по умолчанию вы получите широчайшие возможности, этих возможностей из «коробки» хватит для решения задач даже для крупных компаний. Конечно если Вам по каким-либо причинам не хватает возможностей веб-интерфейса, и нужно реализовать какую-то уникальную (не стандартную) фишку, скорее всего Вы обнаружите ряд проблем, связанных с использованием FreePBX, это различные костыли и затрудненность дебага. В таком случае Вам стоит сразу начинать разбираться в чистом Asterisk, не пугайтесь консоли! Вы получите огромное количество знаний, а главное глубокое понимание принципов работы сервера.

Чем отличается данная статья от официального мануала, или множества других статей на просторах интернета:

  • В данной статье Вы найдете описание (кто и зачем) устанавливаемых пакетов и библиотек;
  • Рассмотрены многие аспекты безопасности и защиты Вашего сервера телефонии;
  • Установка FreePBX выполняется в соответствии высокому уровню безопасности;
  • Мои старания сделать материал доступным и интересным даже для новичка;
  • Полностью работоспособная инструкция по установке FreePBX 13.

Если Вас устраивают возможности, предложенные в последней версии FreePBX 13, то давайте приступим к установке и настройке Вашего сервера IP телефонии. Установка связки Asterisk 13 + FreePBX 13 будет происходить на подготовленный и настроенный сервер  на базе CentOS Linux 7. Для удобства восприятия и визуального структурирования статья будет разбита на несколько частей.

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

Выключение SELinux

sed -i 's/\(^SELINUX=\).*/\SELINUX=disabled/' /etc/sysconfig/selinux
sed -i 's/\(^SELINUX=\).*/\SELINUX=disabled/' /etc/selinux/config

Зависимости

yum install -y kernel-devel kernel-headers

yum install -y e2fsprogs-devel keyutils-libs-devel krb5-devel libogg \
libselinux-devel libsepol-devel libxml2-devel libtiff-devel gmp php-pear \
php php-gd php-mysql php-pdo php-mbstring ncurses-devel \
mysql-connector-odbc unixODBC unixODBC-devel \
audiofile-devel libogg-devel openssl-devel zlib-devel \
perl-DateManip sox git wget net-tools psmisc

yum install -y gcc gcc-c++ make gnutls-devel \
libxml2-devel ncurses-devel subversion doxygen \
texinfo curl-devel net-snmp-devel neon-devel \
uuid-devel libuuid-devel sqlite-devel sqlite \
speex-devel gsm-devel libtool libtool-ltdl libtool-ltdl-devel

Выполните полное обновление системы:

yum -y update

Перезагрузите компьютер:

reboot

После перезагрузки проверьте статус SELinux командой «sestatus», Вы должны увидеть следующий вывод:

SELinux status: disabled
Установим и настроим MariaDB

Выполните:

yum -y install mariadb-server mariadb mariadb-devel

Запустим и включим автозагрузку при старте системы:

systemctl start mariadb.service
systemctl enable mariadb.service

Приступим к конфигурированию MariaDB, в инструкции на официальном сайте предложено не задавать пароль для подключения пользователя root, это связано с выполнением скрипта установки FreePBX командой «./install –n», при этом подключение к базе происходит от имени пользователя root без пароля. Начинающий пользователь может пропустить в процессе настройки несколько очень важных параметров (не будет задан пароль для подключения пользователя root, останется разрешено удаленное подключение для пользователя root), что создаст серьезную уязвимость! Мы отступим от официальной инструкции и выполним установку и настройку с высоким уровнем безопасности.
Запустите интерактивный конфигуратор:

mysql_secure_installation

Рассмотрим подробно параметры настройки:

Enter current password for root (enter for none) оставляем поле пустым нажимаем Enter
Set root password Y
New password: Задаем пароль
Re-enter new password: Подтверждаем
Remove anonymous users Y
Disallow root login remotely Y
Remove test database and access to it Y
Reload privilege tables now? Y

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!
Компиляция необходимых пакетов и библиотек для Asterisk

PearDB
(библиотека классов PHP с открытым исходным кодом)

pear uninstall db
pear install db-1.7.14

SRTP
(Безопасный протокол передачи данных в реальном времени (или SRTP) определяет профиль RTP (транспортный протокол в реальном времени) и предназначен для шифрования, установления подлинности сообщения, целостности, защиту от замены данных RTP в однонаправленных и multicast передачах медиа и приложениях)

cd /usr/src && wget http://srtp.sourceforge.net/historical/srtp-1.4.2.tgz

tar zxvf srtp-1.4.2.tgz &&
cd srtp && autoconf &&
./configure CFLAGS=-fPIC --prefix=/usr &&
make &&
make runtest &&
make install

Pjproject
(open source библиотека для разработки VoIP приложений на различных платформах)

cd /usr/src && git clone git://github.com/asterisk/pjproject pjproject

cd pjproject/ &&
./configure --libdir=/usr/lib64 --prefix=/usr --enable-shared --disable-sound --disable-resample &&
make dep &&
make &&
make install &&
ldconfig

libjansson
(библиотека на С для кодирования и декодирования JSON данных)

cd /usr/src && wget http://www.digip.org/jansson/releases/jansson-2.5.tar.gz

tar zvxf jansson-2.5.tar.gz &&
cd jansson-2.5 &&
./configure --prefix=/usr/ &&
make clean &&
make &&
make install &&
ldconfig

Lame
(свободное приложение для кодирования аудио в формат MP3)

cd /usr/src && wget http://sourceforge.net/projects/lame/files/lame/3.98.4/lame-3.98.4.tar.gz

tar zxvf lame-3.98.4.tar.gz &&
cd lame-3.98.4 &&
./configure &&
make &&
make install

DAHDI
(DAHDI — драйверы для плат производства Digium)

cd /usr/src && wget http://downloads.asterisk.org/pub/telephony/dahdi-linux-complete/dahdi-linux-complete-current.tar.gz

tar xvfz dahdi-linux-complete-current.tar.gz &&
cd dahdi-linux-complete-* &&
make all &&
make install &&
make config

LibPRI
(libpri — библиотека, для работы с потоковыми TDM-интерфейсами ISDN: PRI (Primary Rate Interface) и BRI (Basic Rate Interface))

cd /usr/src && wget http://downloads.asterisk.org/pub/telephony/libpri/libpri-1.6.0.tar.gz

tar xvfz libpri-1.6.0.tar.gz &&
cd /usr/src/libpri-1.6.0 &&
make &&
make install

SpanDSP
(открытая библиотека и набор программ для реализации функции передачи и приема факсов)

cd /usr/src && wget http://soft-switch.org/downloads/spandsp/spandsp-0.0.6.tar.gz

tar zxvf spandsp-0.0.6.tar.gz &&
cd spandsp-0.0.6 &&
./configure &&
make &&
make install &&
ln -s /usr/local/lib/libspandsp.so.2 /usr/lib64/libspandsp.so.2
Установка Asterisk 13
BUG
В некоторых версиях Asterisk может произойти сбой при отсутствии ari.conf
https://issues.asterisk.org/jira/browse/ASTERISK-27026
Выполните в терминале "mkdir -p /etc/asterisk && touch /etc/asterisk/ari.conf" после компиляции Asterisk

Выполните:

cd /usr/src && wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-13-current.tar.gz

tar xvfz asterisk-13-current.tar.gz &&
cd asterisk-13.* &&
contrib/scripts/install_prereq install &&
./configure --libdir=/usr/lib64 &&
contrib/scripts/get_mp3_source.sh

make menuselect

После ввода команды make menuselect, вам будет предложено выбрать устанавливаемые модули. Большинство требуемых модулей выбираются автоматически. Для поддержки mp3 включите модуль 'format_mp3'. Из личных обращений посетителей было выявлено, что не у всех отрабатывает модуль confbridge (необходим для организации конференций), meetme является его более функциональным аналогом. Рекомендую Вам дополнительно и его включить.

---> Add-ons (See README-addons.txt)
--- extended ---
XXX chan_mobile
[*] chan_ooh323
[*] format_mp3
[*] res_config_mysql
--- deprecated ---
[*] app_mysql
[*] app_saycountpl
[*] cdr_mysql

---> Applications
--- Extended ---
[*] app_meetme

---> Core Sound Packages
[*] CORE-SOUNDS-RU-WAV
[*] CORE-SOUNDS-RU-ULAW
[*] CORE-SOUNDS-RU-ALAW
[*] CORE-SOUNDS-RU-GSM
[*] CORE-SOUNDS-RU-G729
[*] CORE-SOUNDS-RU-G722
[*] CORE-SOUNDS-RU-SLN16
[*] CORE-SOUNDS-RU-SIREN7
[*] CORE-SOUNDS-RU-SIREN14

--->  Extras Sound Packages
[*] EXTRA-SOUNDS-EN-WAV
[*] EXTRA-SOUNDS-EN-ULAW
[*] EXTRA-SOUNDS-EN-ALAW
[*] EXTRA-SOUNDS-EN-GSM

Press X to save and exit

Внимание! В некоторых версиях Asterisk может произойти сбой при отсутствии ari.conf

Выполните в терминале:

mkdir -p /etc/asterisk && touch /etc/asterisk/ari.conf

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

make && make install && make config && ldconfig asterisk off

sed -i 's/ASTARGS=""/ASTARGS="-U asterisk"/g'  /usr/sbin/safe_asterisk
Подготовка к установке FreePBX

Создайте пользователя Asterisk и задайте права пользователя.

adduser asterisk -M -c "Asterisk User"

Зададим права на каталоги:

chown asterisk. /var/run/asterisk &&
chown -R asterisk. /etc/asterisk &&
chown -R asterisk. /var/{lib,log,spool}/asterisk &&
chown -R asterisk. /usr/lib64/asterisk &&
chown -R asterisk. /var/www/

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

dd if=/dev/urandom bs=1 count=32 2>/dev/null | base64 - | cut -c2-18

Настроим PHP

cp /etc/php.ini /etc/php.ini_orig &&
sed -ie 's/\;date\.timezone\ \=/date\.timezone\ \=\ "Europe\/Moscow"/g' /etc/php.ini

Настроим Apache

sed -i 's/\(^upload_max_filesize = \).*/\120M/' /etc/php.ini &&
cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf_orig &&
sed -i 's/^\(User\|Group\).*/\1 asterisk/' /etc/httpd/conf/httpd.conf &&
sed -i 's/AllowOverride None/AllowOverride All/'  /etc/httpd/conf/httpd.conf &&
systemctl restart httpd &&
systemctl enable httpd

Подготовка базы данных Asterisk в MaryaDB.

mysql -u root -p
CREATE DATABASE `asterisk` CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE DATABASE `asteriskcdrdb` CHARACTER SET utf8 COLLATE utf8_general_ci;
GRANT ALL PRIVILEGES ON asterisk.* TO asterisk@localhost IDENTIFIED BY 'PASS';
GRANT ALL PRIVILEGES ON asteriskcdrdb.* TO asterisk@localhost IDENTIFIED BY 'PASS';
flush privileges;

* Где PASS сгенерированный сложный пароль.

Установка FreePBX 13

Выполните:

pear install Console_Getopt

cd /usr/src &&
wget http://mirror.freepbx.org/modules/packages/freepbx/freepbx-13.0-latest.tgz &&
tar zxvf freepbx-13.0-latest.tgz &&
cd freepbx

Запустим Asterisk и установим FreePBX.

./start_asterisk start &&
./install

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

fwconsole reload &&
fwconsole ma refreshsignatures &&
fwconsole chown

ln -s /var/lib/asterisk/moh /var/lib/asterisk/mohmp3

fwconsole restart
Firewalld & IPTables

Firewalld

В Centos7 вместо IPTables используется Firewalld.

Выполните для установки:

yum -y install firewalld

Запустите:

systemctl start firewalld

Включите автозагрузку:

systemctl enable firewalld

Проверим:

systemctl status firewalld

Посмотрим, что разрешено по умолчанию:

firewall-cmd --permanent --list-all

Вывод команды:

public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
sourceports:
icmp-blocks:
rich rules:

На постоянной основе разрешен ssh, а также клиент dhcp v6. Я не использую на сервере ip v6, поэтому уберу соответствующее правило:

firewall-cmd --permanent --zone=public --remove-service=dhcpv6-client

Добавим необходимые правила для работы нашего АТС сервера:

firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-port=4569/udp
firewall-cmd --permanent --zone=public --add-port=5038/tcp
firewall-cmd --permanent --zone=public --add-port=5060-5061/tcp
firewall-cmd --permanent --zone=public --add-port=5060-5061/udp
firewall-cmd --permanent --zone=public --add-port=10000-20000/udp

Перезагрузим правила:

firewall-cmd --reload

Проверим:

firewall-cmd --permanent --list-all

Вывод команды:

public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: http ssh
ports: 5060-5061/udp 4569/udp 10000-20000/udp 5060-5061/tcp 5038/tcp
protocols:
masquerade: no
forward-ports:
sourceports:
icmp-blocks:
rich rules:

Все необходимые настройки выполнены.

IPTables

Для использования IPTables на Вашем сервере, выполните следующие шаги.

Выключим Firewalld службу:

systemctl mask firewalld

Остановим Firewalld Service:

systemctl stop firewalld

Установим iptables.

yum -y install iptables-services

Включим IPtables при загрузке системы:

systemctl enable iptables
iptables -P INPUT ACCEPT &&
iptables -F &&
service iptables save &&
iptables -A INPUT -i lo -j ACCEPT &&
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT &&
iptables -A INPUT -p tcp --dport 22 -j ACCEPT &&
iptables -A INPUT -p tcp --dport 80 -j ACCEPT &&
iptables -P INPUT DROP &&
iptables -P FORWARD DROP &&
iptables -P OUTPUT ACCEPT &&
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 tcp -m tcp --dport 5060 -j ACCEPT &&
iptables -A INPUT -p tcp -m tcp --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 &&
service iptables save

Проверим:

iptables -L

Вы должны получить следующий вывод:

iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]
iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]
Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
ACCEPT     udp  --  anywhere             anywhere             udp dpt:sip
ACCEPT     udp  --  anywhere             anywhere             udp dpt:sip-tls
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:sip
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:sip-tls
ACCEPT     udp  --  anywhere             anywhere             udp dpts:ndmp:dnp
ACCEPT     udp  --  anywhere             anywhere             udp dpt:iax
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:5038

Chain FORWARD (policy DROP)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
Быстрый старт

Подключимся к FreePBX

http://IP-адрес/admin

Первым делом, вам будет предложено задать имя пользователя и пароль FreePBX.

Укажите необходимые данные и нажмите "Create Account":

Настройка FreePBX - создайте администратора

Войдите в систему. Для этого кликните "FreePBX Administration", ведите логин/пароль и нажмите "Continue":

Зайдите в систему

Обратите внимание на ошибку: "No Conference Room App". У меня установка всегда проходит гладко и данной пролемы я не встречал (скриншотом любезно поделился оди из посетителей сайта). Для решения данной проблемы необходимо сменить приложение для Conference Room с app_confbridge на app_meetme. Возможно данная проблема связана со спецификой используемого "железа".

Перейдите в раздел "Settings" -> "Advanced Settings"

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

Установите русский язык для интерфеса FreePBX по умолчанию, для этого укажите ru_RU

Установите язык системы

Для удобства других пользователей включите возможность смены языка интерфейса на лету:

Возможность смены языка интерфейса

Проверьте правильность параметра "Timezone" для PHP:

Установите корректную  временную зону PHP

Переключите приложение для "Conference Room" на app_meetm, нажмите "Submit"

Выберите приложение для "Конференций"

Нажмите по кнопке "Применить изменения"

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

Перейдя в "Dashboard" мы видим отсутствие критических проблем, интерфейс на родном языке и кнопку выбора языка:

Установка FreePBX завершена

На этом базовая установка FreePBX успешно завершена. Подробная настройка системы будет рассмотрена в отдельной статье.

Повышение безопасности сервера

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

SSH (актуально для облаков, VPS/VDS хостинга. SSH порт выставлен в интернет)

Настоятельно рекомендую ознакомиться со статьей: Установка и настройка SSH . Она написана для Ubuntu, но полностью подойдет и для CentOS. Важными этапами станут следующие шаги:

• Смена стандартного порта;

• Запрет авторизации root через SSH;

• Авторизация по ключу;

• Запрет авторизации по паролю;

• Разрешение доступа по SSH только определенным пользователям.

Сетевой экран и проброс портов

В случае необходимости подключения пользователей из внешней сети можно использовать несколько вариантов решения данной ситуации:

1. Удаленный филиал. Самым правильным решением станет организация IPSec (VPN) туннеля между офисами, создание необходимых правил и маршрутов. В таком случае Вы не подвергните Ваш сервер вторжениям из внешней сети, а связь между офисами будет надежно защищена;

2. Удаленный сотрудник. Единственным верным решением, я считаю, использование VPN. Все остальные варианты являются не надежными и требуют проброса портов из внешней сети (интернет) на Ваш сервер телефонии;

3. Без VPN. По личным, религиозным или другим не известным мне причинам VPN не используется и не будет использоваться. Рассмотрим варианты: «Условия А». Сотрудник имеет статичный IP, все становится немного радужнее. Можно организовать проброс портов только для определенных адресов (клиентов). Данный метод все равно требует дополнительной защиты и не является надежным. Вы просто ограничиваете источник угроз до определенного диапазона (разрешенные IP адреса). «Условия Б». На моей практике «условия А» встречаются редко (почти никогда). Обычно внешние пользователи - это целый «зоопарк» устройств и провайдеров. В данном случае (без использования VPN) придется выставлять сервер телефонии портами наружу (в интернет).

Итак, проброс портов:

1. Определитесь с набором необходимых портов. Например, если Вы не используете протокол IAX/IAX2 (протокол Asterisk), то и прокидывать порт не нужно. Опционально - можно ограничить диапазон портов RTP (по умолчанию 10000-20000) из расчета 4 порта на сессию. Исходите из необходимого минимума.

2. Настоятельно рекомендую Вам сменить стандартные порты. Например, 5060 на 8060. Это поможет избавиться от ботов, которые пытаются подобрать пароль на стандартном порту;

3. Уделите внимание настройке FreePBX: используйте SSL/TLS для SIP, а также SRTP для шифрования голоса, запретите входящие анонимные SIP звонки, запретите SIP вызовы без аутентификации, измените пароли по умолчанию, используйте сложные пароли на всех уровнях системы;

4. Используйте Fail2Ban для блокировки подозрительных соединений. Например, Fail2ban блокирует соединение по IP адресу при неправильном вводе пароля более 4 раз (все параметры и условия настраиваются без особых проблем).
Рекомендую Вам выполнить данные пункты даже если проброс портов выполнен для определенных клиентов, использующих статичные белые IP адреса (условия А).

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

 

Раздел: Unix сервера
Top
37 комментариев
  • /usr/sbin/asterisk -U asterisk -G asterisk

  • Здравствуйте, прекрасная статья, а не подскажите, не пробовали ли вы работать с h323? У меня ни как не выходит собрать его на данных версиях центоса и астериска. Была бы очень благодарна за ответ.

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

    На каком именно этапе у Вас возникает проблема?

  • Здравствуйте, присоединюсь, прекрасная статья.
    Я только изучаю астериск и CentOS. Поэтому не могу понять в чем ошибка.
    При установке FreePBX 13 дохожу до строки ./start_asterisk start && ./install
    STARTING ASTERISK
    Asterisk is already running
    Database engine [mysql]:
    ....
    Directory for FreePBX html5 playback files [/var/lib/asterisk/playback]:
    Checking if SELinux is enabled...Error!

    и все прекращается. Я проверял в конфигах SELinux=disable
    Подскажите пожалуйста

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

    Покажите вывод команды: sestatus

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

  • Добрый день.
    Спасибо за теплые слова, рад что смог помочь.

    SpanDSP можно взять тут:
    https://pkgs.org/download/spandsp

  • Страницы

Добавить комментарий