Пакет 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:
Hosted by uCoz