Fortalecendo a Resiliência da Rede: Detecção de Ataques DDoS com FastNetMon, FRRouting, Grafana e Implementação em Debian 12 com Huawei & RouterOS

Este tutorial combina e aprimora dois tutoriais anteriores do blog sobre fastnetmon, incorporando melhorias e ideias compartilhadas pela comunidade ao longo do tempo. Espero que aprecie!

Vamos aprender como identificar os ataques Dos/DDoS e anunciar os prefixo atacados (ou atacantes) de seu AS em envia-los para uma blackhole, e repassar os mesmo para sua operadora. (Acordo)

Vamos utilizar o FastNetMon (Community Edition) que é um analisador de carga DoS/DDoS de alto desempenho, construído sobre vários mecanismos de captura de pacotes (NetFlow, IPFIX, sFlow, AF_PACKET, SnabbSwitch, netmap, PF_RING, PCAP).

Farei a instalação no Debian 12 (Instalação Limpa). O hardware utilizado por ser bem generoso, 4CPU (se for usar o influx/grafana recomendo 8CPU) e 4GB de memoria.

Adicione contrib non-free ao repositório.

Irá ficar assim:

Atualize agora o repositório, e os pacotes.

Instale também alguns pacotes que iremos utilizar mais a frente.

Cenário fictício de exemplo:
Seu AS: 260072 (Madruga Telecom)
Operadora AS: 71 (BrUxa71 Telecom)
10.52.52.1/24 – Huawei/RouterOS
10.52.52.2/24 – Servidor

Configurando a interface de Rede

Antes de iniciar a instalação do seu do seu servidor em meu exemplo estou usando o IP 10.52.52.2/30, porém eu NUNCA faria um NAT no roteador de borda então porque utilizar o IP privado? Simples por que ele não é acessível logo não pode ser atacado, mas por outro lado se ele não tiver internet você não poderá fazer a instalação e ele não poderá te notificar pelo telegram. Solução que eu gosto muito de aplicar em servidores é a seguinte (falo muito de como configurar interface de redes nesse tutorial, recomendo uma leitura).

Vamos supor que seu prefixo seja 72.72.72.0/22 e você vai alocar o ip 72.72.72.255/32 para ser o IP de “loopback”. Dica que esse IP não seja próximo a do prefixo público que utiliza em seus servidores. Irei também configurar um IPv6 roteador da mesma forma para que ele tenha uma conectividade IPv6 qual o telegram pode se beneficiar para enviar um alerta por exemplo.

Perceba que nós estaremos conversando com nosso roteador de borda pelo prefixo privado 10.100.0.0/30 porém todo o pacote de origem do servidor sai pelo o IP público. Caso este ip seja atacado o mesmo poderá cair em blackhole que o nosso servidor ainda terá comunicação com a borda.

Mas para que seu IP publico tenha rota será necessário criar um rota em seu roteador de borda apontando o IP público para o privado.

É claro que neste caso ficará sem internet, mas podemos aplicar um firewall para enviar que ele fique respondendo, apenas para deixar ele “escondidinho”. E para isso vamos usar o nftables (Que já vem instalado por padrão no Debian 11 substituindo o iptables)
Habilite o mesmo para iniciar com o sistema:

Vamos montar nosso firewall de forma que apenas conexoes que forem abertas pelo servidor seja respondidas.

Inicie o nftables

Você pode simplesmente rodar um scanner de porta no seu IP público bem como um ping, o mesmo não deve responde.

Instalação FastNetMon (Edição da comunidade)

FastNetMon se encontra no repositório do Debian 12

Adicione todos os prefixos do seu AS, são esses os IPs serão feito analise. Dica: se você for usar o grafana recomendo cadastras todos os prefixos /24 para poder visualizar o trafego de cada prefixo em especifico

Crie também o arquivo que irá conter a lista branca de IPs (Explico mais a frente)

