• Форум посвящен самостоятельной (бесплатной) защите от ддос атак.
    Есть мануалы по настройке сервера от Ddos для сисадминов и готовые инструменты от ддос-атак для вебмастеров.

    Простое, эффективное, точное и проверенное бесплатное решение от мощных ддос-атак: PHP скрипт + Cloudflare, с панелью управления.

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

A

adm

Администратор
Команда форума
Администрация
#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 <[email protected]>                        #
 
##############################################################################
 
# 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 <[email protected]>"
    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.

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