The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

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


<< Предыдущая ИНДЕКС Исправить src / Печать Следующая >>
Ключевые слова: traffic, linux,  (найти похожие документы)
From: Anton Kropachev <cppmm@mail.ru.> Newsgroups: email Date: Mon, 30 Aug 2008 18:21:07 +0000 (UTC) Subject: Подсчёт трафика в Linux с помощью pmacctd. Учётная система работает на основе утилиты 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 В итоге в Лог-директории мы получаем каталог с номером прошедшего месяца и года вида ммгггг, в котором лежат файлы, имя каждого из которых - это имя пользователя, а содержимое - трафик за прошедший месяц.

<< Предыдущая ИНДЕКС Исправить src / Печать Следующая >>

Обсуждение [ RSS ]
  • 1, lagzombie (?), 11:00, 11/09/2008 [ответить]  
  • +/
    Доброго времени суток. Сделал как здесь написано, система linux mandrake.Скрипт старта ругается на отсутствие pmacctd.conf,но запускает демона.Я его туда положил,в нем всего две строчки
    ------------------
    interface: eth0
    aggregate: src_host, dst_host
    ------------------
    ругается:
    --------------------
    /etc/pmacct/pmacctd.conf: line 1: interface:: command not found
    /etc/pmacct/pmacctd.conf: line 2: aggregate:: command not found
    ----------------------------
    В лог файле (/var/log/pmacctd/pmacctd.log)
    следующее:
    --------------------------
    WARN ( cmdline ): No plugin has been activated; defaulting to in-memory table.
    WARN ( cmdline ): ignoring unknown aggregation method: -i.
    WARN ( cmdline ): 'sql_refresh_time' is expected in secs but contains non-digit chars: '-'
    WARN ( cmdline ): Invalid value at line: 2. Ignored.
    WARN ( cmdline ): 'print_refresh_time' has to be > 0.
    WARN ( cmdline ): Invalid value at line: 3. Ignored.
    WARN ( default/memory ): defaulting to SRC HOST aggregation.
    OK ( default/memory ): waiting for data on: '/tmp/collect.pipe'
    WARN ( default/core ): Selecting a suitable device.
    OK ( default/core ): link type is: 1
    WARN: syntax error
    WARN ( default/core ): going on without a filter
    ------------------
    Не подскажете как забороть?
     
     
  • 2, cppmm (??), 14:39, 21/09/2008 [^] [^^] [^^^] [ответить]  
  • +/
    >[оверквотинг удален]
    >WARN ( cmdline ): 'print_refresh_time' has to be > 0.
    >WARN ( cmdline ): Invalid value at line: 3. Ignored.
    >WARN ( default/memory ): defaulting to SRC HOST aggregation.
    >OK ( default/memory ): waiting for data on: '/tmp/collect.pipe'
    >WARN ( default/core ): Selecting a suitable device.
    >OK ( default/core ): link type is: 1
    >WARN: syntax error
    >WARN ( default/core ): going on without a filter
    >------------------
    >Не подскажете как забороть?

    Извиняюсь, забыл описать отдельно вид конфига. Я туда не включал особо много опций, как виднео из стартого скрипта. Он понимает только три параметра:
    PRIMITIVE=     соответствует опции -c утилиты pmacctd
    INTERFACE=     соответствует опции -i утилиты pmacctd
    INTERVAL=      соответствует опции -r утилиты pmacctd

     

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру