Robot pro omezení zahlcujícího provozu: Porovnání verzí
Skočit na navigaci
Skočit na vyhledávání
(odkomentovano mazani reportu z tempu) |
(detekce casoveho useku (v noci nebanuje)) |
||
| Řádek 19: | Řádek 19: | ||
# autor pavkriz@hkfree.org | # autor pavkriz@hkfree.org | ||
# iptables rules kendy@hkfree.org | # iptables rules kendy@hkfree.org | ||
| + | # detekce casoveho useku jezz@hkfree.org | ||
# rychlostni limit v kB/s | # rychlostni limit v kB/s | ||
| Řádek 34: | Řádek 35: | ||
# podsite ktere sledujeme | # podsite ktere sledujeme | ||
WATCHNET=10.107.12.0/24:10.107.42.0/24 | WATCHNET=10.107.12.0/24:10.107.42.0/24 | ||
| − | + | ||
| + | # jak je definovana denni doba (7:00-23:00) (nesmi se prehoupnout pres pulnoc, to neumi) | ||
| + | # v noci se banovani vypina (bany bezi casove dal, ale nejsou "provadeny") | ||
| + | DAYTIME="700-2300" | ||
| + | |||
KLADIVO=/root/kladivo.sh | KLADIVO=/root/kladivo.sh | ||
LISTDIR=/var/lib/kladivo | LISTDIR=/var/lib/kladivo | ||
| Řádek 88: | Řádek 93: | ||
else | else | ||
# je-li stale zabanovan, obnovit banovani | # je-li stale zabanovan, obnovit banovani | ||
| − | IP=`basename $FILE` | + | # ovsem jen v pripade ze je "den" |
| − | + | DAYTIME1=`echo $DAYTIME | awk 'BEGIN { FS = "-" } ; { print $1 }'` | |
| − | + | DAYTIME2=`echo $DAYTIME | awk 'BEGIN { FS = "-" } ; { print $2 }'` | |
| − | + | NOWTIME=`date +%k%M` | |
| − | + | # je den? (podle DAYTIME) | |
| + | if [ $NOWTIME -ge $DAYTIME1 -a $NOWTIME -lt $DAYTIME2 ]; then | ||
| + | IP=`basename $FILE` | ||
| + | $IPTABLES -I SOSACI -p ! icmp -s $IP -m limit --limit 10/s -j ACCEPT | ||
| + | $IPTABLES -I SOSACI 2 -p ! icmp -s $IP -j DROP | ||
| + | $IPTABLES -I SOSACI -p ! icmp -d $IP -m limit --limit 10/s -j ACCEPT | ||
| + | $IPTABLES -I SOSACI 2 -p ! icmp -d $IP -j DROP | ||
| + | fi | ||
fi | fi | ||
fi | fi | ||
Verze z 23. 8. 2005, 17:01
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 # detekce casoveho useku jezz@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
# jak je definovana denni doba (7:00-23:00) (nesmi se prehoupnout pres pulnoc, to neumi) # v noci se banovani vypina (bany bezi casove dal, ale nejsou "provadeny") DAYTIME="700-2300"
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
# ovsem jen v pripade ze je "den"
DAYTIME1=`echo $DAYTIME | awk 'BEGIN { FS = "-" } ; { print $1 }'`
DAYTIME2=`echo $DAYTIME | awk 'BEGIN { FS = "-" } ; { print $2 }'`
NOWTIME=`date +%k%M`
# je den? (podle DAYTIME)
if [ $NOWTIME -ge $DAYTIME1 -a $NOWTIME -lt $DAYTIME2 ]; then
IP=`basename $FILE`
$IPTABLES -I SOSACI -p ! icmp -s $IP -m limit --limit 10/s -j ACCEPT
$IPTABLES -I SOSACI 2 -p ! icmp -s $IP -j DROP
$IPTABLES -I SOSACI -p ! icmp -d $IP -m limit --limit 10/s -j ACCEPT
$IPTABLES -I SOSACI 2 -p ! icmp -d $IP -j DROP
fi
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