Eu tenho um servidor de nomes acessível ao público, pois é o servidor de nomes oficial para alguns domínios .
Atualmente, o servidor é inundado por ANY
solicitações de tipo falsificado para isc.org, mature.net e similares (que é um ataque de DoS distribuído conhecido ).
O servidor executa o BIND e allow-recursion
configurou a minha LAN para que essas solicitações sejam rejeitadas. Nesses casos, o servidor responde apenas com authority
e additional
seções referentes aos servidores raiz.
Posso configurar o BIND para que ele ignore completamente essas solicitações, sem enviar uma resposta?
fonte
iptables -t raw -S PREROUTING
. Saída:,-P PREROUTING ACCEPT
seguida por-A PREROUTING -i eth0 -p udp -m udp --dport 53 -m string --hex-string "|01000001000000000000|" --algo kmp --from 30 --to 65535 -j DROP
. Eu testei que ele está funcionando corretamentehost -ar exampledomain.com dns-server.example.net
. Claro que não funcionou corretamente até eu adicionar a-r
opção.-r
opção faz a diferença. Pessoalmente, não gosto quehost
consultas simples não funcionem mais e isso pode ser muito confuso. Essa provavelmente é uma resposta válida (a melhor até agora) e eu darei a você a recompensa, já que ela está prestes a expirar, mesmo que eu continue usando a minha própria abordagem filtrando OUTPUT.Eu tentaria:
As respostas referentes aos clientes para os servidores raiz são controladas pela zona "redirecionar". Isso deve dizer para não responder a eles.
Isso é sugerido nos documentos do Bind9: http://ftp.isc.org/isc/bind9/cur/9.9/doc/arm/Bv9ARM.ch06.html#id2592674
Você pode substituir
"none"
com sua sub-rede local.Se você já possui uma
zone "."
declaração, basta adicionáallow-query "none";
-la.fonte
zone "." { type hint; file "/etc/bind/db.root"; };
declaração com o db.root listando os servidores raiz. A remoção dessa declaração interrompe as respostas para domínios estrangeiros, mas o servidor ainda está respondendo com uma "falha no servidor" e, portanto, ainda pode ser usado para o DoS.allow-query "none";
àzone "."
configuração?Geralmente, eu sugeriria:
Ative os logs de ligação e registre os ips que recebem resposta rejeitada. Instale o programa fail2ban, adicione a ação blackhole: http://pastebin.com/k4BxrAeG (coloque a regra no arquivo em /etc/fail2ban/actions.d)
Crie um arquivo de filtro de ligação em /etc/fail2ban/filter.d com algo parecido com isto (precisa de depuração!)
Edite fail2ban.conf, adicione a seção:
Espero que isso ajude!
fonte
A idéia básica permite que o bind classifique a resposta DNS como recusada e use o iptables para converter a recusada em ignorada silenciosamente.
Recusado é a parte fácil da seção de opções named.conf:
Ou, é claro, suas ACLs favoritas para exceções locais ...
Na próxima mágica do iptables, ajuste ou remova "-o eth0", conforme necessário. Este comando assume o cabeçalho padrão da camada IPv4 de 20 bytes antes do UDP.
Essas teclas no campo sinalizadores da resposta DNS com os seguintes bits definidos
A mensagem de log percebida executando a ligação na depuração "erro ao enviar resposta: host inacessível" quando a regra corresponde a ter algum feedback para o teste.
Devo admitir que tudo isso é um exercício um tanto inútil. Se não houver amplificação, um invasor poderá refletir com a mesma facilidade o TCP SYN. Em última análise, o DNS está quebrado simplesmente não há solução viável além do uso do TCP ou da implantação dos cookies DNS da Eastlake.
fonte
Você tentou bloquear a string isc.org ou bloquear a string hexadecimal?
Isso funcionou para mim:
fonte
iptables -A OUTPUT -p udp -m string -hex-string "|726f6f742d73657276657273|" –algo bm –to 65535 -j DROP
mas eu realmente preferiria uma solução baseada apenas na configuração do BIND, se isso for possível.'bnrexex.www.sf97.net/A/IN' 'whzpkacpxpiuycm.www.tpa.net.cn/A/IN'
Esse ataque é chamado de negação de serviço amplificada. Você deve configurar a ligação corretamente, mas esse tráfego não deve chegar à sua ligação em primeiro lugar. Bloqueie-o no primeiro dispositivo de rede capaz de fazê-lo na sua rede. Eu tive o mesmo problema e lidei com isso com a regra do ronco surdo:
fonte
Primeiro, eu sei que essa é uma pergunta antiga, mas ...
Estou executando meu próprio servidor DNS autoritativo e não recursivo há décadas, mas nunca fui vítima de nenhum ataque DDoS baseado em DNS - até agora, quando mudei para um novo ISP. Milhares de consultas DNS falsificadas inundaram meus logs e fiquei muito irritado - não tanto pelo impacto no meu servidor, mas pelo fato de ele atrapalhar meus logs e pela sensação desconfortável de ser abusado. Parece que o invasor tenta usar meu DNS em um " ataque do servidor de nomes autoritário ".
Então, imaginei que, embora eu limite consultas recursivas à minha rede interna (negando todas as outras), prefiro gastar meus ciclos de CPU na correspondência de cadeias de caracteres em tabelas de ip do que enviando respostas negativas aos endereços IP falsificados (menos confusão nos meus logs, menos tráfego de rede e um nível mais alto de satisfação).
Comecei fazendo o que todo mundo parece fazer , descubra quais nomes de domínio são consultados e criei uma correspondência de string nesse domínio com uma DROP de destino. Mas logo percebi que acabaria com uma enorme quantidade de regras, cada uma delas consumindo ciclos de CPU. Então o que fazer? Como não executo um servidor de nomes recursivo, achei que poderia fazer a correspondência nas zonas reais para as quais sou autoritário e largar todo o resto.
Minha política padrão no iptables é ACEITAR, se sua política for DROP, você provavelmente precisará fazer alguns ajustes se desejar usar a seguinte solução.
Eu mantenho minha configuração de zona em um arquivo separado (/etc/bind/named.conf.local), vamos usar isso como um exemplo:
Observe o comentário “// Privado” nas minhas duas primeiras zonas, eu uso isso no script a seguir para excluí-las da lista de zonas válidas.
Execute o script acima com o arquivo de configuração da zona como argumento.
Salve a saída em um script, coloque-o em um shell ou copie e cole no seu terminal para criar a nova cadeia e começar a filtrar todas as consultas DNS inválidas.
execute / sbin / iptables -L DNSvalidate -nvx para ver os contadores de pacotes (e bytes) em cada regra da nova cadeia (você pode mover a zona com a maioria dos pacotes para o topo da lista para torná-la mais eficiente).
Na esperança de que alguém possa achar isso útil :)
fonte