База знаний: Linux Server
Краткое руководство по борьбе с DDOS-атаками на http-сервер
Автор Алексей | HiTex.BY на 18 декабря 2011 13:44

Проявление атаки

Проявляется в огромном количестве процессов apache, сервер недоступен из-за превышения максимального числа процессов, или, что наиболее вероятно, недоступен из-за нехватки оперативной памяти.

Диагностика

Если есть возможность зайдите на сервер по ssh. Командами ps и top отметьте большое количество процессов httpd. Если на сервер по ssh войти не удается, то воспользуйтесь VDSmanager (ссылка на него есть в клиентской зоне)

Посмотрите меню Запущенные процессы и Текущая нагрузка. Перезагрузите сервер через VDSmanager, попробуйте зайти по ssh, если падает, из-за apache, то остановите его, как вариант, можете убить все процессы httpd через него же.)

Действия администратора

Включите firewall - отредактируйте /etc/rc.conf прописав в нем строки (редактировать файлы можно через VDSmanager)

firewall_enable="YES"
firewall_type="/etc/firewall.conf"

Создайте файл /etc/firewall.conf и пропишите в нем

add allow ip from ip-адрес с_которого_администрируете_сервер
add deny tcp from any to me 80

Тем самым после перезагрузки сервера у вас будет недоступен apache извне и не будет приводить к зависанию сервера.

Теперь надо определить на какой именно сайт идет атака. У apache есть замечательный модуль mod_status http://httpd.apache.org/docs/2.2/mod/mod_status.html

mod_status позволяет в реальном времени осуществлять мониторинг загрузки сервера.

Подключение mod_status в Apache 2.2

В apache2.2 отредактируйте /usr/local/etc/apache22/httpd.conf

Раскомментируйте строки

#LoadModule status_module libexec/apache22/mod_status.so
#Include etc/apache22/extra/httpd-info.conf

Отредактируйте файл конфигурации /usr/local/etc/apache22/extra/httpd-info.conf

<Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from .example.com
</Location>

Поменяйте на

<Location /server-status>
SetHandler server-status
</Location>

Раскомментируйте строку

#ExtendedStatus On

Перезапустите apache

Подключение mod_status в apache 1.3

В apache 1.3 подключение server_status осуществляется аналогично apache 2.2, за исключением того, что все настраивается только в /usr/local/etc/apache/httpd.conf

Использование server-status

Теперь по адресу

http://ip-aдрес.сервера/server-status доступна статистика запросов к нему.

Аккуратно удалите правило запрещащие запросы к серверу по 80 порту

# ipfw delete 200

И посмотрите http://ip-aдрес.сервера/server-status

Нас интересует следующее

0-0    86795    0/31/31    W     0.54    0    0    0.0    0.09    0.09     89.18.166.89    example.com    GET / HTTP/1.0
1-0 86796 0/19/19 W 0.30 0 0 0.0 0.06 0.06 79.140.78.68 example.com GET / HTTP/1.0
2-0 86801 0/9/9 W 0.15 0 0 0.0 0.03 0.03 89.18.166.89 example.com GET / HTTP/1.0
3-0 86802 0/9/9 W 0.14 0 0 0.0 0.03 0.03 82.12.33.48 myhost.com GET /server-status/ HTTP/1.1
4-0 86805 0/4/4 W 0.07 1 0 0.0 0.01 0.01 79.140.78.68 example.com GET / HTTP/1.0
5-0 86806 0/3/3 W 0.06 2 0 0.0 0.01 0.01 89.18.166.89 example.com GET / HTTP/1.0
6-0 86807 0/4/4 W 0.07 0 0 0.0 0.01 0.01 89.18.166.89 example.com GET / HTTP/1.0
7-0 86808 1/4/4 C 0.08 0 2015 3.0 0.01 0.01 89.18.166.89 example.com GET / HTTP/1.0
8-0 86811 0/1/1 W 0.02 0 0 0.0 0.00 0.00 89.18.166.89 example.com GET / HTTP/1.0
9-0 86812 0/1/1 W 0.02 0 0 0.0 0.00 0.00 89.18.166.89 example.com GET / HTTP/1.0
10-0 86813 0/1/1 W 0.02 0 0 0.0 0.00 0.00 89.18.166.89 example.com GET / HTTP/1.0

В данном случае, атака идет пустыми запросами GET / к серверу example.com

Вам следует его отключить. Выполнить это лучше всего создав файл .htaccess в корневой директории домена с содержимым

Deny from All

Теперь при обращении к сайту будет выдаваться ошибка 403 Forbidden и нагрузка на остальные сайты значительно снизится.

Как правило, флуд-боты обращаются по имени сервера, соответственно, пропишите DNS для этого домена на IP-адрес 127.0.0.1 и когда обновится кэш DNS, то поток пустых запросов полностью прекратится.

Дополнительная оптимизация сервера

В качестве дополнительных параметров, которые следует использовать, при настройке сервера

/usr/local/etc/apache22/extra/httpd-mpm.conf

<IfModule mpm_prefork_module>
StartServers 1
MinSpareServers 1
MaxSpareServers 1
MaxClients 150
MaxRequestsPerChild 100
</IfModule>

Измените MaxClients (максимальное число процессов) в меньшую сторону до количества процессов, которые не роняют ваш сервер по нехватке оперативной памяти. Каждый процесс apache занимает в среднем 4-8 мегабайт памяти и необходимо чтобы суммарное количество помешалось в оперативной памяти.

Отредактируйте /usr/local/etc/apache22/extra/httpd-default.conf Следует уменьшить параметры

Timeout 300
MaxKeepAliveRequests 100

До 60 и 50 соответственно, чтобы как можно более скорее старые процессы apache прекращали свое существование

Firewall

Пропишите правило

allow tcp from any to me dst-port 80 limit src-addr 4

Этим вы ограничите максимальное число одновременных подключений (не стоит его делать меньше) с одного IP-адреса.

Используйте также утилиту netstat

# netstat -na | grep 80
# netstat -an | grep :80 | awk ‘{print $5}’ | awk -F: ‘{print $1}’ | sort | uniq

для определения большого количества подключений с одного IP-адреса

Использование nginx

При использовании nginx в качестве Front-End к Apache (стандартная конфигурация при установки nginx совместно с ISPmanager) WWW домен следует отключать в конфигурации nginx в описании соответствующего виртуалхоста Например

 server {
listen 80;
server_name example.com www.example.com;

Пропишите ниже server_name строку

deny all;

И тем самым уже nginx будет выдавать ответ 403 Forbidden и не перенаправлять запросы к web-серверу apache.

(1231 голос(а))
Эта статья полезна
Эта статья бесполезна

Комментарии (0)