Evite um ataque DDoS com iptables Existem várias maneiras de fazer isso, por tamanho de pacote, por limite de conexão, etc. Aqui veremos como, de uma forma fácil, intuitiva e bem explicada conseguiremos atingir o objetivo, bem como impedir outros ataques irritantes aos nossos servidores.
# Iptables
IPT="/sbin/iptables"
ETH="eth0"
#Todo el tráfico syn
$IPT -P INPUT DROP
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A INPUT -p tcp ! --syn -j REJECT --reject-with tcp-reset
$IPT -A INPUT -m state --state INVALID -j DROP
$IPT -P OUTPUT DROP
$IPT -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A OUTPUT -p tcp ! --syn -j REJECT --reject-with tcp-reset
$IPT -A OUTPUT -m state --state INVALID -j DROP
$IPT -P FORWARD DROP
$IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -p tcp ! --syn -j REJECT --reject-with tcp-reset
$IPT -A FORWARD -m state --state INVALID -j DROP
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT
$IPT -A FORWARD -i lo -o lo -j ACCEPT
#Cuando sube la carga
$IPT -A INPUT -p tcp --syn -j REJECT --reject-with icmp-port-unreachable
#La que mejor va
$IPT -N syn-flood
$IPT -A syn-flood -m limit --limit 100/second --limit-burst 150 -j RETURN
$IPT -A syn-flood -j LOG --log-prefix "SYN flood: "
$IPT -A syn-flood -j DROP
#Igual que el de arriba pero muy raw
$IPT -N syn-flood
$IPT -A INPUT -i eth0:2 -p tcp --syn -j syn-flood
$IPT -A syn-flood -m limit --limit 1/s --limit-burst 4 -j RETURN
$IPT -A syn-flood -j DROP
$IPT -A INPUT -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -m limit --limit 1/sec -j ACCEPT
$IPT -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK RST -m limit --limit 1/sec -j ACCEPT
#Descartar paquetes mal formados
$IPT -N PKT_FAKE
$IPT -A PKT_FAKE -m state --state INVALID -j DROP
$IPT -A PKT_FAKE -p tcp --dport 80 --tcp-flags ALL ACK,RST,SYN,FIN -j DROP
$IPT -A PKT_FAKE -p tcp --dport 80 --tcp-flags SYN,FIN SYN,FIN -j DROP
$IPT -A PKT_FAKE -p tcp --dport 80 --tcp-flags SYN,RST SYN,RST -j DROP
$IPT -A PKT_FAKE -p tcp --dport 80 ! --syn -m state --state NEW -j DROP
$IPT -A PKT_FAKE -f -j DROP
$IPT -A PKT_FAKE -j RETURN
#Syn-flood
$IPT -N syn-flood
$IPT -A INPUT -i eth+ -p tcp --tcp-flags SYN,ACK,FIN,RST RST -j syn-flood
$IPT -A FORWARD -i eth+ -p tcp --tcp-flags SYN,ACK,FIN,RST RST -j syn-flood
$IPT -A syn-flood -m limit --limit 4/s --limit-burst 16 -j RETURN
$IPT -A syn-flood -m limit --limit 75/s --limit-burst 100 -j RETURN -A syn-flood -j LOG --log-prefix "SYN FLOOD " --log-tcp-sequence --log-tcp-options --log-ip-options -m limit --limit 1/second
$IPT -A syn-flood -j DROP
#Requiere módulo "recent"
modprobe ipt_recent
$IPT -A INPUT -p tcp --dport 80 -m state --state NEW -m recent --set
$IPT -A INPUT -p tcp --dport 80 -m state --state NEW -m recent --update --seconds 10 --hitcount 10 -j DROP
# explicación:
# Se añade cada ip que se conecte a la tabla de recent
# Por por cada ip en la tabla de recent si hace mas de x hits en x segundos, se dropea.
$IPT -I INPUT -p tcp --syn -m recent --set
$IPT -I INPUT -p tcp --syn -m recent --update --seconds 10 --hitcount 30 -j DROP
#UDP Flood
$IPT -A OUTPUT -p udp -m state --state NEW -j ACCEPT
$IPT -A OUTPUT -p udp -m limit --limit 100/s -j ACCEPT
$IPT -A OUTPUT -p udp -j DROP
O que ele faz é contar o número de pacotes SYN (Início da conexão TCP) para cada endereço IP nos últimos 10 segundos. Se chegar a 30, ele descarta esse pacote para que a conexão não seja estabelecida (O TCP tentará várias vezes, quando cair abaixo do limite que pode ser definido).
#Evitando Layer7 DoS limitando a 80 la máxima cantidad de conexiones
$IPT -A INPUT -p tcp --dport 80 -m hashlimit --hashlimit-upto 50/min --hashlimit-burst 80 --hashlimit-mode srcip --hashlimit-name http -j ACCEPT
$IPT -A INPUT -p tcp --dport 80 -j DROP
#Permitir el ping, pero a 1 paquete por segundo, para evitar un ataque ICMP Flood
$IPT -A INPUT -p icmp -m state --state NEW --icmp-type echo-request -m limit --limit 1/s --limit-burst 1 -j ACCEPT
$IPT -A INPUT -p icmp -j DROP
#Evitando que escaneen la máquina
$IPT -A INPUT -i $ETH -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE –j DROP
$IPT -A INPUT -i $ETH -p tcp -m tcp --tcp-flags SYN,FIN SYN,FIN –j DROP
$IPT -A INPUT -i $ETH -p tcp -m tcp --tcp-flags SYN,RST SYN,RST –j DROP
$IPT -A INPUT -i $ETH -p tcp -m tcp --tcp-flags FIN,RST FIN,RST –j DROP
$IPT -A INPUT -i $ETH -p tcp -m tcp --tcp-flags ACK,FIN FIN –j DROP
$IPT -A INPUT -i $ETH -p tcp -m tcp --tcp-flags ACK,URG URG –j DROP
Aqui está o script em nosso colar: Colar.DesdeLinux.net (script anterior)
referências:
- Tentando impedir um DDoS (Fórum ElHacker.net)
- Como evitar um ataque DDoS e como vivenciá-lo em servidores reais? (Fórum ElHacker.net)
- Script com condicionais (MaliByte.net)
- Um bom exemplo (LinuxGuruz.org)
- Prevenir um ataque DDoS (LinuxSecurity.com)
- Fortalecendo a pilha TCP / IP para evitar ataques (SecurityFocus. com)
E é por isso que coloquei um tutorial antes dos ataques DDoS 😉
Para colocar / explicar o motivo ou problema (tutorial anterior), e também dar-lhe a solução (este tutorial) 🙂
perfeito.
Doces infantis ...
Bom artigo.
Meus dois centavos:
No caso de pacotes UDP, não há flag SYN porque é um protocolo sem controle de estado. No entanto, paradoxalmente, os estados NEW e ESTABLISHED existem porque iptables carrega internamente tabelas para esse propósito.
Por outro lado, na minha opinião é melhor usar um destino DROP em vez de REJECT, por dois motivos: em primeiro lugar, com um rejeitar está a dar informação a um possível atacante e também o computador está a usar parte da sua conectividade para enviar notificação para a equipe de ataque.
Outra coisa é que no caso do protocolo ICMP (e em geral) é conveniente regular tanto as solicitações quanto as respostas, porque provavelmente estamos interessados em algum momento em fazer o ping para nós mesmos e, ao habilitar essa funcionalidade, alguém poderia usar um botnet e falsificar o endereço de origem para executar ping em muitos desses PCs comprometidos sem fim, e as respostas iriam para nosso servidor, colapsando-o se nenhum limite fosse imposto.
Eu normalmente permito os tipos de ICMP 0,3,8,11 e 12 com um limite de entrada de um por segundo e um burst de dois ou quatro no máximo, e todo o resto é deixado para DROP.
Na verdade, exceto para o protocolo TCP que pode ser melhor regulado, todos os outros devem ser protegidos com uma medida anti-DDoS através de um tipo de correspondência recente. A propósito, a título de curiosidade, o autor deste módulo gosta de colocar primeiro a atualização e depois o conjunto.
Iptables é realmente muito flexível e poderoso, até agora a única coisa que me propus a fazer e ainda não consegui (embora esteja perto de conseguir), é habilitar o módulo psd para evitar portscans, mas mesmo com tudo Aprendi sobre esta ferramenta, acho que ainda nem arranhei a superfície. 😉
Enfim, neste mundo você sempre tem que estudar.
Pontos positivos Hugo, em arquivo para nosso glossário: D, como sempre, aprendendo ...
A propósito, já fiz o módulo psd funcionar para mim. O problema era que inicialmente dependia de uma funcionalidade do kernel que se tornou obsoleta junto com o patch-o-matic, por isso foi removido dos módulos embutidos no netfilter por padrão. Portanto, agora no Debian para usar a extensão psd, primeiro você precisa fazer isso:
aptitude -RvW install iptables-dev xtables-addons-{common,source} module-assistant
module-assistant auto-install xtables-addons-source
Pode então ser usado normalmente, de acordo com as instruções:
man xtables-addons
Hugo, por que você não publica um iptables.sh com suas sugestões para melhorar o script deste post (que é bom) incluindo psd
obrigado
Excelente artigo, excelentes iptables e excelente explicação de @hugo. Estou cada vez mais convencido de que ainda tenho muito que aprender.
Não é só você, pelo menos eu ... Estou perdendo um milhão ... 😀
Olá a todos, e obrigado pela contribuição, mas a verdade é que estamos desesperados, não sabemos o que fazer agora, e viemos até vocês por isso do iptables que sabemos que vocês são especialistas em sistemas.
Eu sou o líder de uma comunidade na Espanha de fonte de contra-ataque e nós somos um dos poucos que ainda mal estamos de pé, estamos recebendo ataques constantes da máquina e outros ataques em intervalos de tempo, o constante remove pouco, mas retarda o servidor um pouco mas aquele que fica de tempo faz mais estragos. Nossa máquina é montada em 6.2 centos
e temos o tcadmin para controlar os servidores. Você poderia nos fazer uma configuração que pudesse impedir esse tipo de ataque um pouco, já estamos desesperados,
e não sabemos a quem recorrer, sabemos que existem dois botnets, um feito em casa e outro pago com tempo e força. Temos sofrido ataques brutais desse tipo há quase um ano, se você pudesse nos ajudar ficaríamos eternamente gratos porque agora é insustentável. Adoro configurar servidores como hoobie e não sou uma criança, garanto, mas isso é muito para mim. Se você quiser que meu ts3 fale ou qualquer coisa que eu adoraria se você pudesse nos ajudar para que postássemos aqui os resultados e tudo o que foi resolvido para o bem de muita gente, seria o blog mais visitado do ano que garanto a vocês porque é incrível como incomoda esses ataques ddos. Como tentamos configurá-lo por conta própria e bloquearmos o acesso à máquina, tivemos que formatá-lo a partir da bios, então imagine como somos.
Envio uma saudação cordial. E meus parabéns pelo blog que faltava, muitas pessoas acham um que foi atualizado com este. -Miguel Angel-
Olá, como vai você 🙂
Escreva para meu e-mail, teremos prazer em ajudá-lo 😀 -» kzkggaara[@]desdelinux[.]líquido
Olá pessoal, até agora que estou trabalhando, vejam este script, muito bom aliás ... só uma dúvida: O módulo "recente" não diminui a performance?
Saudações - Obrigado / Quem gosta de você?
Excelente contribuição meu amigo, vou te colocar nas referências de um vídeo tutorial que estamos montando, um abraço da Costa Rica
Olá,
Não é possível usar o script em várias portas?
Tenho um servidor de jogos e recebo ataques tanto para a web quanto para as portas do servidor de jogos.
Uma saudação.