Wednesday, August 23rd, 2017

Подсчёт трафика в Linux с помощью pmacctd

Published on Март 30, 2009 by   ·   Комментариев нет

Учётная система работает на основе утилиты pmacctd. Утилита записывает
весь, проходящий через интерфес трафик и скидывает в лог-файл.
После этого скрипты сортируют получившийся дамп по адресам клиентов,
разделяет по дням недели и месяцам, а так же создают бекап дампа. Адреса
клиентов система берёт из основного конфига прокси-сервера.

Скрипт запуска, останова и считывания адресов клиентов системы учета
находится в /etc/inti.d/

Отрабатывает с параметром start при старте системы и параметром stop,
при останове. После добавления нового пользователя, надо делать
/etc/ini.d/pmacct restart

    #!/bin/sh
    #

    ## Глобальные переменные
    ### Пути к утилитам, по которым скрипт может обращаться. Не обязательная переменная, но для подстраховки не помешает.
    PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
    ### Расположение собственно исполняемого файла утилиты pmacctd
    DAEMON=/usr/sbin/pmacctd
    ### Имя работающего демона
    NAME=pmacctd
    ### Описание.
    DESC="traffic accounting system"
    ### Директория для хранения настроек учётной системы.
    CONFDIR=/etc/pmacct
    ### Директория для хранения логов.
    LOGDIR=/var/log/pmacctd
    ### Инклудим конфиг.
    . $CONFDIR/pmacctd.conf

    ### Проверяем наличие исполняемого файла демона. Если отсутствует, завершаем работу.
    test -x $DAEMON || exit 0

    ### Функция останова.
    stop () {
       killall -INT $NAME
    }

    ### Функция старта.
    start () {
    #### Вытягиваем из конфига прокси-сервера имена и ip-адреса пользователей и сохраняем из в файл stat.conf в директории конфигов.
           grep 255.255.255.255 /etc/squid/squid.conf | grep -v 127.0.0.1 | grep -v '#' | awk '{print $2, $4}' | cut -f 1 -d / > $CONFDIR/stat.conf
    #### Собственно запускаем демона в фоновом режиме и складываем всю статистику по трафику в файл pmacctd.log в лог-директории.
           $DAEMON -c $PRIMITIVE -i $INTERFACE -r $INTERVAL -P print >> $LOGDIR/pmacctd.log &
    }

    ### Меню выбора используемой функции из первого аргумента после скрипта.
    case "$1" in
     start)
           echo -n "Starting $DESC: "
           start
           echo "$NAME."
           ;;
     stop)
           echo -n "Stopping $DESC: "
           stop
           echo "$NAME."
           ;;
     restart)
           echo -n "Restarting $DESC: "
           stop
           sleep 1
           start
           echo "$NAME."
           ;;
     *)
           N=/etc/init.d/$NAME
           echo "Usage: $N {start|stop|restart}" >&2
           exit 1
           ;;
    esac

    exit 0

Скрипт скидывания ежедневной статистики

Запуск скрипта прописан в файле /etc/crontab:

   01 4 * * * root /usr/sbin/pmacctdaily

Он отрабатывает автоматически каждый день в 04:01:00 по времени сервера.

    #!/bin/bash
    #

    ## Конфигурационная директория
    CONFDIR=/etc/pmacct
    ## Лог-директория
    LOGDIR=/var/log/pmacctd
    ## Текущая дата в формате ддммгггг
    DATE=`date +%d%m%Y`

    ## Вычисление пользовательских ip-адреса.
    USERSIP=`cat $CONFDIR/stat.conf | awk '{print $2}'`

    ## Останов учётной системы для того, чтобы она не обращалась к логам во время работы с ними данного скрипта.
    /etc/init.d/pmacct stop >/dev/null
    ## Создание директории для трафика за сутки до текущей даты
    mkdir $LOGDIR/$DATE 2>/dev/null

    ## Пока в памяти лежат пользовательские ip-адреса, обработать каждый из них по-очереди.
    for i in $USERSIP
    do
        #### Вычисляем количество бит в каждой следующей записи из лога, в которой упоминается текущий ip-адрес
        BYTES=`grep -w $i $LOGDIR/pmacctd.log | awk '{print $16}'`
        ALLBYTES=0
        ##### Прибавляем каждое новое вычисленное количество битов к переменной ALLBYTES
        for b in $BYTES
        do
            ALLBYTES=$((ALLBYTES+b))
        done
        ##### Вычисляем имя пользователя с текущим ip-адресом
        USERNAME=`grep -w $i $CONFDIR/stat.conf | awk '{print $1}'`
        #### Скидываем в файл с именем текущего пользователя значение переменной ALLBYTES
        echo $ALLBYTES > $LOGDIR/$DATE/$USERNAME
    done

    ##### Архивируем общий лог и сохраняем его в директорию с файлами статистики пользователей за сутки.
    gzip $LOGDIR/pmacctd.log
    mv $LOGDIR/pmacctd.log.gz $LOGDIR/$DATE/
    Запускаем учётную систему.
    /etc/init.d/pmacct start >/dev/null

В общей сложности при нынешней нагрузке скрипт отрабоатывает примерно за
10-15 секунд. Чем больше будет пользователей и трафика, тем больше
понадобится времени, но для того, чтобы дойти хотя бы до минуты
выполнения, надо увеличить объёмы в несколько раз.

Скрипт скидывания ежемесячной статистики

Запуск скрипта прописан в файле /etc/crontab:

   01 5 1 * * root /usr/sbin/pmacctdmonthly

