Bloquear ataques DDoS com bloqueio de range de IPs e avisar por e-mail
Publicado por marcio mendes mendes (última atualização em 09/12/2015)
[ Hits: 9.948 ]
Homepage: https://www.conectadohost.com
Olá amigos do VOL, trago para vocês um excelente script desenvolvido por mim para bloquear ataques DDos.
Nosso script fará o bloqueio de todo o range de IPs, dessa forma não será necessário ficar bloqueando ip por ip. O bloqueio será feito pelo iptables, é uma ótima ferramenta, claro que se o ataque for bem distribuído serão necessárias outras ferramentes, mas mesmo que seja um ataque com vários ips, certamente não conseguirá atacar com o mesmo range de ips, pois o bloqueio será feito pelo range.
Nosso sistema será construído em 2 etapas:
- na primeira será um script para verificar as conexões e a segunda etapa será responsável por bloquear o ip e todo seu range.
O script que verifica as conexões chamamos de block-ddos.sh e o script que fará o bloqueio será bloqueando-ddos.sh.
Em nosso exemplo o bloqueio se dará quando um determinado ip tiver mais de 250 conexões no servidor. Quando isso ocorrer o ip e todo seu range serão bloqueados e o administrador será informado por e-mail, conforme exemplo abaixo:
O Ip 192.168.1.1 Tem 269 Conexões E Está Conectado Nas Portas Abaixo
O IP 192.168.1.1 Foi Bloqueado Por Questões De Segurança
1 tcp 0 0 192.168.1.2:80 192.168.1.1:32783 TIME_WAIT -
1 tcp 0 0 192.168.1.2:80 192.168.1.1:33286 TIME_WAIT -
1 tcp 0 0 192.168.1.2:80 192.168.1.1:33287 TIME_WAIT -
Obs.: em nosso exemplo o ip 192.168.1.2 fica sendo o ip do servidor e o ip 192.168.1.1 fica sendo o ip do atacante apenas como exemplo não usamos os ips reais por questões de privacidades.
Antes de instalar o script é necessário criar os seguintes arquivos:
echo -n > /home/pega-ddos.txt
echo -n > /home/pega-ddos2.txt
echo -n > /home/result2.txt
echo -n > /home/result-ddos.txt
echo -n >/home/meus-ips.txt
Obs.: dentro do arquivo meus-ips.txt coloque todos os ips do seu servidor. Supondo que o ip do seu servidor seja 192.168.1.1, coloque da seguinte forma: ip 192.168.1.1 e desse modo 192.168.1.0/24, isso é para que não bloqueie o ip do seu servidor, pois muitas vezes o Apache pode ter varias conexões vindas do próprio ip.
Criar o cron para executar somente um script a cada minuto, ou o tempo que achar necessário.
*/1 * * * * /bin/bloqueando-ddos.sh
E como bônus fiz um terceiro script de regras para DDos. Esse script para regras DDos deve ser executado somente uma vez, para inserir as regras em seu iptables.
Primeiro script block-ddos.sh responsavel por verificar as conexões #!/usr/bin/perl # attackers 2, with ipv6 support. # output connection information from netstat # use strict; sub run { my @netstat = `netstat -pant`; my $portcheck = $ARGV[0]; if ( $portcheck =~ /^[0-9]+$/ ) { my %ports; my %ips; foreach (@netstat) { my ($port, $ip); if ( /^tcp\s+\d\s+\d\s+[0-9\.|0-9A-Za-z\.:]+:${portcheck}\s+([0-9\.|0-9A-Za-z\.:]+):/ ) { chomp; $ip = $1; if ( $ip !~ /^::$/ ) { $ips{$ip}++; } } } my $count; print "[+] Highest connections on port $portcheck\n"; foreach my $number ( sort {$ips{$b} <=> $ips{$a}} keys %ips ) { if ( $count <= 10 ) { if ($number) { print "\t$ips{$number} $number\n"; $count++; } } } my $total; foreach my $key ( keys %ips ) { if ($key) { $total += $ips{$key}; } } print "\n[+] TOTAL: $total\n"; } else { my %ports; my %ips; foreach (@netstat) { my ($port, $ip); if ( /^tcp\s+\d\s+\d\s+[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}:([0-9]+)\s+([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}):[0-9]+\s+/ ) { chomp; $port = $1; $ip = $2; } elsif ( /^tcp\s+\d\s+\d\s+[0-9\.|0-9A-Za-z\.:]+:([0-9]+)\s+([0-9\.|0-9A-Za-z\.:]+):[0-9]+\s+/ ) { chomp; $port = $1; $ip = $2; } $ports{$port}++; $ips{$ip}++; } my $count; print "[+] Número de Conexões por IP:\n"; foreach my $number ( sort {$ips{$b} <=> $ips{$a}} keys %ips ) { if ( $count <= 10 ) { if ($number) { print "\mk $ips{$number} jk $number\n"; $count++; } } } } } run(); Segundo script responsável por bloquear os ips #!/bin/bash SHELL=/bin/sh PATH=/sbin:/usr/sbin:/usr/bin:/bin rm /home/pega-ddos.txt -f let linhas=`block-ddos.sh |wc -l`-1 block-ddos.sh|tail -$linhas|sed 's/%//'|sed 's/G//g'| while read Tam mk jk do echo $jk $mk if [ "$mk" -gt "250" ] then echo " $jk " >> /home/pega-ddos.txt sed 's/[^0-9.]//g' /home/pega-ddos.txt > /home/pega-ddos2.txt MMM="`cat /home/pega-ddos2.txt` " netstat -anp | grep $MMM | sort | uniq -c | sort -n > /home/result2.txt RESUL2=" `cat /home/result2.txt` " MOSTRA=" `cat /home/pega-ddos2.txt` " echo -e " O Ip $MOSTRA Tem $mk Conexões E Está Conectado Nas Portas Abaixo \n \n O IP $MOSTRA Foi Bloqueado Por Questões De Segurança \n \n$RESUL2\n" >> /home/result-ddos.txt sed -i 's/\(\w.*\)\.\(\w.*\)\.\(\w.*\)\.\(\w.*\)/\1.\2.\3.0\/24/' /home/pega-ddos2.txt for ACCT in `cat /home/pega-ddos2.txt` ; do iptables -I INPUT -s $ACCT -j DROP ; done && echo "ips bloqueados com sucesso" && for ACCT in `cat /home/meus-ips.txt` ; do iptables -D INPUT -s $ACCT -j DROP ; done && echo "ips Desbloqueados com sucesso" echo -e | cat /home/result-ddos.txt | mail -s " IPS TENTANDO ATACAR COM DDOS " coloque seu email aqui && echo -n > /home/result2.txt && echo -n > /home/result-ddos.txt && echo -n > /home/pega-ddos2.txt fi done script bonus para regras DDos echo " Adicionando Regras Iptables para proteção " ###### Protege contra synflood iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT iptables -A FORWARD -p tcp --syn -j DROP iptables -A INPUT -m state --state INVALID -j DROP echo 1 > /proc/sys/net/ipv4/tcp_syncookies ###### Protecao contra ICMP Broadcasting echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all ###### Prote.. Contra IP Spoofing echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter ###### Protecao diversas contra portscanners, ping of death, ataques DoS, pacotes danificados e etc. iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT iptables -A INPUT -i eth1 -p icmp --icmp-type echo-reply -m limit --limit 1/s -j DROP iptables -A FORWARD -p tcp -m limit --limit 1/s -j ACCEPT iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT iptables -A FORWARD --protocol tcp --tcp-flags ALL SYN,ACK -j DROP iptables -A INPUT -m state --state INVALID -j DROP iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -N VALID_CHECK iptables -A VALID_CHECK -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP iptables -A VALID_CHECK -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP iptables -A VALID_CHECK -p tcp --tcp-flags ALL ALL -j DROP iptables -A VALID_CHECK -p tcp --tcp-flags ALL FIN -j DROP iptables -A VALID_CHECK -p tcp --tcp-flags SYN,RST SYN,RST -j DROP iptables -A VALID_CHECK -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP iptables -A VALID_CHECK -p tcp --tcp-flags ALL NONE -j DROP echo "" echo " Regras Anti DDOS Adicionadas com sucesso"
Criar políticas para o SELinux
Detalhes técnicos do processador - CPUINFO
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Como renomear arquivos de letras maiúsculas para minúsculas
Imprimindo no formato livreto no Linux
Vim - incrementando números em substituição
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
Melhorando a precisão de valores flutuantes em python[AJUDA] (9)
GLPI - Configuração de destinatário com conta Microsoft Exchange (0)
Vou voltar moderar conteúdos de Dicas e Artigos (3)
OpenVPN no MACBOOK conecta mas não pinga pastas de rede compartilhada ... (1)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta