Защита от небольших ддос атак с помощью ssh-скрипта

Тема в разделе "Защита от Ddos-атак", создана пользователем Devider, 28 сен 2013.

  1. Защищаться даже от небольших DDoS-атак при помощи PHP-скриптов крайне неэффективно. Относительно эффективную защиту можно обеспечить, используя shell, однако постоянное использование этих скриптов снизит производительность системы.


    ddos.conf - файл с настройками для скрипта
    Код:
     
    ##### Пути к скриптам
     
    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"
     
     
    ##### указываем время как часто будет запускаться скрипт.
     
    ##### чем чаще он будет запускаться тем сильнее нагрузка на процессор, поэтому, если ддос-атака прекратилась, скрипт надо отключать.
     
    FREQ=1
     
    ##### Предел подключений для айпи, то что больше этого предела - заносится в бан-лист.
     
    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
     
    ##### 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="root"
     
    ##### Number of seconds the banned ip should remain in blacklist.
     
    BAN_PERIOD=600
    ignore.ip.list - в этом файле указываем список IP - исключений. Можно добавить туда свой IP адрес.

    Код:
    127.0.0.1

    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.*
    Для активации скрипта вам необходимо изменить права доступа к ssh-файлу, установив значение 755 (chmod 755 - каждый пользователь имеет право читать и запускать файл на исполнение; владелец может редактировать). Если, при этом, выполнить команду
    "/usr/local/ddos/ddos.sh --cron > /dev/null 2>&1", то скрипт будет запускаться автоматически (с интервалом в 1 минуту) при помощи крона (служба, отвечающая за автоматическое выполнение отложенных задач).

    Вышеупомянутый скрипт отслеживает количество соединений с сервером, выполняемых
    с одного IP-адреса. Если число соединений превышает значение, указанное в файле
    ddos.conf, скрипт банит такой IP-адрес, закрывая доступ к серверу посредством iptables.

    Один из минусов вышеописанного способа защиты от DDoS-атак состоит в том, что он
    подходит лишь для выделенных или же виртуальных выделенных серверов, так как на
    обычном хостинге менять настройки подобным образом нельзя.

    В любом случае данный способ защиты от DDoS-атак далеко не панацея. При относительно серьёзной DDoS-атаке этот способ, в лучшем случае, позволит лишь спасти ваш сервер от «смерти». Кроме того, если посредством сервера, который вы хотите защитить, предоставляются какие либо услуги, например, редирект с другого сервера, с использованием директивы proxy_pass, вам необходимо добавить IP-адреса этого сервера в список исключений или же активировать скрипт лишь при выявлении DDoS-атаки.

    Оптимальным решением проблемы может стать использование аппаратного фаервола (межсетевой экран), который бы блокировал отдельные IP-адреса, число подключений с которых превышает заданное значение.

    Если у вас есть доступ к iptables, и вы не планируете работать в китайском или корейском сегменте сети Интернет, то можно заблокировать большинство китайских/корейских IP-адресов, используя правила, изложенные на сайте okean.com.

    Практика показывает, что подобные меры снижают количество атак и усложняют жизнь кибершпионам.
     
    28 сен 2013

Поделиться этой страницей