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: 7.011 ]

Homepage: https://www.conectadohost.com

Download 6322.block-ddos.zip




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.

  



Esconder código-fonte

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"

Scripts recomendados

Impedir duas ou mais conexões por usuário

slowloris

Tux Colorido

Backup Automatizado

Digitalizar em batch e remover páginas em branco


  

Comentários
[1] Comentário enviado por marcobraghim em 08/02/2016 - 10:39h

Cara, achei bem legal isso ae, mas fiquei com uma dúvida. Essas 250 conexões são calculadas num período de tempo? existe um desbloqueio automático desses IP's depois de um certo tempo?

[2] Comentário enviado por conectadohost em 08/02/2016 - 10:50h


[1] Comentário enviado por marcobraghim em 08/02/2016 - 10:39h

Cara, achei bem legal isso ae, mas fiquei com uma dúvida. Essas 250 conexões são calculadas num período de tempo? existe um desbloqueio automático desses IP's depois de um certo tempo?


Olá,
a cada minuto o script verifica quantas conexões há do mesmo ip, se ele tiver mais de 250 conexões fica bloqueado no iptables e não será mais desbloqueado, a não ser que você limpe as regras ou reinicie o servidor.

[3] Comentário enviado por marcobraghim em 08/02/2016 - 11:16h

Legal cara, e como eu posso testar isso ae? No windows existe o tal do Sprut, para linux o que eu posso usar?

[4] Comentário enviado por conectadohost em 08/02/2016 - 11:31h


[3] Comentário enviado por marcobraghim em 08/02/2016 - 11:16h

Legal cara, e como eu posso testar isso ae? No windows existe o tal do Sprut, para linux o que eu posso usar?


olá,
simples não precisa de programas, basta mudar 250 para 10 ou 0 e onde está
for ACCT in `cat /home/pega-ddos2.txt` ; do iptables -I INPUT -s $ACCT -j DROP ; done
você coloca um echo
for ACCT in `cat /home/pega-ddos2.txt` ; do echo " iptables -I INPUT -s $ACCT -j DROP " ; done
ele vai te exibir na tela como se os ips estivessem bloqueado
iptables -I INPUT -s ippppp -j DROP
iptables -I INPUT -s ippppp -j DROP
iptables -I INPUT -s ippppp -j DROP

[5] Comentário enviado por marcobraghim em 08/02/2016 - 11:41h

Show cara, muito obrigado!! \o/

[6] Comentário enviado por Bieel em 17/06/2016 - 18:46h

Ta dando esse problema quando vou executar o segundo script, oq pode ser? http://prntscr.com/bhpjc6


Contribuir com comentário