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

Развертывание 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)

суббота, 6 февраля 2016 г.

Использование библиотеки Yowsup 2 для отправки сообщений пользователю WhatsApp

Yowsup 2 является python библиотекой, которая позволяет строить приложения, используя услуги WhatsApp.

Установка Yowsup 2

Ставим пакеты, которые понадобятся:
# yum install python python-dateutil python-argparse 
# yum install libtiff-devel libjpeg-devel libzip-devel freetype-devel lcms2-devel libwebp-devel tcl-devel tk-devel zlib-devel
# yum install gcc
# yum install python-devel
# yum install protobuf pycrypto
# yum -y install python-pip
# pip install --upgrade pip
# yum install python-imaging
Выполняем установку:
# cd /usr/src/
# wget https://github.com/tgalal/yowsup/archive/master.zip
# unzip master
# cd yowsup-master/
# python setup.py install

Регистрация пользователя WhatsApp

Сервер, с которого будут рассылаться сообщения, должен иметь телефонный номер для регистрации. Этот же номер будет использоваться для отправки сообщений.  Наша задача запросить код регистрации на наш номер телефона. 
Это делается командой:
# python yowsup-cli registration --requestcode sms --phone 79171112222 --cc 7 --mcc 250 --mnc 01
Здесь:
79171112222 – номер телефона, от имени которого регистрируем сервер.
сс – код страны. Россия – 7
mcc - mobile country code - это другой код страны (для России это 250)
mnc - mobile network code - это код вашего оператора. (01 - МТС, 02 - мегафон, 20 - теле2, 99 - билайн)
У меня МТС поэтому, я буду вписывать mnc = 01
В ответ увидим:
INFO:yowsup.common.http.warequest:{"status":"sent","length":6,"method":"sms","retry_after":64,"sms_wait":64,"voice_wait":64}
status: sent
retry_after: 64
length: 6
method: sms
На телефонный аппарат приходит SMS с кодом подтверждения
У меня код был такой: 930-620
Имея этот код, завершаем процедуру регистрации:
# python yowsup-cli registration --register 930-620 --phone 79171112222 --cc 7
Вывод ответа сервера:
INFO:yowsup.common.http.warequest:{"status":"ok","login":"79171112222","type":"new","pw":"0t7OhrPLwf9KjX5qkwnVqTtXXmg=","expiration":4444444444.0,"kind":"free","price":"33,00 \u0440\u0443\u0431.","cost":"33.00","currency":"RUB","price_expiration":1457232900} 
status: ok
kind: free
pw: 0t7OhrPLwf9KjX5qkwnVqTtXXmg=
price: 33,00 руб.
price_expiration: 1457232900
currency: RUB
cost: 33.00
expiration: 4444444444.0
login: 79171112222
type: new
Главное, что нам требуется пароль. Здесь он в строке:
pw: 0t7OhrPLwf9KjX5qkwnVqTtXXmg=

Создание конфигурации пользователя Yowsup 2

Прямо в каталоге /usr/src/yowsup-master/ создаем конфигурационный файл:
# nano yowsup-cli.config
Вписываем туда:
cc=7
phone=79171112222
password=0t7OhrPLwf9KjX5qkwnVqTtXXmg=

Отправка сообщений:

Отправка сообщений  WhatsApp через командную строку из директории /usr/src/yowsup-master/:
# yowsup-cli demos -c yowsup-cli.config -M -s 79171440055 "Авария"
Ответ сервера:
INFO:yowsup.demos.sendclient.layer:Message sent
Отправка сообщений из любого каталага:
# /usr/bin/yowsup-cli demos -c /usr/src/yowsup-master/yowsup-cli.config -M –s “Сообщение”
Для того что бы мы могли отправлять сообщения через самописную web-страницу, необходимо пользователю apache разрешить отправку сообщений из консоли. Для этого необходимо:
1) разрешить пользователю apache запускать команду /usr/bin/yowsup-cli. Это делается в файле /etc/sudoers 
# nano /etc/sudoers
После строчки
root    ALL=(ALL)       ALL
Вписываем
ALL ALL=(root) NOPASSWD: /usr/bin/yowsup-cli
2) скопировать установочный файл программы yowsup в домашний каталог apache
# cp -R /root/.yowsup/ /var/www/.yowsup
# chown -R apache:apache /var/www/.yowsup/
Если этого не сделать, то сообщения отправляться не будут, а в файле ошибок apache - /var/log/httpd/error_log будет появляться сообщение:
Traceback (most recent call last):
  File "/usr/bin/yowsup-cli", line 5, in <module>
    pkg_resources.run_script('yowsup2==2.4.48', 'yowsup-cli')
  <…..>
OSError: [Errno 13] Permission denied: '/var/www/.yowsup'

