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