iptables: Verbindungen pro Minute per Hosts unterdrücken

#0
24.05.2005, 11:42
...neu hier

Beiträge: 2
#1 Erstmal Hallo zusammen,

ich versuche jetzt schon seit ca. 2 Wochen eine Lösung für mein Problem zu finden. Leider war ich bisher erfolglos. Ich hoffe ich finde hier Hilfe. Zum VErwendeten System. Ich Benutze ein Linux 2.6 Kernel. (2.6.10) Ansonsten komme ich gleich zu meinen Problem.


Ich möchte einkommende Packete, vor allem ein Verbindungsaufbau Zeitlich begrenzen. Die erste Möglichkeit dir mir bietet war das Modul "limit". Jedoch beschränke ich damit gleichzeitig alle Verbindungen.

Wenn ich es also fest einstelle, dass nur 100 Verbindungen pro Minute erlaubt sind. Gilt das gleichzeitig für alle hosts. Sollte also ein einzelner 100 Verbindungsanfragen/Min senden, ist der Service gleichzeitig für alle anderen nicht erreichbar. ich kann daraus keinen großen Nutzen ziehen, wenn der Server zwar läuft, aber der Service trotzdem nicht erreichbar ist.

Besser wäre es jedoch wenn der Verbindungsaufbau nur von dieser IP unterdrückt wird. Und alle anderen normal weiter den Service Benutzen können.


In Patch-O-Matic gab es eine zusätzliche Erweiterung die sich "connlimit" nennt (damals iplimit). Problem dabei ist, dass ich nur einen 2.6.11.10 Kernel damit sauber Kompilieren kann. Das wäre nicht so schlimm, wenn der 2.6.11.10er Kernel bei mir Funktionieren würde. Leider freezt der Kernel bei mir. Deswegen bin ich noch auf den 2.6.10er Kernel angewiesen. Und dort sagt er mir beim Kompilieren des Kernels das eine veriable etc. nicht existiert.


Ein ganz anderes problem ist aber das "connlimit" nur mit tcp Funktioniert. Ich würde das ganze auch gerne für icmp benutzen. z.b. bei icmp-echo-reply anfragen, so dass nach einer Überschreitung einer eingehende Grenze von Packeten/Zeit alle eingehende Packete von der auslösenden IP gedropt werden.


Das nur eine bestimmte Anzahl von Verbindungen Möglich sind, habe ich zur Zeit über xinetd gelöst. Jedoch bin ich damit immer noch unzufrieden. Ich habe ssh auf Port 23 Laufen, der wiederrum nur local verfügbar ist. xinetd lauscht auf Port 22, und leitet alle Anfragen nach Port 23 weiter.

Damit bekomme ich es ohne Probleme hin das Beispielsweise eine IP sich nur 2 mal per SSH einloggen kann, und andere Verbindungen nicht beeinträchtigt werden. Jedoch kann ein Angreifer immer noch ohne Probleme ein Verbindungsaufbau einleiten. Passwörter ausprobieren, und danach sofort wieder eine Verbindung aufbauen.

Sinnvoller wäre es, wenn z.B. nur 1 Verbindungsaufbau pro Minute per Host Funktionieren würde.

ICMP-Echo Reply habe ich zwar zur Zeit per limit begrenzt. Jedoch kann ich damit immer noch als DoS Relay dienen. Da ich ja immer eine bestimmte Anzahl von Antwortpacketen zulasse.


Ich hoffe es weiß einer Rat wie ich dem Problem begegne. Bei www.heise.de weiß ich Beispielsweise das dies mit dem ICMP Echo Reply so gelöst wurde. Wenn man zu viele Pings sendet, wird man irgendwann geblockt, aber von jeder anderen IP aus kann man weiter pingen. Und soweit ich weiß benutzt heise.de auch GNU/Linux Server.


Wenn also jemanden noch gute Einfälle hat, bin für jede weitere idee offen.
Dieser Beitrag wurde am 24.05.2005 um 11:47 Uhr von sidburn editiert.
Seitenanfang Seitenende
24.05.2005, 12:56
Member
Avatar Xeper

Beiträge: 5291
#2 http://blog.jeanpierre.de/archives/2005/02/skriptkiddiessh.html

Vielleicht ist es ja das was du suchst, sowas ähnliches hab ich bei mir auch realisiert. Ganz schick - wie ich finde ;)
__________
E-Mail: therion at ninth-art dot de
IRC: megatherion @ Freenode
Seitenanfang Seitenende
24.05.2005, 17:53
...neu hier

