DDoS e outros ataques contra iptables (segurança anti-DDoS em iptables)

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:


14 comentários, deixe o seu

Deixe um comentário

Seu endereço de email não será publicado. Campos obrigatórios são marcados com *

*

*

  1. Responsável pelos dados: Miguel Ángel Gatón
  2. Finalidade dos dados: Controle de SPAM, gerenciamento de comentários.
  3. Legitimação: Seu consentimento
  4. Comunicação de dados: Os dados não serão comunicados a terceiros, exceto por obrigação legal.
  5. Armazenamento de dados: banco de dados hospedado pela Occentus Networks (UE)
  6. Direitos: A qualquer momento você pode limitar, recuperar e excluir suas informações.

  1.   KZKG ^ Gaara dito

    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) 🙂

    1.    diazepam dito

      perfeito.

  2.   koratsuki dito

    Doces infantis ...

  3.   Hugo dito

    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.

  4.   koratsuki dito

    Pontos positivos Hugo, em arquivo para nosso glossário: D, como sempre, aprendendo ...

    1.    Hugo dito

      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

      1.    longe dito

        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

  5.   nelson dito

    Excelente artigo, excelentes iptables e excelente explicação de @hugo. Estou cada vez mais convencido de que ainda tenho muito que aprender.

  6.   koratsuki dito

    Não é só você, pelo menos eu ... Estou perdendo um milhão ... 😀

  7.   Miguel Angel dito

    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-

    1.    KZKG ^ Gaara dito

      Olá, como vai você 🙂
      Escreva para meu e-mail, teremos prazer em ajudá-lo 😀 -» kzkggaara[@]desdelinux[.]líquido

  8.   Arthur Shelby dito

    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ê?

  9.   Jose tapia dito

    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

  10.   Cristian Ivory Reinoso dito

    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.