User Tools

Site Tools


Sidebar


Tags Cloud
ddos_ipset

This is an old revision of the document!


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

  • Тянем последний 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 < 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:
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m set --set blacklist src,dst -j DROP
  • Добавляем запуск скрипта /root/antiddos/blacklist.sh в крон с интервалом в 10 минут.
ddos_ipset.1196243157.txt.gz · Last modified: 2007/11/28 09:45 by kyxap