Перейти к собственно контенту

Архив

Метка: ddos

Добавляем в конфиг nginx в секцию http такие строки:

## FastCGI Cache
open_file_cache max=1000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
fastcgi_cache_path /tmp/nginx/cache levels=2 keys_zone=sites:100m inactive=1d max_size=10g;

и в описание вирт хоста в секцию сервер пишем:

### Fast-CGI Cache

location / {
if ($request_uri ~* "\.(ico|css|js|gif|jpe?g|png)$") {
expires max;

}
}

if ($http_cookie ~* "comment_author_|wordpress_(?!test_cookie)|wp-postpass_" ) {
set $do_not_cache 1;
}

fastcgi_cache_bypass $do_not_cache;
fastcgi_no_cache $do_not_cache;
fastcgi_pass_header Cookie;
fastcgi_cache sites;
fastcgi_cache_key $request_method|$host|$request_uri;
fastcgi_cache_valid 301 8h;
fastcgi_cache_valid 404 1h;
fastcgi_cache_valid 200 1h;

Создаем каталог для кеша и выставляем права:
mkdir -p /tmp/nginx/cache
chmod -R 777 /tmp/nginx/cache

Перезапускаем nginx :

/usr/local/etc/rc.d/nginx restart

Лазаем по сайту и смотри в каталог с кешем:

deathstar# ls /tmp/nginx/cache
00 0e 1c 2a 38 46 54 62 70 7e 8c 9a a8 b6 c4 d2 e0 ee fc
01 0f 1d 2b 39 47 55 63 71 7f 8d 9b a9 b7 c5 d3 e1 ef fd
02 10 1e 2c 3a 48 56 64 72 80 8e 9c aa b8 c6 d4 e2 f0 fe
03 11 1f 2d 3b 49 57 65 73 81 8f 9d ab b9 c7 d5 e3 f1 ff
04 12 20 2e 3c 4a 58 66 74 82 (далее…)

!!!! Из-за неправильного отображения данных конфигов в WordPress выложил их здесь.
Устанавливаем fail2ban
deathstar# cd /usr/ports/secuity/py-fail2ban && make install clean
Правим конфиг
deathstar# ee /usr/local/etc/fail2ban/jail.conf
У меня он выглядит так
[DEFAULT]
# Какие IP игнорировать
ignoreip = 127.0.0.1
# Время бана в секундах
bantime = 600
# время проверки,за которое событие успеет повторится, чтоб отловить и забанить
findtime = 600
# кол-во неверных попыток
maxretry = 1
backend = auto

[ssh-ipfw]
enabled = true
# использовать фильтр из примеров
filter = bsd-sshd
# использовать /action.d/bsd-ipfw.conf
action = ssh-ipfw[localhost=78.24.219.97]
# Уведомление в Jabber :))
jabber-whois[name="SSH,IPFW", dest=deathstar@deathstar.name]
# Какой лог парсить
logpath = /var/log/auth.log
# Какой Ip игнорировать
ignoreip = 127.0.0.1

[exim-ipfw]
enabled = true
filter = exim
action = exim-ipfw[localhost=78.24.219.97]
jabber-whois[name="Exim,IPFW", dest=deathstar@deathstar.name]
logpath = /var/log/exim/mainlog
ignoreip = 127.0.0.1

[nginx-ipfw]
enabled = true
filter = nginx
action = nginx-ipfw[localhost=127.0.0.1]
jabber-whois[name="Nginx,IPFW", dest=deathstar@deathstar.name]
logpath = /home/deathstar/www/deathstar.name.access.log
ignoreip = 127.0.0.1

Для уведомления в Jabber должен быть установлен и настроен sendxmpp ( о нем я писал в предыдущих статьях)
Создаем файл /usr/local/etc/fail2ban/action.d/jabber-whois.conf с таким содержимым

[Definition]
actionstart = printf %%b "[Fail2Ban] : started
The jail
has been started successfully.\n
" | /usr/local/bin/sendxmpp ""

actionstop = printf %%b "[Fail2Ban] : stopped
The jail
has been stopped.\n
" | /usr/local/bin/sendxmpp ""

actioncheck =

actionban = printf %%b "[Fail2Ban] : banned
The IP
has just been banned by Fail2Ban after
(далее…)

Активируем IPFW
Добавим в /etc/rc.conf

firewall_enable="YES"
firewall_script="/etc/ddos.sh"
firewall_logging="YES"

Создаем наш файерволл в файл /etc/ddos

#!/bin/sh
ipfw='/sbin/ipfw -q'
${ipfw} flush
${ipfw} add check-state
${ipfw} table 1 flush
${ipfw} add deny ip from table\(1\) to me
${ipfw} add allow all from any to any

Пишем парсер логов и добавляем их в черный список
Создадим файл /etc/ban.sh, который будет собирать IP и добавлять их в table1

#!/bin/sh
echo '' > /etc/bl
cat /var/log/nginx/deathstar.name.access.log | awk ' match($0, /(\d*.\d*.\d*.\d*).*"-" "-"/) {print $1}' | sort | uniq >> /etc/bl
/sbin/ipfw table 1 flush
cat /etc/bl | awk '{ if ($1!="") {system("/sbin/ipfw table 1 add "$1"")} }' > /dev/null

Добавить в cron задание

*/1 * * * * root /etc/ban.sh

Не плохо бы добавить в конфиг nginx следующее:

if ($http_user_agent ~* "(vaginamook|2003100|ODI3|Hotbar|4.75|DigExt|20030718|Q312461|H010818|inktomi|googlebawt|FAST-WebCrawler|Microsoft-WebDAV-MiniRedir|F
return 403;
}