As configurações do Fastnetmon ficam em /etc/fastnetmon.conf, vamos fazer alguns ajustes básicos:
Vamos começar ativando o serviço de netflow. Utilizarei o comando sed que irá buscar no arquivo netflow = off e alterar para netflow = on, nos comandos seguintes farei o mesmo, se desejar acesse o arquivo e edite manualmente.

Ajustes para Huawei

Ajustes para Mikrotik

Defina por quanto tempo em segundos um IP ficará em blackhole o padrão é 1900 seg. No comando estou alterando para 10min:

Altera o top 7 para o top 10 ao usar o comando fastnetmon_client (Ao seu gosto)

Temos diferentes abordagens para detecção dos ataques: Pacotes por segundos, largura de banda e por fluxo (flows), protocolos, nessa parte irei habilitar todos filtros, mas cada caso é uma realidade.

Se desejar ter mais detalhes no log, aumenta de 20 para até 200 linhas de registro no log.

Como temos todas as detecções ativas, precisamos ajustar cada situação para sua realidade. Você precisa ter em mente qual é o maior tráfego que pode atingir por um IP da sua rede (seu maior plano) com base nisso tenha em mente que a cada 100MB gera em torno de 10.000 pps por segundo, isso não é regra mas pode ser uma base inicial. Vamos imaginar então que meu maior plano seja 900MB, farei uma ajuste no threshold_pps para 110.000 pps para não pegar alguma rajada inicial. Mas vale lembrar que inicialmente você precisa estudar sua rede e adaptar a sua realidade.

Agora em threshold_mbps seria o maior tráfego que você irá permitir, eu normalmente não altero e deixo no padrão 1gb. E em threshold_flows o fluxos de limite qual também mantenho o mesmo valor 3500.

Ajustes de ICMP

O netflow ouve a porta padrão 2055 se desejar alterar basta alterar o valor de netflow_port. Irei alterar para 52055.

Ainda em /etc/fastnetmon.conf temos notify_script_path que sempre que o fastnetmon identificar um ataque irá executar o script /usr/local/bin/notify_about_attack.sh, identificando o IP da sua rede que está sofrendo (incoming) o ataque ou que está atacando (outgoing) alguém. Ele NÃO irá identificar os IPs de origem, pois em um ataque quase sempre as origens são alteradas por milhares de IPs aleatórios.

Faça alguns ajustes nos parâmetros do kernel

Adicione ao final do arquivo, observe enp0s3 é o nome da sua interface de rede coloque o nome da sua, pode usar o comando ip addr para visualizar

Carregue as alterações:

Habilite e reinicie o fastnetmon para carregar as novas configurações.

Verifique se a porta 52055/udp esta ouvindo:

Bom mas antes de criarmos nosso script notify_about_attack.sh, precisamos preparar algumas coisas, e antes de mais nada vamos configurar nosso Huawei para enviar os dados.

Roteador RuterOS/Mikrotik:
Informe apenas suas interfaces de upstream (operadoras) ex: spf1,sfp1.100

Roteador Huawei:

slot 0 NE8000F1A / slot 10 ou 9 NE8000 M8 / slot 3 NE40

Será necessário adicionar em todas suas interfaces de Uplink:

Exemplo:

Com o tcpdump vamos monitorar a interface para ver o que esta chegando na porta.

Se seu NE estiver mandado os pacotes você terá um resultado como:

Agora com o comando:

Iremos visualizar os TOP IPs

Perceba que o IP 72.72.72.238 foi banido, pois o mesmo excedeu os pps de 50.000, no entanto este é um dos IPs que então em meu CGNAT, e vai ser natural este ter um comportamento diferente. Para que o fastnetmon ignore o mesmo você pode cria uma lista branca. Não se preocupe se isso acontecer com você o fastnetmon não ira fazer nenhuma ação, pois não configuramos nada ainda.
Para criar a lista branca networks_whitelist com os IPs ou prefixo que deseja ignorar.

Exemplo

Reinicie para carregar as novas configurações.

Bot Telegram

