DDOS - что делать. Если сервер только один - Linux с Apache.

Из прошлой заметки мы узнали, откуда берется DDOS.
Сейчас перейдем к более практическим занятиям и посмотрим, каким образом можно защитить сервер от DDOS.
В качестве сервера будет взят обычный компьютер с x86 архитектурой и ОС Linux и веб-сервером apache.
Почему не FreeBSD? На FreeBSD, насколько мне известно, аналога модуля iptables string нет.
Почему не nginx или lighttpd? Эти веб-сервера будут рассмотрены в следующих заметках. В этой заметке nginx выступает как фронтенд, а не как основной.

Важно знать! Для работы модуля iptables string, iptables должен быть не ниже версии 1.3.5, а ядро – не ниже 2.6.18, собранным с опцией CONFIG_NETFILTER_XT_MATCH_STRING=m

Рекомендую! Эти эти примеры помогут сохранить веб-сервер атак:
Лимит на 20 запросов в секунду для интерфейса eth0
iptables --new-chain car
iptables --insert OUTPUT 1 -p tcp --destination-port 80 -o eth0 --jump car
iptables --append car -m limit --limit 20/sec --jump RETURN
iptables --append car --jump DROP

Максимум 10 одновременных соединений с одного IP
iptables -A INPUT-p tcp --dport 80 -m iplimit --iplimit-above 10 -j REJECT
Блокировка более 10 SYN
iptables -I INPUT -p tcp --syn --dport 80 -j DROP -m iplimit --iplimit-above 10
20 соединений на сеть класса С
iptables -p tcp --dport 80 -m iplimit --iplimit-above 20 --iplimit-mask 24 -j REJECT

Если на сервере предоставлен хостинг для множества сайтов

Наша задача - спасти все остальные сайты, потому что то все сайты, которые размещены на общем IP адресе с жертвой, будут недоступны.
Почему? На этот вопрос даст ответ алгоритм атаки ботнета:

  • бот получает от координатора домен-жертву
  • бот производит преобразование домена в IP
  • бот отсылает по данному IP запрос "GET / HTTP/1.0" на веб-сервер жертвы

Как только замечены симптомы DDOS атаки, проверьте access_log веб-сервера apache. Если он забит записями вида "GET / HTTP/1.0", то это значит, что атака идет на IP адрес.
Что делать? Прежде всего временно отключите атакуемый IP адрес, лучше всего через iptables, командой iptables -A FORWARD -p tcp -s <атакуемый IP> --dport 80 -j REJECT. Это даст хоть какой-то шанс, что ботнет не успеет забить весь канал к серверу, после чего связь с ним будет потеряна. После отключения атакуемого домена доступ можно будет открыть обратно.
Для поиска атакуемого домена необходимо, чтоб его NS сервера находились на вашем сервере!
Почему? Так как атака идет по IP адресу, то единственным способом нахождения домена-жертвы может быть только анализ запросов к dns.
Как? С помощью утилиты ngrep. Эта утилита позволяет применить регулярные выражения к трафику. В нашем случае команда будет ngrep port 53. На 53 порт идут запросы на преобразование домена в IP. В течении нескольких десятков секунд визуально можно будет определить домен-жертву.
Другой вариант – настроить bind на запись всех запросов в лог и проверить, какой домен чаще всех запрашивается.
Следующее действие – это отключение домена. Наиболее простым и действенным методом будет блокировка запросов с именем домена. Это запретит преобразование домена, и боты не смогут получить IP домена-жертвы. Снова iptables поможет сделать это:
iptables -I INPUT 1 -p tcp --dport 53 -m string --string "domain.com" --algo kmp -j DROP
iptables -I INPUT 2 -p udp --dport 53 -m string --string "domain.com" --algo kmp -j DROP
Обратите внимание – блокируются TCP и UDP порты.
Другой вариант – вписать для домена-жертвы IP 127.0.0.1 и подождать пока запись разойдется, это зависит от настроек TTL, обычно 15 минут.
После отключения атакуемого домена все остальные сайты будут работать нормально.

