Robot pro omezení zahlcujícího provozu: Porovnání verzí
m |
|||
| Řádek 19: | Řádek 19: | ||
(proměnné v hlavičce si račte upravit k obrazu svému, nezapomenout do sledovanych sítí přidat i veřejné IP) | (proměnné v hlavičce si račte upravit k obrazu svému, nezapomenout do sledovanych sítí přidat i veřejné IP) | ||
| − | + | <bash>#!/bin/sh | |
| + | |||
| + | # Verze 1.06 -> doplnujte aktualni verzi | ||
| + | # 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) | ||
| + | # muze se prehoupnout pres pulnoc, pak je prvni cislo vetsi nez druhe (700-200) | ||
| + | # v noci se banovani vypina (bany bezi casove dal, ale nejsou "provadeny") | ||
| + | DAYTIME="700-2300" | ||
| + | |||
| + | KLADIVO=/root/kladivo.sh | ||
| + | LISTDIR=/var/lib/kladivo | ||
| + | |||
| + | IPTABLES=/sbin/iptables | ||
| + | IPBAND=/usr/sbin/ipband | ||
| + | |||
| + | case "$1" in | ||
| + | report) | ||
| + | # ziskame obsah reportu do tempfile | ||
| + | TMPF=`mktemp -t kladivo.XXXXXX` | ||
| + | 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 desetinnou cast | ||
| + | OVERTIME="${OVERTIME%%.*}" | ||
| + | # 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="$(($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 &> /dev/null | ||
| + | NOW="`date +%s`" | ||
| + | NOWTIME="`date +%k%M`" | ||
| + | DAYTIME1="${DAYTIME%%-*}" | ||
| + | DAYTIME2="${DAYTIME##*-}" | ||
| + | # 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 | ||
| + | BANME='no' | ||
| + | if [ "$DAYTIME1" -gt "$DAYTIME2" ]; then | ||
| + | [ "$NOWTIME" -ge "$DAYTIME1" -o "$NOWTIME" -lt "$DAYTIME2" ] \ | ||
| + | && BANME='yes' | ||
| + | elif [ "$NOWTIME" -ge "$DAYTIME1" -a "$NOWTIME" -lt "$DAYTIME2" ]; then | ||
| + | BANME='yes' | ||
| + | fi | ||
| + | |||
| + | if [ "$BANME" = 'yes' ]; then | ||
| + | IP="${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|start) | |
| − | + | # 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|stop) | |
| − | + | killall $IPBAND | |
| − | + | # smazat iptables pravidla (chyby ignorovat, pokud neexistuji) | |
| − | + | $IPTABLES -F SOSACI &> /dev/null | |
| − | + | $IPTABLES -D FORWARD -j SOSACI &> /dev/null | |
| − | + | $IPTABLES -X SOSACI &> /dev/null | |
| − | + | exit 0 | |
| − | + | ;; | |
| − | + | ||
| − | + | restart) | |
| − | + | $0 stop | |
| − | + | $0 start | |
| − | + | exit 0 | |
| − | + | ;; | |
| − | + | ||
| − | + | *) | |
| − | + | echo "usage: $0 startwatch|stopwatch|start|stop|restart|report|cronjob" | |
| − | + | exit 1 | |
| − | + | ;; | |
| − | + | esac | |
| − | + | </bash> | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
CGI skript pro sledování stavu černé listiny: | CGI skript pro sledování stavu černé listiny: | ||
| − | + | <bash>#!/bin/sh | |
| − | + | # | |
| − | + | #Verze 1.01 | |
| − | + | #Autor PavKriz | |
| − | + | # | |
| − | + | 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 | |
| − | + | echo "$FILE" | grep archive &>/dev/null && continue | |
| − | + | 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 ($IP)" | |
| − | + | echo "Minutes to unban: $UNBAN" | |
| − | + | echo "Ban-causing report:" | |
| − | + | tail +8 $FILE | |
| − | + | echo | |
| − | + | fi | |
| − | + | done | |
| + | </bash> | ||
TCP/IP rozhrani na dotazy do userdb pro prevod IP adresy na e-mail HKfree clena bezi na brita (brita.lhota.hkfree.org, 10.107.15.17) na portu 10107. | TCP/IP rozhrani na dotazy do userdb pro prevod IP adresy na e-mail HKfree clena bezi na brita (brita.lhota.hkfree.org, 10.107.15.17) na portu 10107. | ||
Verze z 4. 11. 2005, 23:58
Postaveno na http://ipband.sourceforge.net/
Vyžaduje adresář /var/lib/kladivo - zrobíme snadno:
# mkdir /var/lib/kladivo
Potřebný 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
nebo skript přímo nalinkovat do startovacích adresářů (rcX.d). Na debianu to lze udělat takto:
cd /etc/init.d ln -s /root/kladivo.sh update-rc.d kladivo.sh defaults
Skript /root/kladivo.sh:
(proměnné v hlavičce si račte upravit k obrazu svému, nezapomenout do sledovanych sítí přidat i veřejné IP)
<bash>#!/bin/sh
- Verze 1.06 -> doplnujte aktualni verzi
- 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)
- muze se prehoupnout pres pulnoc, pak je prvni cislo vetsi nez druhe (700-200)
- v noci se banovani vypina (bany bezi casove dal, ale nejsou "provadeny")
DAYTIME="700-2300"
KLADIVO=/root/kladivo.sh LISTDIR=/var/lib/kladivo
IPTABLES=/sbin/iptables IPBAND=/usr/sbin/ipband
case "$1" in
report)
# ziskame obsah reportu do tempfile
TMPF=`mktemp -t kladivo.XXXXXX`
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 desetinnou cast
OVERTIME="${OVERTIME%%.*}"
# 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="$(($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 &> /dev/null
NOW="`date +%s`"
NOWTIME="`date +%k%M`"
DAYTIME1="${DAYTIME%%-*}"
DAYTIME2="${DAYTIME##*-}"
# 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
BANME='no'
if [ "$DAYTIME1" -gt "$DAYTIME2" ]; then
[ "$NOWTIME" -ge "$DAYTIME1" -o "$NOWTIME" -lt "$DAYTIME2" ] \
&& BANME='yes'
elif [ "$NOWTIME" -ge "$DAYTIME1" -a "$NOWTIME" -lt "$DAYTIME2" ]; then
BANME='yes'
fi
if [ "$BANME" = 'yes' ]; then
IP="${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|start)
# 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|stop) killall $IPBAND # smazat iptables pravidla (chyby ignorovat, pokud neexistuji) $IPTABLES -F SOSACI &> /dev/null $IPTABLES -D FORWARD -j SOSACI &> /dev/null $IPTABLES -X SOSACI &> /dev/null exit 0 ;;
restart) $0 stop $0 start exit 0 ;;
*) echo "usage: $0 startwatch|stopwatch|start|stop|restart|report|cronjob" exit 1 ;;
esac </bash>
CGI skript pro sledování stavu černé listiny:
<bash>#!/bin/sh
- Verze 1.01
- Autor PavKriz
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
echo "$FILE" | grep archive &>/dev/null && continue
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 ($IP)"
echo "Minutes to unban: $UNBAN"
echo "Ban-causing report:"
tail +8 $FILE
echo
fi
done
</bash>
TCP/IP rozhrani na dotazy do userdb pro prevod IP adresy na e-mail HKfree clena bezi na brita (brita.lhota.hkfree.org, 10.107.15.17) na portu 10107.
Priklady:
uspesny dotaz:
23:13:30 Lhota3-JZD:~# echo 10.107.12.88 | nc 10.107.15.17 10107 caryInvalidaddresSfukhk@tiscInvaliddomaiNali.cz
neuspesny dotaz (ip adresa v userdb neni)
23:15:36 Lhota3-JZD:~# echo 10.107.12.888 | nc 10.107.15.17 10107 23:15:46 Lhota3-JZD:~#
chybova hlaska:
23:15:46 Lhota3-JZD:~# echo 10.107.12.8888 | nc 10.107.15.17 10107 ip2mail: [10.107.12.8888] does not look like IPv4 address.
Rozhrani je vhodne k pouziti v kladivu - poslu clenovi mail hned jak na nej kladivo "spadne"