Para receber notificações pelo Telegram juntamente com o arquivo de log, vai ser necessário criar um bot do telegram para o uso do mesmo. Se você não sabe como criar um Bot para telegram basta você falar com o @BotFather e enviar para ele /newbot, ele irá pedir qual nome você gostaria de dar a seu bot, e em seguida ira gera um token que vamos precisar a seguir.

Para o Telegram vamos usar um scriptzinho que criei.

Edite o token.conf e altere para o seu TOKEN.

Esse script você pode usar para diversas coisas, ele será capaz de zipar um diretorio e lhe enviar o arquivo bem como enviar apenas uma mensagem. Como usar? É importante você saber que o IDs de grupos tem um “-” no inicio do ID, já usuários não. Para descobrir o ID do seu usuário fale com o bot @myidbot e envie para ele /getid, para saber de um grupo adicione @myidbot ao seu grupo e envie /getgroupid@myidbot. Realize um teste com um dos comandos: (Não esqueça de alterar pelo seu ID)

FRR

Vamos realizar a instalação do FRRouting (FRR) para fechar sessão BGP entre o roteador de borda e servidor.

Ative o modulo BGP

Reinicie o FRR

Entre no shell VTY do FRR.

Rode o comando: show running-config

Agora entre no modo de configuração, e vamos preparar nosso peer com o router de borda. No exemplo está praticamente auto explicativo, vamos fechar o peer e deixar ser anunciado apenas nossos prefixos e aplicaremos a community 65001:666 para prefixos /32 e 65001:777 para prefixos /24

Configuração RouterOS/Mikrotik

Crie um filtro de entrada que todas as rotas /32 e /24 aprendida do fastnetmon seja setadas como blackhole ou como prefixo para mitigação, e não ensine nada para ele.

Atenção para a instance que deve estar selecionada corretamente (use a mesma que você usa com sua operadora).

Exemplo de configuração para filtro para operadora

Exemplo de configuração para filtro para mitigação

Configurações do Huawei

Crie uma rota estática de Blackhole

Crie um filtro que irá aceitar qualquer rota /32

Crie um filtro que irá aceitar as rota /24 de seu prefixo

Crie filtro se desejar rejeitar algum IP ou prefixo atacado atacado, caso você deixar o fastnetmon anúnciar seu NE pode rejeitar (Ex IP Servidores ou CGNAT)

Crie um filtro para nossas community 65001:666 65001:777

Defina community para usar nos RP das operadoras

Vamos montar agora nosso route policy de import (rotas que iremos receber). A 1ª é ignorar os prefixos IGNORE_PREFIX_FASTNETMON_IPV4

A 2º é o que vir marcado do fastnetmon com 65001:666 (COMM_FASTNETMON_BLACKHOLE_32) jogar para blackhole e aplicar uma community nova 65444:666, como no exemplo aqui meu AS é de 32bits vou usar um AS privado, mas onde seu AS é de 16bits o mais comunity de se encontrar é AS:666. Assim se você for trânsito de outro AS você pode montar em suas route policy para aceitar prefixos do AS dele com /32 marcados com AS:666 e jogar para blackhole também fica dica!

Vamos preparar também para receber os prefixos /24 caso for anunciar para um mitigação por exemplo.

E a 3ª ignoramos o resto como boas praticas.

Para as route policy de export (Rotas que o NE irá ensinar) colocarei apenas um Deny pois ele não precisa ensinar nada.

Vamos ao peer

Em caso de alguma emergência, para baixar a sessão use:

Para subir novamente:

Verifique se sua sessão subiu:

No FRR use show bgp summary

Para repassar os prefixos marcados como blackhole para sua operadora você precisará saber qual é a community que a mesma utiliza e se ela lhe oferece esse recurso, em seguida você irá adicionar a route policy da sua operadora uma nova regra:

No exemplo tudo que recebemos do fastnetmon passamos a aplicar a community 65444:666, logo tudo que for marcado com a mesma iremos repassar para operadora, com o community da operadora.

