Springe zum Inhalt

Spam-Bots mit iptables aussperren

Kommentar-Spam ist nichts Neues. Für fast jedes Content-Managment-System gibt es eine Erweiterung, die mehr oder weniger erfolgreich die Bots abwehrt. Oft wird auch geraten, die IP-Adressen mittels geeigneter Einträge in der Datei .htaccess auszusperren. Bei dieser Lösung muss jedoch immer erst der Webserver den Request behandeln, die Datei .htaccess parsen und anhand der IP-Adresse entscheiden, ob ein Zugriff auf die Webseite erlaubt ist. Eine andere Methode ist der Einsatz von iptables, welches bereits auf Kernelebene den Zugriff von bestimmten IP-Adressen auf den Server verhindern kann. Dadurch wird besonders auf stark frequentierten Webseiten Rechenzeit gespart und bleibt so für die echten Besucher übrig.

Zuerst einmal wird ein sogenannter Chain mit einem frei definierbaren Namen in iptables angelegt. Im folgenden Beispiel habe ich den Chain "wordpress-spambot" genannt:

iptables -N wordpress-spambot

Anschließend wird dem Chain eine Regel für die Rückkehr in den übergeordneten Chain hinzugefügt:

iptables -A wordpress-spambot -j RETURN

Damit wäre der Chain auch schon fertig. Jetzt wird im Chain INPUT, in dem alle IP-Pakete von aussen ankommen eine Regel erstellt, die alle TCP-Pakete mit dem Zielport 80 oder 443 (also eine Anfrage an den HTTP- oder HTTPS-Port) an den gerade erstellten Chain "wordpress-spambot" weiterleitet:

iptables -A INPUT -p tcp -m multiport --dports 80,443 -j wordpress-spambot

Der Grundaufbau ist somit fertig. Alle ankommenden TCP-Pakete an die Ports 80 oder 443 werden an den Chain "wordpress-spambot" weitergeleitet. Die Regeln in diesem Chain werden von oben nach unten abgearbeitet. Im Moment ist dort nur eine einzige Regel enthalten, die die Rückkehr in den aufrufenden Chain bewirkt. Um das zu überprüfen, können mit

iptables -L -v

die aktuellen iptables-Regeln angezeigt werden. Das Ergebnis sollte folgende Angaben enthalten:

Chain INPUT (policy ACCEPT 1413K packets, 678M bytes)
pkts bytes target     prot opt in     out     source               destination
2148  385K wordpress-spambot  tcp  --  any    any     anywhere             anywhere            multiport dports www,https

Chain wordpress-spambot (1 references)
pkts bytes target     prot opt in     out     source               destination
2136  384K RETURN     all  --  any    any     anywhere             anywhere

Anschließend können nacheinander die zu sperrenden IP-Adressen in den Chain "wordpress-spambot" eingetragen werden:

iptables -I wordpress-spambot --source xxx.xxx.xxx.xxx -j DROP

Damit wird am Anfang des Chains "wordpress-spambots" eine Regel eingetragen, die bewirkt, dass jeder eingehende Verbindungsversuch von der angegeben IP-Adresse sofort abgebrochen wird. Durch die Angabe von DROP wird der Verbindungsabbruch dem Absender nicht mitgeteilt. Dumme Bots können dadurch sogar noch etwas ausgebremst werden, da sie auf einen Timeout warten. Auch braucht hier keine Auswahl mehr auf die Ports 80 und 443 und das Protokoll TCP durchgeführt zu werden, da ja nur genau diese im Chain "wordpress-spambot" ankommen.

Nach längere Laufzeit können die durch die iptables-Regeln verworfenen Pakete angezeigt werden:

iptables -L wordpress-spambot -v -n

In den ersten beiden Spalten der Ausgabe werden die Anzahl der verworfen Pakete  und Bytes für jede einzelne Regel im Chain "wordpress-spambot" ausgegeben.

Verbindungsversuche von den gesperrten IP-Adressen werden jetzt bereits auf Kernelebene abgelehnt und belasten somit nur unmerklich das System. Weitere Prozesse auf dem Server brauchen sich um die Spamabwehr von diesen IP-Adressen nicht mehr zu kümmern. Einen Nachteil hat diese Lösung allerdings: die iptables-Regeln sind nicht permanent. Ohne besondere Vorkehrungen sind die iptables-Regeln nach einem Server-Neustart verloren und müssen neu erfasst werden.