Robot pro omezení zahlcujícího provozu: Porovnání verzí

Z HKfree wiki
Skočit na navigaci Skočit na vyhledávání
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)
  
#!/bin/sh
+
<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
 +
  ;;
 
   
 
   
  # Verze 1.06 -> doplnujte aktualni verzi
+
  startwatch|start)
# autor pavkriz@hkfree.org
+
  # vytvorit chain kam strkame banovaci pravidla
# iptables rules kendy@hkfree.org
+
  $IPTABLES -N SOSACI && $IPTABLES -I FORWARD -j SOSACI
# detekce casoveho useku jezz@hkfree.org
+
  # 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
# rychlostni limit v kB/s
+
  exit 0
LIMIT=70
+
  ;;
+
 
# maximalni doba na jakou lze prekrocit limit (minut)
+
  stopwatch|stop)
MAXOVERTIME=15
+
  killall $IPBAND
+
  # smazat iptables pravidla (chyby ignorovat, pokud neexistuji)
# doba, na jakou danou IP zabanujeme (minut)
+
  $IPTABLES -F SOSACI &> /dev/null
BANTIME=180
+
  $IPTABLES -D FORWARD -j SOSACI &> /dev/null
+
  $IPTABLES -X SOSACI &> /dev/null
# interface ktery sledujeme
+
  exit 0
WATCHIF=eth2
+
  ;;
+
 
# podsite ktere sledujeme
+
  restart)
WATCHNET=10.107.12.0/24:10.107.42.0/24
+
  $0 stop
+
  $0 start
# jak je definovana denni doba (7:00-23:00)
+
  exit 0
# 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"
+
  *)
+
  echo "usage: $0 startwatch|stopwatch|start|stop|restart|report|cronjob"
KLADIVO=/root/kladivo.sh
+
  exit 1
LISTDIR=/var/lib/kladivo
+
  ;;
+
esac
IPTABLES=/sbin/iptables
+
</bash>
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
 
  
 
CGI skript pro sledování stavu černé listiny:
 
CGI skript pro sledování stavu černé listiny:
  
#!/bin/sh
+
<bash>#!/bin/sh
#
+
#
#Verze 1.01
+
#Verze 1.01
#Autor PavKriz
+
#Autor PavKriz
#  
+
#  
LISTDIR=/var/lib/kladivo
+
LISTDIR=/var/lib/kladivo
+
 
SEP="--------------------------------------------"
+
SEP="--------------------------------------------"
echo "Content-type: text/plain"
+
echo "Content-type: text/plain"
echo ""
+
echo ""
TODAY=`date`
+
TODAY=`date`
echo "Report k datu: $TODAY"
+
echo "Report k datu: $TODAY"
echo $SEP
+
echo $SEP
NOW=`date +%s`
+
NOW=`date +%s`
+
 
    for FILE in $LISTDIR/* ; do
+
  for FILE in $LISTDIR/* ; do
        echo "$FILE" | grep archive &>/dev/null && continue
+
      echo "$FILE" | grep archive &>/dev/null && continue
        if [ -e "$FILE" ]; then
+
      if [ -e "$FILE" ]; then
            IP=`basename $FILE`
+
          IP=`basename $FILE`
            HOST=`host $IP | awk "{ print \\$5 }"`
+
          HOST=`host $IP | awk "{ print \\$5 }"`
            BANTO=`head -n 1 $FILE`
+
          BANTO=`head -n 1 $FILE`
            UNBAN=`expr $BANTO - $NOW`
+
          UNBAN=`expr $BANTO - $NOW`
            UNBAN=`expr $UNBAN / 60`
+
          UNBAN=`expr $UNBAN / 60`
            # print report
+
          # print report
            echo "Host: $HOST ($IP)"
+
          echo "Host: $HOST ($IP)"
            echo "Minutes to unban: $UNBAN"
+
          echo "Minutes to unban: $UNBAN"
            echo "Ban-causing report:"
+
          echo "Ban-causing report:"
            tail +8 $FILE
+
          tail +8 $FILE
            echo
+
          echo
        fi
+
      fi
    done
+
  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

  1. Verze 1.06 -> doplnujte aktualni verzi
  2. autor pavkriz@hkfree.org
  3. iptables rules kendy@hkfree.org
  4. detekce casoveho useku jezz@hkfree.org
  1. rychlostni limit v kB/s

LIMIT=70

  1. maximalni doba na jakou lze prekrocit limit (minut)

MAXOVERTIME=15

  1. doba, na jakou danou IP zabanujeme (minut)

BANTIME=180

  1. interface ktery sledujeme

WATCHIF=eth2

  1. podsite ktere sledujeme

WATCHNET=10.107.12.0/24:10.107.42.0/24

  1. jak je definovana denni doba (7:00-23:00)
  2. muze se prehoupnout pres pulnoc, pak je prvni cislo vetsi nez druhe (700-200)
  3. 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

  1. Verze 1.01
  2. 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"