27 марта 2016
После нескольких месяцев работы при отправке сообщения вдруг стал получать ошибку:
# yowsup-cli demos -c yowsup-cli.config -M -s 7917XXXXXXX "Текст сообщения"
/usr/lib/python2.6/site-packages/yowsup2-2.4.48-py2.6.egg/yowsup/demos/sendclient/stack.py:56: DeprecationWarning: BaseException.message has been deprecated as of Python 2.6
  print("Authentication Error: %s" % e.message)
Authentication Error: not-authorized
Попытался повторно авторизоваться. Выдается ошибка:
# python yowsup-cli registration --requestcode sms --phone 7917XXXXXXX --cc 7 --mcc 250 --mnc 01
INFO:yowsup.common.http.warequest:{"status":"fail","reason":"old_version"}
INFO:yowsup.common.http.warequest:{"status":"fail","reason":"old_version"}
status: fail
reason: old_version

Установка новой версии Yowsup 2

# cd /usr/src/
Удаляем старые версии:
# rm -fR yowsup-master/
# rm -fR master
Качаем свежую версию и устанавливаем:
# wget https://github.com/tgalal/yowsup/archive/master.zip
# unzip master
# cd yowsup-master/
# python setup.py install
Закончится установка выводом:
Finished processing dependencies for yowsup2==2.4.48
Конфигурационные файлы после переустановки удалились.
Далее выполняем рекомендации, взятые отсюда: http://stackoverflow.com/questions/35877803/yowsup-old-version-error 
Открываем файл env_android.py:
# nano /usr/lib/python2.6/site-packages/yowsup2-2.4.48-py2.6.egg/yowsup/env/env_android.py
И меняем содержание переменных _MD5_CLASSES, _KEY  и _VERSION
Должно быть так:
    _MD5_CLASSES = "7UDPOXwpiLBvEjT8uNwsuA=="
    _KEY = "eQV5aq/Cg63Gsq1sshN9T3gh+UUp0wIw0xgHYT1bnCjEqOJQKCRrWxdAe2yvsDeCJL+Y4G3PRD2HUF7oUgiGo8vGlNJOaux26k+A2F3hj8A="
_VERSION = "2.12.440"
Затем открываем файл yowsup/registration/coderequest.py:
# nano /usr/lib/python2.6/site-packages/yowsup2-2.4.48-py2.6.egg/yowsup/registration/coderequest.py
Здесь вместо строк:
from yowsup.env import S40YowsupEnv
CURRENT_ENV = S40YowsupEnv()
пишем:
from yowsup.env import AndroidYowsupEnv
CURRENT_ENV = AndroidYowsupEnv()
То же делаем в файле warequest.py
# nano /usr/lib/python2.6/site-packages/yowsup2-2.4.48-py2.6.egg/yowsup/common/http/warequest.py

Повторная регистрация
# yowsup-cli registration --requestcode sms --phone 7917XXXXXXX --cc 7 --mcc 250 --mnc 01
INFO:yowsup.common.http.warequest:{"status":"sent","length":6,"method":"sms","retry_after":65,"sms_wait":65,"voice_wait":65}
status: sent
retry_after: 65
length: 6
method: sms
Повторно подтверждаем регистрацию
# yowsup-cli registration --register 240-411 --phone 7917XXXXXXX --cc 7
INFO:yowsup.common.http.warequest:{"status":"ok","login":"7917XXXXXXX","type":"existing","pw":"jv5p/tEC5z61pkwQ0MwzjDMVn2M=","expiration":4444444444.0,"kind":"free","price":"33,00 \u0440\u0443\u0431.","cost":"33.00","currency":"RUB","price_expiration":1462183400}
status: ok
kind: free
pw: jv5p/tEC5z61pkwQ0MwzjDMVn2M=
price: 33,00 руб.
price_expiration: 1462183400
currency: RUB
cost: 33.00
expiration: 4444444444.0
login: 7917XXXXXXX
type: existing

Создаем конфигурационный файл 
# touch /usr/src/yowsup-master/yowsup-cli.config
# nano /usr/src/yowsup-master/yowsup-cli.config
и пишем в него:
cc=7
phone=7917XXXXXXX
password=jv5p/tEC5z61pkwQ0MwzjDMVn2M=

Отправка сообщений

К сожалению у меня так и  не получилось отправить сообщение. Все заканчивалось сообщением о неудачной авторизации.
# yowsup-cli demos -c /usr/src/yowsup-master/yowsup-cli.config -M -s 7917XXXXXXX "Авария на сети "
/usr/lib/python2.6/site-packages/yowsup2-2.4.48-py2.6.egg/yowsup/demos/sendclient/stack.py:56: DeprecationWarning: BaseException.message has been deprecated as of Python 2.6
  print("Authentication Error: %s" % e.message)
Authentication Error: not-authorized

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



суббота, 30 января 2016 г.

Клонирование потока Netflow на несколько приемников трафика.

