Robot pro omezení zahlcujícího provozu

Z HKfree wiki
Verze z 23. 8. 2005, 10:41, kterou vytvořil Pavkriz (diskuse | příspěvky)
(rozdíl) ← Starší verze | zobrazit aktuální verzi (rozdíl) | Novější verze → (rozdíl)
Skočit na navigaci Skočit na vyhledávání

Postaveno na http://ipband.sourceforge.net/

Potřebý záznam v crontabu:

*/5 * * * * /root/kladivo.sh cronjob

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   -s $IP -m limit --limit 10/s -j ACCEPT
             $IPTABLES -I SOSACI 2 -s $IP -j DROP
             $IPTABLES -I SOSACI   -d $IP -m limit --limit 10/s -j ACCEPT
             $IPTABLES -I SOSACI 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