iptables: construindo um conjunto de regras contra o abuso de ataques de amplificação de DNS

6

Eu tenho trabalhado na criação de um conjunto de regras para detectar e bloquear um ataque de amplificação de DNS.

Eu fiquei preso e espero encontrar ajuda aqui.

Vou postar aqui o que tenho (bash scripting, as partes que dizem respeito ao DNS):

IPTABLES='/sbin/iptables -v' 
SERVERIP=a.b.c.d

echo '################ Previously initiated and accepted exchanges bypass rule checking #'
$IPTABLES --append INPUT  -m state --state ESTABLISHED,RELATED     --jump ACCEPT
echo '################################################ Allow unlimited outbound traffic #'
$IPTABLES --append OUTPUT -m state --state NEW,ESTABLISHED,RELATED --jump ACCEPT

echo '################################################################## Rules for DNS #'
# DIG ANY ISC.ORG attack preventer.
# QUESTION1: this one does not work, why!?!?
$IPTABLES --append INPUT --proto udp --dport 53 -m string --string "isc.org" --algo bm --to 65535 --jump LOG --log-prefix "iptables: UDP ISC0 "

$IPTABLES --append INPUT --proto udp --dport 53 -m string --hex-string "|03697363036f726700|" --algo bm --to 65535 --jump LOG --log-prefix "iptables: UDP ISC "
$IPTABLES --append INPUT --proto udp --dport 53 -m string --hex-string "|03697363036f726700|" --algo bm --to 65535 --jump DROP

# DNS DNSIPSOK list
$IPTABLES --new DNSFLOODRULES
$IPTABLES --append DNSFLOODRULES --source 127.0.0.1 --jump RETURN
$IPTABLES --append DNSFLOODRULES --source $SERVERIP --jump RETURN
$IPTABLES --append DNSFLOODRULES --jump LOG --log-prefix "iptables: UDP BLOCK "
$IPTABLES --append DNSFLOODRULES --jump ACCEPT
#$IPTABLES --append DNSFLOODRULES --jump DROP
# I have it turned off right now, because 

echo '# S & D port rules'
# DNS limit rule for standard acceptance
# QUESTION2: can't get the connbytes to work properly :(
$IPTABLES --append INPUT --proto udp --source 0/0 --dport 53 \
    -m state --state NEW \
    -m connbytes --connbytes 75 --connbytes-dir reply --connbytes-mode bytes
    -m limit --limit 1/s --limit-burst 10 --jump ACCEPT 
# DNS log / drop the abusers EXEPT the whitelisted IP numbers
$IPTABLES --append INPUT --proto udp --source 0/0 --dport 53 -m state --state NEW --jump DNSFLOODRULES
$IPTABLES --append INPUT --proto udp --source 0/0 --sport 53 -m state --state NEW --jump DNSFLOODRULES
# DNS allow the whitelisted IP numbers
$IPTABLES --append INPUT --proto udp --source 0/0 --dport 53 -m state --state NEW --jump ACCEPT
$IPTABLES --append INPUT --proto udp --source 0/0 --sport 53 -m state --state NEW --jump ACCEPT

QUESTION1: Por que ele precisa ser o hexagonal, o simples seria mais fácil de manter, mas esse não será byte, você pode dizer o meu por quê?

QUESTION2: Via TCPdump eu posso ver que a maioria das respostas são bem pequenas, portanto elas precisam estar na lista de permissões. Também localhost (e alguns dos meus próprios servidores minha consulta o servidor de nomes extensivamente (DNSFLOODRULES). O ataque de amplificação DNS é um surto contínuo de respostas "grandes", aqueles que eu quero limitar. O problema é que não consigo fazer a parte 'connbytes' funcionar. Eu estive procurando por ele um pouco, também achando que deveria ser arte de OUTPUT, já que é sobre o tamanho da resposta, não a questão. Eu também experimentei a parte "Permitir tráfego de saída ilimitado", mas isso foi terrivelmente errado.

Seus pensamentos e ajuda são muito apreciados.

    
por Tiffany Walker 05.02.2013 / 17:50

1 resposta

1

Pergunta 1:

A string não corresponde porque o "." não está incluído no pacote. Um pacote DNS não contém um "hostname" como tal, mas "labels". No pacote, cada parte do nome do domínio é um rótulo, prefixado pelo número de bytes para o rótulo.

Então "isc.org" se traduz em:

isc: 03 69 73 63
org: 03 6f 72 67

Ou no pacote:

03697363036f7267

Cada etiqueta está limitada a 63 bytes, o nome inteiro é limitado a 255 bytes.

É explicado no RFC do DNS:

link

link

Pergunta 2:

Você precisa ativar o sinalizador net.netfilter.nf_conntrack_acct para usar a opção conntrack (consulte iptables manpage). Mas eu não acho sábio usá-lo assim. Sempre haverá respostas legítimas que são grandes pacotes.

Talvez seja melhor usar a extensão hashlimit. Já foi mencionado:

link

    
por 05.04.2013 / 23:10