Имеется ситуация, когда с маршрутизатора Cisco ASR1006 в формате Netflow ver9 льется поток данных о NAT трансляциях. На маршрутизаторе Cisco ASR1006 в конфигурации прописано:
ip nat log translations flow-export v9 udp destination 10.200.15.117 2000
(лить nat log в формате netflow ver9 на ip 10.200.15.117 и порт 2000)
Эту строчку можно написать только один раз и следовательно лить логи NAT трансляций в формате Netflow можно только на один адрес/порт получателя. Но иногда возникает необходимость распараллелить поток Netflow на два сервера-приемника или больше. 
Для решения этой задачи можно воспользоваться утилитой samplicator, умеющей размножать UDP трафик. (https://github.com/sleinen/samplicator).
Схема должна в конечном счет получиться такая:



1. Установка утилиты samplicator, позволяющей размножать потоки UDP:
# cd /usr/src/
# git clone https://github.com/sleinen/samplicator
# cd samplicator
# automake
# ./autogen.sh
# ./ configure
# make 
# make install

2. Запуск утилиты samplicator выполняется командой:
# samplicate -S 127.0.0.1/2059 172.16.6.130/2059
После запуска утилиты консоль будет заблокирована и система начнет слушать порт 2000 (по умолчанию для утилиты samplicate) и все UDP пакеты отправлять получателям:
 - ip 127.0.0.1 порт 2059
 - ip 172.16.6.130 порт 2059
Ключ -S указывает на то что утилите необходимо сохранить оригинальный ip адрес источника трафика.
В соседней консоли сервера можно проконтролировать прием и отправку пакетов с помощью tcpdump:
Проверка приходящих пакетов на порт 2000:
#tcpdump port 2000
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
09:25:13.250021 IP 10.200.15.118.59948 > 10.200.15.117.sieve-filter: UDP, length 1052
09:25:13.262595 IP 10.200.15.118.59948 > 10.200.15.117.sieve-filter: UDP, length 1052
09:25:13.275274 IP 10.200.15.118.59948 > 10.200.15.117.sieve-filter: UDP, length 1052
Видим, что пакеты при ходят с 10.200.15.118 на наш сервер (10.200.15.117)
Обозначение sieve-filter – это как раз порт 2000.
Проверка уходящих пакетов на порт 2059
#tcpdump port 2059
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
09:27:55.685079 IP 10.200.15.118.59948 > 172.16.6.130.bmc-messaging: UDP, length 1052
09:27:55.690870 IP 10.200.15.118.59948 > 172.16.6.130.bmc-messaging: UDP, length 1052
09:27:55.697099 IP 10.200.15.118.59948 > 172.16.6.130.bmc-messaging: UDP, length 1088
Видим, что пакеты уходят на второй сервер 172.16.6.130 на порт bmc-messaging (2059) с сохраненным ip адресом источника (10.200.15.118).

Что бы запустить команду в фоне выполняем:
# samplicate -Sf 127.0.0.1/2059 172.16.6.130/2059
Для добавления в автозагрузку добавляем эту строчку в файл /etc/rc.local
Чтобы заставить утилиту samplicate слушать не порт 2000, а любой другой необходимо применить ключ –p.
Например для прослушивания порта 4000 выполняем:
# samplicate -Sf -p 4000  127.0.0.1/2059 172.16.6.130/2059

3. Справка
Если нужно просто попрактиковаться и нет потока Netflow с Cisco, отправить UDP пакеты получателю на определенный ip и порт можно воспользоваться утилитой netcat и выполнить команду: 
# echo -n "foo" | nc -4u -w1 10.200.15.117 2000
Пакет с содержимым «foo» уйдет на ip 10.200.15.117 и на порт 2000

Что бы убедиться, что локальный приемник Netflow трафика принимает пакеты на Ip 127.0.0.1, порт 2059 не достаточно утилиты tcpdump. Она не может прослушать интерфейс lo.
Смотрим кто слушает порт 2059
# netstat -ltupn | grep 2059
udp        0    0 0.0.0.0:2059     0.0.0.0:*     1459/nfcapd
Ищем как запущен процесс nfcapd
# ps ax |  grep nfcapd
 1456 ? S 0:00 /usr/local/bin/nfcapd -w -D -l /mnt/disk1/NFLogs/netflow/R7/ -p 2055
 1459 ? S 9:53 /usr/local/bin/nfcapd -w -D -l /mnt/disk1/NFLogs/NEL/R7/ -p 2059
 6669 pts/0 S+   0:00 grep nfcapd
Видим, что порт 2059 прослушивается утилитой и при этом задействуется директория /mnt/disk1/NFLogs/NEL/R7/.
Смотрим содержимое директории несколько раз подряд:
# ls -l /mnt/disk1/NFLogs/NEL/R7/
итого 115708
-rw-r--r-- 1 root root 118482132 Янв 30 09:39 nfcapd.current.1457
# ls -l /mnt/disk1/NFLogs/NEL/R7/
итого 117756
-rw-r--r-- 1 root root 120579156 Янв 30 09:39 nfcapd.current.1457
Размер файла меняется. Значит данные получаются и записываются.
Если размер файла меняться не будет – значит что-то не так и локальный сборщик netflow не работает.