Игорь Олемской — практические заметки по системному администрированию Linux CentOS

Архив тега ‘Происшествия’

Ваша OS была переустановлена (перепечатка)

Комментариев нет

Взял Xen VPS, поставил на нем MTA, джаббер, еще какие то приблуды. Приходит письмо через неделю от хостера

Здравствуйте,

было получено сообщение о недоступности Вашего ВПСа, после перезагрузки, Ваш ВПС не запустился, вынуждены были сделать релоад ОС,

старый раздел был смотнирован в папку /root/hdd_old, скопируйте, пожалуйста необходимую информацию и сообщите, для того, что бы отключить старый раздел.

Пиздец, дорогая редакция. Ваше ядро не загрузилось, мы накатали вам новую ось.

Директория весом в 1Гб (перепечатка)

Комментариев нет

Вы видели когда нибудь папочку весом 1Gb? Имеется в виду вес не содержимого низлежащих файлов, а вес самой папочки, т.е. листинг имен файлов весом 1Gb… около 13млн инод внутри…

hosted-by:/> stat /var/www/admin/data/mod-tmp
  File: `/var/www/admin/data/mod-tmp'
  Size: 1022976000      Blocks: 1999960    IO Block: 4096   directory
Device: 802h/2050d      Inode: 11403505    Links: 2
Access: (2700/drwx--S---)  Uid: (   33/www-data)   Gid: (  502/   admin)
Access: 2011-05-30 23:44:44.000000000 +0300
Modify: 2011-05-30 08:36:27.000000000 +0300
Change: 2011-05-30 08:36:27.000000000 +0300


При попытке просмотра папочки, ls задумывается минут на 20, а потом выдает:

hosted-by:/> ls -1 /var/www/admin/data/mod-tmp > /tmp/ls
ls: memory exhausted

Поступили жалобы на «некорректную работу сервера». Да я думаю некорректная…

hosted-by:/> df -i
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/sda2            14884864 14884864       0  100% /

Найти потенциальных пожирателей инод смог по команде

find / -type d -size +100k -print

На этой папочке find заткнулся навечно, что навело на мысль.

Диагноз: рак. Лечение: ампутация.

screen
rm -rf /var/www/admin/data/mod-tmp && mkdir /var/www/admin/data/mod-tmp && chmod 777 /var/www/admin/data/mod-tmp

При скорости удаления около 100 файлов в секунду, а файлов более 10 млн, можно идти спать….

Дальнейшее вскрытие показало что в папочке были файлы сессий php. На Debian Lenny почему то выпиливатель старых файлов сессий выключен по дефолту:

hosted-by:~> grep -B 5 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.

Отбил небольшой DDOS ;) (перепечатка)

Комментариев нет

DDOS на HTTP 20 Мбит входящего. Отбито софтварным костылем 8-)

Конфигурация машины: Quad Core Xeon / 4G RAM, CentOS 5.3 x86_64

Сервисы: apache (back) + nginx (front)

Sysctl:

kernel.shmall = 4294967296
vm.min_free_kbytes=70000
net.core.somaxconn=65536
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_tw_recycle=1
net.ipv4.ip_local_port_range = 2000 61000
net.ipv4.tcp_fin_timeout = 25
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_window_scaling = 0
net.ipv4.tcp_timestamps = 0
net.core.rmem_max=8388608
net.core.wmem_max=16777216
net.ipv4.tcp_no_metrics_save=0
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 87380 16777216
net.core.netdev_max_backlog=65536
net.ipv4.tcp_max_syn_backlog=4096
net.ipv4.ip_conntrack_max=300000

nginx:

worker_rlimit_nofile 80000;
events {
worker_connections  65536;
use epoll;
}

http {
gzip off; # ;)
keepalive_timeout  0;
server_tokens off;
reset_timedout_connection on;

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{$_}++;
}
}
}

close $f;

foreach $k (keys (%h)) {
if ($h{$k} > 20) {
system («iptables -I INPUT -s $k -j DROP»);
print «$k banned\n»;
}
}

20 -число вычисленное в ходе проб и ошибок применительно к этому серверу и location’у nginx. После того как скрипт беспощадно побанил 2к хостов, сервер начал подавать внешние признаки жизни, после 3к забаненых зомби начала грузицца морда.

В процессе работы мой рабочий комп был дважды забанен в ходе экспериментов ))

Более серъезный DDOS конечно будет трудно отбивать тупой банилкой.

АПДЕЙТ. Время шло, таблица бана росла, ддосеры не унимались.

Поставил вот эту хрень http://www.configserver.com/cp/csf.html

Софтина умеет вообще много чего. Но практически все что она умеет бесполезно. Кроме 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″);

Так же цель атаки – страницу, сделал статичной.  ДДОС просел, сайт ожил.