Agora tudo que marcamos com community 65444:777 enviamos para mitigraçação

Pronto agora que já temos nosso peer Up entre router e servidor, nosso Bot mandando mensagem, iremos criar o script que será executado sempre que um ataque for identificado BAN ou UNBAN. Irei criar um diretório /var/log/fastnetmon_attacks/ataques qual irá ficar os ataques finalizados.

Altere ID_CHAT=’-1000000000000′ pelo ID do seu usuário ou grupo.
Para anunciar os prefixos /24 do IP atacado altere ANUNCIAR_24 para sim
Se não quiser receber o arquivo de log altere ARQUIVO_DE_LOG para nao
Dei uma encrementada para identificar a categoria do IP, que iremos ver em seguido o script que ira identificar, em IDENT_CATEGORIA vai poder classificar exemplo se um ip é de CGNAT, servidor…

De permissão para execução

Crie um diretório em /opt/rr_fastnetmon onde iremos colocar nossos scripts complementares

Crie o arquivo categoria_ip.py que utiliza python3 (Não se preocupe em instalar o python)

Adicione:

Agora crie um arquivo prefixos.txt nele você pode classificar seus IPs assim no alarme ira lhe ajudar (ou você pode invetar algo novo). Coloque sempre os mais especificos primeiro caso você não queira declarar todos os prefixos.

Exemplo:

Teste o script executando como no exemplo:

Exemplo de alarme no telegram

Restarte o fastnetmon

Se quiser fazer um teste manual simulando um anuncio de um IP (Cuidado se estiver anunciando prefixo) exemplo: 72.72.73.255/32

Verificando se esta enviando:

Para remover:

Finalizamos a primeira parte sem fazer nenhum estrago ao servidor (CPU) 🙂

Seria interessante fazer alguns testes de ataques (coisa pequena) mas com características reais de dentro da sua rede e de fora, escolha uma IP que não esteja em uso para tal! Para realizar esse ataque user o a ferramenta criada pelo ekovegeance: https://github.com/ekovegeance/DDOS Cuidado você pode criar um alto uso de Hardware na sua rede!!!

Em um servidor/desktop linux vai precisar ter instalado os pacotes bash sudo curl netcat hping3 openssl stunnel nmap whois dnsutils.
Baixe os arquivos, extraia entre em sua pasta e execute o arquivo ddos.

Gráficos Grafana

Habilite o graphite no fastnetmon

Vamos instalar o influxdb para ser a base de dados

Crie uma cópia do arquivo de configuração, e edite o mesmo

Localize [[graphite]] e insira a baixo as seguintes linhas:

Reinicie o influxdb

Em seguida o fastnetmon

Agora vamos acessar o o influxdb para ver se o banco e verificar se o graphite foi criado.

Se você tem pouco disco e deseja não salvar por tanto tempo, você pode ajustar o tempo de retenção dos dados, no comando estarei informando 90 dias (padrão é infinito) com métrica de tráfego para 7 dias (padrão ja é 7 dias), será necessário apagar o banco e recria-lo.

Vamos remover o banco, criar novamente com os tempos desejados

Reinicie os serviços novamente

Você pode optar pelo modo bruto e remover com script.

Ajuste o número de dias que deseja que fique salvo apenas.

De permissão e execute, se desejar pode adicionar ao cron:

Grafana

Adicione o repositório do grafana e instale-o

Habilite serviço para inicialização e inicie o mesmo

Acesse em seu navegador http://ip_privado:3000 e entre com usuário e senha admin em seguida defina uma nova senha. Atualmente o grafana esta na versão 9.5.x caso você instale uma versão superior no futuro os passos não devem mudarem muito de locais.

No menu vá em Connections, clique em Connect data

Localize influxDB e clique nele

Preencha apenas:
URL: http://localhost:8086
Database: graphite
E clique em Save & test, você deve ter a resposta atasource is working. 3 measurements found.
Mas antes de sair anote o uid que esta na URL no meu caso: da56a879-9ae6-42ca-aeb5-236e8b439be4, vamos precisar dele para facilitar ao importar as dashs.

