Guia passo a passo: Instalando NFDUMP, NFSEN e NFSEN-NG para Análise de Fluxo de Rede no Debian 12 Bookworm

há 2 anos 13

por · Published 11 de julho de 2023 · Updated 15 de setembro de 2023

Neste tutorial você adquirirá conhecimentos e habilidades relacionadas à análise de fluxo de rede bem como a área de segurança. Você poderá examinar os dados de fluxo de rede capturados e identificar padrões, tendências e anomalias no tráfego de rede. Isso pode ajudar a detectar atividades suspeitas, como ataques cibernéticos, tráfego malicioso ou congestionamentos.

Distribuição Utilizada

Debian 12 bookworm (Instalação Limpa)

Requisitos de hardware

Para o que vamos utilizar aqui não precisamos nada tão agressivo, porém o armazenamento vai depender muito de quanto tempo você for deixar salvo, em média você pode colocar 2GB a 4GB (por source) de dados por dias (mas isso é bem relativo), em questão de CPU e memoria 2 CPU e 2GB de memória já da conta, mas se puder coloca mais melhor para processar os dados.

Pacotes Requeridos

# apt install \ curl wget unzip man-db tcpdump htop tree dialog git \ build-essential autoconf pkg-config flex byacc bison \ php php-dev apache2 libapache2-mod-php autogen \ libtool librrd-dev libbz2-dev libpcap-dev rrdtool \ libcurl4-openssl-dev librrds-perl libsocket6-perl \ librrdp-perl libio-socket-inet6-perl libmailtools-perl \ libnet-telnet-perl libnet-whois-ip-perl libnet-snmp-perl \ libio-socket-ssl-perl libgd-perl git -y

Crie o diretório onde iremos baixar nossos arquivos extras

# mkdir /root/nf

NFDUMP

NFDUMP é um conjunto de ferramentas para coletar e processar dados netflow/ipfix e sflow, enviados de dispositivos compatíveis com netflow/sflow.

O conjunto de ferramentas contém vários coletores para coletar dados de fluxo:

  • nfcapd suporta netflow v1, v5/v7, v9 e IPFIX
  • sfcapd suporta sflow.
  • nfpcapd converte dados pcap lidos de uma interface de host ou de arquivos pcap.

O nfdump possui um filtro de fluxo muito poderoso para processar fluxos. A sintaxe do filtro é muito semelhante ao tcpdump, mas adaptada e estendida para filtragem de fluxo. Um filtro de fluxo também pode conter matrizes de muitos milhares de endereços IP, etc., para pesquisar registros específicos.

O nfdump pode agregar fluxos de acordo com um número de elementos definido pelo usuário. Isso mascara certos elementos e permite somar registros de fluxo correspondentes aos mesmos valores.

A combinação de filtragem e agregação de fluxo como entrada para qualquer estatística de fluxo permite processamento de fluxo complexo. Os dados de fluxo pré-filtrados e agregados também podem ser gravados de volta em um arquivo de fluxo binário, que novamente pode ser processado com nfdump

O nfdump pode enriquecer a listagem de fluxos com informações de localização geográfica e informações de AS, a menos que as informações de AS já estejam disponíveis nos registros de fluxo. Os endereços IP podem ser marcados com um código de país de duas letras ou com uma etiqueta de localização mais longa contendo a região geográfica, o país e a cidade. A localização geográfica e as informações AS são recuperadas do banco de dados geoDB opcional, criado pelo programa geolookup das ferramentas nfdump. geolookup usa o banco de dados Maxmind GeoDB ou GeoLite2 para criar um banco de dados de pesquisa binária para nfdump.

Instalação:
O nfdump até se encontra no repositório do Debian 12 (na versão 1.7.1) como um serviço de coleta, como a ideia é mais voltada a depois utilizar o nfsen, irei baixar a ultima versão que inclusive tem alguns recursos interessantes que você pode se aprofundar posteriormente.