Themenstarter

Beiträge: 2
#3

Zitat

Xeper postete
http://blog.jeanpierre.de/archives/2005/02/skriptkiddiessh.html

Vielleicht ist es ja das was du suchst, sowas ähnliches hab ich bei mir auch realisiert. Ganz schick - wie ich finde ;)
Hi,

danke dir. Ja genau so etwas habe ich gesucht.

Aber irgendwie ein Komischer Modul Name für diese Funktion. ;) Ich wäre wohl wahrscheinlich nie drauf gekommen dieses Modul mal anzuschauen.


EDIT:
So,
nach einem etwas kleinem Testen ist mir doch etwas Interessantes aufgefallen.

Ich habe für ICMP folgende Regeln aufgestellt:

$IPT -A INPUT -p icmp -m recent --name icmp_block --rcheck --seconds 60 --hitcount 100 -j DROP
$IPT -A INPUT -p icmp --icmp-type 0 -m recent --name icmp_block --set -j ACCEPT
$IPT -A INPUT -p icmp --icmp-type 3 -m recent --name icmp_block --set -j ACCEPT
$IPT -A INPUT -p icmp --icmp-type 8 -m recent --name icmp_block --set -j ACCEPT
$IPT -A INPUT -p icmp --icmp-type 11 -m recent --name icmp_block --set -j ACCEPT
$IPT -A INPUT -p icmp --icmp-type 12 -m recent --name icmp_block --set -j ACCEPT
$IPT -A OUTPUT -p icmp -j ACCEPT


Eigentlich sollte es so sein, dass jeder Host maximal 100 ICMP Nachrichten pro Minute erzeugen kann. Kommt er über dieses Limit wird er für die restliche Zeit der 60 Sekunden geblockt. Danach wäre er wieder in der Lage innerhlab einer Minute maximal 100 Antworten zu erzeugen.

Ich habe die Regeln so wie sie sind stehen lassen und eine Ping Flood Attacke auf meinen Rechner gestartet. (von einem anderen Rechner aus) Und kurz herum gesagt. Die Regeln greifen nicht.

Es wird kein einziges Packet gedropt, und der Packetzähler für die DROPS steht immer noch auf 0. Selbst wenn ich 2000 ping anfragen innerhalb von paar Sekunden erzeuge.

Jetzt kommt aber etwas anderes im Spiel. Sofern ich die Zeit und die hitcounts herunter setze. Greifen die Regeln. Wenn ich also Beispielsweise nur die letzten 10 Sekunden beobachte, und dafür nur 15 Antworten erlaube, dann bekomme ich auch nur 15 pongs zurück. Der Rest wird gedropt.

Jetzt ist die Frage warum das so ist?
Ich habe mir zuerst gedacht das er intern eine Tabelle hat, und bei zu vielen Anfragen, werden die letzten gelöscht, und innerhalb der letzten 60 Sekunden kann er somit wegen der häufigkeit der Anfragen keine 100 hits auf 60 Sekunden finden. Jedoch würde diese Logik nur dann aufgehen, wenn sehr viele Leute auf einmal ein Ping Flood auf mich starten würden. Bei einem einzigen Host sollte es volkommen egal sein. Dort erreicht er letztendlich immer die geforderte Anzahl.

Es könnte jetzt natürlich auch sein das er pro Tabelle nur eine geringe Anzahl ein Einträgen speichert. Sofern diese unter 100 liegt, würde das matching demzufolge nie stimmen. Und das verhalten würde passen, und er würde nie etwas droppen.

Jedoch halte ich das persönlich etwas uneffektiv weniger als 100 Einträge? Wenn ich mir vorstelle das man damit Beispielsweise sein WebServer schützen möchte, auf dennen mehr als 100 Leute gleichzeitig surfen würden, würde ein Matching ja so gut wie nie zustande kommen. Da immer unterschiedliche source IPs in der Tabelle stehen.

Wäre also Interessant wenn da jemand genaueres zu weiß wie das Matching genau Funktioniert, wie groß die tabelle ist, und ob man am Speicherverbrauch vllt. auch am /proc fs etwas einstellen kann.
Dieser Beitrag wurde am 25.05.2005 um 00:30 Uhr von sidburn editiert.
Seitenanfang Seitenende
Um auf dieses Thema zu ANTWORTEN
bitte erst » hier kostenlos registrieren!!

Folgende Themen könnten Dich auch interessieren: