TkTopNetFlow::FAQ

# Пакет TkTopNetFlow
v0.4
Пример конфигурации

### Содержание

1. Введение
2. Настройка Cisco
3. Настройка flow-capture
4. Настройка flow_Server.pl - view_definitions.pl
5. Настройка TkTopNetFlows.tcl - in.cfg
6. Настройка TkTopNetFlows.tcl - out.cfg

1. Введение

   Существует не очень широкий канал от филиала к центральному офису (частная сеть). Нужно организовать контроль загруженности этого канала.
   Интервал - 1 минута.
   IP адрес маршрутизатора 192.168.1.254. Индекс внешнего интерфейса - 2.
   Сервер сбора данных NetFlow - monitor[192.168.1.2] (FreeBSD 4.9) flow-capture будет слушать UDP порт 9292
   Классификация - по потокам. Нужно отображать 5 самых "говорливых" потоков.
   Шкала Y - в процентах полосы пропускания 64Кбит/сек.

2. Настройка Cisco

                $ 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

3. Настройка flow-capture

   Допустим, данные будут храниться в подкаталоге /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

4. view_definitions.pl

       	#!/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

5. in.cfg

       	#
       	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 &

6. out.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 &

Last change: