воскресенье, 7 февраля 2016 г.

Использование поля Diversion в SIP пакете и возможные решения проблемы недозвона при двойной переадресации в Asterisk.

Справка о использовании поля Diversion, а так же описание переадресации в SIP здесь: https://tools.ietf.org/html/rfc5806

При двойной переадресации вызова в Asterisk могут быть проблемы недозвона. Например, имеем схему:


Запрос INVITE, поступающий на Asterisk будет такой:
INVITE sip:2057004@10.200.104.12:5172;user=phone SIP/2.0
Accept: application/sdp;q=0.3
Accept: application/ISUP;q=0.2
Accept: multipart/mixed;q=0.1
Allow: INVITE,ACK,CANCEL,BYE,INFO,PRACK,UPDATE,OPTIONS,REGISTER,REFER,SUBSCRIBE,MESSAGE,PUBLISH
Call-ID: 41a5c682bgw882nql@10.200.101.11
Contact: "3303030" <sip:3303030@10.200.101.11:5060;user=phone>
CSeq: 298 INVITE
Expires: 3600
From: "3303030" <sip:3303030@10.200.101.11:5060;user=phone;cpc=ordinary>;tag=t8uu0piu60
To: "205704" <sip:2057004@10.200.104.12:5172;user=phone>
Organization: IskraTel
User-Agent: SI3000
Via: SIP/2.0/UDP 10.200.101.11:5060;branch=z9hG4bK-8uhf0-9alb1
Max-Forwards: 69
Subject: Call from CS6111
Diversion:"910123000"<sip:9101230000@10.200.101.11:5060>;reason=unconditional;privacy=full;counter=1
Content-Length:  233
Content-Type: application/sdp
Content-Disposition: session;handling=required
На Asterisk поступает уже переадресованный вызов с мобильного телефона. Вызов приходит с полем Diversion, в котором указывается номер телефона, на котором установлена переадресация.  На Asterisk в extension.conf установлена переадресация на другой мобильный телефон. 


В этой схеме можем наблюдать проблемы недозвона. 
Проблема возникает из-за того, что некоторые операторы неадекватно реагируют на поле Diversion и могут отбросить вызов, если не смогут его тарифицировать.

Можно решить проблему глобально, выключив поддержку заголовка SIP Diversion глобально в sip.conf. Для этого в глобальных настройках sip.conf необходимо прописать:
send_diversion=no (по умолчанию «yes»). 
Обычно Asterisk отправляет Diversion хидеры с определенным SIP invites для ретрансляции данных о переадресованных звонках. Если выключено, Asterisk не будет отсылать Diversion хидеры, Отсылка будет только если их добавят вручную.
Таким образом, установив в sip.conf
send_diversion=no
и следующие правила переадресации в extensiom.conf
exten => 2057004,1,Set(CALLERID(all)="2057004" <2057004>)
exten => 2057004,n,Dial(${OUTTRUNKSI}/89276132605,120,r)
exten => 2057004,n,Hangup()
будем иметь нормально установленный вызов:


Выходящий с Asterisk запрос INVITE не будет иметь поле Diversion:
INVITE sip:89276132605@10.200.101.11 SIP/2.0.
Via: SIP/2.0/UDP 10.200.104.12:5172;branch=z9hG4bK50851d21.
Max-Forwards: 70.
From: "2057004" <sip:2057004@10.200.104.12:5172>;tag=as07f597ec.
To: <sip:89276132605@10.200.101.11>.
Contact: <sip:2057004@10.200.104.12:5172>.
Call-ID: 26f878371ab6f22b7f68b67923197933@10.200.104.12:5172.
CSeq: 102 INVITE.
User-Agent: Asterisk PBX 13.1-cert2.
Date: Sun, 31 Jan 2016 15:01:25 GMT.
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH, MESSAGE.
Supported: replaces, timer.
Content-Type: application/sdp.
Content-Length: 271.

Решить проблему исключения заголовка Diversion из исходящих INVITE запросов можно и локально для одного абонента, выключив глобальную настройку send_diversion, то есть установив send_diversion=yes.
При этом переадресацию в extension.conf нужно записывать вот так:
exten => 2057004,1,Set(CALLERID(all)="2057004" <2057004>)
exten => 2057004,n,Set(CALLERID(rdnis)=)
exten => 2057004,n,Dial(${OUTTRUNKSI}/89276132605,120,r)
exten => 2057004,n,Hangup()

При необходимости можно добавить второе поле Diversion в SIP пакет INVITE. Это делается так:
exten => 2057004,1,Set(CALLERID(all)="2057004" <2057004>)
exten => 2057004,n,SIPAddHeader(Diversion: <sip:2057004@10.200.104.12>\;user=phone\;privacy=off\;reason=unconditional)
exten => 2057004,n,Dial(${OUTTRUNKSI}/89276132605,120,r)
exten => 2057004,n,Hangup()
Здесь:
privacy=off -пераметр указывает удаленной стороне не верить полю Remote-Party-ID
reason=unconditional - причина перевода (reason) - безусловная переадресация (unconditional)
Пакет INVITE, ходящий с Asterisk будет такой:
INVITE sip:89276132605@10.200.101.11 SIP/2.0.
Via: SIP/2.0/UDP 10.200.104.12:5172;branch=z9hG4bK36d97725.
Max-Forwards: 70.
From: "2057004" <sip:2059590@10.200.104.12:5172>;tag=as540b20bf.
To: <sip:89276132605@10.200.101.11>.
Contact: <sip:2057004@10.200.104.12:5172>.
Call-ID: 3471e7a82c066a3b34ed1aee4a4bd18c@10.200.104.12:5172.
CSeq: 102 INVITE.
User-Agent: Asterisk PBX 13.1-cert2.
Date: Sun, 31 Jan 2016 15:13:33 GMT.
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH, MESSAGE.
Supported: replaces, timer.
Diversion: <sip:2057004@10.200.104.12>;user=phone;privacy=off;reason=unconditional.
Diversion: "9101230000" <sip:9101230000@10.200.104.12>;reason=unconditional.
Content-Type: application/sdp.
Content-Length: 270.





