вторник, 26 августа 2014 г.

Защита от DDoS. Скрипт (D)DoS Deflate

UPD: 18.02.2015
Я немного допилил скрипт, инструкция по установке на GitHub: https://github.com/Amet13/ddos-deflate
Все что описано ниже, я делал гораздо раньше.

На днях  сервер упал под DDoS. До этого момента защищался от них только самопальным скриптом и модулем GeoIP для nginx. Однако в этот раз нагрузка была слишком большая, поэтому скрипт и nginx не справились.
В связи с этим я нашёл в интернете скрипт, который позволяет защититься от некоторых видов DDoS, от заказных атак он конечно не спасёт, но большинство отразить он способен.
В своей основе скрипт использует команду:
# netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
141 1.2.3.4
 26 5.4.3.2
 20 8.7.6.5
...
которая выявляет число открытых соединений с каждого адреса, и в случае если соединений много, то адрес блокируется на определённое время.

Установка:
# cd /tmp
# wget http://www.inetbase.com/scripts/ddos/install.sh
# chmod 0700 install.sh
# ./install.sh

Редактируем конфигурационный файл скрипта. Я изменил только два значения:
# vim /usr/local/ddos/ddos.conf
# вместо APF используем IPTables
APF_BAN=0
# куда отправляем письма
EMAIL_TO="[email protected]"

Добавляем адреса, которые будут игнорироваться скриптом:
# vim /usr/local/ddos/ignore.ip.list
127.0.0.1
1.2.3.4
2.2.2.2

Скрипт не идеален и в нём много косяков, по крайней мере на Debian 7.
Дальше буду их исправлять.

Пробуем запустить скрипт:
# /usr/local/ddos/ddos.sh -c
./ddos.sh: 13: [: /usr/local/ddos/ddos.conf: unexpected operator
DDoS-Deflate version 0.6
Copyright (C) 2005, Zaf <[email protected]>

$CONF not found.

Для устранения этого косяка нужно уже исправить в /usr/local/ddos/ddos.sh:
#!/bin/sh
на
#!/bin/bash

Проверяем снова:
# /usr/local/ddos/ddos.sh -c
./ddos.sh: 14: ./ddos.sh: source: not found
crond: unrecognized service
./ddos.sh: 72: ./ddos.sh: cannot create : Directory nonexistent
./ddos.sh: 73: [: -le: unexpected operator
./ddos.sh: 76: ./ddos.sh: let: not found
./ddos.sh: 77: ./ddos.sh: let: not found
./ddos.sh: 78: ./ddos.sh: let: not found
./ddos.sh: 79: ./ddos.sh: cannot create : Directory nonexistent
crond: unrecognized service

В Debian сервис крона называется cron, а не crond.
Нужно исправить в файле /usr/local/ddos/ddos.sh везде:
crond 
на 
cron

Проверяем:
# /usr/local/ddos/ddos.sh -c
[ ok ] Restarting periodic command scheduler: cron[....] Stopping periodic command scheduler: cron.
[ ok ] Starting periodic command scheduler: cron.
[ ok ] Restarting periodic command scheduler: cron[....] Stopping periodic command scheduler: cron.
[ ok ] Starting periodic command scheduler: cron.

Теперь всё ок.

Удаление скрипта:
# cd /tmp
# wget http://www.inetbase.com/scripts/ddos/uninstall.ddos
# chmod 0700 uninstall.ddos
# ./uninstall.ddos

Исправления тут: https://github.com/Amet13/ddos-deflate

1 комментарий:

Ярослав комментирует...

При удачной настройке iptables nginx попросту блокирует атакующие адреса и они не нагружают системные ресурсы сервера, ну а для решения серьезных проблем нужная хорошая аппаратная защита. Могу порекомендовать ребят из Simplyway. отлично справляются с ддос атаками