# mkdir /root/nf # cd /root/nf # git clone https://github.com/phaag/nfdump.git # cd nfdump # ./autogen.sh

Na compilação podemos ativar algumas features adicionais, para ver mais sobre use o comando:

# ./configure --help

Estarei instalando as seguintes: (–enable-influxdb –enable-maxmind opcional)

# ./configure --enable-nfprofile --enable-nftrack --enable-jnat --enable-influxdb --enable-maxmind # make ; make install

Atualize o cache das bibliotecas dinâmicas.

# ldconfig

Iremos ter uma lista de novos binários em /usr/local/bin/

├── geolookup ├── nfanon ├── nfcapd ├── nfdump ├── nfexpire ├── nfprofile ├── nfreplay ├── nftrack └── updateGeoDB.sh

Configure seu roteador para enviar dados de netflow para porta 2055, e com o comando a baixo vamos analisar se os mesmo estão chegando em nosso servidor e capturados pelo nfcap.

# nfcapd -E -p 2055 -w /tmp/ Verbose log level: 3 Add flow source: ident: none, IP: any IP, flowdir: /tmp Bound to IPv4 host/IP: any, Port: 2055 Init v1 Init v5/v7: Default sampling: 1 Init v9: Max number of v9 tags enabled: 105, default sampling: 1 Init IPFIX: Max number of ipfix tags enabled: 88, default sampling: 1 Startup nfcapd. Process_v9: New v9 exporter: SysID: 1, Domain: 2166325505, IP: 10.10.10.255 Process_v9: New v9 exporter: SysID: 2, Domain: 18841857, IP: 10.10.10.255 ^CFile Block Header: type: 3, size: 64, NumRecords: 2 Ident: 'none' Flows: 0, Packets: 0, Bytes: 0, Sequence Errors: 0, Bad Packets: 0 Terminating nfcapd.

Ctrl+C Para cancelar (Não precisa deixar em execução, deixe apenas alguns segundos para ver se esta chegando os flows)

# ls -lh /tmp/nfcapd.*

Se tudo ocorreu bem você ira ter uma arquivo da captura com o nome nfcapd.AAAAMMDDHHMM [ANO MÊS DIA HORA MINUTO]

-rw-r--r-- 1 root root 149K jul 11 14:54 /tmp/nfcapd.202307111450

Nfdump é muito poderoso, para dar apenas uma provinha do que estamos falando testes os comandos a baixo para visualizar as saídas. O ultimo comando você vai gostar!

# nfdump -r /tmp/nfcapd.202307111450 # nfdump -r /tmp/nfcapd.202307111450 dst ip 8.8.8.8 # nfdump -r /tmp/nfcapd.202307111450 dst ip 8.8.8.8 and dst port 53 # nfdump -r /tmp/nfcapd.202307111500 dst port 80 or dst port 443 -s srcip/bytes # nfdump -r /tmp/nfcapd.202307111450 -s record/bytes # nfdump -r /tmp/nfcapd.202307111450 -s dstip/bytes # nfdump -r /tmp/nfcapd.202307111450 -s dstas/bytes # nfdump -r /tmp/nfcapd.202307111450 -s dstas/bytes # nfdump -r /tmp/nfcapd.202307111450 'net 200.200.200.0/22 and (dst port 80 or dst port 443)' -s dstas/bytes -n 20

Para mais informações de como utiliza-lo use comando man para ver o manual do nfdump.

# man nfdump

Mas não se preocupe ainda em aprender todas as possibilidades, para isso vamos aprender agora utilizar duas ferramentar que poderão ser uteis para você. Mas ler esse manual não vai cair o braço. 😂

NFSEN

