DNS-Query Limits mit iptables und Burstrate

Seit etwas über zwei Monaten betreibe ich einen OpenNIC Nameserver, über den jeder Mensch auf der Welt Hostnamen in IP-Adressen auflösen kann (mehr zum Nameserver gibt es hier). Jeder Mensch, aber leider auch jeder durch Viren befallene Zombie-Computer. Die massiven Anfragen nach Mailservern führten bereits zweimal dazu, dass mein Router die Anzahl von Anfragen nicht mehr bearbeiten konnte und der Internetzugang sich verabschiedete.

Query Flood! Was tun?

Im Blog von Benny Baumann werden Tips vorgestellt, die sehr spezifisch bestimmte Anfragen mit einfachen iptables Regeln verwerfen. Da ich leider nicht Nachfragen nach den Rootservern ablehnen kann (öffentliche Nameserver müssen hier antworten) und auch leider nicht nach einer einzigen Domain gefragt wird, kam nur eine Limitierung in Frage. Dabei wird die Anzahl der maximal in einem Zeitintervall (zum Beispiel eine Sekunde) verarbeiteten Pakete begrenzt.

Durch Nachfragen bei anderen OpenNIC Serveradmins und Analyse anonymisierter Logfiles konnte ich 5 Anfragen pro Sekunde als Durchschnitt pro IP feststellen. Diese Einstellung brachte zwar Besserung, führte aber dazu, dass bei einem Rechnerstart einige Programmer länger brauchten. Klar, die Anfragen pro Sekunde sind zu stark begrenzt. Die Lösung des Problems möchte ich gern mit euch teilen.

Es wird die Anzahl der Pakete pro Sekunde einer Quell-IP nicht über den Zeitraum einer Sekunde gemessen, sondern über einen längeren Zeitraum. Das würde zu einer Reduzierung der Anfragen führen (fünf pro Sekunde ist trivialierweise mehr als 5 pro zehn Sekunden), also wird die Anzahl der Anfragen mit den Sekunden multipliziert. Jetzt ist es natürlich möglich, alle erlaubten Anfragen in der ersten Sekunde zu senden, was wieder zu einer Überlastung der Anbindung führen würde. Dem wird ein Riegel vorgeschoben, indem die Anzahl der Anfragen pro Sekunde auch limitiert wird, aber eben auf einen höheren als den angestrebten Wert.

Ich habe die Anfragen pro Sekunde auf 5 limitiert, was dazu führt, dass in 7 Sekunden 35 Anfragen erlaubt sind.
Um das Erste-Sekunde Problem zu lösen, sind in jeder der sieben Sekunden nur maximal 15 Anfragen erlaubt.

Skript schreiben statt manuell blockieren!

Hier das Skript für Interessierte:

#!/bin/bash
# This script limits the queries per second to 5/s
# with a burst rate of 15/s and does not require
# buffer space changes

# Requests per second
RQS="15"

# Requests per 7 seconds
RQH="35"

iptables --flush
iptables -A INPUT -p udp --dport 53 -m state --state NEW -m recent --set --name DNSQF --rsource
iptables -A INPUT -p udp --dport 53 -m state --state NEW -m recent --update --seconds 1 --hitcount ${RQS} --name DNSQF --rsource -j DROP
iptables -A INPUT -p udp --dport 53 -m state --state NEW -m recent --set --name DNSHF --rsource
iptables -A INPUT -p udp --dport 53 -m state --state NEW -m recent --update --seconds 7 --hitcount ${RQH} --name DNSHF --rsource -j DROP

One comment

  1. Hello, your script was very useful for solving a DoS attack on a DNS server on my network. Thanks.

    Ruben (tuk) From Patagonia, Argentina.

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>