Взял Xen VPS, поставил на нем MTA, джаббер, еще какие то приблуды. Приходит письмо через неделю от хостера
Здравствуйте,
было получено сообщение о недоступности Вашего ВПСа, после перезагрузки, Ваш ВПС не запустился, вынуждены были сделать релоад ОС,
старый раздел был смотнирован в папку /root/hdd_old, скопируйте, пожалуйста необходимую информацию и сообщите, для того, что бы отключить старый раздел.
Пиздец, дорогая редакция. Ваше ядро не загрузилось, мы накатали вам новую ось.
Вы видели когда нибудь папочку весом 1Gb? Имеется в виду вес не содержимого низлежащих файлов, а вес самой папочки, т.е. листинг имен файлов весом 1Gb… около 13млн инод внутри…
При скорости удаления около 100 файлов в секунду, а файлов более 10 млн, можно идти спать….
Дальнейшее вскрытие показало что в папочке были файлы сессий php. На Debian Lenny почему то выпиливатель старых файлов сессий выключен по дефолту:
hosted-by:~>grep-B5 session.gc_probability /etc/php5/apache2/php.ini
; This is disabled in the Debian packages, due to the strict permissions
; on /var/lib/php5. Instead of setting this here, see the cronjob at
; /etc/cron.d/php5, which uses the session.gc_maxlifetime setting below.
; php scripts using their own session.save_path should make sure garbage
; collection is enabled by setting session.gc_probability
;session.gc_probability = 0
Вопиющее распиздяйство. Хотя скорей всего дело в нестандартном расположении session.save_path, который ставит ISP Manager.
server {
listen x.x.x.x default deferred;
log_format IP $remote_addr;
location / {
proxy_pass http://127.0.0.1/;
…. access_log /var/log/nginx/ipban IP;
apache: ServerLimit и MaxClients установить так, чтобы не засрало более чем 80% памяти. (В top’е можно глянуть сколько памяти потребляет каждый процесс).
Собсно скрипт. Запускается по крону раз в минуту и банит нах айпи, которые за эту минуту обратились к скриптовой части более 20 раз.
#!/usr/bin/perl
system (‘mv /var/log/nginx/ipban /var/log/nginx/ipban.proc’);
system (‘touch /var/log/nginx/ipban’);
system («/etc/init.d/nginx reload»);
open $f,’/var/log/nginx/ipban.proc’;
%h=();
while (<$f>) {
chomp;
if (/\d+\.\d+\.\d+\.\d+/) {
unless ($h{$_}) {
$h{$_}=1;
} else {
$h{$_}++;
}
}
}
20 -число вычисленное в ходе проб и ошибок применительно к этому серверу и location’у nginx. После того как скрипт беспощадно побанил 2к хостов, сервер начал подавать внешние признаки жизни, после 3к забаненых зомби начала грузицца морда.
В процессе работы мой рабочий комп был дважды забанен в ходе экспериментов ))
Более серъезный DDOS конечно будет трудно отбивать тупой банилкой.
АПДЕЙТ. Время шло, таблица бана росла, ддосеры не унимались.
Поставил вот эту хрень
Софтина умеет вообще много чего. Но практически все что она умеет бесполезно. Кроме temporary ban ip address.
В конфигах отключил практически все, ибо оно (все) мешало. Мне надо было от этой проги только то, чтобы она банила айпи с TTL. Т.е. на время. И крон стал пускать раз в 5 минут.
Соответственно, в кроновом скрипте поменял
if ($h{$k} > 20) {
system («iptables -I INPUT -s $k -j DROP»);
На
if ($h{$k} > 60) {
system («/usr/sbin/csf –tempdeny $k 28800″);
Так же цель атаки – страницу, сделал статичной. ДДОС просел, сайт ожил.