O NfSen é uma ferramenta de código aberto para análise e visualização de dados de fluxo de rede. Com uma interface web intuitiva (estilo anos 90 😂), ele coleta registros de fluxo de diferentes dispositivos e os apresenta de forma compreensível. Além disso, oferece recursos avançados, como detecção de ataques e armazenamento de dados de fluxo histórico, tornando-o uma opção popular para monitoramento e solução de problemas em redes de grande porte.

# cd /root/nf # wget https://github.com/phaag/nfsen/archive/v1.3.9.tar.gz # tar -vxzf v1.3.9.tar.gz # cd nfsen-1.3.9 # sed -i 's/\$USER\s*=\s*"netflow";/\$USER = "www-data";/' etc/nfsen-dist.conf # sed -i 's/\$WWWUSER\s*=\s*"www";/\$WWWUSER = "www-data";/' etc/nfsen-dist.conf # sed -i 's/\$WWWGROUP\s*=\s*"www";/\$WWWGROUP = "www-data";/' etc/nfsen-dist.conf # sed -i 's/\$HTMLDIR\s*=\s*"\/var\/www\/nfsen\/";/\$HTMLDIR = "\/var\/www\/html\/nfsen\/";/' etc/nfsen-dist.conf # sed -i 's/\$BUFFLEN = 200000;/\$BUFFLEN = 1073741824;/' etc/nfsen-dist.conf

Vamos definir nosso enviadores de fluxos (sim você pode enviar de vários locais)

# vim etc/nfsen-dist.conf

Procure pela seguintes linhas:

%sources = ( 'Borda' => { 'port' => '2055', 'col' => '#0D47A1', 'type' => 'netflow' }, 'Cgnat' => { 'port' => '3055', 'col' => '#B71C1C', 'type' => 'netflow' }, );

No exemplo acima estarei incluindo analise do meu Cgnat para fins de investigação de problemas (Mas se prepare que os arquivos capturados serão gigantes). Vale lembrar que para cada source a porta não pode ser a mesma!

Caso você queira adicionar ou remover um novo source edite o arquivo /data/nfsen/etc/nfsen.conf e rode o comando /data/nfsen/bin/nfsen reconfig

Vamos criar o diretório /data/nfsen onde ficarão nossos dados do sistema.

# mkdir -p /data/nfsen # ./install.pl etc/nfsen-dist.conf

De um ENTER ao perguntar: Perl to use: [/usr/bin/perl]

Check for required Perl modules: All modules found. Setup NfSen: Version: 1.3.9: install.pl 2022-12-19 Perl to use: [/usr/bin/perl] [ENTER] Setup php and html files. mkdir /var/www/html/nfsen/ Copy NfSen dirs etc bin libexec plugins doc ... Copy config file '/etc/nfsen.conf' In directory: /data/nfsen/bin ... Update script: nfsen ... ...

Vamos ajustar o timezone do PHP

# vim /etc/php/8.2/apache2/php.ini

Localize e altere: (remova “;” do início para descomentar)

date.timezone = 'America/Sao_Paulo' # vim /etc/php/8.2/cli/php.ini

Localize e altere:

date.timezone = 'America/Sao_Paulo'

Reinicie p apache

# systemctl restart apache2

Agora vamos criar um serviço no systemd para nosso amigo nfsen

# ln -s /data/nfsen/bin/nfsen /etc/init.d/nfsen

Crie o arquivo:

# vim /lib/systemd/system/nfsen.service

Adicione:

[Unit] Description=nfsen After=network-online.target [Service] Type=simple #Type=oneshot RemainAfterExit=yes ExecStart=/data/nfsen/bin/nfsen start ExecStop=/data/nfsen/bin/nfsen stop ExecReload=/data/nfsen/bin/nfsen restart [Install] WantedBy=multi-user.target

Recarregue o daemon e vamos por para rodar

# systemctl daemon-reload # systemctl enable nfsen # systemctl start nfsen # systemctl status nfsen

Verificar logs

# journalctl -u nfsen # journalctl -u nfsen -p err

Vamos ver se as portas estão na escuta

