FastNetMon

Tuesday, 4 November 2008

Подсчёт трафика на Debian Linux

Ставим: ulogd-mysql

Вот так выглядит дефалтовый конфиг: /etc/ulogd.conf

# Example configuration for ulogd
# $Id: ulogd.conf.in 714 2005-02-19 21:33:43Z laforge $
# Adapted to Debian by Achilleas Kotsis

[global]
######################################################################
# GLOBAL OPTIONS
######################################################################

# netlink multicast group (the same as the iptables --ulog-nlgroup param)
nlgroup=1

# logfile for status messages
logfile="/var/log/ulog/ulogd.log"

# loglevel: debug(1), info(3), notice(5), error(7) or fatal(8)
loglevel=5

# socket receive buffer size (should be at least the size of the
# in-kernel buffer (ipt_ULOG.o 'nlbufsiz' parameter)
rmem=131071

# libipulog/ulogd receive buffer size, should be > rmem
bufsize=150000

######################################################################
# PLUGIN OPTIONS
######################################################################

# We have to configure and load all the plugins we want to use

# general rules:
# 1. load the plugins _first_ from the global section
# 2. options for each plugin in seperate section below


#
# ulogd_BASE.so - interpreter plugin for basic IPv4 header fields
# you will always need this
plugin="/usr/lib/ulogd/ulogd_BASE.so"


# output plugins.
plugin="/usr/lib/ulogd/ulogd_LOGEMU.so"
#plugin="/usr/lib/ulogd/ulogd_OPRINT.so"
#plugin="/usr/lib/ulogd/ulogd_MYSQL.so"
#plugin="/usr/lib/ulogd/ulogd_PGSQL.so"
#plugin="/usr/lib/ulogd/ulogd_SQLITE3.so"
#plugin="/usr/lib/ulogd/ulogd_PCAP.so"


[LOGEMU]
file="/var/log/ulog/syslogemu.log"
sync=1

[OPRINT]
file="/var/log/ulog/pktlog.log"

[MYSQL]
table="ulog"
pass="changeme"
user="laforge"
db="ulogd"
host="localhost"

[PGSQL]
table="ulog"
schema="public"
pass="changeme"
user="postgres"
db="ulogd"
host="localhost"

[SQLITE3]
table="ulog"
db="/path/to/sqlite/db"
buffer=200

[PCAP]
file="/var/log/ulog/pcap.log"
sync=1


Вот так выглядит конфиг iptables, где пакеты отправляются в ULOG:

#!/bin/sh
INET="eth0" # internet iface
INETIP="192.168.155.51"

# сбрасываем все правила
iptables -F INPUT
iptables -F FORWARD
iptables -F OUTPUT

# политика по умолчанию
iptables -P FORWARD ACCEPT
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT

# это правило и отправляет пакеты на анализ ULOG
iptables -A FORWARD -i $INET -j ULOG --ulog-prefix "FORWARD" --ulog-cprange 0 --ulog-qthreshold 50

iptables -t nat -A POSTROUTING -o $INET -j SNAT --to-source $INETIP
echo "1" > /proc/sys/net/ipv4/ip_forward



Делаем sudo /etc/init.d/ulogd start, перезапускаем фаерволл и смотрим лог проходящих пакетов:
tail -f /var/log/ulog/syslogemu.log там должны замелькать записи :)

Теперь надо переключиться на MySQL для приёма логов, т.к. в таком виде их парсить... нет уж.
sudo apt-get install mysql-server
Потом запускаем mysql_secure_installation и выбираем новый пароль на root, пусть это будет: phahde4I

Теперь идём в /usr/share/doc/ulogd-mysql и там ищем файлик: mysql.table
Создаём БД для хранения трафика: mysqladmin -uroot -pphahde4I create traffic
Создаём таблицу во вновь созданной базе: mysql -uroot -pphahde4I -Dtraffic -e 'source mysql.table;'


Идём в настройки ulogd.conf и делаем следующее:
# output plugins.
#plugin="/usr/lib/ulogd/ulogd_LOGEMU.so"
#plugin="/usr/lib/ulogd/ulogd_OPRINT.so"
plugin="/usr/lib/ulogd/ulogd_MYSQL.so"
#plugin="/usr/lib/ulogd/ulogd_PGSQL.so"
#plugin="/usr/lib/ulogd/ulogd_SQLITE3.so"
#plugin="/usr/lib/ulogd/ulogd_PCAP.so"


