iptables / recent modul und Management der dynamischen Listen

akxak

New Member
Hi!

Zur Absicherung meines root-Servers nutze ich schon lange fail2ban.

Allerdings beherrscht fail2ban leider keinen Dump, um bspw. vor einem Restart die bestehenden Bans zu sichern und danach wieder zu laden. Auch ist das Entsperren eher aufwendig, da man die entsprechende(n) Firewall-Regel(n) manuell suchen und austragen muss.

Hier bietet m.E. das Modul ipt_recent der netfilter-Firewall eine interessante Option. Die dynamischen Listen und die darauf aufbauende Verwaltung machen die Eintragungen in Netfilter deutlich übersichtlicher und Einträge lassen sich schnell ergänzen bzw. löschen.

Mir ist es soweit gelungen, dass fail2ban die dazu erforderlichen Regeln nur anlegt, wenn es sie nicht schon gibt (ein Löschen und Neuanlagen der Regeln würde zu einem Löschen der dynamischen Listen führen).

Allerdings laufen die dynamischen Listen bis zum eingestellten Grenzwert (bei mir 5000) langsam aber sicher voll, da Einträge nicht automatisch entfernt werden. Dies erfolgt wohl nur, wenn die Liste überläuft oder bei Match einer entsprechenden Firewall-Regel. Letzteres ist für mich keine Option, da ich die Systeme, die in der Blockliste gelandet sind, garnicht "wiedersehen" will.

ipt_recent nutzt als Zeitbasis "jiffies", die sich aus HX (einer Timerkonstante des BS, abfragbar über /proc/config.gz) mal Sekunden berechnet.

Allerdings ist es mir bisher nicht gelungen, den Ausgangswert zu ermitteln, der Grundlage für die durch ipt_recent vergebenen Werte als "last_seen" ist.

Soviel der Vorrede:

Frage: Kann mir jemand sagen, wie ich den last_seen in /proc/net/ipt_recent/* in Vergleich zur aktuellen Zeit zu berechnen habe, um veraltete Einträge löschen zu können?
 
Last edited by a moderator:
Mittlerweile habe ich eine Lösung... vielleicht kann es ja auch jemand anders gebrauchen.

Code:
#!/bin/bash

TIMESPAN=`expr <number of seconds> \* $HZ`
CTRLFILE=/proc/net/ipt_recent/<filename>
HZ=250 # system specific! check /proc/config.gz for CONFIG_HZ
echo 1.1.1.1 >$CTRLFILE
CURJIFFIE=`cat $CTRLFILE | grep "1.1.1.1" | awk '{ print $5 }'`
echo -1.1.1.1 >$CTRLFILE

awk -v tst=`expr $CURJIFFIE - $TIMESPAN` ' $5 < tst { print substr($1,5)}' ${CTRLFILE} | while read OUTDATED
do
  echo -${OUTDATED} >${CTRLFILE}
done

Das Script holt sich für den aktuellen Zeitpunkt den last_seen Eintrag durch Einfügen einer Dummy-IP, rechnet dann zurück (Zahl der Sekunden * HZ), ermittelt alle älteren Einträge und löscht diese.
 
Back
Top