Nfsen + nfdump + rrd.cgi no Slackware11 - PoP-GO
Transcrição
Nfsen + nfdump + rrd.cgi no Slackware11 - PoP-GO
Nfsen + nfdump + rrd.cgi no Slackware11 1 Introdução Ferramentas de monitoramento como SNMP (Simple Network Management Protocol) são recomendadas quando o interesse é de monitorar apenas o status de algum serviço ou saber o volume de trafego em uma interface, elas são inviáveis quando se esta interessado em informações mais ricas, como volume de tráfego de uma sub-rede, uma aplicação específica ou tipos de protocolos. Para obter este tipo de informação, pode-se usar aplicações que fazem uso e análise de dados coletados usando técnicas de NetFlow ou Sflow. Este texto explica como fazer uso da análise de dados usando NetFlow através da interação das ferramentas Nfdump, Nfsen e rrd.cgi. 2 Instalar Nfdump Nfdump é um conjunto de ferramente em linha de comando, que apesar de estar hospedado em página separada faz parte do projeto nfsen descrito na seção seguinte, usado para capturar e manipular sflow (http://www.sflow.org/) e Netflow. O codigo fonte pode ser obtido no endereço abaixo: (http://nfdump.sourceforge.net/). Uma compilação dependências do que nfdump deve é ser a resolvida ferramente durante a RRDtool (http://oss.oetiker.ch/rrdtool/) utilizada para gerar e manipular dados no formato rrd, abaixo segue os passos para compilar e instalar o pacote manualmente ou pacote usando os script slackbuild obitido no (http://ftp.scarlet.be/pub/linuxpackages/Slackware- 11.0/Console/rrdtool/rrdtool-1.2.23-i486-2szu.tgz). Instalação manual do RRDtool versão 1.2.22: # # # # wget ftp://ftp.pucpr.br/rrdtool/rrdtool-1.2.22.tar.gz tar zxf rrdtool-1.2.22.tar.gz cd rrdtool-1.2.22 ./configure –prefix=/usr \ –localstatedir=/var \ --sysconfdir=/etc \ --libdir=/usr/lib\ # # # # # # --enable-perl-site-install make mkdir tgz make install DESTDIR=`pwd`/tgz cd tgz makepkg rrdtool-1.2.22-i486.tgz installpkg rrdtool-1.2.22-i486.tgz Após instalar o RRDtool vamos instalar o nfdump usando os seguintes passos: wget http://ufpr.dl.sourceforge.net/sourceforge/nfdump/nfdump-1.5.6.tar.gz tar -zxf nfdump-1.5.6.tar.gz cd nfdump-1.5.6 # ./configure –prefix=/opt/nfdump \ --enable-nfprofle\ --enable-sflow # make # mkdir tgz # make install DESTDIR=`pwd`/tgz # cd tgz # makepkg nfdump-1.5.6-i486.tgz # installpkg nfdump-1.5.6-i486.tgz 3 Instalar e configurar Nfsen O projeto Nfsen (http://nfsen.sourceforge.net/) age como uma interface gráfica para configurar e utilizar o nfdump, ele pode ser usando para capturar várias entradas de dados do tipo netflow ou sflow e gerar gráficos e arquivos rrd utilizando profiles e filtros com a sintaxe parecida com a da ferramenta tcpdump. Os exemplos de dados deste tutorial, foram obtidos usando o gerador de trafego nepim (http://www.nongnu.org/nepim/) e o tipo de flow analisado é Netflow V5 gerado pelo fprobe (http://fprobe.sourceforge.net/). • php4.1 ou superior, ou php5: Vamos utilizar o pacote compilado quem vem com a distribuição Slackware11 php (php- 4.4.4). Caso queira, pode usar os slackbuild para compilar uma outra versão do php, como o php5 que esta dentro dos extras da distribuição. • Perl 5.6.0 ou superior: Utilizaremos o pacote compilado que vem com a distribuição Slackware11 (perl-5.8.8). • RRDtool v1.0.x ou superior: Usaremos a versão explicada na seção2. • Nfdump versão 1.5.5 ou superior: Usaremos a versão explicada na seção2, compilado com a opção –enable-nfprofle. • Módulos perl Mail::Header and Mail::Internet: Explicarei com mais detalhes como instalar estes módulos logo abaixo: 3.1 Instalar módulos perl Vamos usar o repositório CPAN (http://www.cpan.org) para instalar os módulos automaticamente usando uma shell perl e a Internet para fazer o download dos mesmos com os seguintes passos. # perl -MCPAN -e 'install Mail::Header' # perl -MCPAN -e 'install Mail::Internet' 3.2 Configurar arquivo de nfsen.conf Fazer o download do nfsen-1.3b-20070824 no site do projeto (http://sourceforge.net/projects/nfsen). Após isto, descompactado os arquivos fontes editar o arquivo DIRETORIO_NFSEN/nfsen-1.3b- 20070824/etc/nfsen-dist.conf como indicado no exemplo abaixo e renomear para para nfsen.conf. # Local de instalação do aplicativo $BASEDIR = "/opt/nfsen"; $BINDIR="${BASEDIR}/bin"; $LIBEXECDIR="${BASEDIR}/libexec"; $CONFDIR="${BASEDIR}/etc"; # Local de instalação dos scripts web $HTMLDIR = "/var/www/htdocs/nfsen/"; $DOCDIR="${HTMLDIR}/doc"; $VARDIR="${BASEDIR}/var"; # Local onde será salvo as imagens e os rrd gerados $BASEDIRDATA = "/var/dataflow"; $PROFILESTATDIR="${BASEDIRDATA}/profiles-stat"; # Local onde será salvos os flows capturados $PROFILEDATADIR="${BASEDIRDATA}/profiles-data"; $BACKEND_PLUGINDIR="${BASEDIR}/plugins"; $FRONTEND_PLUGINDIR="${HTMLDIR}/plugins"; # Caminho onde estão os binarios do nfdump $PREFIX = '/opt/nfdump/bin'; # Usuario q irá rodas o nfcapd para capturar os flows # Não é necessário ser o mesmo usuario que roda o daemon httpd $USER = "nobody"; # Usuario que roda o daemon httpd $WWWUSER = "nobody"; $WWWGROUP = "nobody"; $BUFFLEN = 200000; # Como será a arvore de diretorio dos flows capturados # 1 %Y/%m/%d year/month/day $SUBDIRLAYOUT = 1; $DISKLIMIT = 98; # Porta onde esta escutando os flows exportados e tipo de flow (netflow ou sflow) %sources = ( 'netflow_teste' => { 'port' => '2355', 'col' => '#0000ff', 'type' => 'netflow' }, ); $low_water = 90; $syslog_facility = 'local3'; $LogSocket = 'unix'; @plugins = ( # profile # [ '*', ); # module 'demoplugin' ], # Usuario que o nfsen ira mandar e-mails de alerta caso use $MAIL_FROM = '[email protected]'; $SMTP_SERVER = 'localhost'; $MAIL_BODY = q{ Alert '@alert@' triggered at timeslot @timeslot@ }; Obs1.: Este arquivo de configuração é apenas uma sugestão para este material, você pode modifica-lo conforme suas necessidade. Após configurar o arquivo acimas, basta rodar o script install.pl passando o arquivos nsfen.conf configurado acima como parâmetro. # cd DIRETORIO_NFSEN/nfsen-1.3b-20070824 # ./install.pl etc/nfsen.conf Obs2.: Não esquecer de conferir se teu apache esta carregando o modulo do php dentro do arquivo de configuração /etc/apache/httpd.conf. Agora vamos criar um script de inicialização para o nfsen e /etc/rc.d/rc.nfsen como o exemplo abaixo. #!/bin/sh #Description: Start/stop nfsen # Start nfsen nfsen_start() { /opt/nfsen/bin/nfsen start echo nfsen Start } # Stop nfsen nfsen_stop() { /opt/nfsen/bin/nfsen stop echo nfsen Stop } # Restart nfsen nfsen_restart() { nfsen_stop sleep 1 nfsen_start } case "$1" in 'start') nfsen_start ;; 'stop') nfsen_stop ;; 'restart') nfsen_restart ;; *) echo "usage $0 start|stop|restart" esac Adicionar a seguinte linha no final do arquivo /etc/rc.d/rc.M if [ -x /etc/rc.d/rc.nfsen ]; then . /etc/rc.d/rc.nfsen start fi Tornar o script rc.nfsen executável e executa-lo para inicializar o daemon nfsen # chmod +x rc.nfsen # sh /etc/rc.d/rc.nfsen start Agora basta abrir um browser e testar a aplicação usando o seguinte link http://localhost/nfsen/nfsen.php. Caso tudo tenha sido feito corretamente, após alguns instantes aparecerá uma tela semelhante a esta abaixo, exibindo os gráficos do profile live gerados a partir dos flows capturados. Ilustração 1: Tela principal do nfsen.php Nesta figura é exibido respectivamente os gráfico do volume de flows por segundos (flow/s), do volume de pacotes por segundos (packets/s) e do tráfego passante pelo profile analisado (Bits/s), separados em dias, semanas, meses e ano. 4 Utilizar o Nfsen Clicando na aba Detail, podemos ver algumas informações detalhadas que a ferramente nos oferece, como os gráficos já vistos de traffic, flows e packets e também gráficos separando os tipos de protocolos como TCP, UDP, ICMP e Other (outros protocolos diferente destes). Alem disto podemos selecionar no display se queremos exibir um gráfico das 12 últimas horas, último dia, semana e ultimo mês. Ilustração 2: Detalhes dos tipos de protocolos No gráfico principal desta tela, temos uma ferramenta de seleção com duas opções, Single Timeslot ou Time Window, sendo a primeira opção uma forma temporal de navegação no gráfico para se obter informações detalhadas como as mostradas abaixo. Ilustração 3: Seleção Single Timeslot Já na outra opção, podemos definir uma janela de tempo dentro do gráfico, a figura abaixo exemplifica isto para o intervalo de tempo entre as 2 e 6 horas. Ilustração 4: Seleção Time Window No final desta paginas, temos a parte mais interessante, que é a possibilidade de usar a ferramente nfdump para analisar os flows capturados e armazenados, obtendo detalhes sobre a natureza do tráfego como endereço e porta de origem e destinho entre outras, podendo usar caso necessário um filtro nfdump. Podemos listar os 10 hosts que mais fazem uso dos recursos. Segue exemplo na figura abaixo. 4.1 Criando profiles Como exemplificado na figura seguinte, criaremos um profile que é uma forma de gerar rrds usando os flows já capturados e construir gráficos usando filtros que o nfdump oferece. Mais detalhes sobre filtros nfdump podem ser obtidos no manual da aplicação. Após ter criado nosso profile vamos criar as Channel List onde iremos definir os filtros desejados e algumas outras opções de composição de gráficos. Clicando no botão “+” teremos uma tela semelhante à da figura abaixo, onde vamos preencher os dados como indicado. Ilustração 5: Chanel com pacotes de Inbound Da mesma forma, criaremos agora um Chanel para os pacotes de saída de nosso profile. Ilustração 6: Chanel com pacotes de outbound Após ter feito isto, basca clica no botão verde (Commit new profile) para que as novas alteração tenham efeito e a aplicação possa fazer uma varredura nos flows armazenados e gerar os rrds seguindo o filtro. Obs.: Outras opções e sintaxe de filtros podem ser obtidas no manual do nfdump ou no site (http://nfdump.sourceforge.net). Podem ser usados parâmetros como: • tipo de protocolo, • versão de protocolos, • host, porta ou rede de origem e destinho, • interface, • tcpflags, • etc. Entrando na aba Graph já podemos ver os gráficos gerados usando o profile e os chanel criados. 5 Configurar rrd.cgi O script rrd.cgi é um poderoso front-end para o rrdtool , com suporte ilimitado a DEFs e CDEfs, exibição de gráficos separados por hora/dia/semana/mês/ano. O download do script rrd.cgi, exemplos de arquivos de configuração e outros scripts e arquivos necessários podem ser obtidos no (http://haroon.sis.utoronto.ca/rrd/scripts), site onde do tem projeto uma ótima documentação e exemplo de gráficos gerados. 5.1 Resolvendo dependências Para teu funcionamento, o script precisa ser resolvidas as seguintes dependências, seguindo como exemplo o comando de instalação de módulos perl descrito na seção 3.1. • mod_perl • Date::Manip • LWP::UserAgent e suas dependências requeridas durante a instalação do módulo usando a shell perl. • Text::ParseWords • Time::Local • CGI 5.2 Preparando a árvore de diretório Dentro do diretório /var/www/htdocs, devesse criar o diretórios rrd seguindo o exemplo da árvore de diretórios abaixo, atentando para as especificações de permissão, grupo e usuário dono. /var/www/htdocs/rrd |-- [drwxrwsr-x nobody nobody] rrd/archive | `-- [drwxrwsr-x nobody nobody] rrd/archive/rede_155 |-- [drwxr-xr-x root root] rrd/etc |-- [drwxrwsr-x nobody nobody] rrd/images | `-- [drwxrwsr-x nobody nobody] rrd/images/rede_155 |-- [drwxrwsr-x nobody nobody] rrd/logs | `-- [drwxrwsr-x nobody nobody] rrd/logs/rede_155 |-- [drwxr-xr-x root root] rrd/resources | `-- [drwxr-xr-x root root] rrd/rrds/rede_155 `-- [drwxr-xr-x root root] rrd/script Após ter criado os diretórios vamos fazer o download dos arquivos necessários. # # # # # # # # # # # # # # # # # # # # cd /var/www/htdocs/rrd wget http://haroon.sis.utoronto.ca/rrd/scripts/rrd.cgi chgrp nobody rrd.cgi chmod 0750 rrd.cgi cd resources wget http://haroon.sis.utoronto.ca/rrd/resources/rrdtool.gif wget http://haroon.sis.utoronto.ca/rrd/resources/calendar.gif wget http://haroon.sis.utoronto.ca/rrd/resources/wait.gif wget http://haroon.sis.utoronto.ca/rrd/resources/CalendarPopup.js wget http://haroon.sis.utoronto.ca/rrd/resources/jquery.cluetip.js wget http://haroon.sis.utoronto.ca/rrd/resources/jquery.dimensions.min.js wget http://haroon.sis.utoronto.ca/rrd/resources/jquery.hoverIntent.minified.js wget http://haroon.sis.utoronto.ca/rrd/resources/jquery.js wget http://haroon.sis.utoronto.ca/rrd/resources/jquery.js chmod 0750 * chgrp nobody * cd ../etc wget http://haroon.sis.utoronto.ca/rrd/scripts/rrd.cfg chmod 0750 * chgrp nobody * Agora vamos criar um link simbólico para os rrds gerados pelo nfsen. # cd logs/rede_155 # ln -s /var/dataflow/profiles-stat/rede_155/entrada.rrd # ln -s /var/dataflow/profiles-stat/rede_155/saida.rrd 5.3 Arquivos de Configuração Após termos feito o downloads e criado os diretórios necessários, temos que configurar o arquivo rrd.cfg para exibir os gráficos do modo como queremos, é um arquivo simples cuja estrutura parece com a de um arquivo html, onde pode-se passar parâmetros de configuração como os esperados pela ferramente RRDtools. Segue como exemplo: Imagedir: Logdir: Archivedir: ArchiveUrl: ArchiveCgi: ResourceDir: Interval: /var/www/htdocs/rrd/images /var/www/htdocs/rrd/logs /var/www/htdocs/rrd/archive /rrd/archive/ http://localhost/rrd/rrd.cgi /rrd/resources 5 Directory[trafego-rede_155]: rede_155 Title[trafego-rede_155]: Trafego bps Rede 155 IgnoreTimestamps[trafego-rede_155]: yes PageTop[trafego-rede_155]: <H1>Rede_155</H1> <h3> <a href="/rrd/rrd.cgi">inicio</a></h3> Graph[trafego-rede_155]: --title 'Rede_155-bps' --vertical-label="bits por segundos" --rigid --base=1000 --alt-autoscale-max --lower-limit=0 --slope-mode DEF:A=entrada.rrd:traffic:AVERAGE DEF:D=saida.rrd:traffic:AVERAGE CDEF:cdefa=A,8,* CDEF:cdefe=D,8,* AREA:cdefa#00CF00:Entrada GPRINT:cdefa:LAST:"Atual\:%8.2lf %s" GPRINT:cdefa:AVERAGE:"Media\:%8.2lf %s" GPRINT:cdefa:MAX:"Maximo\:%8.2lf %s\n" LINE1:cdefe#002A97:Saida GPRINT:cdefe:LAST:"\ \ Atual\:%8.2lf %s" GPRINT:cdefe:AVERAGE:"Media\:%8.2lf %s" GPRINT:cdefe:MAX:"Maximo\:%8.2lf %s\n" Directory[pkts-rede_155]: rede_155 Title[pkts-rede_155]: Trafego pkts Rede_155 IgnoreTimestamps[pkts-rede_155]: yes PageTop[pkts-rede_155]: <H1>Rede_155</H1> <h3> <a href="/rrd/rrd.cgi">inicio</a></h3> Graph[pkts-rede_155]: --title 'Rede_155-Pkts' --vertical-label="pkts por segundos" --rigid --base=1000 --alt-autoscale-max --lower-limit=0 --slope-mode DEF:B=entrada.rrd:packets:AVERAGE DEF:E=saida.rrd:packets:AVERAGE CDEF:cdefb=B,1,* CDEF:cdefe=E,1,* LINE1:cdefb#EACC00:Entrada_pkts GPRINT:cdefb:LAST:"Atual\:%8.2lf %s" GPRINT:cdefb:AVERAGE:"Media\:%8.2lf %s" GPRINT:cdefb:MAX:"Maximo\:%8.2lf %s\n" LINE1:cdefe#000001:Saida_pkts GPRINT:cdefe:LAST:"\ \ Atual\:%8.2lf %s" GPRINT:cdefe:AVERAGE:"Media\:%8.2lf %s" GPRINT:cdefe:MAX:"Maximo\:%8.2lf %s\n" Directory[tcp-rede_155]: rede_155 Title[tcp-rede_155]: Trafego tcp Rede_155 IgnoreTimestamps[tcp-rede_155]: yes PageTop[tcp-rede_155]: <H1>Rede_155 - TCP</H1> <h3> <a href="/rrd/rrd.cgi">inicio</a></h3> Graph[tcp-rede_155]: --title 'Rede_155-tcp' --vertical-label="bits por segundos" --rigid --base=1000 --alt-autoscale-max --lower-limit=0 --slope-mode DEF:A=entrada.rrd:traffic_tcp:AVERAGE DEF:D=saida.rrd:traffic_tcp:AVERAGE CDEF:cdefa=A,8,* CDEF:cdefe=D,8,* AREA:cdefa#00CF00:Entrada_TCP GPRINT:cdefa:LAST:"Atual\:%8.2lf %s" GPRINT:cdefa:AVERAGE:"Media\:%8.2lf %s" GPRINT:cdefa:MAX:"Maximo\:%8.2lf %s\n" LINE1:cdefe#002A97:Saida_TCP GPRINT:cdefe:LAST:"\ \ Atual\:%8.2lf %s" GPRINT:cdefe:AVERAGE:"Media\:%8.2lf %s" GPRINT:cdefe:MAX:"Maximo\:%8.2lf %s\n" Directory[udp-rede_155]: rede_155 Title[udp-rede_155]: Trafego udp Rede_155 IgnoreTimestamps[udp-rede_155]: yes PageTop[udp-rede_155]: <H1>Rede_155 - UDP</H1> <h3> <a href="/rrd/rrd.cgi">inicio</a></h3> Graph[udp-rede_155]: --title 'Rede_155-udp' --vertical-label="bits por segundos" --rigid --base=1000 --alt-autoscale-max --lower-limit=0 --slope-mode DEF:A=entrada.rrd:traffic_udp:AVERAGE DEF:D=saida.rrd:traffic_udp:AVERAGE CDEF:cdefa=A,8,* CDEF:cdefe=D,8,* AREA:cdefa#00CF00:Entrada_UDP GPRINT:cdefa:LAST:"Atual\:%8.2lf %s" GPRINT:cdefa:AVERAGE:"Media\:%8.2lf %s" GPRINT:cdefa:MAX:"Maximo\:%8.2lf %s\n" LINE1:cdefe#002A97:Saida_UDP GPRINT:cdefe:LAST:"\ \ Atual\:%8.2lf %s" GPRINT:cdefe:AVERAGE:"Media\:%8.2lf %s" GPRINT:cdefe:MAX:"Maximo\:%8.2lf %s\n" Configurar o arquivo rrd.cgi alterando a seguinte seção: BEGIN { @config_files = qw( /var/www/htdocs/rrd/etc/rrd.cfg ); } Feito tudo corretamente, já podemos ver os gráficos gerados em um browser, como mostra a figura abaixo. Ilustração 7: Gráficos gerados com rrd.cgi