# ss -putan | grep nfcapd udp UNCONN 0 0 0.0.0.0:2055 0.0.0.0:* users:(("nfcapd",pid=20756,fd=3)) udp UNCONN 0 0 0.0.0.0:3055 0.0.0.0:* users:(("nfcapd",pid=20752,fd=3))

Se quiser testar se algo esta chegando o tcpdump pode ser uma boa escolha também.

# tcpdump -i enp0s3 -n udp port 2055 -T cnfp -c 10 # tcpdump -i enp0s3 -n udp port 3055 -T cnfp -c 10

Vamos entender como os dados vão ser armazenados
Em /data/nfsen/profiles-data/live/ todos nossos sources terão uma pasta, outra pasta com ano, mes, dia. Cada arquivos criado tem um intervalo de 5 minutos. Aguarde uns 15min e rode o seguinte comando:

# tree /data/nfsen/profiles-data/live/

Iremos ver que alguns arquivos e diretórios já foram criados.

├── Borda │   ├── 2023 │   │   └── 07 │   │   └── 11 │   │   ├── nfcapd.202307111600 │   │   ├── nfcapd.202307111605 │   │   ├── nfcapd.202307111610 │   │   ├── nfcapd.202307111615 │   │   └── nfcapd.202307111620 │   └── nfcapd.current.29124 └── Cgnat ├── 2023 │   └── 07 │   └── 11 │   ├── nfcapd.202307111600 │   ├── nfcapd.202307111605 │   ├── nfcapd.202307111610 │   ├── nfcapd.202307111615 │   └── nfcapd.202307111620 └── nfcapd.current.29128 9 directories, 12 files

Projeto não tem uma index então para não precisar informar na url nfsen.php crie um atalho apontando para index.php

# ln -s /var/www/html/nfsen/nfsen.php /var/www/html/nfsen/index.php

Agora acesse: http://__endereco_servidor/nfsen/
E temos nossa bela interface anos 90! Não me preocupo com isso, a ferramenta é o que importa. Recomendo você dar uma olha na documentação.

NFSEN-NG

O projeto NfSen-NG é uma implementação melhorada do NfSen, que oferece recursos avançados para coleta, análise e visualização de dados de tráfego de rede. Com sua interface web intuitiva e poderosa, o “nfsen-ng” permite aos usuários monitorar e analisar o tráfego em tempo real, realizar pesquisas detalhadas em dados históricos e criar relatórios personalizados, facilitando a detecção de problemas, a análise de desempenho e a tomada de decisões relacionadas à rede.

# cd /var/www/html # git clone https://github.com/mbolli/nfsen-ng /var/www/html/nfsen-ng # cd /var/www/html/nfsen-ng/ # chmod +x backend/cli.php # cp backend/settings/settings.php.dist backend/settings/settings.php # mkdir /var/www/html/nfsen-ng/backend/datasources/data/ # chown -R www-data: /var/www/html/nfsen-ng/

Vamos fazer alguns ajustes para ler nossa mesma base de dados do nfsen.

# vim backend/settings/settings.php

Localize os sources.

'sources' => array( 'source1', 'source2', ),

Informe os seus:

'sources' => array( 'Borda', 'Cgnat', ),

Se desejar incluir algumas porta para analisar os gráficos.

'ports' => array( 80, 22, 53, ),

No meu vou alterar para:

'ports' => array( 0, 22, 53, 80, 443, ),

Localize e altere:

'binary' => '/usr/bin/nfdump', 'profiles-data' => '/var/nfdump/profiles-data',

Por

'binary' => '/usr/local/bin/nfdump', 'profiles-data' => '/data/nfsen/profiles-data',

Enable apache modules

# a2enmod rewrite expires

Configure a biblioteca RRD para o PHP

# pecl install rrd # echo "extension=rrd.so" > /etc/php/8.2/mods-available/rrd.ini # phpenmod rrd

