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

Архив тега ‘атака’

Отбил небольшой 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″);

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