Он отрабатывает автоматически каждый первый день месяца в 05:01:00 по
времени сервера.

    #!/bin/bash
    #

    ### Конфигурационная директория
    CONFDIR=/etc/pmacct
    ### Лог-директория
    LOGDIR=/var/log/pmacctd
    ### Текущий месяц в формате мм
    MONTH=`date +%m`
    ### Текущий год в формате гггг
    YEAR=`date +%Y`
    Временная директория
    TMPDIR=/tmp/pmacctd

    ## Так как скрипт выполняется первого числа, а нам надо сделать статистику за предыдущий месяц, делаем проверку, не первое ли сегодня января и присваиваем переменным месяца и года нужные нам значения.
    #### Отдельное примечание. Из-за того, что в bash по умолчанию числа, начинающиеся с 0, автоматически считаются числами восьмеричой системы счисления,
    #### приходится делать более сложную проверку, сравнивая значения месяцев, как строки, и только потом присваивать им какие-либо значения.
    if [[ $MONTH == 01 ]]
    then
        LASTMONTH=12
        LASTYEAR=$((YEAR-1))
    else
        if [[ $MONTH == 10 || $MONTH == 11 || $MONTH == 12 ]]
        then
                LASTMONTH=$((MONTH-1))
                LASTYEAR=$YEAR
        else
                MONTH=${MONTH:1}
                LASTMONTH=$((MONTH-1))
                LASTMONTH=0$LASTMONTH
                LASTYEAR=$YEAR
        fi

    fi

    ## Так как номера некоторых части месяцев выглядят как 01,02,..09, а части 10,11,12, надо это учитывать при расчётах.
    ## Для этого идёт нижеследующая проверка.
    if [[ "$LASTMONTH" -lt 10 ]]
    then
        LASTMONTH=0$LASTMONTH
    fi

    ## Создаём директорию вида ммгггг для хранения статистики за месяц.
    mkdir $LOGDIR/$LASTMONTH$LASTYEAR
    ## Считываем все директории с файлам посуточной статистики за прошедший месяц.
    DIR=`ls $LOGDIR | grep $LASTMONTH$LASTYEAR`
    for i in $DIR
    do
        #### Поочереди, в каждой из этих директорий находим файлы по именам пользователей
        USERNAME=`ls $LOGDIR/$i/`
        for n in $USERNAME
        do
            ###### Во временной директории создаём файл с несуммированной статистикой на каждого пользователя.
            BYTES=`cat $LOGDIR/$i/$n`
            echo $BYTES >> $TMPDIR/$n
        done
    done

    #### Суммируем статистику из временной директории на каждого пользователся,
    #### Складываем её в вышесозданную директорию и
    #### удаляем временные файлы.

    for nn in $USERNAME
    do
        ALLBYTES=0
        BYTES=`cat $TMPDIR/$nn`
        for b in $BYTES
        do
            ALLBYTES=$((ALLBYTES+b))
            echo $ALLBYTES > $LOGDIR/$LASTMONTH$LASTYEAR/$nn
        done
        rm -rf $TMPDIR/$nn
    done

В итоге в Лог-директории мы получаем каталог с номером прошедшего месяца
и года вида ммгггг, в котором лежат файлы, имя каждого из которых — это
имя пользователя, а содержимое — трафик за прошедший месяц.















Смотрите также:

Readers Comments (Комментариев нет)




Да человек я, человек! =)

Exchange 2007

Проведение мониторинга Exchange 2007 с помощью диспетчера System Center Operations Manager 2007 (часть 3)

Если вы хотите прочитать предыдущие части этой серии статей, перейдите по ссылкам: Проведение мониторинга Exchange 2007 с помощью диспетчера System ... [+]

Практическое рассмотрение перехода с Exchange 2003 на Exchange 2007 (часть 1)

Введение В этой статье из нескольких частей я хочу показать вам процесс, который недавно использовал для перехода с существующей среды Exchange 2003 ... [+]

Использование инструмента Exchange Server Remote Connectivity Analyzer Tool (часть 2)

Если вы пропустили первую часть этой серии, пожалуйста, прочтите ее по ссылке Использование инструмента Exchange Server Remote Connectivity Analyzer Tool (Часть ... [+]

Мониторинг Exchange 2007 с помощью диспетчера System Center Operations Manager 2007 (часть 2)

Если вы пропустили предыдущую часть этой серии статей, перейдите по ссылке Мониторинг Exchange 2007 с помощью диспетчера System Center Operations ... [+]

Подробное рассмотрение подготовки Active Directory для Exchange 2007 (часть 5)

Если вы пропустили предыдущие части этой серии статей, перейдите по ссылкам: Подробное рассмотрение подготовки Active Directory для Exchange 2007 (часть 1) ... [+]

Установка и настройка Exchange 2007 из командной строки (Часть 3)

If you missed the previous parts in this article series please read: Exchange 2007 Install and Configuration from the command line (Part ... [+]

Использование инструмента Exchange Server Remote Connectivity Analyzer Tool (часть 1)

Инструмент ExRCA Текущий выпуск инструмента предоставляется только в целях тестирования и оснащен 5 опциями: Тест подключения Outlook 2007 Autodiscover Тест подключения Outlook 2003 RPC ... [+]

Развертывание сервера Exchange 2007 Edge Transport (часть 5)

Если вы хотите прочитать предыдущие части этой серии статей, перейдите по ссылкам: Развертывание сервера Exchange 2007 Edge Transport (часть 1) Развертывание ... [+]

Установка и настройка Exchange 2007 из командной строки (часть 2)

Если вы пропустили первую статью данного цикла, пожалуйста, перейдите по ссылке: Exchange 2007 Install and Configuration from the command line (Part ... [+]

Использование интегрированных сценариев Using Exchange Server 2007 – часть 2: генерирование отчетов агента Transport AntiSpam Agent

Если вы пропустили предыдущую часть этой серии статей, перейдите по ссылке Использование интегрированных сценариев Using Exchange Server 2007 – часть ... [+]