Robot pro omezení zahlcujícího provozu: Porovnání verzí
Skočit na navigaci
Skočit na vyhledávání
(uprava: nerezat ICMP (hint vojtalhota)) |
|||
Řádek 89: | Řádek 89: | ||
# je-li stale zabanovan, obnovit banovani | # je-li stale zabanovan, obnovit banovani | ||
IP=`basename $FILE` | IP=`basename $FILE` | ||
− | $IPTABLES -I SOSACI -s $IP -m limit --limit 10/s -j ACCEPT | + | $IPTABLES -I SOSACI -p ! icmp -s $IP -m limit --limit 10/s -j ACCEPT |
− | $IPTABLES -I SOSACI 2 -s $IP -j DROP | + | $IPTABLES -I SOSACI -p ! icmp 2 -s $IP -j DROP |
− | $IPTABLES -I SOSACI -d $IP -m limit --limit 10/s -j ACCEPT | + | $IPTABLES -I SOSACI -p ! icmp -d $IP -m limit --limit 10/s -j ACCEPT |
− | $IPTABLES -I SOSACI 2 -d $IP -j DROP | + | $IPTABLES -I SOSACI -p ! icmp 2 -d $IP -j DROP |
fi | fi | ||
fi | fi |
Verze z 23. 8. 2005, 11:28
Postaveno na http://ipband.sourceforge.net/
Vyžaduje adresář /var/lib/kladivo - zrobíme snadno:
# mkdir /var/lib/kladivo
Potřebý záznam pro běh v crontabu:
*/5 * * * * /root/kladivo.sh cronjob
Někde v init skriptech je záhodno nastartovat sledování pomocí:
/root/kladivo.sh startwatch
Skript /root/kladivo.sh:
(proměnné v hlaviččne si račte upravit k obrazu svému, nezapomenout do sledovanych sítí přidat i veřejné IP)
#!/bin/sh # autor pavkriz@hkfree.org # iptables rules kendy@hkfree.org # rychlostni limit v kB/s LIMIT=70 # maximalni doba na jakou lze prekrocit limit (minut) MAXOVERTIME=15 # doba, na jakou danou IP zabanujeme (minut) BANTIME=180 # interface ktery sledujeme WATCHIF=eth2 # podsite ktere sledujeme WATCHNET=10.107.12.0/24:10.107.42.0/24 KLADIVO=/root/kladivo.sh LISTDIR=/var/lib/kladivo TMP=/tmp IPTABLES=/sbin/iptables IPBAND=/usr/sbin/ipband case "$1" in report) # ziskame obsah reportu do tempfile TMPF="$TMP/kladivo.$$.tmp" cat - > $TMPF # ziskame IP ktere se report tyka IP=`awk '/Network: / { print $2 }' $TMPF` # ziskame cas z reportu (jak dlouho presahuje limit) - jako desetinne cislo v minutach OVERTIME=`awk '/exceeded for: / { print $7 }' $TMPF` # odsekneme deseetinnou cast OVERTIME=`echo $OVERTIME | awk 'BEGIN { FS = "." } ; { print $1 }'` # debug ###echo $IP $OVERTIME if [ $OVERTIME -gt $MAXOVERTIME ]; then # limit prekrocen na dobu delsi nez je povolena -> zabanovat FILE="$LISTDIR/$IP" if [ ! -e $FILE ]; then # pokud jeste neni zabanovan, tak zalozime soubor se znackou pro zabanovani # vypocteme timestamp do kdy budem IP banovat NOW=`date +%s` BANTOTIME=`expr $BANTIME \* 60 + $NOW` # zapiseme timestamp do souboru echo $BANTOTIME > $FILE # zapiseme report na jehoz zaklade ban vznikl echo "" >>$FILE cat $TMPF >>$FILE fi fi #rm $TMPF exit 0 ;; cronjob) # vyprazdnit chain $IPTABLES -F SOSACI NOW=`date +%s` # projit vsechny zabanovane for FILE in $LISTDIR/* ; do if [ -e "$FILE" ]; then BANTO=`head -n 1 "$FILE"` if [ $BANTO -lt $NOW ]; then # uz vyprsel ban # smazat znacku o zabanovani (casem asi presunout do nejakeho archivu) rm "$FILE" else # je-li stale zabanovan, obnovit banovani IP=`basename $FILE` $IPTABLES -I SOSACI -p ! icmp -s $IP -m limit --limit 10/s -j ACCEPT $IPTABLES -I SOSACI -p ! icmp 2 -s $IP -j DROP $IPTABLES -I SOSACI -p ! icmp -d $IP -m limit --limit 10/s -j ACCEPT $IPTABLES -I SOSACI -p ! icmp 2 -d $IP -j DROP fi fi done exit 0 ;; startwatch) # vytvorit chain kam strkame banovaci pravidla $IPTABLES -N SOSACI && $IPTABLES -I FORWARD -j SOSACI # spustit sledovaci ipband, ktery nam bude posilat reporty a detekovanych prekroceni $IPBAND -F -L $WATCHNET -m 32 -b $LIMIT -a 60 -r 240 -t 5 -M root@localhost -T "$KLADIVO report" $WATCHIF exit 0 ;; stopwatch) killall $IPBAND exit 0 ;; *) echo "usage: $0 startwatch" exit 1 ;; esac
CGI skript pro sledování stavu černé listiny:
#!/bin/sh LISTDIR=/var/lib/kladivo SEP="--------------------------------------------" echo "Content-type: text/plain" echo "" TODAY=`date` echo "Report k datu: $TODAY" echo $SEP NOW=`date +%s` for FILE in $LISTDIR/* ; do if [ -e "$FILE" ]; then IP=`basename $FILE` HOST=`host $IP | awk "{ print \\$5 }"` BANTO=`head -n 1 $FILE` UNBAN=`expr $BANTO - $NOW` UNBAN=`expr $UNBAN / 60` # print report echo "Host: $HOST" echo "Minutes to unban: $UNBAN" echo "Ban-causing report:" tail +8 $FILE echo fi done