Como se proteger de ataques DDoS com FastNetMon de graça – Integração FRR vs NE-Huawei – Bonus Gráficos Grafana

Ouvir tutorial

Neste tutorial 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 11 (Instalação Limpa). O hardware utilizado por ser bem generoso, 1CPU e 1GB de memoria.


Nesse gráfico podemos ver um servidor analisando 10GB via Netflow e quase nada sendo usado de recursos. Mais ao final irei configurar o Graphith para termos gráficos qual irá abusar mais do hardware, porem para muitos gráficos não são necessários, e sim algo que o proteja.

Cenário fictício de exemplo:
Seu AS: 260072 (Madruga Telecom)
Operadora AS: 71 (BrUxa71 Telecom)
10.100.0.1/30 – Huawei NE
10.100.0.2/30 – 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.100.0.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.

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)

Para ver o comparativo da versão gratuita acesse aqui. Já antemão o que não teremos suporte é ao IPv6 e alguns recursos extras.
Conversando com Pavel Odintsov entendeu que no Brasil os planos da versão paga ficam muito pesada para a grande maioria devido a alto do dólar, então ele criou um cupom com 50% de desconto para os brasileiros. 🙂
Segue os lins com o desconto:
Licença 10Gb
Licença 40GB
Licença 100GB

Vamos a instalação [Doc Oficial]

É necessário que vc informe seu e-mail durante a instalação. (Para usar a Comunidade FastNetMon você deve fornecer seu e-mail corporativo válido e aceitar receber informações sobre nossa edição comercial e atualizações de segurança)

Adicione todos os prefixos do seu AS, são esses os IPs serão feito analise.

Exemplo:

Ajustando as configurações do /etc/fastnetmon.conf.
Habilitamos o serviço de netflow: netflow = off para netflow = on

Ajustes de tempo

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

Ative medidores de velocidade por sub-rede, para listar a velocidade da faixa em bps e pps para ambas as direções.

Temos diferentes abordagens para detecção dos ataques: Pacotes por segundos, largura de banda e por fluxo (flows).

Vamos ativar o ban por flows:

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 500MB, farei uma ajuste no threshold_pps para 50.000 pps.

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.

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

Por o serviço ira ficar ouvindo em todos os endereços IPs do seu servidor (netflow_host = 0.0.0.0), logo o mais correto seria deixa-lo apenas para o IP privado.

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.

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.

Acesse seu 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

Vamos ao Huawei

Crie uma rota estática de Blackhole

Crie um filtro que irá aceitar qualquer rota /32

Crie os prefixos publico para rejeitar e não cair em blackhole mesmo quando atacado, caso você deixar o fastnetmon anúnciar seu NE pode rejeitar (Ex IP Servidores ou CGNAT)

Crie um filtro para a community 65001:666

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) 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 comum 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!

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á adiciar 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 irei repassar para operadora com a commnunity da operadora. Para isso crie então primeiro a community-filter de Blackhole sua.

Agora na route policy da operadora crie algo semelhante ao exemplo, sendo que a community de blackhole que sua operadora passou fosse “71:666”:

Pronto agora que ja 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.

De permissão para execução

Restarte o fastnetmon

Se quiser fazer um teste manual anunciando um IP (um que não esteja em uso né!!! rsrsrs) exemplo: 72.72.73.255/32
Adicionando:

Verificando se esta enviando:

Removendo:

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

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

Edite o influxdb.conf

Localize [[graphite]] e abaixo adicione:

Reinicie o influxdb

Em seguida o fastnetmon

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

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.

No menu Configuration e vá em Data sources, clique em Add data source

Localize influxDB e selecione

Preencha apenas:
URL: http://localhost:8086
Database: graphite
E clique em Save & test, você deve ter a resposta Data source is working.

Faça download aqui das Dashs e importe.

Não esqueça de definir o banco InfluxDB

Você pode pesquisar por mais dashs em: https://grafana.com/grafana/dashboards/?search=fastnetmon

Fastnetmon

Fastnetmon PAINEL GERAL

Fastnetmon TOP HOSTS (+100MB)

Fastnetmon TOP HOSTS (+300MB)

Fastnetmon TOP NETWORKS

Fastnetmon TOP TRÁFEGO DE SAÍDA

Fastnetmon TRÁFEGO REDE ESPECIFICADA

Fastnetmon TRÁFEGO POR IP ESPECIFICO

E como ficou o hardware agora?

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...

4 Resultados

  1. Rafael Velloso disse:

    Boa tarde, alguem sabe porque no meu não apareceu o Networks?
    Conferi o template la no influxdb.conf, refiz e não apareceu…

    > show measurements
    name: measurements
    name
    —-
    hosts
    total
    > exit

  2. Alessandro Rocha disse:

    Muito bom como sempre! Vou testar!

  3. Vinicius Dorneles disse:

    É possível personalizar as regras baseado no prefixo? Por exemplo:
    o prefixo 72.72.72.0/24 possui uma regra de pps/mbps/flow;
    o prefixo 72.72.73.0/24 possui outra regra de pps/mbps/flow.

Deixe um comentário

O seu endereço de e-mail não será publicado.