-
Существует не очень широкий канал от филиала к центральному офису (частная сеть).
Нужно организовать контроль загруженности этого канала.
Интервал - 1 минута.
IP адрес маршрутизатора 192.168.1.254. Индекс внешнего интерфейса - 2.
Сервер сбора данных NetFlow - monitor[192.168.1.2] (FreeBSD 4.9)
flow-capture будет слушать UDP порт 9292
Классификация - по потокам. Нужно отображать 5 самых "говорливых" потоков.
Шкала Y - в процентах полосы пропускания 64Кбит/сек.
-
$ telnet 192.168.1.254
..........................
router> en
Password: *********
router# configure terminal
router(config)# ip flow-cache feature-accelerate
router(config)# ip flow-cache timeout inactive 60
router(config)# ip flow-cache timeout active 1
router(config)# ip flow-export version 5
router(config)# ip flow-export destination 192.168.1.2 9292
#
router(config)# access-list 1 permit 192.168.1.2
router(config)# snmp-server community verysecret RO 1
#
router(config)# interface Serial0/0
router(config-if)# ip route-cache flow
router(config-if)# exit
router(config)# interface FastEthernet0/0
router(config-if)# ip route-cache flow
router(config-if)# exit
router(config)# exit
router# copy running-config startup-config
|
-
Допустим, данные будут храниться в подкаталоге /var/netflow
Создадим такой скрипт /usr/local/libexec/flowcapture_watchdog.sh
#!/bin/sh
#
prefix=/usr/local
exec_prefix=${prefix}
PATH=/bin:/usr/bin
export PATH
port=9292
pidfile=/var/run/flow-capture.pid.${port}
wrkdir=/var/netflow
while : ; do
if [ -r $pidfile ] && kill -0 `cat $pidfile` >/dev/null 2>&1 ; then
# echo "Flow-capture Running"
else
# echo "Flow-capture failed"
logger -p daemon.err -t flowcapture_watchdog "Flow-capture failed. Restarting..."
rm -f ${pidfile}
${exec_prefix}/bin/flow-capture -n 1439 -w ${wrkdir} 0/0/${port}
fi
sleep 10
done
#
В каталоге /usr/local/etc/rc.d создадим скрипт flow-capture.sh
(он будет исполняться в момент старта системы, и будет запускать flow-capture сервис)
#!/bin/sh
case "$1" in
start)
/usr/local/libexec/flowcapture_watchdog.sh & > /dev/null
;;
stop)
PIDS=`ps -ax | grep flowcapture_watchdog.sh | grep -v grep | awk -- '{print $1}'`
kill -TERM $PIDS
killall flow-capture
;;
*)
echo "Usage: `basename $0` start | stop " >&2
;;
esac
#
Запуск flow-capture
# nohup /usr/local/libexec/flowcapture_watchdog.sh > /dev/null &
Через некоторое время можно обнаружить, что в /var/netflow появились подкаталоги,
и файлы с данными. Например, полный путь до файла данных созданного в 17:30 19 марта 2003 года
будет выглядеть примерно так:
/var/netflow/2003/2003-03/2003-03-19/ft-v05.2003-03-19.173021+0600
-
#!/usr/bin/perl
#
# $view{view_name} = \( descr, pre_filter, %class, n_top, &PrintFlow, f_legend, %counters )
# .[0] описание
# .[1] процедура совпадения с view
# .[2] процедура классификации потоков
# .[3] макс количество классов;
# .[4] процедура печати потоков
# .[5] заголовок таблицы потоков
#
#
use Cflow qw(:flowvars :tcpflags :icmptypes :icmpcodes 1.041);
#
@hosts_files = ("/etc/hosts");
@protocols_files = ("/etc/protocols");
@services_files = ("/etc/services");
@asns_files = ();
$main::step = 60; # ширина интервала - 1 минута.
#----------------------------------------------------------------
# views filters
#----------------------------------------------------------------
sub all_out_filter {
# direction - outside ( outif=2 Serial0/0)
if ( $Cflow::exporterip eq "192.168.1.254" &&
$Cflow::output_if == 2 ) { return 1; }
return 0;
}
sub all_in_filter {
# direction - inside ( outif=2 Serial0/0)
if ( $Cflow::exporterip eq "192.168.1.254" &&
$Cflow::input_if == 2 ) { return 1; }
return 0;
}
#----------------------------------------------------------------
# classes filters
#----------------------------------------------------------------
sub FormatFlow {
$snm=$Cflow::srcip;
if ( defined $hosts{$snm}) { $snm=$hosts{$snm}; }
$dnm=$Cflow::dstip;
if ( defined $hosts{$dnm}) { $dnm=$hosts{$dnm}; }
if ( $Cflow::protocol==6 || $Cflow::protocol==17 ) {
$sp=$Cflow::srcport;
$dp=$Cflow::dstport;
if ($Cflow::protocol==6 ) {
$p= "tcp";
if ( defined $tcp_services{$sp}) { $sp=$tcp_services{$sp}; }
if ( defined $tcp_services{$dp}) { $dp=$tcp_services{$dp}; }
} else {
$p="udp";
if ( defined $udp_services{$sp}) { $sp=$udp_services{$sp}; }
if ( defined $udp_services{$dp}) { $dp=$udp_services{$dp}; }
};
return "$p $snm:$sp $dnm:$dp";
} elsif ( $Cflow::protocol==1 ) {
$icp = get_icmp_typecode($Cflow::dstport);
return "icmp $snm $dnm..$icp";
}
$p=$Cflow::protocol;
if (defined $protocols{$p}) { $p=$protocols{$p}; }
return "$p $snm $dnm";
};
#
undef %view;
#
sub classify_by_flow { return &FormatFlow; }
#
sub myPrintFlow {
$f = &FormatFlow;
return "$f $Cflow::bytes $Cflow::pkts\r\n";
} # печатать поток, кол-во байт и пакетов в потоке.
#
@{$view{total_output_by_flow}} = ( "OutPut traffic by Flows ", # описание view ( одна строка )
\&all_out_filter, # процедура - фильтр для view
\&FormatFlow, # view classifier
5, # число top классов
\&myPrintFlow, # процедура печати потоков
"protocol src_addr:src_port dst_addr:dst_port bytes packets"
);
#
@{$view{total_intput_by_flow}} = ( "InPut traffic by Flows ", # описание view ( одна строка )
\&all_in_filter, # процедура - фильтр для view
\&FormatFlow, # view classifier
5, # число top классов
\&myPrintFlow, # процедура печати потоков
"protocol src_addr:src_port dst_addr:dst_port bytes packets"
);
Запускаем:
$ cp view_definitions.pl /usr/local/etc
$ flow_Server.pl
-
#
set ::topNetFlows::server localhost
set ::topNetFlows::port 9000
set ::topNetFlows::view_name total_input_by_flow
#
set ::topNetFlows::bandwidth [ expr 64*1024 ]
#
set ::topNetFlows::viewFlows_sort_order decreasing
set ::topNetFlows::viewFlows_sort_mode integer
set ::topNetFlows::viewFlows_sort_col 3
#
set ::topNetFlows::graphGeometry 446x360+456+0
set ::topNetFlows::vfGeometry 490x558+781+400
set ::topNetFlows::vfTableGeometry {{4 -60} {3 -142} {2 -129} {1 -50} {0 -11}}
#
Запускаем:
$ TkTopNetFlows.tcl in.cfg &
-
#
set ::topNetFlows::server localhost
set ::topNetFlows::port 9000
set ::topNetFlows::view_name total_output_by_flow
#
set ::topNetFlows::bandwidth [ expr 64*1024 ]
#
set ::topNetFlows::viewFlows_sort_order decreasing
set ::topNetFlows::viewFlows_sort_mode integer
set ::topNetFlows::viewFlows_sort_col 3
#
set ::topNetFlows::graphGeometry 446x360+0+0
set ::topNetFlows::vfGeometry 490x558+781+400
set ::topNetFlows::vfTableGeometry {{4 -60} {3 -142} {2 -129} {1 -50} {0 -11}}
#
Запускаем:
$ TkTopNetFlows.tcl in.cfg &