Предварительная настройка ASTERISK 13, которая пригодиться всегда.


1 Делаем резервные копии базовых конфигурационных файлов
# cp /etc/asterisk/sip.conf  /etc/asterisk/sip.conf.sample
# cp /etc/asterisk/extensions.conf /etc/asterisk/extensions.conf.sample

2 Настройки RTP в Asterisk:
В файле /etc/asterisk/rtp.conf в секции [general]
разрешаем хождение RTP по портам от 8000 до 20000
# nano /etc/asterisk/rtp.conf
[general]
rtpstart=8000
rtpend=20000
Рестартуем asterisk
# systemctl restart asterisk.service

3 Отключение сбора CDR в CSV файл.
CSV файл обычно располагается здесь: /var/log/asterisk/cdr-csv/Master.csv
Что бы посмотреть, что данный CDR файл используется для записи информации о вызове, выполняем команду:
# tail -f /var/log/asterisk/cdr-csv/Master.csv
и совершаем вызов через asterisk. В консоли мы должны увидеть новую CDR запись.
Для отключения записи логов CDR в файл Master.csv
 -  закомментировать секцию [csv] в файле /etc/asterisk/cdr.conf
# nano /etc/asterisk/cdr.conf
Должно получиться:
;[csv]
;usegmtime=yes    ; log date/time in GMT.  Default is "no"
;loguniqueid=yes  ; log uniqueid.  Default is "no"
;loguserfield=yes ; log user field.  Default is "no"
;accountlogs=yes  ; create separate log file for each account code. Default is "yes"
 -  Убрать из загрузки модуль модуль cdr_csv.so в /etc/asterisk/modules.conf:
# nano /etc/asterisk/modules.conf
Добавляем к конец строчку:
noload =>cdr_csv.so
 -  Рестартуем сервис Asterisk
# systemctl restart asterisk.service