Configure virtual host para ler o .htaccess

# vim /etc/apache2/sites-available/000-default.conf

Deve ficar assim:

<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www/html <Directory /var/www/html/> Options FollowSymLinks Indexes AllowOverride All </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>

Reinicie o serviço web

# systemctl restart apache2

Vamos criar um “serviço” no systemd para iniciar o /var/www/html/nfsen-ng/backend/cli.php.

# vim /lib/systemd/system/nfsen-ng.service

Adicione?

[Unit] Description=nfsen-ng After=network-online.target [Service] Type=simple RemainAfterExit=yes ExecStart=su - www-data --shell=/bin/bash -c '/var/www/html/nfsen-ng/backend/cli.php start' ExecStop=su - www-data --shell=/bin/bash -c '/var/www/html/nfsen-ng/backend/cli.php stop' [Install] WantedBy=multi-user.target

Recarregue o daemon e vamos por para rodar

# systemctl daemon-reload # systemctl enable nfsen-ng # systemctl start nfsen-ng # systemctl status nfsen-ng

Acesse agora: http://__endereco__/nfsen-ng/

Utilizando um filtro Ex: “dst as 15169 OR dst as 2906 OR dst as 32934” obtém um informações com destino aos 3 AS.

Se notar na parte verde temos o comando executado no terminal

# nfdump -M '/data/nfsen/profiles-data/live/Borda' -R '2023/07/11/nfcapd.202307111605:2023/07/11/nfcapd.202307111730' -s 'dstas/pps' 'dst as 15169 OR dst as 2906 OR dst as 32934'


Pode ser um bom “meio de você aprender os comandos”.

Algo legal do NfSen-Ng é que ele tem uma API: http://__endereco__//nfsen-ng/api/config de uma lida em https://github.com/mbolli/nfsen-ng/blob/master/README.md como utiliza, com um pouco de imaginação você pode fazer algumas coisas bem legais.

Script para ir apagando arquivos mais antigos

# mkdir /root/scripts/ # vim /root/scripts/faxina_nf.sh

Adicione (ajuste os dias para realidade do seu disco)

#!/bin/bash # Defina o diretório do NFSen nf_dir="/data/nfsen/profiles-data/live/" #Define o número de dias a ser removido ref_date=$(date -d '60 days ago' +%Y%m%d) # Ativar o modo de depuração debug=false # Percorre os diretórios e exclui os arquivos antigos find "$nf_dir" -type f -name 'nfcapd.*' | while read -r file; do # Obtém a data do arquivo em vez do diretório file_date=$(date -r "$file" +%Y%m%d) if [[ "$file_date" -lt "$ref_date" ]]; then if [[ "$debug" = true ]]; then echo "$(date -r "$file") - $file excluído" fi rm "$file" fi done

Agende o script para roda todos os dias as 4h da manhã

# crontab -e

Adcione

# m h dom mon dow command # Apaga coletas 00 04 * * * /root/scripts/faxina_nf.sh

Reinicie o cron

# systemctl restart cron

Para verificar o tamanho do diretório use o comando

# du -sh /data/nfsen/profiles-data/live/

E para ver o disco use:

# df -h

Gostou e quer me ajudar manter o blog? 🙂

Se quiser fazer uma doação para o café ficarei muito feliz pelo seu reconhecimento!

Se não puder doar pode deixar seu agradecimento nos comentário também ficarei feliz em saber que ajudei. Se tiver qualquer pergunta deixe-a também. Se preferir entrar em Contato clique aqui.

Abraço!

Fonte:
https://github.com/phaag/nfdump
https://github.com/phaag/nfsen
https://nfsen.sourceforge.net/
https://github.com/mbolli/nfsen-ng
https://github.com/phaag/nfinflux
https://github.com/phaag/nfexporter
https://github.com/phaag/go-nfdump

Ler artigo completo

users online free counter