zoukankan      html  css  js  c++  java
  • 超级NB的防DDOS(小量级)攻击的脚本

    # tree /usr/local/ddos/
    /usr/local/ddos/
    ├── ddos.conf
    ├── ddos.sh
    ├── ignore.ip.list
    └── LICENSE
    
    0 directories, 4 files
    # ll /usr/local/sbin/ddos 
    lrwxrwxrwx 1 root root 23 Sep 13 15:36 /usr/local/sbin/ddos -> /usr/local/ddos/ddos.sh
    # cat /etc/cron.d/ddos.cron 
    SHELL=/bin/sh
    */1 * * * * root /usr/local/ddos/ddos.sh >/dev/null 2>&1

    查看关键的几个脚本:

    # cat ddos.conf 
    ##### Paths of the script and other files
    PROGDIR="/usr/local/ddos"
    PROG="/usr/local/ddos/ddos.sh"
    IGNORE_IP_LIST="/usr/local/ddos/ignore.ip.list"
    CRON="/etc/cron.d/ddos.cron"
    APF="/etc/apf/apf"
    IPT="/sbin/iptables"
    
    ##### frequency in minutes for running the script
    ##### Caution: Every time this setting is changed, run the script with --cron
    #####          option so that the new frequency takes effect
    FREQ=1
    
    ##### How many connections define a bad IP? Indicate that below.
    NO_OF_CONNECTIONS=150
    
    ##### APF_BAN=1 (Make sure your APF version is atleast 0.96)
    ##### APF_BAN=0 (Uses iptables for banning ips instead of APF)
    #APF_BAN=1
    APF_BAN=0
    
    ##### KILL=0 (Bad IPs are'nt banned, good for interactive execution of script)
    ##### KILL=1 (Recommended setting)
    KILL=1
    
    ##### An email is sent to the following address when an IP is banned.
    ##### Blank would suppress sending of mails
    EMAIL_TO="xxx@xxx.com"
    
    ##### Number of seconds the banned ip should remain in blacklist.
    BAN_PERIOD=600
    # cat ddos.sh 
    #!/bin/sh
    ##############################################################################
    # DDoS-Deflate version 0.6 Author: Zaf <zaf@vsnl.com>                        #
    ##############################################################################
    # This program is distributed under the "Artistic License" Agreement         #
    #                                                                            #
    # The LICENSE file is located in the same directory as this program. Please  #
    #  read the LICENSE file before you make copies or distribute this program   #
    ##############################################################################
    load_conf()
    {
        CONF="/usr/local/ddos/ddos.conf"
        if [ -f "$CONF" ] && [ ! "$CONF" ==    "" ]; then
            source $CONF
        else
            head
            echo "$CONF not found."
            exit 1
        fi
    }
    
    head()
    {
        echo "DDoS-Deflate version 0.6"
        echo "Copyright (C) 2005, Zaf <zaf@vsnl.com>"
        echo
    }
    
    showhelp()
    {
        head
        echo 'Usage: ddos.sh [OPTIONS] [N]'
        echo 'N : number of tcp/udp    connections (default 150)'
        echo 'OPTIONS:'
        echo '-h | --help: Show    this help screen'
        echo '-c | --cron: Create cron job to run this script regularly (default 1 mins)'
        echo '-k | --kill: Block the offending ip making more than N connections'
    }
    
    unbanip()
    {
        UNBAN_SCRIPT=`mktemp /tmp/unban.XXXXXXXX`
        TMP_FILE=`mktemp /tmp/unban.XXXXXXXX`
        UNBAN_IP_LIST=`mktemp /tmp/unban.XXXXXXXX`
        echo '#!/bin/sh' > $UNBAN_SCRIPT
        echo "sleep $BAN_PERIOD" >> $UNBAN_SCRIPT
        if [ $APF_BAN -eq 1 ]; then
            while read line; do
                echo "$APF -u $line" >> $UNBAN_SCRIPT
                echo $line >> $UNBAN_IP_LIST
            done < $BANNED_IP_LIST
        else
            while read line; do
                echo "$IPT -D INPUT -s $line -j DROP" >> $UNBAN_SCRIPT
                echo $line >> $UNBAN_IP_LIST
            done < $BANNED_IP_LIST
        fi
        echo "grep -v --file=$UNBAN_IP_LIST $IGNORE_IP_LIST > $TMP_FILE" >> $UNBAN_SCRIPT
        echo "mv $TMP_FILE $IGNORE_IP_LIST" >> $UNBAN_SCRIPT
        echo "rm -f $UNBAN_SCRIPT" >> $UNBAN_SCRIPT
        echo "rm -f $UNBAN_IP_LIST" >> $UNBAN_SCRIPT
        echo "rm -f $TMP_FILE" >> $UNBAN_SCRIPT
        . $UNBAN_SCRIPT &
    }
    
    add_to_cron()
    {
        rm -f $CRON
        sleep 1
        service crond restart
        sleep 1
        echo "SHELL=/bin/sh" > $CRON
        if [ $FREQ -le 2 ]; then
            echo "0-59/$FREQ * * * * root /usr/local/ddos/ddos.sh >/dev/null 2>&1" >> $CRON
        else
            let "START_MINUTE = $RANDOM % ($FREQ - 1)"
            let "START_MINUTE = $START_MINUTE + 1"
            let "END_MINUTE = 60 - $FREQ + $START_MINUTE"
            echo "$START_MINUTE-$END_MINUTE/$FREQ * * * * root /usr/local/ddos/ddos.sh >/dev/null 2>&1" >> $CRON
        fi
        service crond restart
    }
    
    
    load_conf
    while [ $1 ]; do
        case $1 in
            '-h' | '--help' | '?' )
                showhelp
                exit
                ;;
            '--cron' | '-c' )
                add_to_cron
                exit
                ;;
            '--kill' | '-k' )
                KILL=1
                ;;
             *[0-9]* )
                NO_OF_CONNECTIONS=$1
                ;;
            * )
                showhelp
                exit
                ;;
        esac
        shift
    done
    
    TMP_PREFIX='/tmp/ddos'
    TMP_FILE="mktemp $TMP_PREFIX.XXXXXXXX"
    BANNED_IP_MAIL=`$TMP_FILE`
    BANNED_IP_LIST=`$TMP_FILE`
    echo "Banned the following ip addresses on `date`" > $BANNED_IP_MAIL
    echo >>    $BANNED_IP_MAIL
    BAD_IP_LIST=`$TMP_FILE`
    netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr > $BAD_IP_LIST
    cat $BAD_IP_LIST
    if [ $KILL -eq 1 ]; then
        IP_BAN_NOW=0
        while read line; do
            CURR_LINE_CONN=$(echo $line | cut -d" " -f1)
            CURR_LINE_IP=$(echo $line | cut -d" " -f2)
            if [ $CURR_LINE_CONN -lt $NO_OF_CONNECTIONS ]; then
                break
            fi
            IGNORE_BAN=`grep -c $CURR_LINE_IP $IGNORE_IP_LIST`
            if [ $IGNORE_BAN -ge 1 ]; then
                continue
            fi
            IP_BAN_NOW=1
            echo "$CURR_LINE_IP with $CURR_LINE_CONN connections" >> $BANNED_IP_MAIL
            echo $CURR_LINE_IP >> $BANNED_IP_LIST
            echo $CURR_LINE_IP >> $IGNORE_IP_LIST
            if [ $APF_BAN -eq 1 ]; then
                $APF -d $CURR_LINE_IP
            else
                $IPT -I INPUT -s $CURR_LINE_IP -j DROP
            fi
        done < $BAD_IP_LIST
        if [ $IP_BAN_NOW -eq 1 ]; then
            dt=`date`
            if [ $EMAIL_TO != "" ]; then
                cat $BANNED_IP_MAIL | mail -s "IP addresses banned on $dt" $EMAIL_TO
            fi
            unbanip
        fi
    fi
    rm -f $TMP_PREFIX.*
    # cat ignore.ip.list 
    127.0.0.1
    10.100.0.5
    #不防御的ip

     注意权限:

    # ll /etc/cron.d/ddos.cron 
    -rw-r--r-- 1 root root 71 Sep 14 17:13 /etc/cron.d/ddos.cron

    注意软连接:

    # ll /usr/local/sbin/ddos 
    lrwxrwxrwx 1 root root 23 Sep 13 15:36 /usr/local/sbin/ddos -> /usr/local/ddos/ddos.sh
  • 相关阅读:
    面试题3,求101-200之间有多少个素数,并且输出所有素数
    面试题2,兔子问题
    plsql 导入导出表数据与表结构
    plsql 的各个窗口区别
    oracle cmd命令
    ora-01017 用户名密码未登录
    PLSQL登录报错ORA-12154
    看oracle 的数据库位数
    plsql Developer 登录oracle出现 initialization error
    plsql dev 12 版下载地址
  • 原文地址:https://www.cnblogs.com/bass6/p/7522089.html
Copyright © 2011-2022 走看看