Ключевые слова: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
В итоге в Лог-директории мы получаем каталог с номером прошедшего месяца
и года вида ммгггг, в котором лежат файлы, имя каждого из которых - это
имя пользователя, а содержимое - трафик за прошедший месяц.
Доброго времени суток. Сделал как здесь написано, система 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
------------------
Не подскажете как забороть?
>[оверквотинг удален]
>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