NG_NETFLOW(4) Руководство по интерфейсам ядра FreeBSD

Перевод: Сгибнев Михаил


Имя
ng_netflow -- реализация протокола Cisco NetFlow


Применение

#include <sys/types.h>
#include <netinet/in.h>
#include <netgraph/netflow/ng_netflow.h>

Описание
Нода ng_netflow реализует протокол Cisco NetFlow на маршрутизаторах, работающих под управлением FreeBSD. Нода ng_netflow прослушивает входящий трафик и идентифицирует в нем уникальные потоки. Потоки идентифицируются по IP адресам конечных точек, портам TCP/UDP, ToS и индексу входного интерфейса. Потоки экспортируются из ноды в формате NetFlow version 5. Причиной экспорта могут быть следущие события:
RST или FIN TCP пакет
Таймаут активного потока. Потоки не могут жить больше чем указанный период времени. Значение по умолчанию - 1800 секунд (30 минут).
Таймаут неактивного потока. Поток был неактивен в течение указанного периода времени. Значение по умолчанию - 15 секунд.
Крючки (HOOKS)
Эта нода поддерживает максимальное число крючков, равное NG_NETFLOW_MAXIFACES. Они обозначаются iface0, iface1 и т.д. В добавок существует еще один крючок, называемый export. Нода читает данные из крючков iface* и посылает данные на крючок export. Крючок export подсоединяется к крючкам inet/dgram/udp ng_ksocket(4).
Управляющие сообщения
Нода поддерживает стандартные управляющие сообщения. Дополнительные команды:
NGM_NETFLOW_INFO
Возвращает статистику работы ноды и значения таймаутов в struct ng_netflow_info.
NGM_NETFLOW_IFINFO
Возвращает информацию о крючке ifaceN. В качестве аргумента принимает номер крючка.
NGM_NETFLOW_SETDLT
Устанавливает тип данных на крючке ifaceN. В настоящее время поддерживаются raw IP datagrams и Ethernet. В качестве аргумента используется struct ng_netflow_setdlt:

struct ng_netflow_setdlt {
uint16_t iface; /* which iface to operate on */
uint8_t dlt; /* DLT_XXX from bpf.h */
};

Запрашиваемый крючок ifaceN должен быть присоединен, в противном случае возвращается сообщение об ошибке.
NGM_NETFLOW_SETIFINDEX
В некоторых случаях ng_netflow не способен определить входящий интерфейс пакета. Это может случиться, если трафик попадает в ноду ng_netflow перед тем, как попасть в очередь интерфейса. Для примера, это может случиться при отслеживании трафика между синхронной линией и ng_iface(4). В этом случае, входящий индекс связывается с этим крючком. Индекс интерфейса может быть определен через if_nametoindex(3) из пользовательского окружения. В качестве аргумента принимается struct ng_netflow_setifindex:

struct ng_netflow_setdlt {
uint16_t iface; /* which iface to operate on */
uint8_t dlt; /* DLT_XXX from bpf.h */
};

Запрашиваемый крючок ifaceN должен быть присоединен, в противном случае возвращается сообщение об ошибке.
NGM_NETFLOW_SETTIMEOUTS
Устанавливает значение таймаутов в секундах. В качестве аргумента требует struct ng_netflow_settimeouts :

struct ng_netflow_settimeouts {
uint32_t inactive_timeout;
uint32_t active_timeout;
};

NGM_NETFLOW_SHOW
Это управляющее сообщение указывает ноде сформировать дамп записей кэша потока. Оно вызывается из flowctl(8), в отличии от остальных, вызываемых из ngctl(8).
Управляющие сообщения ASCII
У бинарных управляющих сообщений есть ASCII аналоги. Поддерживаемыми ASCII командами являются:

NGM_NETFLOW_INFO "info"
NGM_NETFLOW_IFINFO "ifinfo %u"
NGM_NETFLOW_SETDLT "setdlt { iface = %u dlt = %u }"
NGM_NETFLOW_SETIFINDEX "setifindex { iface = %u index = %u }"
NGM_NETFLOW_SETTIMEOUTS "settimeouts { inactive = %u active = %u }"

Отключение
Ноду можно отключить, послав управляющее сообщение NGM_SHUTDOWN. Отключение так же происходит при отсутствии подключенных крючков(hook).
Примеры
Самая простая из возможных - конфигурация с одним интерфейсом Ethernet, где и осуществляется прослушивание потока.

/usr/sbin/ngctl -f- <<-SEQ
mkpeer fxp0: tee lower right
connect fxp0: fxp0:lower upper left
mkpeer fxp0:lower netflow right2left iface0
name fxp0:lower.right2left netflow
mkpeer netflow: ksocket export inet/dgram/udp
msg netflow:export connect inet/10.0.0.1:4444
SEQ

Рассмотрим более сложный пример. Маршрутизатор с двумя интерфейсами: fxp0 и ng0, на которых включена поддержка NetFlow. Обратите внимание, что нода ng0, в этом примере, подсоединена к ng_tee(4).

/usr/sbin/ngctl -f- <<-SEQ
# connect ng0's tee to iface0 hook
mkpeer ng0:inet netflow right2left iface0
name ng0:inet.right2left netflow
# set DLT to raw mode
msg netflow: setdlt { iface=0 dlt=12 }
# set interface index (5 in this example)
msg netflow: setifindex { iface=0 index=5 }

# Create tee on fxp0, and connect it to iface1 hook
mkpeer fxp0: tee lower right
connect fxp0: fxp0:lower upper left
name fxp0:lower fxp0_tee
connect fxp0_tee: netflow: right2left iface1

# Create ksocket node on export hook, and configure it
# to send exports to proper destination
mkpeer netflow: ksocket export inet/dgram/udp
msg netflow:export connect inet/10.0.0.1:4444
SEQ

Смотри также
netgraph(4), ng_ksocket(4), ng_tee(4), ngctl(8), http://www.cisco.com/warp/public/cc/pd/iosw/ioft/neflct/tech/napps_wp.htm.
Авторы
Нода ng_netflow была написана Глебом Смирновым < glebius@FreeBSD.orgЭтот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script >, и базируется на ng_ipacct Романа Палагина < romanp@unshadow.netЭтот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script >.
Ошибки
Нода ng_netflow не показывает информацию о номере AS. Это происходит из-за недостатка информации в таблице маршрутизации ядра. Однако, эта информация может быть введена в ядро от демона маршрутизации типа GNU Zebra. Возможно, эти функциональные возможности будут доступны в следующих релизах.

Обновлено: 12.03.2015