вторник, сентября 25, 2012

Установка ipt_NETFLOW v1.8 в CentOS 5.8 (PAE)


Сенсор ipt_NETFLOW считается самым быстрым, в прямом смысле этого слова, для отдачи статистики по протоколу netflow. Систему не грузит, работает молненосно :)

ВЕРСИЯ СИСТЕМЫ

Система centos 5.8:

shell> uname -a
Linux temp.test.local 2.6.18-308.13.1.el5PAE #1 SMP Tue Aug 21 17:50:26 EDT 2012 i686 i686 i386 GNU/Linux

УСТАНОВКА ИНСТРУМЕНТАРИЯ

Устанавливаем набор инструментов и исходники ядра:

shell> yum install iptables-devel gcc gcc-c++ kernel-headers kernel-PAE-devel make

Если у вас процессор без PAE то надо указать kernel-devel.

ИСХОДНИКИ ipt_NETFLOW

Загружаем исходники модуля:

shell> wget http://citylan.dl.sourceforge.net/project/ipt-netflow/ipt-netflow/ipt_netflow-1.8.tgz
shell> tar xf ipt_netflow-1.8.tar
shell> mv ipt_netflow-1.8 /usr/local/src/
shell> cd /usr/local/ipt_netflow-1.8/

КОМПИЛЯЦИЯ

Начинаем собирать:

shell> ./configure
(...)
  Now run: make all install
shell> make all install
make -C /lib/modules/2.6.18-308.13.1.el5PAE/build M=/usr/local/src/ipt_netflow-1.8 modules_install
make: *** /lib/modules/2.6.18-308.13.1.el5PAE/build: Нет такого файла или каталога.  Останов.
make: *** [minstall] Ошибка 2

Покавырявшись немного стало понятно - нет симлинка на исходники ядра:

shell> ln -s /usr/src/kernels/2.6.18-308.13.1.el5PAE-i686/ /lib/modules/$(uname -r)/build

Проверяем привильно ли все:

shell> file /lib/modules/$(uname -r)/build
/lib/modules/2.6.18-308.13.1.el5PAE/build: symbolic link to `/usr/src/kernels/2.6.18-308.13.1.el5PAE-i686/'

И опять собираем моудль:

shell> ./configure
(...)
  Now run: make all install
shell> make all install
(...)
shell> depmod

Проверяем установился ли модуль:

shell> modinfo ipt_NETFLOW
filename:       /lib/modules/2.6.18-308.13.1.el5PAE/extra/ipt_NETFLOW.ko
version:        1.7.2
description:    iptables NETFLOW target module
author:         
license:        GPL
srcversion:     43F3959209576499C33AB98
depends:        x_tables
vermagic:       2.6.18-308.13.1.el5PAE SMP mod_unload 686 REGPARM 4KSTACKS gcc-4.1
parm:           destination:export destination ipaddress:port (charp)
parm:           inactive_timeout:inactive flows timeout in seconds (int)
parm:           active_timeout:active flows timeout in seconds (int)
parm:           debug:debug verbosity level (int)
parm:           sndbuf:udp socket SNDBUF size (int)
parm:           hashsize:hash table size (int)
parm:           maxflows:maximum number of flows (int)
parm:           aggregation:aggregation ruleset (charp)

Опа! А версия то 1.7.2.

АВТОЗАГРУЗКА МОДУЛЯ

Раз модуль относится к iptables то пусть он его и подгружает. Логично? Логично. Но не рабоатет. Редактируем файл /etc/sysconfig/iptables-config, находим там параметр IPTABLES_MODULES и приводим его к такому виду:

IPTABLES_MODULES="ip_nat_pptp ip_nat_ftp ipt_NETFLOW"

У меня тут еще кое что есть, так что ненужное можно удалить. Создаем файл /etc/modprobe.d/ipt_netflow.conf с содержимым:

options ipt_NETFLOW hashsize=160000 destination=127.0.0.1:8818

Т.е. сенсор ipt_NETFLOW будет отсылать на 127.0.0.1:8818 данные о трафике. Именно на этот IP:PORT надо вешать коллектор. Перезапускаем систему и ... Не работает. Модуль как бы загружен, но он не подвязался к сетевому интерфейсу lo. Проблема в том, что iptables загружается немного раньше, чем система начинает грузить сеть:

shell> ll /etc/rc3.d/ |grep iptables
lrwxrwxrwx 1 root root 18 Сен 17 14:45 S08iptables -> ../init.d/iptables
shell> ll /etc/rc3.d/ |grep network
lrwxrwxrwx 1 root root 17 Сен 19 13:19 S10network -> ../init.d/network

По цифаркам видно, что грузится первее. iptables загружается первым, интерфейса lo еще нет, в dmesg попадает сообщение remove destination 127.0.0.1:8818. Все пропало...

Когда встала проблема я полез в сеть искать решение. И все что я нашел было как у меня. Т.е. все запускали ipt_NETFLOW как я, через конфиг iptables. Такое чувство, что никто никогда не перезагружает сервера (я ради теста перезагружал :)). Возможно проблема в чем-то другом.

Заставить загружать модуль номально удалось лишь указав загрузку через /etc/rc.local:

shell> echo modprobe ipt_NETFLOW >> /etc/rc.local

ПРОВЕРКА РАБОТЫ СЕНСОРА

Проверить работу можно так:

shell> cat /proc/net/stat/ipt_netflow 
Flows: active 14 (peak 100 reached 0d0h5m ago), mem 0K
Hash: size 160000 (mem 625K), metric 1.0, 1.0, 1.0, 1.0. MemTraf: 304 pkt, 15 K (pdu 77, 4004).
Timeout: active 1800, inactive 15. Maxflows 2000000
Rate: 286 bits/sec, 0 packets/sec; Avg 1 min: 1630 bps, 0 pps; 5 min: 1419 bps, 0 pps
cpu#  stat: , sock: , traffic: , drop: 
Total stat:      1   1087   1216,    0    0    0    0, sock:     42 0 0, 56 K, traffic: 2303, 0 MB, drop: 0, 0 K
cpu0  stat:      0      0      0,    0    0    0    0, sock:      0 0 0, 0 K, traffic: 0, 0 MB, drop: 0, 0 K
cpu1  stat:      1   1087   1216,    0    0    0    0, sock:     42 0 0, 56 K, traffic: 2303, 0 MB, drop: 0, 0 K
sock0: 127.0.0.1:8818, sndbuf 110592, filled 0, peak 0; err: sndbuf reached 0, other 0

Незабудте убрать модуль из конфига iptables (/etc/sysconfig/iptables-config).

Все настроено. Осталось настроить правила в iptables (пример есть в исходниках - README) и настроить какой нить коллектор для принятия данных отсылаемых сенсором.

UPDATE 10/04/2012
Есть еще один способ загружать ipt_NETFLOW во время загрузки системы. В файл /etc/sysctl.conf добавить вот эти параметры:

net.netflow.flush = 0
net.netflow.maxflows = 2000000
net.netflow.aggregation =
net.netflow.destination = 127.0.0.1:8818
net.netflow.sndbuf = 110592
net.netflow.hashsize = 160000
net.netflow.debug = 0
net.netflow.inactive_timeout = 15
net.netflow.active_timeout = 1800

А в файл /etc/sysconfig/iptables-config отредактировать параметр:

IPTABLES_MODULES="ipt_NETFLOW"

Такой способ более правильный


3 комментария:

  1. Анонимный8/12/2013 1:04 PM

    Добрый день!

    В статье не описано какие правила нужно создавать в iptables чтобы собирать трафик через модуль ipt_netflow

    ОтветитьУдалить
    Ответы
    1. /sbin/iptables --table filter --insert FORWARD 1 --jump NETFLOW
      /sbin/iptables --table filter --insert FORWARD 2 --match state --state RELATED,ESTABLISHED --jump ACCEPT
      /sbin/iptables --table filter --append FORWARD --source 192.168.42.168 --jump ACCEPT
      ...

      Именно так, по другому правило с NETFLOW ставилось в другом порядке и не работало.

      Удалить
  2. Hi! Можно поучаствовать в тестировании новой версии ipt-netflow (сделайте clone из git), новые возможности: IPv6 (ip6tables), ipfix и netflow v9 протоколы, NAT events (как Cisco NEL) и прочая мелочь. Git репозиторий https://github.com/aabc/ipt-netflow

    ОтветитьУдалить