por Rudimar Remontti · 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 -yCrie o diretório onde iremos baixar nossos arquivos extras
# mkdir /root/nfNFDUMP
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.
Na compilação podemos ativar algumas features adicionais, para ver mais sobre use o comando:
# ./configure --helpEstarei instalando as seguintes: (–enable-influxdb –enable-maxmind opcional)
# ./configure --enable-nfprofile --enable-nftrack --enable-jnat --enable-influxdb --enable-maxmind # make ; make installAtualize o cache das bibliotecas dinâmicas.
# ldconfigIremos ter uma lista de novos binários em /usr/local/bin/
├── geolookup ├── nfanon ├── nfcapd ├── nfdump ├── nfexpire ├── nfprofile ├── nfreplay ├── nftrack └── updateGeoDB.shConfigure 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.202307111450Nfdump é 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 20Para mais informações de como utiliza-lo use comando man para ver o manual do nfdump.
# man nfdumpMas 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.confVamos definir nosso enviadores de fluxos (sim você pode enviar de vários locais)
# vim etc/nfsen-dist.confProcure 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.confDe 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.iniLocalize e altere: (remova “;” do início para descomentar)
date.timezone = 'America/Sao_Paulo' # vim /etc/php/8.2/cli/php.iniLocalize e altere:
date.timezone = 'America/Sao_Paulo'Reinicie p apache
# systemctl restart apache2Agora vamos criar um serviço no systemd para nosso amigo nfsen
# ln -s /data/nfsen/bin/nfsen /etc/init.d/nfsenCrie o arquivo:
# vim /lib/systemd/system/nfsen.serviceAdicione:
[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.targetRecarregue o daemon e vamos por para rodar
# systemctl daemon-reload # systemctl enable nfsen # systemctl start nfsen # systemctl status nfsenVerificar logs
# journalctl -u nfsen # journalctl -u nfsen -p errVamos 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 10Vamos 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:
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 filesProjeto 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.phpAgora 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.
Vamos fazer alguns ajustes para ler nossa mesma base de dados do nfsen.
# vim backend/settings/settings.phpLocalize 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 expiresConfigure a biblioteca RRD para o PHP
# pecl install rrd # echo "extension=rrd.so" > /etc/php/8.2/mods-available/rrd.ini # phpenmod rrdConfigure virtual host para ler o .htaccess
# vim /etc/apache2/sites-available/000-default.confDeve 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 apache2Vamos criar um “serviço” no systemd para iniciar o /var/www/html/nfsen-ng/backend/cli.php.
# vim /lib/systemd/system/nfsen-ng.serviceAdicione?
[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.targetRecarregue o daemon e vamos por para rodar
# systemctl daemon-reload # systemctl enable nfsen-ng # systemctl start nfsen-ng # systemctl status nfsen-ngAcesse 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
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.shAdicione (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 doneAgende o script para roda todos os dias as 4h da manhã
# crontab -eAdcione
# m h dom mon dow command # Apaga coletas 00 04 * * * /root/scripts/faxina_nf.shReinicie o cron
# systemctl restart cronPara verificar o tamanho do diretório use o comando
# du -sh /data/nfsen/profiles-data/live/E para ver o disco use:
# df -hGostou 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