Если на сервере предоставлен хостинг только для одного сайта (dedicated или vps хостинг)

Задача меняется – цель уже известна, а вот методы нужны иные. Цель защиты от DDOS на сайт – сохранить его работоспособность.
Проявите сразу заботу о защите своего сайта. Сделайте главную страницу сайта вида http://hostinghelp.biz/node с редиректом на нее при запросе вида http://hostinghelp.biz/
Почему? Это поможет защитить главную страницу сайта, отфильтровав все запросы от ботнета, так как боты не выполняют заход при редиректе и будут продолжать упорно долбить "GET / HTTP/1.0"
Как? Лучше всего поставить перед веб-сервером apache быстрый и легкий nginx и отдавать им статичные файлы. Создать статичный файл index.html в котором написать о том, что будет сделан переход на другую страницу и установите редирект с помощью метатега html.
Когда начнется DDOS атака, то nginx сможет выдержать намного больше запросов к статичному файлу по сравнению с apache.
Если nginx не помогает, и сервер не выдерживает столько запросов - забивается канал, то на помощь нам снова приходит iptables.
Так как главная страница сайта известна посетителям и поисковым системам, то можно просто заблокировать страницу-редирект, и тем самым сделав недоступным сайт для запросов вида "GET / HTTP/1.0", оставить его работоспособным по всем остальным.
Как? iptables -I INPUT 1 -p tcp --dport 80 -m string --string "GET / HTTP/1.0" --algo kmp -j DROP
Таким образом сайт защищен от DDOS атаки и сохраняет работоспособность, пусть и ценой временного отключения страницы редиректа

В следующей заметке я расскажу о том, как защищать сайт от серьезных атак (более 100Mbit) с помощью нескольких серверов и фильтрации трафика

4.5
Your rating: None Average: 4.5 (2 votes)

Комментарии

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

iptables --new-chain

iptables --new-chain car
iptables --insert OUTPUT 1 -p tcp --destination-port 80 -o eth0 --jump car
iptables --append car -m limit --limit 20/sec --jump RETURN
iptables --append car --jump DROP

??? в output ???

Это все - только примеры,

Это все - только примеры, конечно их можно и нужно модифицировать.
Правило применяется к OUTPUT для того, чтоб "не попасть на трафик"

Админ dedic.ru

>Прежде всего временно

>Прежде всего временно отключите атакуемый IP адрес

Всё. Атака завершилась успехом для 90% сайтов. Только большие имеют 1+ IP.

Ключевое слово -

Ключевое слово - временно
Потом пересаживаем сайт на пустой IP и действуем как описано во второй части

Админ dedic.ru

OUTPUT на 80 ???

OUTPUT на 80 ???

как это OUTPUT на 80-й

как это OUTPUT на 80-й порт?
вход на 80 выход на как-то иной (с которого было инициализировано соединение)

Все верно, Вы - наверное

Все верно, Вы - наверное единственный, кто заметил это.

Админ dedic.ru

Интересно, автор вообще

Интересно, автор вообще когда-нибудь видел в живую SYN-flood? Можете смело засунуть себе в задницу всякие дурацкие правила типа "не более 10 запросов", т.к. канал будет засран SYN-пакетами со случайными обратными IP-адресами, и честный пользователь http-сервера все равно не достучится до него никогда во время атаки. В данном случае - ещё и из-за идиотских правил iptables. Рекомендую хотя бы покурить что-то по проблеме, например syn cookies.

В данной статье описывается

В данной статье описывается защита от классического http flood
SYN flood и защита от него будет написано в другой статье

Админ dedic.ru

Про SYN-пакеты со случайными

Про SYN-пакеты со случайными обратными адресами - это всё хорошо, но такие атаки организуются не-ботнетом (случайный обратный адрес просто не выйдет из 99% машин ботнета) и вообще не имеет отношения к практике отражения типичных атак, ибо если атака промышленная (т.е. это не ботнет), то не спасет вообще ничего.
Автор четко и правильно описал ограниченный ряд проблем, и то, что описано, описано правильно и доступно.