Faça download aqui das Dashs e importe.
– Fastnetmon – Home
– Fastnetmon – Painel Geral
– Fastnetmon – Top PPs
– Fastnetmon – Top Prefixos
– Fastnetmon – Top Hosts MBs
– Fastnetmon – Top Tráfego saída
– Fastnetmon – Tráfego por Prefixo
– Fastnetmon – Tráfego por endereço IPv4

Extraia o arquivo zip e abra em um editor de texto os arquivos .json localize xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx e substitua pelo seu uid, assim lhe poupará de fazer ajustes manuais.
Se seu desktop é um linux use o comando sed e faça em um unico comando:
sed -i 's/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/da56a879-9ae6-42ca-aeb5-236e8b439be4/' *.json

Volte para o menu e clique em Dashboards

Importe uma a um das Dashs.

Gostou? Se sentindo mais seguro agora? É consultor e ganha $ com isso!?

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!

Fontes:
https://fastnetmon.com/install/
https://docs.frrouting.org/en/latest/bgp.html
https://deb.frrouting.org/
https://fastnetmon.com/docs/influxdb_integration/
https://grafana.com/docs/grafana/latest/installation/debian/

Rudimar Remontti

Trabalho atualmente como Gerente de Redes em um Provedor de Internet no Rio Grande do Sul.

Você pode gostar...

15 Resultados

  1. Damião Barbosa disse:

    parabéns, excelente artigo e obrigado por compartilhar.

  2. Frederico disse:

    Olá! Obrigado pelo tutorial, funcionou.
    Porém não funcionou com IPV6. Não localizei neste tutorial sobre a configuração do IPV6 no fastnetmon. Se puderem me ajudar, agradeço!

  3. Osni Silva disse:

    Olá! primeiramente come sempre, um excelente material!
    Gostaria de saber porque no dashboard trafego por prefixo, o meu não trouxe nenhum prefixo. Estou utilizando o Huawei ne8k para exportar flow.
    Obrigado.

    • Osni Silva disse:

      O problema estava na configuração do fastnetmon.conf neste item:

      # enable per subnet speed meters
      # For each subnet, list track speed in bps and pps for both directions
      enable_subnet_counters = on

      esta off e passei para on.

  4. Perfeito, só não conseguir monitorar o trafego por IP

  5. Elvis disse:

    Quanto de armazenamento pra uma maquina dessas ai rodar de boa?

  6. Marcos Oliveira disse:

    Primeiramente parabéns pelo excelente trabalho! 👏👏👏👏
    o que mudaria na configuração para utilizar por exemplo o bgp flowspec ?

  7. William Araujo disse:

    Estou tendo um resultado difente. Ao escutar a porta 52055, vejo o huawei enviando diversas informações de netflow para o servidor. Mas quando rodo o comando fastnetmon_client , não é mostrado nenhum endereço IP.
    Outgoing, internal traffic e other traffic, incmoing, ficam todos zerados. sem informação nenhuma. Já fiz e refiz, mas não sei porque está dessa forma.

  8. Bruno disse:

    Consegui fazer perfeitamente no IPv4 seguindo os passos, para IPv6 seria somente adaptar os filtros com os prefixos v6 ?

    Excelente Material!!!

  9. Impecável como sempre, nossa guerra é contra os ataques DDoS e suas variantes. Parabéns Rudimar..

  10. Denis Esthywe disse:

    Quando agente pensa q acabou o cara surpreende novamente ….

  1. 16 de junho de 2023

    […] Fortalecendo a Resiliência da Rede: Detecção de Ataques DDoS com FastNetMon, FRRouting, Grafana e… […]

  2. 16 de junho de 2023

    […] Fortalecendo a Resiliência da Rede: Detecção de Ataques DDoS com FastNetMon, FRRouting, Grafana e… 👆 👆 👆 👆 👆 👆 👆 👆 👆 👆 👆 […]

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *