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.968 ]
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"
Jftp Script - Script para automação de um processo FTP
POSTFIX AUTOMÁTICO COM MYSQL E IPTABLES - RESTAURANDO MBOX VIA SSH
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
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
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
Cups: Mapear/listar todas as impressoras de outro Servidor CUPS de forma rápida e fácil
Criando uma VPC na AWS via CLI
Tem como instalar o gerenciador AMD Adrenalin no Ubuntu 24.04? (16)
Arch Linux - Guia para Iniciantes (2)
Problemas ao instalar o PHP (11)
Tenho dois Link's ( IP VÁLIDOS ), estou tentando fazer o failover... (0)