Сбор статистики во FreeBSD через запуск ng_ipacct

Добавил Support
Для ITDoc

1 звезда2 звезд3 звезд4 звезд5 звезд (2 голосов, средний: 4.50 из 5)
Загрузка ... Загрузка ...
557 Просмотров!

Издано: марта 30, 2009

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

Поскольку сам я не люблю мегабайтные конфиги то предложу свой вариант
запуска ipacct-а

И так, начнем:

Задача - начать сбор статистики как можно быстрее.

Что имеем - FreeBSD 6.4, пара сетевых карт em0, em1, ядро собранное с
поддержкой netgraph - options NETGAPH, свежие порты, вкомпилированный ipfw и
наверное всё.

Первое что делаем - ставим ng_ipacct:

cd /usr/ports/net-mgmt/ng_ipacct
        make install

если на машине присутствует интернет (я обычно это проверяю ping
www.ru), то проблем с установкой появиться не должно, иначе учимся
ставить систему.

после установки в /usr/local/etc/rc.d/ и /usr/local/etc/ появляется
скрипты, находим их и убиваем, любопытные могут посмотреть что там
внутри :) я же в чужие скрипты зарекся лазить.

теперь на нашей машинке есть ng_ipacct, не знаю почему, но в мане информации по
нему не появилось, разбираться лениво, все что мне нужно было - я нашел
прямо в порте, советую посмотреть и вам, файлик ipacctctl.8

т.к. мне нужно забирать статистику не только с физического интерфейса em0, то
я принял решение перенаправлять необходимый для подсчета трафик с ipfw в
нетграф, т.е. по аналогии с простым дивертом

подгружаем необходимые модули в ядро

kldload ng_ipfw  #модуль для передачи трафика с ipfw в нетграф
        kldload ng_ipacct #собственно сам ipacct
        kldload ng_tee #модуль для копирования трафика в ng_ipacct

смотрим что получилось

kldstat

если модули загружены, то всё хорошо, иначе учимся ставить систему(с)
далее, при помощи утилиты ngctl даем команды нетграфу, их можно засунуть
в скрипт и поставить на автозагрузку:

#!/bin/sh
        #####тело файла Strart.sh
        # именуем ноду
        ngctl name ipfw: ipfw1

        # создаем ноду tee и подрубаем её хуком left к ноде ipfw1 через хук 100
        ngctl mkpeer ipfw1: tee 100 left

        # даем имя ноде em0_tee (на место em0 можно написать что угодно, привязки
        # к карте никакой тут нет, в моём случае приписка em0 стечение обстоятельств)
        ngctl name ipfw1:100 em0_tee

        #коннектим фаервол хуком 200 к ноде em0_tee в хук right
        ngctl connect ipfw1: 100 200 right

        # создаем и подключаем ноду ipacct хуком em0_in (em0 тут опять же может
        # быть любым, если напишете vasya_in, то команду ipacctctl ip_acct:em0
        # checkpoint,show,clear нужн будет писать ipacctctl ip_acct:vasya
        # checkpoint,show,clear и хук out с префиксом vasya обязательно)
        ngctl mkpeer em0_tee: ipacct left2right em0_in

        # именуем ноду ipacct именем ip_acct
        ngctl name em0_tee:left2right ip_acct

        #коннектим ноды ip_acct и em0_tee хуками em0_out и right2left
        ngctl connect ip_acct: em0_tee: em0_out right2left

        # вкратце опишем процесс заново
        # у нас получились ноды - tee обозванная em0_tee, с хуками left, right для
        # приема трафа c ng_ipfw, хуки right2left и left2right для отдачи трафика к следующему
        # обработчику, в нашем случае ipacct, хуки эти переименовать нельзя и они
        # постоянные, имя ноды, как вы уже наверно заметили, можно задать произвольное
        # нода ipfw обозванная ipfw1 с хуками 100 и 200 (чуть ниже поймете откуда они
        # взяты), эти хуки произвольные, имя ноды произвольное, нода подрублена к ноде
        # em0_tee (см строкой выше)
        # нода ipacct названная ip_acct с хуками em0_in и em0_out в которые
        # нода em0_tee копирует трафик хуками left2right и right2left
        # чтоб это всё понять - рисуйте на бумажке - нода - это квадратик,
        # хук - линия к другому квадратику, у ноды может быть несколько хуков.
        # Нод существует тоже достаточно.

        # после выполнения команд мы имеем завязанный ng_ipacct с ng_tee,
        # а ng_tee с ng_ipfw, чтоб посмотреть все это наглядно - зайдите в
        # утилиту ngctl и дайте там команду ls

        # продолжаем:
       
        # теперь с этого же скрипта дадим команды ipacct-у

        # кол-во записей которые хранит ipacct в мозгах, подробней смотрите ipacctctl.8
        ipacctctl ip_acct:em0 threshold 10000

        # тип пакетов, смотрите всё тот же ipacctctl.8
        ipacctctl ip_acct:em0 dlt RAW

        # вид выдаваемой статистики, см ipacctctl.8
        ipacctctl ip_acct:em0 verbose off

на этом скрипт можно завершить, но каждый для себя его может дополнить,
переписать и т.д., имхо краткокость - сестра … ;)

Осталось добавить в ipfw правила и начать сбор трафика и снятие статистики

ipfw add 10 netgraph 100 ip from any to any in
        ipfw add 11 netgraph 200 ip from any to any out

переменной sysctl net.inet.ipfw.one_pass можно задать способ прохождения
трафика - либо пакет принят, либо продолжает сравнение. см man ipfw

снятие статистики:

# перенос статистики в чекпоинт базу
        ipacctctl ip_acct:em0 checkpoint

        # показать статистику на экран, если нужно сохранить в файл,
        # то ipacctctl ip_acct:em0 show >> file.stat
        ipacctctl ip_acct:em0 show

        # очистили базу для последующей статистики.
        ipacctctl ip_acct:em0 clear

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

1. http://citrin.ru/netgraph/
2. http://nexus.org.ua/weblog/message/406/ - позновательно
3. http://www.opennet.ru/base/net/ng_ipacct_tips.txt.html - после осознания нетграфа

Популярность: 11% [!]

Tagged with: , , , ,


Спонсор



 WPSN comments




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

ITDoc самый Последний