Имя
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 была написана Глебом Смирновым
<[email protected]>
,
и базируется на
ng_ipacct Романа Палагина
<[email protected]>
.
Ошибки
Нода
ng_netflow не показывает информацию о номере AS.
Это происходит из-за недостатка информации в таблице маршрутизации ядра.
Однако, эта информация может быть введена в ядро от демона маршрутизации типа GNU Zebra.
Возможно, эти функциональные возможности будут доступны в следующих релизах.
Перевод: Сгибнев Михаил