Борьба с DDOS посредством использования утилиты ipset на выделенных серверах с Debian

  • XJIOP
  • 14 июля 2014 в 16:29
  • СисАдмин 
  • -= SYSOP =-
    • Рейтинг: 3
    • Комментариев: 398
    • Загрузили: 1.34 ТБ
    • Скачали: 483.43 ГБ
    Тянем последний patch-o-matic-ng в /usr/src, распаковываем, заходим в директорию и стартуем ./runme set.
    При этом подразумевается что исходники текущего ядра находятся в /usr/src/linux, а iptables - в /usr/src/iptables.
    После заходим в /usr/src/linux и делаем make oldconfig, где указываем поддержку фич ipset модулями.

    Собираем и устанавливаем ядро:
    # make-kpkg --bzImage kernel_image
    # dpkg -i /usr/src/linux-image-x.x.x-blablabla.deb
    Устанавливаем ipset из репозитория:
    apt-get install ipset
    Добавляем загрузку модуля ipset в /etc/modules и либо загружаем модуль modprobe ipset, либо перезагружаемся в новое ядро.
    Создаем хеш ip-адресов для использования в правилах iptables. Стоит учесть, что максимальное количество ip в списке - 65536 штук:
    # ipset -N blacklist iphash
    Создаем перловый скрипт /root/antiddos/num-filter.pl для отбора ip-адресов, с которых идет большое количество одинаковых запросов:
    #!/usr/bin/perl
    while ($line = <STDIN>) {
    if ($line =~ /^\s+(\d+) (\d+)\.(\d+)\.(\d+)\.(\d+)/) {
    print $2, ".", $3, ".", $4, ".", $5, "\n" if ($1 > $ARGV[0]);
    }
    }
    Создаем скрипт /root/antiddos/blacklist.sh для cron:
    #!/bin/bash
    # variables, change them to get script work
    BADREQUEST="GET / HTTP/1.1";
    LOGPATH="/home/clients/login_ftp0/domains/domain.com/logs/access_log";
    MINREQUESTS="50";
    SCRIPTHOME="/root/antiddos";
    # don't change anything bellow
    grep "$BADREQUEST}" $LOGPATH | awk -F ' ' '{ print $ 1 }' | sort | uniq -c | ${SCRIPTHOME}/num-filter.pl $MINREQUESTS >> ${SCRIPTHOME}/in_blacklist.add.pre
    sort -u < {SCRIPTHOME}/in_blacklist.add.pre > ${SCRIPTHOME}/in_blacklist.add
    cat ${SCRIPTHOME}/in_blacklist.add > ${SCRIPTHOME}/in_blacklist
    for i in `cat ${SCRIPTHOME}/in_blacklist`;
    do
    /usr/sbin/ipset -q -A blacklist $i;
    done
    Добавляем правила для iptables:
    /sbin/iptables -F
    /sbin/iptables -X DDOS_HTTP_FILTER
    /sbin/iptables -N DDOS_HTTP_FILTER
    /sbin/iptables -A DDOS_HTTP_FILTER -d $IP -p tcp --syn --dport 80 -m set --set blacklist src -j DROP
    /sbin/iptables -A DDOS_HTTP_FILTER -d $IP -p tcp --syn --dport 80 -m hashlimit --hashlimit 10/min --hashlimit-burst 30 --hashlimit-mode srcip --hashlimit-name DDOS --hashlimit-htable-size 32768 --hashlimit-htable-max 32768 --hashlimit-htable-gcinterval 1000 --hashlimit-htable-expire 100000 -j ACCEPT
    /sbin/iptables -A DDOS_HTTP_FILTER -d $IP -p tcp --dport 80 --syn -j DROP
    /sbin/iptables -A DDOS_HTTP_FILTER -d $IP -p tcp --syn --dport 80 -m connlimit --connlimit-above 10 -j DROP
    /sbin/iptables -A DDOS_HTTP_FILTER -j ACCEPT
    /sbin/iptables -A INPUT -p tcp --dport http -j DDOS_HTTP_FILTER
    Добавляем запуск скрипта /root/antiddos/blacklist.sh в крон с интервалом в 10 минут.

    --------------------

    for (;;) { echo rand(0,1); }
    Файлы обмена предоставлены пользователями трекера, администрация не несет ответственность за их содержание. Большая просьба не заливать файлы, защищенными авторскими правами, а так же файлы с нелегальным содержанием.
    Рейтинг торрент трекеров