и ещё правим блок:

[MYSQL]
table="ulog"
pass="phahde4I"
user="root"
db="traffic"
host="localhost"


Далее ребутаем ulogd: sudo /etc/init.d/ulogd restart и топаем в базу:
mysql -uroot -pphahde4I -Dtraffic
А там следим за ростом числа: select count(*) from ulog; -- это число перехваченных и записаных пакетов.

Итого ulogd конфиг принимает вид:

# Example configuration for ulogd
# $Id: ulogd.conf.in 714 2005-02-19 21:33:43Z laforge $
# Adapted to Debian by Achilleas Kotsis

[global]
######################################################################
# GLOBAL OPTIONS
######################################################################

# netlink multicast group (the same as the iptables --ulog-nlgroup param)
nlgroup=1

# logfile for status messages
logfile="/var/log/ulog/ulogd.log"

# loglevel: debug(1), info(3), notice(5), error(7) or fatal(8)
loglevel=5

# socket receive buffer size (should be at least the size of the
# in-kernel buffer (ipt_ULOG.o 'nlbufsiz' parameter)
rmem=131071

# libipulog/ulogd receive buffer size, should be > rmem
bufsize=150000

######################################################################
# PLUGIN OPTIONS
######################################################################

# We have to configure and load all the plugins we want to use

# general rules:
# 1. load the plugins _first_ from the global section
# 2. options for each plugin in seperate section below


#
# ulogd_BASE.so - interpreter plugin for basic IPv4 header fields
# you will always need this
plugin="/usr/lib/ulogd/ulogd_BASE.so"


# output plugins.
#plugin="/usr/lib/ulogd/ulogd_LOGEMU.so"
#plugin="/usr/lib/ulogd/ulogd_OPRINT.so"
plugin="/usr/lib/ulogd/ulogd_MYSQL.so"
#plugin="/usr/lib/ulogd/ulogd_PGSQL.so"
#plugin="/usr/lib/ulogd/ulogd_SQLITE3.so"
#plugin="/usr/lib/ulogd/ulogd_PCAP.so"


[LOGEMU]
file="/var/log/ulog/syslogemu.log"
sync=1

[OPRINT]
file="/var/log/ulog/pktlog.log"

[MYSQL]
table="ulog"
pass="phahde4I"
user="root"
db="traffic"
host="localhost"

[PGSQL]
table="ulog"
schema="public"
pass="changeme"
user="postgres"
db="ulogd"
host="localhost"

[SQLITE3]
table="ulog"
db="/path/to/sqlite/db"
buffer=200

[PCAP]
file="/var/log/ulog/pcap.log"
sync=1



Собственно, настройка системы подсчета трафика закончена, далее вопрос за её анализом и красивым отображением, но это в следующих статьях :)

3 comments :

  1. ulogd в связке с субд для подсчета траффика не годится в принципе. Ибо на каждый чих ulogd'шные плагины делают INSERT(а операция дорогая).

    Даже парсенье лога ulog-acctd обходится сильно(очень сильно) дешевле рассмотренной схемы.

    На мой взгляд наиболее продуктивным вариантом будет ipcad + пара скриптов.

    ReplyDelete
  2. Не подскажете, куда копать?
    Поставил ulogd2 ver 2.0.0.beta3, но не получается подключить модуль mysql.
    Включил дебаг и в ulogd.log нашел, кажется, причину:
    ================
    Wed Dec 2 15:44:05 2009 <1> ulogd.c:662 connecting input/output keys of stack:
    Wed Dec 2 15:44:05 2009 <1> ulogd.c:670 traversing plugin `MYSQL'
    ......
    Wed Dec 2 15:44:05 2009 <7> ulogd.c:727 cannot find key `label' in stack
    Wed Dec 2 15:44:05 2009 <1> ulogd.c:863 destroying stack
    ================
    В результате в БД ни одной записи не создаётся.
    Но в стеке, судя по описанию, никакие ключи и не должны указываться... Как это лечить, я что-то делаю не так?

    ReplyDelete
  3. А файл схемы точно переливали после апдейта:

    Теперь идём в /usr/share/doc/ulogd-mysql и там ищем файлик: mysql.table

    Похоже, там просто добавили какие-то дополнительные поля в таблице.

    ReplyDelete

Note: only a member of this blog may post a comment.