The OpenNET Project / Index page

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



"Подсчет траффика на интерфейсе"
Версия для распечатки Пред. тема | След. тема
Форум Открытые системы на сервере
Исходное сообщение [ Отслеживать ]
Подсказка: Второй уровень иерархии тем в форуме реализован через вкладку "Показ ключевых тем".
. "Подсчет траффика на интерфейсе" +/
Сообщение от artemrtsemail (ok), 22-Май-09, 17:24 
>[оверквотинг удален]
>
> Озадачили вопросом - нужно считать траффик на интерфейсе сервера.
>Кол-во ОЗУ там ограничено, поэтому очень не хочется, чтобы SNMPd постоянно в
>памяти висел.
>
>Кто-нибудь сталкивался с подобной проблемой? Если да - как решалось?
> Подумывал я брать данные скриптом из netstat -ib, но думаю, что
>погрешность "измерений" будет очень большая. Существуют ли консольные программки, которые просто
>бы выводили данные значения? (как тот нетстат, к примеру - кол-во
>бит К/ОТ)?

   Здаров.
   Скажу, что сам очень долго искал метод подсчета траффика, который был бы точным и с мин. потреблением системных ресурсов.
  Остановился на следующем: ng_ntflow + flow-tools.
  Для этого в ядро нада вкомпилить потдержку netgraph.
  Реализация:
1. Снимаем флоу-поток с интерфейса.

  #!/bin/sh

# PROVIDE: ngnetflow
# REQUIRE: DAEMON
# KEYWORD: shutdown

. /etc/rc.subr

name="ngnetflow"
rcvar=`set_rcvar`
command="/usr/sbin/ngctl"
load_rc_config $name
: ${ngnetflow_enable="NO"}
: ${ngnetflow_iface=""}
: ${ngnetflow_dst=""}

start_cmd="${name}_start"
stop_cmd="${name}_stop"

ngnetflow_start() {
/usr/sbin/ngctl -f- <<-SEQ
mkpeer ${ngnetflow_iface}: netflow lower iface0
name ${ngnetflow_iface}:lower netflow
connect netflow: ${ngnetflow_iface}: iface1 upper
connect netflow: netflow: out0 out1
mkpeer netflow: ksocket export inet/dgram/udp
name netflow:export ksocket
msg ksocket: connect inet/${ngnetflow_dst}
SEQ
}

ngnetflow_stop() {
/usr/sbin/ngctl -f- <<-SEQ
shutdown netflow:
SEQ
}

run_rc_command "$1"

естественно, прописываем в /etc/rc.conf параметры

ngnetflow_enable=""
ngnetflow_iface=""
ngnetflow_dst=""

думаю, тут все понятно.

2. С помощью flow-tools захватываем и обрабатываем данные.

#!/bin/sh

RPT_Y=`/bin/date -v-1d +%Y`
RPT_M=`/bin/date -v-1d +%m`
RPT_D=`/bin/date -v-1d +%d`

RPT_DIR="/usr/local/www/data"
RPT_DATE=${RPT_Y}-${RPT_M}-${RPT_D}
RPT_NAME=${RPT_DIR}/${RPT_DATE}.html
FLOW_DIR="/var/db/flows"
INDEX="/usr/local/www/data/index.html"

## WEB index.html

#echo -e "<HTML>\n<HEAD>\n<TITLE> Traffic statistics for LAN #Users</TITLE>\n</HEAD>\n<BODY>\n \
#<h2 align="center"><font color="blue">Traffic statistics for LAN Users</font></h2>" > #$INDEX
#echo -e "</BODY>\n</HTML>\n" >> ${INDEX}
echo -e "<p align="left"><a href="${RPT_DATE}.html"> Pere-IP statistics for LAN during \
<strong>${RPT_DATE}</strong></a></p>" >> ${INDEX}

Поясню вышенаписанное. Сначала надо раскоментировать первые 5 строк, что бы скрипт сгенерировал Индекс-страничку для страницы отчетов. Перед вторым запуском их надо закоментирвать, и тогда будут добавляться только ссылки на страницы с отчетами за определенный день.

## DOWNLOADED

echo -e "<HTML>\n<HEAD>\n<TITLE>${RPT_DATE}</TITLE>\n</HEAD>\n<BODY>\n<H2>${RPT_DATE} DOWNLOADED</H2>\n" > ${RPT_NAME}

/usr/local/bin/flow-cat ${FLOW_DIR}/${RPT_Y}/${RPT_Y}-${RPT_M}/${RPT_Y}-${RPT_M}-${RPT_D} \
|/usr/local/bin/flow-filter -f /usr/local/etc/flow-tools/flow.acl -Sinternet -Dlocalnet \
|/usr/local/bin/flow-report -s /usr/local/etc/flow-tools/report_down.conf -S localnet \
|/usr/local/bin/flow-rptfmt -f html -H -s -octets >> ${RPT_NAME}

echo -e "</BODY>\n" >> ${RPT_NAME}

### UPLOADED

echo -e "<BODY>\n<H2>${RPT_DATE} UPLOADED</H2>\n" >> ${RPT_NAME}

/usr/local/bin/flow-cat ${FLOW_DIR}/${RPT_Y}/${RPT_Y}-${RPT_M}/${RPT_Y}-${RPT_M}-${RPT_D} \
|/usr/local/bin/flow-filter -f /usr/local/etc/flow-tools/flow.acl -Slocalnet -Dinternet \
|/usr/local/bin/flow-report -s /usr/local/etc/flow-tools/report_up.conf -S localnet \
|/usr/local/bin/flow-rptfmt -f html -H -s -octets >> ${RPT_NAME}

echo -e "</BODY>\n</HTML>\n" >> ${RPT_NAME}

### REMOVE OLD

RM_Y=`/bin/date -v-4d +%Y`
RM_M=`/bin/date -v-4d +%m`
RM_D=`/bin/date -v-4d +%d`

rm -Rf ${FLOW_DIR}/${RM_Y}/${RM_Y}-${RM_M}/${RM_Y}-${RM_M}-${RM_D}

-----
flow.acl

ip access-list standard localnet permit 10.0.100.0 0.0.0.255
ip access-list standard localnet deny any
ip access-list standard internet deny 10.0.100.0 0.0.0.255
ip access-list standard internet permit any

-----
report_down.conf

stat-report localnet
    type ip-destination-address
    output
        format ascii
        options +header,+xheader,+totals
        fields -flows,-packets,-duration
stat-definition localnet
    report localnet
----
report_up.conf

stat-report localnet
    type ip-source-address
    output
        format ascii
        options +header,+xheader,+totals
        fields -flows,-packets,-duration
stat-definition localnet
    report localnet
-------
3. В крон записываем, что бы генерировался отчет:
  5       2       *       *       *       root /usr/local/etc/flow-tools/stat_daily.sh

4. Устанавливаем Apache, заходим на страничку и смотрим статистику.

Чего пока здесь нету? Хотелось бы выводить статистику за день не только по IP, но и суммарную по всей подсети. Но пока до этого руки не дошли, так что если кто допишет, киньте плиз.

Что бы это все реализовать мне помогли 2 статьи:
http://ylsoftware.com/news/492
http://tmp.barev.net/htmlart/unix/pres-ngnetflow.xml#1

Вобщем разьяснять каждую строчку мне влом, так что если кому чего непонятно - пишите.

Ответить | Правка | Наверх | Cообщить модератору

Оглавление
Подсчет траффика на интерфейсе, vladsol, 20-Май-09, 19:00  [смотреть все]
Форумы | Темы | Пред. тема | След. тема



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

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