Fail2ban и DDOS


Простой способ ограничить влияние DDOS атак на ваш сайт — использовать функционал fail2ban.

Если вы впервые столкнулись с DDOS атакой, то это, скорее всего, означает, что ваш сайт уже недоступен, а вы не можете зайти по ssh на сервер.

Ваши первые действия в этом случае:

  • перезагрузка сервера
  • вход по ssh,
  • остановка сервиса, который подвергся атаки,
  • анализ логов
  • блокирование атакующих хостов.

С помощью fail2ban можно автоматически отслеживать атакующих и применять к ним санкции.

После установки fail2ban (пример для CentOS, предварительно нужно подключить epel репозитарий):

# yum -y install fail2ban

фильтр для ssh атак будет включен по умолчанию.

Ниже предлагается один из самых простых способов ограничить влияние DDOS атаки на сайт под управлением apache . Алгоритм блокировки атакущих в данном случае предельно прост: атакующим будет считаться каждый, кто сделает больше XXX запросов в течении YYY секунд. Значения XXX и YYY подбираются так, чтобы не затронуть легитимных посетителей и зависят они от структуры сайта и его посещаемости.

в /etc/fail2ban/jail.conf добавляем:

[http-ddos]
enabled = true
port = http
filter = http-dos
logpath = [путь к access логу вашего сайта, например /var/log/httpd/access.log]
# maxretry is how many GETs we can have in the findtime period before getting narky
maxretry = XXX
# findtime is the time period in seconds in which we're counting "retries" (300 seconds = 5 mins)
findtime = YYY
# bantime is how long we should drop incoming GET requests for a given IP for, in this case 86400 = 1 day
bantime = 86400
action = iptables-dos[name=HTTP, port=http, protocol=tcp]

в /etc/fail2ban/filter.d/ добавляем файл  http-dos.conf со следующим содержимым:

# Fail2Ban configuration file
#
# Author: http://www.adminhelp.pro
#
[Definition]

# Option: failregex
# Note: This regex will match any GET and POST entry in your logs, so basically all valid and not valid entries are a match.
# You should set up in the jail.conf file, the maxretry and findtime carefully in order to avoid false positives.

failregex = ^<HOST> -.*"(GET|POST).*

# Option: ignoreregex
# Notes.: regex to ignore. If this regex matches, the line is ignored.
# Values: TEXT
#
ignoreregex =

 

в /etc/fail2ban/action.d/ добавляем файл  iptables-dos.conf со следующим содержимым:

# Fail2Ban configuration file
#
# Author: Cyril Jaquier and http://www.adminhelp.pro
#
#

[INCLUDES]

before = iptables-blocktype.conf

[Definition]

# Option: actionstart
# Notes.: command executed once at the start of Fail2Ban.
# Values: CMD
#
actionstart = iptables -N fail2ban-<name>
iptables -A fail2ban-<name> -j RETURN
iptables -I <chain> -p <protocol> --dport <port> -j fail2ban-<name>

# Option: actionstop
# Notes.: command executed once at the end of Fail2Ban
# Values: CMD
#
actionstop = iptables -D <chain> -p <protocol> --dport <port> -j fail2ban-<name>
iptables -F fail2ban-<name>
iptables -X fail2ban-<name>

# Option: actioncheck
# Notes.: command executed once before each actionban command
# Values: CMD
#
actioncheck = iptables -n -L <chain> | grep -q 'fail2ban-<name>[ \t]'

# Option: actionban
# Notes.: command executed when banning an IP. Take care that the
# command is executed with Fail2Ban user rights.
# Tags: See jail.conf(5) man page
# Values: CMD
#
actionban = iptables -I fail2ban-<name> 1 -s <ip> -j <blocktype>

# Option: actionunban
# Notes.: command executed when unbanning an IP. Take care that the
# command is executed with Fail2Ban user rights.
# Tags: See jail.conf(5) man page
# Values: CMD
#
actionunban = iptables -D fail2ban-<name> -s <ip> -j <blocktype>

[Init]

# Default name of the chain
#
name = default
### blocktype
blocktype = DROP

# Option: port
# Notes.: specifies port to monitor
# Values: [ NUM | STRING ] Default:

#
port = ssh

# Option: protocol
# Notes.: internally used by config reader for interpolations.
# Values: [ tcp | udp | icmp | all ] Default: tcp
#
protocol = tcp

# Option: chain
# Notes specifies the iptables chain to which the fail2ban rules should be
# added
# Values: STRING Default: INPUT
chain = INPUT

Перезагружаем сервис fail2ban:

# service fail2ban restart

Проверяем в логах (в CentOS 6 fail2ban по умолчанию пишет в /var/log/messages) работу.
Так же можно посмотреть в iptables:

# iptables -L -n

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *