Простой способ ограничить влияние 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