защита сервера от DoS ((D)DoS Deflate)

Thank you for reading this post, don't forget to subscribe!

Ока­зы­ва­ет­ся мож­но попы­тать­ся защи­тить свой сер­вер от DoS посред­ством (D)DOS DEFLATE, это сце­на­рий, кото­рый на пери­о­дич­ной осно­ве про­ве­ря­ет коли­чет­сво исполь­зу­е­мых под­клю­че­ний с одно­го IP адре­са, про­ве­рить нали­чие таких под­клю­че­ний мож­но командой:

netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n

При нали­чии под­клю­че­ний более чем обо­зна­чи­ли Вы, дан­ный IP бло­ки­ру­ет­ся, бла­го­да­ря создан­но­му авто­ма­ти­че­ски скрип­том пра­ви­лу в iptables.

Установка (D)DoS Deflate

Про­ис­хо­дит посред­ством загруз­ки уста­но­воч­но­го скрип­та, ука­за­ни­ем раз­ре­ше­ний на запуск и соб­ствен­но запуск установки:

wget http://www.inetbase.com/scripts/ddos/install.sh
chmod 0700 install.sh
./install.sh

Удаление (D)DoS Deflate

Про­ис­хо­дит в ана­ло­гич­ном поряд­ке, за исклю­че­ни­ем загру­жа­е­мо­го скрипта:

wget http://www.inetbase.com/scripts/ddos/uninstall.ddos
chmod 0700 uninstall.ddos
./uninstall.ddos

Настройка (D)DoS Deflate

Кон­фиг рас­по­ло­жен в ката­ло­ге - /usr/local/ddos/, имя кон­фи­га - ddos.conf, основ­ные настройки:

  • ука­за­ние воз­мож­но­го коли­че­ства соеди­не­ний - NO_OF_CONNECTIONS=100
  • ука­за­ние бло­ки­ров­ки посред­ством iptables - APF_BAN=0
  • пери­од бло­ки­ро­ва­ния в секун­дах - BAN_PERIOD=600
  • настрй­о­ку - KILL=1 остав­ля­ем по умолчанию
  • ука­зать email для отправ­ки поч­то­вых уве­дом­ле­ний - EMAIL_TO="USER@SERVER.DOMAIN"
  • так же мож­но создать спи­сок "белых" IP в фай­ле - IGNORE_IP_LIST="/usr/local/ddos/ignore.ip.list"

Запуск само­го скрип­та мож­но мож­но осу­ще­ствить так:

sh /usr/local/ddos/ddos.sh

 Дополнительно

Про­смотр обще­го коли­че­ства соединений:

netstat -n -p | awk '{print $6}'|awk -F: '{print $1}' | sort -n | uniq -c | sort -nr | head -n10

Далее мож­но про­смот­реть рей­тинг коли­че­ства подключений:

netstat -n -p | awk '{print $5}'|awk -F: '{print $1}' | sort -n | uniq -c | sort -nr | head -n10

И далее мож­но про­смот­реть по каким портам:

sudo netstat -nput | awk '{print $4}'|awk -F: '{print $2}' | sort -n | uniq -c | sort -nr | head -n10
=================================================

Мож­но исполь­зо­вать несколь­ко мето­дов. Защи­та от мно­же­ствен­ных соеди­не­ний может быть осу­ществ­ле­на при помо­щи DDOS DEFLATE, защи­та от мно­же­ствен­ных GET / POST запро­сов может осу­ществ­ле­на при помо­щи FAIL2BAN, ниже в кра­це рас­ска­жу как мож­но быст­ро задей­ство­вать оба метода.

Установка DDOS DEFLATE

Послед­ний пакет мож­но "затя­нуть" из master вет­ки с GitHub:

wget https://github.com/jgmdev/ddos-deflate/archive/master.zip

Рас­па­ко­вать:

unzip master.zip

Уста­но­вить:

cd ddos-deflate-master
./install.sh

Доба­вить в автозагрузку:

chkconfig ddos on

 

Настройка DDOS DEFLATE

Все настрой­ки хра­нят­ся в фай­ле /etc/ddos/ddos.conf, их не мно­го, в каче­стве клю­че­вых настро­ек мож­но выде­лить мно­же­ствен­ные соединения:

NO_OF_CONNECTIONS=200

Вре­мя бана (в секун­дах), например:

BAN_PERIOD=1800

 

При­ме­ча­ние: В каче­стве игно­ри­ру­е­мо­го IP мож­но ука­зать внеш­ний IP сер­ве­ра, в слу­чае зна­че­ния по умол­ча­нию 0.0.0.0 все локаль­ные соеди­не­ния будут разрешены.

Пере­за­пус­ка­ем сервис:

service ddos restart

Теперь у DDOS DEFLATE появил­ся "интер­фейс" при помо­щи кото­ро­го мож­но про­смот­реть соединения:

ddos -v

Или быст­ро обру­бить из в соот­вет­ствии с настройками:

ddos -k

 

 Защита от множественных запросов GETPOST

Как уста­но­вить fail2ban было опи­са­но ЗДЕСЬ и ЗДЕСЬ, ниже рас­ска­жу как доба­вить пра­ви­ло. Необ­хо­ди­мо создать файл /etc/fail2ban/filter.d/http-get-dos.conf с выражением:

[Definition]
failregex = ^<HOST> -.*"(GET|POST).*
ignoreregex =

 В /etc/fail2ban/jail.local необ­хо­ди­мо добавить:

[http-get-dos]
enabled = true
port = http,https
filter = http-get-dos
# путь к логам
logpath = /var/www/httpd-logs/*.access.log
# кол-во повтор­ных запросов
maxretry = 300
# 300 секунд = 5 минут
findtime = 300
# бан на 5 минут
bantime = 300
action = iptables[name=HTTP, port=http, protocol=tcp]

Пере­за­пу­стить сервис:

service fail2ban restart

Про­те­сти­ро­вать с уда­лен­ной машины:

ab -c10 -n500  https://site/