4 Настаиваем сбор CDR файлов сервера asterisk в базу данных MySQL
Коннектимся к MySQL
# mysql -uroot -p
Создаем базу данных
> CREATE DATABASE asterisk;
Подключаемся к базе данных
> USE asterisk;
Создаем таблицу
> CREATE TABLE IF NOT EXISTS `cdr` (
  `calldate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `clid` varchar(80) NOT NULL DEFAULT '',
  `src` varchar(80) NOT NULL DEFAULT '',
  `dst` 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 '',
  `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',
  `accountcode` varchar(20) NOT NULL DEFAULT '',
  `uniqueid` varchar(32) NOT NULL DEFAULT '',
  `remote_signal_ip` varchar(17) CHARACTER SET utf8 NOT NULL,
  `userfield` varchar(255) NOT NULL DEFAULT '',
  `did` varchar(50) NOT NULL DEFAULT '',
  `recordingfile` varchar(255) NOT NULL DEFAULT '',
  `cnum` varchar(40) NOT NULL DEFAULT '',
  `cnam` varchar(40) NOT NULL DEFAULT '',
  `outbound_cnum` varchar(40) NOT NULL DEFAULT '',
  `outbound_cnam` varchar(40) NOT NULL DEFAULT '',
  `dst_cnam` varchar(40) NOT NULL DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Создаем индексы для этой таблицы:
> ALTER TABLE `cdr`
  ADD KEY `calldate` (`calldate`),
  ADD KEY `dst` (`dst`),
  ADD KEY `accountcode` (`accountcode`),
  ADD KEY `uniqueid` (`uniqueid`),
  ADD KEY `did` (`did`);
Создаем пользователя asterisk  с паролем passwd123
> grant all on asterisk.cdr to asterisk@'localhost' identified by 'passwd123';
Выходим из MySQL.

Сбор CDR в базу MySQL нужно выполнять через сервис ODBC.
Выполняем установку сервиса ODBC, если того еще не произошло раньше:
# yum install unixODBC unixODBC-devel libtool-ltdl libtool-ltdl-devel mysql-connector-odbc
Редактируем файл драйверов сервиса ODBC /etc/odbcinst.ini
# nano /etc/odbcinst.ini
В файле не закомментированным должна быть только секция [MySQL]
[MySQL]
Description    = ODBC for MySQL
Driver         = /usr/lib64/libmyodbc5.so
Setup          = /usr/lib64/libodbcmyS.so
FileUsage      = 1
Проверим видит ли ODBC MySQL драйвер
# odbcinst -q -d
[MySQL]
Создаем файл учетных данных ODBC /etc/odbc.ini
# nano /etc/odbc.ini 
Выписываем туда следующее содержимое:
[MySQL-asteriskcdrdb]
Description=MySQL connection to 'asterisk' database
Driver=MySQL
Server=localhost
Database=asterisk
Port=3306
Socket=/var/lib/mysql/mysql.sock
UserName=asterisk
Password=passwd123
Здесь:
MySQL-asteriskcdrdb – наименование соединения с сервером MySQL
UserName – имя пользователя asterisk
Password – пароль пользователя asterisk

Правим конфигурационные файлы Asdterisk
Проверяем файл  /etc/asterisk/cdr.conf
# nano /etc/asterisk/cdr.conf
В файле должен быть раскомментирован в секции [general] главный параметр enable
[general]
enable=yes
Вносим изменения в файл настройки сервиса ODBC
# nano /etc/asterisk/res_odbc.conf
Вписываем в конец файла:
[asteriskcdrdb]
enabled=>yes
dsn=>MySQL-asteriskcdrdb
pooling=>no
limit=>5
pre-connect=>yes
username=>asterisk
password=>passwd123
Связываем настройку ODBC Asterisk с задачей сбора CDR.
Редактируем файл /etc/asterisk/cdr_odbc.conf
# nano /etc/asterisk/cdr_odbc.conf
Вписываем в конец файла:
[asteriskcdrdb]
connection=asteriskcdrdb
loguniqueid=yes
table=cdr
alias start => calldate

Для того, что бы в базу данных MySQL в поле remote_signal_ip  складывались ip адреса вызывающих абонентов, в диал-план в файле /etc/asterisk/extensions.conf в план набора надо написать вот эту строчку в тот контекст, при совершении вызова через который котором нужно сохранять IP адрес:
Set(CDR(remote_signal_ip)=${CHANNEL(recvip)});

Рестартуем Asterisk:
# systemctl restart asterisk.service
Теперь база данных должна пополняться вызовами, проходящими через asterisk.

Проверка работы ODBC:
asterisk2*CLI> odbc show
ODBC DSN Settings
-----------------
Name:   asteriskcdrdb
DSN:    MySQL-asteriskcdrdb
   Last connection attempt: 1970-01-01 03:00:00
Pooled: No
Connected: Yes

5. Настройка сбора логов CEL(Channel Event Logging) в базу данных MySQL

Коннектимся к MySQL
# mysql -uroot -p
Подключаемся к базе данных asterisk
> USE asterisk;
Создаем таблицу cel
> CREATE TABLE IF NOT EXISTS `cel` (
`id` int(11) NOT NULL auto_increment,
`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,
PRIMARY KEY (`id`),
KEY `uniqueid_index` (`uniqueid`),
KEY `eventtime_index` (`eventtime`),
KEY `linkedid_index` (`linkedid`)
);
Даем пользователю asterisk возможность работы с таблицей cel
> grant all on asterisk.cel to asterisk@'localhost' identified by 'passwd123';
Выходим из MySQL.

Включаем генерацию CEL в asterisk:
# nano /etc/asterisk/cel.conf
В разделе [general] должно быть прописано
[general]
enable=yes
apps=all
events=ALL
dateformat = %F %T
Затем указываем asterisk, куда заносить сгенерированные события CEL
# nano /etc/asterisk/cel_odbc.conf
В конец файла дописываем:
[cel]
connection=asteriskcdrdb
loguniqueid=yes
table=cel
Здесь cel – название таблицы в MySQL, asteriskcdrdb – название соединения ODBC из файла /etc/asterisk/res_odbc.conf

Перезагружаем сервис asterisk:
# systemctl restart asterisk.service

Проверка включения CEL в asterisk
# asterisk -rx "cel show status"
CEL Logging: Enabled
CEL Tracking Event: ALL
CEL Tracking Event: CHAN_START
CEL Tracking Event: CHAN_END
CEL Tracking Event: HANGUP
CEL Tracking Event: ANSWER
CEL Tracking Event: APP_START
CEL Tracking Event: APP_END
CEL Tracking Event: BRIDGE_ENTER
CEL Tracking Event: BRIDGE_EXIT
CEL Tracking Event: PARK_START
CEL Tracking Event: PARK_END
CEL Tracking Event: BLINDTRANSFER
CEL Tracking Event: ATTENDEDTRANSFER
CEL Tracking Event: USER_DEFINED
CEL Tracking Event: LINKEDID_END
CEL Tracking Event: PICKUP
CEL Tracking Event: FORWARD
CEL Tracking Event: LOCAL_OPTIMIZE
CEL Tracking Application: all
CEL Event Subscriber: ODBC CEL backend
CEL Event Subscriber: CEL Custom CSV Logging

6 Настройка обработчика джиттера в Asterisk.
Для того что бы включить компенсацию джиттера на сервере Asterisk в файл sip.conf в секцию [general] вписываем строки:
jbenable = yes
jbforce = yes
jbmaxsize = 400
jbresyncthreshold = 1000 
jbimpl = fixed
Затем из консоли Asterisk выполняем
> sip reload


Развертывание Asterisk 13 + DAHDI на пустом CentOS7 с нуля

1. Подготовка системы к установке

Ставим базовые пакеты
# yum install nano
# yum install mc wget
# yum install git
# yum install nc

Отключаем SE Linux
# nano /etc/sysconfig/selinux
Комментируем все, вставляем строку
SELINUX=disabled

Переходим от firewalld к iptables
Останавливаем и удаляем firewald
# systemctl stop firewalld
# systemctl disable firewalld
Установим и запустим службу iptables:
# yum install iptables-services
# systemctl start iptables
# systemctl enable iptables

Обновляем систему
# yum update

Подключаем репозитарий EPEL
# yum -y install epel-release
# rpm -Uvh http://files.freeswitch.org/freeswitch-release-1-6.noarch.rpm

Перезагружаемся
# reboot


2. Меняем стандартный пароль на root

# passwd root
Изменяется пароль пользователя root.
Новый пароль : <вводим пароль>
Повторите ввод нового пароля : <вводим пароль еще раз>
passwd: все данные аутентификации успешно обновлены.


3. Меняем имя сервера:

Cмотрим текущее имя так:
# hostnamectl status
Имя меняем так:
# hostnamectl set-hostname asterisk2.svttk.ru
Прописываем собственное имя в файле hosts
# nano /etc/hosts
Дописываем имя сервера в строке:
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 asterisk2.svttk.ru


4. Установка базы данных MariaDB (MySQL для CentOS7)

# yum install mysql mariadb-server
Добавляем с скрипт автозапуска
# systemctl enable mariadb.service
Запускаем сервер MariaDB
# systemctl start  mariadb.service
Задаем пароль root для сервера MariaDB
# mysql_secure_installation
Сначала вводим на первый вопрос просто <Enter>, затем на следующих вопросах вводим пароль и его подтверждение. На остальные вопросы отвечаем ДА (y)
Перезагружаем сервис просто так:
# systemctl restart  mariadb.service


5. Установка Web-сервера APACHE

# yum install httpd
Задание имени серверу. Открываем файл /etc/httpd/conf/httpd.conf
# nano /etc/httpd/conf/httpd.conf
Находим строку:
#ServerName www.example.com:80
меняем ее на:
ServerName ServerName www.asterisk2.svttk.ru:80
Здесь - www.asterisk2.svttk.ru – это имя нашего web сервера. Для того что бы сам сервер знал всегда свое имя, добавляем это имя в файл hosts
# nano /etc/hosts
Первая строка в файле теперь приводиться к виду
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 asterisk2.svttk.ru www.asterisk2.svttk.ru
Добавляем сервер Apache в скрипт автозапуска
# systemctl enable httpd.service
Запускаем сервер Apache
# systemctl start  httpd.service
Разрешаем прохождение пакетов на сервер с ip адресов сети 10.10.0.0/16
Вписываем соответствующее правило в начало цепочки правил в файл /etc/sysconfig/iptables
# nano /etc/sysconfig/iptables
Вписываем
# Открываем для сети 10.10.0.0/16 доступ на 80 порт
-A INPUT -p tcp -s 10.10.0.0/16 --dport 80 -j ACCEPT
Проверяем, обратившись к серверу через http и убеждаемся, что через браузер сервер отвечает.
Проверка работы сервера из командной строки:
# systemctl status httpd.service


6. Установка PHP и связывание его с MySQL

# yum install php
Перезапускаем web-сервер
# systemctl restart  httpd.service
Создаем файл для проверки работы PHP
# nano /var/www/html/info.php
вписываем туда
<?php
phpinfo();
?>
Теперь при запросе страницы http://<ip адрес>/info.php можно увидеть информацию о модуле PHP

Установка модулей для связки PHP5 и Mysql, а так же некоторых других модулей php
# yum install php-mysql php-gd php-imap php-ldap php-odbc
Перезапускаем web-сервер
# systemctl restart  httpd.service
Проверяем информацию на странице http://<ip адрес>/info.php и убеждаемся, что на странице появился раздел посвященный MySQL.


7. Установка PHPMYADMIN

# yum -y install phpmyadmin
Устанавливаем доступ к phpmyadmin с определенных ip (только из локальной сети):
# nano /etc/httpd/conf.d/phpMyAdmin.conf
В следующих блоках добавляем разрешенные сети / Ip-адреса (выделено красным)
<Directory /usr/share/phpMyAdmin/>
   AddDefaultCharset UTF-8

   <IfModule mod_authz_core.c>
     # Apache 2.4
     <RequireAny>
       Require ip 127.0.0.1 10.10.0.0/16
       Require ip ::1
     </RequireAny>
   </IfModule>
   <IfModule !mod_authz_core.c>
     # Apache 2.2
     Order Deny,Allow
     Deny from All
     Allow from 127.0.0.1 10.10.0.0/16
     Allow from ::1
   </IfModule>
</Directory>

<Directory /usr/share/phpMyAdmin/setup/>
   <IfModule mod_authz_core.c>
     # Apache 2.4
     <RequireAny>
        Require ip 127.0.0.1 10.10.0.0/16
       Require ip ::1
     </RequireAny>
   </IfModule>
   <IfModule !mod_authz_core.c>
     # Apache 2.2
     Order Deny,Allow
     Deny from All
     Allow from 127.0.0.1 10.10.0.0/16
     Allow from ::1
   </IfModule>
</Directory>
Перезапускаем сервер Apache
# systemctl restart  httpd.service
Теперь к странице phpmyadmin можно обратиться так: http://<ip адрес>/phpmyadmin 


8. Подготовка к установке телефонных сервисов DAHDI и ASTERISK

Ставим необходимые пакеты:
# yum install tcpdump
# yum install kernel-devel 
# yum install kernel-headers
# yum install perl rpm-build redhat-rpm-config asciidoc hmaccalc perl-ExtUtils-Embed pesign xmlto 
# yum install audit-libs-devel binutils-devel elfutils-devel elfutils-libelf-devel
# yum install ncurses-devel newt-devel numactl-devel pciutils-devel python-devel zlib-devel
# yum install gcc  gcc-c++ mysql-connector-odbc unixODBC unixODBC-devel audiofile-devel libogg-devel openssl-devel zlib-devel
# yum install php-pear php-pdo php-mbstring perl-DateManip sox net-tools psmisc
# yum install e2fsprogs-devel  keyutils-libs-devel krb5-devel libogg libselinux-devel libsepol-devel gmp 
# yum install make gnutls-devel subversion doxygen texinfo curl-devel net-snmp-devel neon-devel uuid-devel libuuid-devel 
# yum install sqlite-devel sqlite speex-devel gsm-devel libtool libtool-ltdl libtool-ltdl-devel 
# yum install ncurses-devel newt-devel libtiff-devel libxml2-devel sqlite-devel glibc-headers
# yum install perl-Pod-Parser

Установка базы PearDB:
# pear channel-update pear.php.net
# pear install -Z db-1.7.14

Устанвока 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
# cd ..

Далее перезагружаем систему:
# reboot


9. Установка 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
# cd ..


10. Ставим SpanDSP, приложение для работы с факсами

# wget http://soft-switch.org/downloads/spandsp/spandsp-0.0.6pre21.tgz
# tar zxvf spandsp-0.0.6pre21.tgz
# cd spandsp-0.0.6
# ./configure
# make
# make install
# ln -s /usr/local/lib/libspandsp.so.2 /usr/lib64/libspandsp.so.2
# cd ..


11. Установка DAHDI и LibPRI

Установка DAHDI
# yum -y install kernel kernel-headers-`uname -r` kernel-devel-`uname -r` 
# 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-2.11.0+2.11.0/
# make all
В CentOS7 почему-то некорректно устанавливаются man-ы DAHDI TOOLS. 
Для решения проблемы необходимо закомментировать в файле tools/xpp/Makefile соответствующую цель
# nano /usr/src/dahdi-linux-complete-2.11.0+2.11.0/tools/xpp/Makefile
ищем и комментируем строчку, установив перед строкой символ #
#install-man: install-man8
Далее запускаем
# make install
# make config
# cd ..

Установка LibPRI, драйвер для работы с потоками PRI
# svn checkout http://svn.asterisk.org/svn/libpri/branches/1.4 libpri
# cd /usr/src/libpri
# make
# make install
# cd ..


12. Установка Asterisk 13

# wget http://downloads.asterisk.org/pub/telephony/certified-asterisk/certified-asterisk-13.1-current.tar.gz
# tar xvfz certified-asterisk-13.1-current.tar.gz
# cd certified-asterisk-13.1-cert2/
# ./configure --libdir=/usr/lib64
Если видим такое значит все удалось
configure: Menuselect build configuration successfully completed

               .$$$$$$$$$$$$$$$=..
            .$7$7..          .7$$7:.
          .$$:.                 ,$7.7
        .$7.     7$$$$           .$$77
     ..$$.       $$$$$            .$$$7
    ..7$   .?.   $$$$$   .?.       7$$$.
   $.$.   .$$$7. $$$$7 .7$$$.      .$$$.
 .777.   .$$$$$$77$$$77$$$$$7.      $$$,
 $$$~      .7$$$$$$$$$$$$$7.       .$$$.
.$$7          .7$$$$$$$7:          ?$$$.
$$$          ?7$$$$$$$$$$I        .$$$7
$$$       .7$$$$$$$$$$$$$$$$      :$$$.
$$$       $$$$$$7$$$$$$$$$$$$    .$$$.
$$$        $$$   7$$$7  .$$$    .$$$.
$$$$             $$$$7         .$$$.
7$$$7            7$$$$        7$$$
 $$$$$                        $$$
  $$$$7.                       $$  (TM)
   $$$$$$$.           .7$$$$$$  $$
     $$$$$$$$$$$$7$$$$$$$$$.$$$$$$
       $$$$$$$$$$$$$$$$.

configure: Package configured for:
configure: OS type  : linux-gnu
configure: Host CPU : x86_64
configure: build-cpu:vendor:os: x86_64 : unknown : linux-gnu :
configure: host-cpu:vendor:os: x86_64 : unknown : linux-gnu :

Качаем звуки
# contrib/scripts/get_mp3_source.sh

Запускаем меню конфигурации
# make menuselect
Должно появиться окно:


Здесь отмечаем дополнительно разделы (клавишей ENTER), которые желаем установить:
 --->  Add-ons (See README-addons.txt) 
  [*] format_mp3
 --->  Call Detail Recording 
[*] cdr_csv  
[*] cdr_odbc
[*] cdr_sqlite3_custom  
 ---> Channel Drivers 
[*] chan_mgcp
[*] chan_oss
[*] chan_phone
[*] chan_sip
[*] chan_skinny
[*] chan_unistim
  ---> 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  
Переходи на кнопку Save & Exit (клавишей TAB) и применяем настройки

Теперь собираем
# make
В конце сборки получаем
 +--------- Asterisk Build Complete ---------+
 + Asterisk has successfully been built, and +
 + can be installed by running:              +
 +                                           +
 +                make install               +
 +-------------------------------------------+
Устанавливаем сборку
# make install
В конце установки получим вывод:
 +---- Asterisk Installation Complete -------+
 +                                           +
 +    YOU MUST READ THE SECURITY DOCUMENT    +
 +                                           +
 + Asterisk has successfully been installed. +
 + If you would like to install the sample   +
 + configuration files (overwriting any      +
 + existing config files), run:              +
 +                                           +
 + For generic reference documentation:      +
 +    make samples                           +
 +                                           +
 + For a sample basic PBX:                   +
 +    make basic-pbx                         +
 +                                           +
 +                                           +
 +-----------------  or ---------------------+
 +                                           +
 + You can go ahead and install the asterisk +
 + program documentation now or later run:   +
 +                                           +
 +               make progdocs               +
 +                                           +
 + **Note** This requires that you have      +
 + doxygen installed on your local system    +
 +-------------------------------------------+
Завершающие штрихи установки
# make config 
# make samples
# ldconfig
# sed -i 's/ASTARGS=""/ASTARGS="-U asterisk"/g'  /usr/sbin/safe_asterisk
# cd ..

Проверяем попал ли Asterisk в автозагрузку:
# chkconfig asterisk --list
Должно быть
asterisk     0:выкл  1:выкл  2:вкл   3:вкл   4:вкл   5:вкл   6:выкл
Если у цифр 2,3,4,5 нет значения «вкл», то добавляем сервис asterisk в автозагрузку командой
# chkconfig --add asterisk

Создаем пользователя Asterisk и задайте права пользователя.
# useradd -m asterisk
# chown asterisk.asterisk /var/run/asterisk
# chown -R asterisk.asterisk /etc/asterisk
# chown -R asterisk.asterisk /var/{lib,log,spool}/asterisk
# chown -R asterisk.asterisk /usr/lib64/asterisk

Разрешаем общение с сервисом Asterisk по порту 5060 и разрешаем обмен по портам 8000..20000 трафику RTP.
# nano /etc/sysconfig/iptables
Вставляем:
## Разрешаем порты для SIP и RTP
-A INPUT -p udp --dport 5060 -j ACCEPT
-A INPUT -p udp --dport 8000:20000 -j ACCEPT
### 
Перезагружаем iptables
# systemctl restart iptables.service

13. Запуск DAHDI и ASTERISK
Для запуска DAHDI необходимо в CentOS 7 создать скрипт запуска
Создаем пустой файл 
# touch /etc/init.d/dahdi
# nano /etc/init.d/dahdi
Помещаем туда:
#!/bin/sh
#
# dahdi         This shell script takes care of loading and unloading \
#               DAHDI Telephony interfaces
# chkconfig: 2345 9 92
# description: The DAHDI drivers allow you to use your linux \
# computer to accept incoming data and voice interfaces
#
# config: /etc/dahdi/init.conf

### BEGIN INIT INFO
# Provides:        dahdi
# Required-Start:  $local_fs $remote_fs
# Required-Stop:   $local_fs $remote_fs
# Should-Start:    $network $syslog
# Should-Stop:     $network $syslog
# Default-Start:   2 3 4 5
# Default-Stop:    0 1 6
# Short-Description: DAHDI kernel modules
# Description:     dahdi - load and configure DAHDI modules
### END INIT INFO

initdir=/etc/init.d

# Don't edit the following values. Edit /etc/dahdi/init.conf instead.

DAHDI_CFG=/usr/sbin/dahdi_cfg
DAHDI_CFG_CMD=${DAHDI_CFG_CMD:-"$DAHDI_CFG"} # e.g: for a custom system.conf location

FXOTUNE=/usr/sbin/fxotune

# The default syncer Astribank. Usually set automatically to a sane
# value by xpp_sync(1) if you have an Astribank. You can set this to an
# explicit Astribank (e.g: 01).
XPP_SYNC=auto

# The maximal timeout (seconds) to wait for udevd to finish generating
# device nodes after the modules have loaded and before running dahdi_cfg.
DAHDI_DEV_TIMEOUT=20

# A list of modules to unload when stopping.
# All of their dependencies will be unloaded as well.
DAHDI_UNLOAD_MODULES="dahdi"

#
# Determine which kind of configuration we're using
#
system=redhat  # assume redhat
if [ -f /etc/debian_version ]; then
    system=debian
fi

if [ -f /etc/gentoo-release ]; then
    system=debian
fi

if [ -f /etc/SuSE-release -o -f /etc/novell-release ]
then
    system=debian
fi

# Source function library.
if [ $system = redhat ]; then
    . $initdir/functions || exit 0
fi

DAHDI_MODULES_FILE="/etc/dahdi/modules"

[ -r /etc/dahdi/init.conf ] && . /etc/dahdi/init.conf

if [ $system = redhat ]; then
        LOCKFILE=/var/lock/subsys/dahdi
fi

# recursively unload a module and its dependencies, if possible.
# where's modprobe -r when you need it?
# inputs: module to unload.
# returns: the result from
unload_module() {
        module="$1"
        line=`lsmod 2>/dev/null | grep "^$1 "`
        if [ "$line" = '' ]; then return; fi # module was not loaded

        set -- $line
        # $1: the original module, $2: size, $3: refcount, $4: deps list
        mods=`echo $4 | tr , ' '`
        ec_modules=""
        # xpp_usb keeps the xpds below busy if an xpp hardware is
        # connected. Hence must be removed before them:
        case "$module" in xpd_*) mods="xpp_usb $mods";; esac

        for mod in $mods; do
                case "$mod" in
                dahdi_echocan_*)
                        ec_modules="$mod $ec_modules"
                        ;;
                *)
                        # run in a subshell, so it won't step over our vars:
                        (unload_module $mod)
                        ;;
                esac
        done
        # Now that all the other dependencies are unloaded, we can unload the
        # dahdi_echocan modules.  The drivers that register spans may keep
        # references on the echocan modules before they are unloaded.
        for mod in $ec_modules; do
                (unload_module $mod)
        done
        rmmod $module
}

unload_modules() {
        for module in $DAHDI_UNLOAD_MODULES; do
                unload_module $module
        done
}

# In (xpp) hotplug mode, the init script is also executed from the
# hotplug hook. In that case it should not attempt to loade modules.
#
# This function only retunrs false (1) if we're in hotplug mode and
# coming from the hotplug hook script.
hotplug_should_load_modules() {
        if [ "$XPP_HOTPLUG_DAHDI" = yes -a "$CALLED_FROM_ATRIBANK_HOOK" != '' ]
        then
                return 1
        fi
        return 0
}

# In (xpp) hotplug mode: quit after we loaded modules.
#
# In hotplug mode, the main run should end here, whereas the rest of the
# script should be finished by the instance running from the hook.
# Note that we only get here if there are actually Astribanks on the
# system (otherwise noone will trigger the run of the hotplug hook
# script).
hotplug_exit_after_load() {
        if [ "$XPP_HOTPLUG_DAHDI" = yes -a "$CALLED_FROM_ATRIBANK_HOOK" = '' ]
        then
                exit 0
        fi
}

# Initialize the Xorcom Astribank (xpp/) using perl utiliites:
xpp_startup() {
        # do nothing if there are no astribank devices:
        if ! /usr/share/dahdi/waitfor_xpds; then return 0; fi

        hotplug_exit_after_load

        # overriding locales for the above two, as perl can be noisy
        # when locales are missing.
        # No register all the devices if they didn't auto-register:
        LC_ALL=C dahdi_registration on
}


hpec_start() {
        # HPEC license found
        if ! echo /var/lib/digium/licenses/HPEC-*.lic | grep -v '\*' | grep -q .; then
                return
        fi

        # dahdihpec_enable not installed in /usr/sbin
        if [ ! -f /usr/sbin/dahdihpec_enable ]; then
                echo -n "Running dahdihpec_enable: Failed"
                echo -n "."
                echo "  The dahdihpec_enable binary is not installed in /usr/sbin."
                return
        fi

        # dahdihpec_enable not set executable
        if [ ! -x /usr/sbin/dahdihpec_enable ]; then
                echo -n "Running dahdihpec_enable: Failed"
                echo -n "."
                echo "  /usr/sbin/dahdihpec_enable is not set as executable."
                return
        fi

        # dahdihpec_enable properly installed
        if [ $system = debian ]; then
                echo -n "Running dahdihpec_enable: "
                /usr/sbin/dahdihpec_enable 2> /dev/null
        elif [ $system = redhat ]; then
                action "Running dahdihpec_enable: " /usr/sbin/dahdihpec_enable
        fi
        if [ $? = 0 ]; then
                echo -n "done"
                echo "."
        else
                echo -n "Failed"
                echo -n "."
                echo "  This can be caused if you had already run dahdihpec_enable, or if your HPEC license is no longer valid."
        fi
}

shutdown_dynamic() {
        if ! grep -q ' DYN/' /proc/dahdi/* 2>/dev/null; then return; fi

        # we should only get here if we have dynamic spans. Right?
        $DAHDI_CFG_CMD -s
}

load_modules() {
        # Some systems, e.g. Debian Lenny, add here -b, which will break
        # loading of modules blacklisted in modprobe.d/*
        unset MODPROBE_OPTIONS
        modules=`sed -e 's/#.*$//' $DAHDI_MODULES_FILE 2>/dev/null`
        #if [ "$modules" = '' ]; then
                # what?
        #fi
        echo "Loading DAHDI hardware modules:"
        modprobe dahdi
        for line in $modules; do
                if [ $system = debian ]; then
                        echo -n "   ${line}: "
                        if modprobe $line 2> /dev/null; then
                                echo -n "done"
                        else
                                echo -n "error"
                        fi
                elif [ $system = redhat ]; then
                        action "  ${line}: " modprobe $line
                fi
        done
        echo ""
}

if [ ! -x "$DAHDI_CFG" ]; then
       echo "dahdi_cfg not executable"
       exit 0
fi

if [ ! -f /etc/dahdi/system.conf ]; then
        echo "/etc/dahdi/system.conf not found. Nothing to do."
       exit 0
fi

RETVAL=0

# See how we were called.
case "$1" in
  start)
        if hotplug_should_load_modules; then
                load_modules
        fi

        TMOUT=$DAHDI_DEV_TIMEOUT # max secs to wait

        while [ ! -d /dev/dahdi ] ; do
                sleep 1
                TMOUT=`expr $TMOUT - 1`
                if [ $TMOUT -eq 0 ] ; then
                        echo "Error: missing /dev/dahdi!"
                        exit 1
                fi
        done

        xpp_startup

        if [ $system = debian ]; then
            echo -n "Running dahdi_cfg: "
            $DAHDI_CFG_CMD 2> /dev/null && echo -n "done"
            echo "."
        elif [ $system = redhat ]; then
            action "Running dahdi_cfg: " $DAHDI_CFG_CMD
        fi
        RETVAL=$?

        if [ "$LOCKFILE" != '' ]; then
                [ $RETVAL -eq 0 ] && touch $LOCKFILE
        fi

        if [ -x "$FXOTUNE" ] && [ -r /etc/fxotune.conf ]; then
                # Allowed to fail if e.g. Asterisk already uses channels:
                $FXOTUNE -s || :
        fi

        # Set the right Astribanks ticker:
        LC_ALL=C xpp_sync "$XPP_SYNC"

        hpec_start
        ;;
  stop)
        # Unload drivers
        #shutdown_dynamic # FIXME: needs test from someone with dynamic spans
        echo -n "Unloading DAHDI hardware modules: "
        if unload_modules; then
                echo "done"
        else
                echo "error"
        fi
        if [ "$LOCKFILE" != '' ]; then
                [ $RETVAL -eq 0 ] && rm -f $LOCKFILE
        fi
        ;;
  unload)
        unload_modules
        ;;
  restart|force-reload)
        $0 stop
        $0 start
        ;;
  reload)
        if [ $system = debian ]; then
            echo -n "Rerunning dahdi_cfg: "
            $DAHDI_CFG_CMD 2> /dev/null && echo -n "done"
            echo "."
        elif [ $system = redhat ]; then
            action "Rerunning dahdi_cfg: " $DAHDI_CFG_CMD
        fi
        RETVAL=$?
        ;;
  status)
        if [ -d /proc/dahdi ]; then
                /usr/sbin/lsdahdi
                RETVAL=0
        else
                RETVAL=3
        fi
        ;;
  *)
        echo "Usage: dahdi {start|stop|restart|status|reload|unload}"
        exit 1
esac

exit $RETVAL

Делаем файл исполняемым:
# chmod +x /etc/init.d/dahdi
Готовим типовые файлы конфигурации:
# cp /etc/dahdi/modules.sample /etc/dahdi/modules
# cp /etc/dahdi/system.conf.sample /etc/dahdi/system.conf

Запускаем сервис DAHDI:
# /etc/init.d/dahdi start
# chkconfig --add dahdi
Проверка сервиса DAHDI
# systemctl status dahdi.service
Перезагрузка сервиса DAHDI
# systemctl restart dahdi.service

Запуск ASTERISK
# systemctl start asterisk.service
Проверка сервиса ASTERISK
# systemctl status asterisk.service
Перезагрузка сервиса ASTERISK
# systemctl restart asterisk.service
Смотрим под каким пользователем работает сервис asterisk
# ps auxf | grep asterisk
Пользователь должен быть asterisk:
# ps auxf | grep asterisk
root      7400  0.0  0.0 112664   960 pts/0    S+   20:34   0:00          \_ grep --color=auto asterisk
root      5118  0.0  0.0 115236   812 ?        S    20:19   0:00 /bin/sh /usr/sbin/safe_asterisk
asterisk  5120  0.3  0.5 1620752 43736 ?       Sl   20:19   0:03  \_ /usr/sbin/asterisk -f -U asterisk -vvvg -c

Делаем контрольную перезагрузку, что бы и DAHDI и ASTERISK запустились самостоятельно
# reboot
Заходим в консоль asterisk
# asterisk -r
Проверяем подцепился ли сервис DAHDI к ASTERISK
asterisk2*CLI> dahdi show version
DAHDI Version: 2.11.0 Echo Canceller:
Все хорошо.


14. Увеличение количества лимитов на открытие файлов и обращений к жесткому диску для пользователя asterisk
# nano /etc/security/limits.conf
Вписываем в конец файла перед строкой
# End of file
Следующее:
asterisk         hard    nofile      500000
asterisk         soft    nofile      500000


15 Разрешаем доступ на сервер по SSH (на 22 порт) только c доверенных ip адресов (с сетей 10.10.0.0/16 и 10.200.104.0/24)

Для этого открываем файл /etc/hosts.allow
# nano  /etc/hosts.allow
Вписываем туда:
sshd: 10.10.0.0/255.255.0.0, 10.200.104.0/255.255.255.0, 10.200.5.220/255.255.255.255 
Потом открываем файл /etc/hosts.deny
# nano  /etc/hosts.deny
Вписываем туда:
sshd: ALL@ALL
Рестартуем сервис sshd
# systemctl restart sshd.service


16 Устанавливаем SIPGPEP – утилиту для удобного просмотра трейсов
# yum install libpcap-devel pcre-devel git
# cd /usr/src
# git clone https://github.com/sipcapture/sipgrep.git
# cd sipgrep
# ./configure
# make && make install
Проверка работы:
# ./sipgrep  -V
# sipgrep  -d ens32 -f 2057004
Здесь ens32 – имя интерфейса, который нужно прослушивать для получения трейса от (from) номера 2057004


17 Установка сервиса ntp на CentOS7, который будет синхронизировать время на текущем сервере с общемировым.
# yum -y install ntp
Редактируем файл конфигурации
# nano /etc/ntp.conf
Комментируем строку
#restrict ::1
Запускаем сервис:
# systemctl start ntpd
Добавляем в автозагрузку
# systemctl enable ntpd
Проверяем, что сервис запустился на порту 123 и работает с источниками времени
# netstat -ltupn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      2100/mysqld
tcp        0      0 0.0.0.0:2000            0.0.0.0:*               LISTEN      3265/asterisk
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      864/httpd
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      865/sshd
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      2198/master
udp        0      0 10.200.104.17:123       0.0.0.0:*                           3976/ntpd
udp        0      0 127.0.0.1:123           0.0.0.0:*                           3976/ntpd
udp        0      0 0.0.0.0:123             0.0.0.0:*                           3976/ntpd
udp        0      0 0.0.0.0:4569            0.0.0.0:*                           3265/asterisk
udp        0      0 0.0.0.0:5000            0.0.0.0:*                           3265/asterisk
udp        0      0 0.0.0.0:5060            0.0.0.0:*                           3265/asterisk
udp6       0      0 :::123                  :::*                                3976/ntpd

# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 sf.ntp.fancube. .STEP.          16 u    -   64    0    0.000    0.000   0.000
*ns.rnl.tecnico. 194.117.9.130    3 u   67   64    3  110.093    1.155   1.118
 khyber.madduck. .STEP.          16 u    -   64    0    0.000    0.000   0.000
 108.61.194.85.v .STEP.          16 u    -   64    0    0.000    0.000   0.000


18 Отключаем использование протокола IPv6 в CentOS7
# yum install net-tools
Смотрим какие программы используют ipv6 в принципе
# netstat -ltupn
Пример вывода:
# netstat -ltupn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      2166/mysqld
tcp        0      0 0.0.0.0:2000            0.0.0.0:*               LISTEN      5351/asterisk
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      4338/sshd
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      2214/master
tcp6       0      0 :::80                   :::*                    LISTEN      881/httpd
tcp6       0      0 :::22                   :::*                    LISTEN      4338/sshd
tcp6       0      0 ::1:25                  :::*                    LISTEN      2214/master
udp        0      0 0.0.0.0:4569            0.0.0.0:*                           5351/asterisk
udp        0      0 0.0.0.0:5000            0.0.0.0:*                           5351/asterisk
udp        0      0 0.0.0.0:5060            0.0.0.0:*                           5351/asterisk

В моем случае нужно выключить ipv6 в httpd (APACHE), sshd (SSH) и master (почтовый сервер postfix).

Выключение в sshd
Открываем файл настроек /etc/ssh/sshd_config 
# nano /etc/ssh/sshd_config 
находим строки:
#AddressFamily any
#ListenAddress 0.0.0.0
Раскомментируем их и изменим. Должно получиться вот так:
AddressFamily inet
ListenAddress 0.0.0.0
Перезапускаем sshd
# systemctl restart sshd.service
Теперь SSHD не использует ipv6

Выключение в httpd
Открываем файл конфигурации apache
# nano /etc/httpd/conf/httpd.conf
По умолчанию стоит строчка
Listen 80
Это значит, что прослушиваются ip адреса и ipv4 и ipv6
Правим строчку на:
Listen 0.0.0.0:80
Перезагружаем httpd
# systemctl restart httpd.service
Теперь HTTPD не использует ipv6

Выключение в сервисе postfix
Открываем файл 
# nano /etc/postfix/main.cf
Ищем строчку
inet_protocols = all
комментируем ее и пишем новую строчку:
#inet_protocols = all
inet_protocols = ipv4
Рестуртуем postfix
# systemctl restart postfix.service
Теперь почтовый сервис не использует ipv6

Выключаем в сервисе ntpd
Редактируем юнит system для сервиса ntpd:
# nano /usr/lib/systemd/system/ntpd.service
В файле меняем
ExecStart=/usr/sbin/ntpd -u ntp:ntp $OPTIONS
на
ExecStart=/usr/sbin/ntpd -4 -u ntp:ntp $OPTIONS
Флаг -4 означает, что ntpd будет запускаться только с протоколом ipv4
Перечитываем юнит
# systemctl daemon-reload
Рестартуем сервис
# systemctl restart ntpd.service

После выключения ipv6 во всех сервисах выключаем ipv6 в CentOS
Открываем файл:
# nano  /usr/lib/sysctl.d/00-system.conf
Добавляем туда строки:
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

Открываем файл
# nano  /etc/sysconfig/network
Добавляем туда строки:
NETWORKING_IPV6=no
IPV6INIT=no
Перезагружаемся.
# reboot
Все, теперь в системе нет ipv6.


19 Разрешаем форвардинг между интерфейсами сервера для нормальной работы NAT
# echo "net.ipv4.ip_forward = 1"|sudo tee /etc/sysctl.d/99-ipforward.conf
# sysctl -p /etc/sysctl.d/99-ipforward.conf
См http://jensd.be/343/linux/forward-a-tcp-port-to-another-ip-or-port-using-nat-with-iptables 
Перезагружаемся:
# reboot

ЧАСТНОСТИ, ПРИ ПЕРЕХОДЕ от ASTERISK 1.8 к ASTERISK 13

1) В настройках файлов sip.conf устарела директива nat=yes. Ее необходимо заменить на nat=force_rport,comedia:
Групповая замена в файлах *sip.conf sip nat=yes на nat=force_rport,comedia
sed -i 's/nat \{0,\}= \{0,\}yes/nat\=force\_rport\,comedia/g' asterisk_test/*sip.conf

2) В новой версии Asterisk нет более функции SIPCHANINFO. Теперь следует использовать функцию CHANNEL.
В файлах /etc/asterisk/extensions.conf функцию SIPCHANINFO меняем на CHANNEL командой:
sed -i 's/SIPCHANINFO/CHANNEL/g' asterisk_test/*sip.conf

3) В CentOS7 новое обозначение интерфейсов. Меняем старые названия на новые в iptables:
Меняем в файле iptables названия интерфейсов
sed -i -e 's/eth0/ens34/g' -e 's/eth1/ens32/g' -e 's/eth2/ens35/g' asterisk_test/iptables.bak

4) Проверяем расположение звуковых файлов в конфигурационном конфиге:
В файле /etc/asterisk/extensions.conf подредактировать все директивы с указанием частного пути к звуковым файлам.
Например вместо:
exten => _X.,1,Playback(custom/ru/invalid)
пишем
exten => _X.,1,Playback(invalid)