а насколько производителен

а насколько производителен этот самый "-m string"
не получится так, что ядро сожрёт 100% ЦПУ, занимаясь поиском строки?

Нет, не сожрет, но нагрузка

Нет, не сожрет, но нагрузка конечно возрастет.

Админ dedic.ru

Добрый день! Задача: нужно

Добрый день!

Задача: нужно настроить IPTables для боевого арендуемого сервера (VPS).
Нюансы: Вот здесь - http://www.linux.org.ru/view-message.jsp?msgid=2811126&lastmod=121302645... и здесь- http://www.linux.org.ru/view-message.jsp?msgid=2811126&lastmod=121302645... говорится, что для высоконагруженного сервера IPTables лучше не включать вообще (выносить на другой сервер). Причина - тормоза, которые проявляются уже при 2000 соединений в секунду, если включен механизм отслеживаний состояний (STATE: NEW, RELATED, ESTABLISHED).

Тормоза могут быть связаны с тем, что на отслеживание состояний STATE каждого соединения IPTables забирает 16 кбайт оперативной памяти (см. прим. ниже). Т.е. при 2000 sites в секунду 1 гигабайт RAM будет заполнен примерно через пол минуты (точнее - 33 секунды).

У меня не планируется такой высокой нагрузки, но хотелось бы вычислить приемлемую загрузку сервера для использования на нем IPTables.

Согласно таблицы 4.2 IPTables Tutorial 1.1.19 Oskar'a Anderson'a - http://www.opennet.ru/docs/RUS/iptables/ таймаут для состояния ESTABLISHED - 5 дней.

В связи с этим вопрос. Если рассматривать обычную ситуацию, когда клиентский браузер посылает запрос серверу, затем сервер отдает ему html, то после этого соединение остается в состоянии ESTABLISHED или же клиент его закрывает, посылая FIN/ACK или RST серверу?

Другими словами меня интересует - когда реально происходит закрытие соединения для TCP, UDP? Или еще проще - сколько времени клиент "висит" на сервере?

____________
Примечание: по руководству IPTables Tutorial 1.1.19 Oskar'a Anderson'a - http://www.opennet.ru/docs/RUS/iptables/ -
"Максимальное количество записей, которое может содержаться в таблице зависит от значения по-умолчанию, которое может быть установлено вызовом функции ipsysctl в последних версиях ядра. Для объема ОЗУ 128 Мб это значение соответствует 8192 записям, для 256 Мб - 16376. Вы можете посмотреть и изменить это значение установкой переменной /proc/sys/net/ipv4/ip_conntrack_max."

VPS обладает способностью

VPS обладает способностью расширения, так что можно смело ставить на нем iptables. Если ресурсов не хватит - их можно будет расширить.

Клиент может висеть довольно долго, особенно если это модемное или GRPS соеденение. По этому рекомендуется ставить быстрый сервер nginx в качестве некеширующего прокси.

Вы можете настроить iptables и без использования состояний. Все зависит от задачи, которая не указана.

Админ dedic.ru

Есть смысл собирать IP и

Есть смысл собирать IP и рассылать мыло хостинг компаниям чтоб они блокировали пользователей?
Скрипта автоматической рассылки не кому не подалался?

Смысла нет Провайдер не

Смысла нет

Провайдер не станет их блокировать

 

Админ dedic.ru

iptables -A INPUT-p tcp


iptables -A INPUT-p tcp --dport 80 -m iplimit --iplimit-above 10 -j REJECT

опечатка

iptables -A INPUT -p tcp --dport 80 -m iplimit --iplimit-above 10 -j REJECT

запускаю выводит ошибку:
iptables v1.3.5: Couldn't load match `iplimit':/lib/iptables/libipt_iplimit.so: cannot open shared object file: No such file or directory

Понятно что файла не хватает.
По лазил по сайтам не нашол решения.
Не подскажете в чем проблемма?

Собрать iptables с поддержкой

Собрать iptables с поддержкой libipt_iplimit.so

 

Админ dedic.ru