
Was ich brauche :
Das Hinzufügen von Drop-Regeln anhand der Anzahl von Anfragen pro Zeitintervall führt zu vielen Ergebnissen, ich muss jedoch nach der Anzahl der empfangenen Bytes von einer bestimmten Adresse über einen bestimmten Zeitraum hinweg droppen.
Was ich untersucht habe:
Ich habe mir iptables angesehen: Für den ersten Fall sah ich eine dedizierteübereinstimmenIch sah auch dieQuotenübereinstimmungaber die Datenanzahl wird global verfolgt.
Ich habe keine Ahnung, wie ich die beiden Regeln kombinieren kann, um die empfangenen Daten pro IP zu verfolgen.
Andere Dinge :
Mir ist bewusst, dass die Verfolgung der Byteanzahl pro IP viel Speicher beanspruchen kann, deshalb möchte ich den Zeitraum auch kurz halten.
Ich kann andere Methoden akzeptieren, solange es dafür ein ausführliches Beispiel gibt.
Antwort1
Sie können IPSET mit Timeout- und Zähleroptionen verwenden. Dies sieht dann folgendermaßen aus:
#create ipset for accounting with default lifetime 300 secs
ipset create IP_QUOTA_SET hash:ip timeout 300 counters
#create separated rule chain
iptables --new-chain PER_IP_QUOTING
#send packets to chain
iptables -t filter -A INPUT \
-i <in-iface> --dst <ip> \
-p tcp --dport <dstport> \
-j PER_IP_QUOTING
#if ip doesn't exist in the set, add it
iptables -t filter -A PER_IP_QUOTING \
-m set ! --match-set IP_QUOTA_SET src \
-j SET --add-set IP_QUOTA_SET src --timeout 300
#if packet exists in the set, check bytes
#if byte counter > quota then close connection
#by sending of tcp-reset packet.
iptables -t filter -A PER_IP_QUOTING \
-m set --match-set IP_QUOTA_SET src \
--bytes-gt 1000 -j REJECT --reject-with tcp-rst
#pass other packets (for debug purpose)
iptables -t filter -A PER_IP_QUOTING \
-j RETURN
In diesem Fall können Sie die Liste überprüfen und mit dem ipset-Befehl bearbeiten. Aktuelle Liste mit Zählern und Timeouts anzeigen: ipset-Liste IP_QUOTA_SET.
Weitere Einzelheiten finden Sie in der Dokumentation.