Если вы когда-нибудь держали достаточно посещаемый сайт, то, наверняка, вам приходилось страдать от ddos-атак, организованных вашими недоброжелателями. Типичная ситуация - это флуд http-запросами, либо syn-пакетами с вебшеллов или ботнета. Если вы хоститесь на виртуальном хостинге, то скорее всего вам придется менять хостинг, так как в 99% случаев они удаляют сайт после пары суток ддоса, но если у вас есть dedicated server, то еще можно побороться.
Наиболее простой и часто используемой атакой является http флуд. Этот метод заключается в создании потока http запросов на наиболее узкое место, которым зачастую являются php скрипты форума, либо другое активное содержимое. Заполнение канала входящим трафиком при такой атаке невелико, а значит достаточно заблокировать доступ с IP атакующих, чтобы свести действие атаки к нулю. Достоинство этого метода атаки в нетребовательности к ресурсам, именно поэтому она встречается чаще всего. Другой, также часто встречающийся тип атаки - syn flood, то есть посылка на порт сервера множества пакетов с запросами на соединение без последующей передачи каких-либо данных. Эта атака требует больших ресурсов, но на порядок эффективнее предыдущей. Результатом такой атаки становиться как минимум полная недоступность атакуемого сервиса и как максимум - полное зависание всего сервера (что весьма вероятно при неправильной его настройке). Защититься от такой атаки тоже можно, если атакующий при этом не использует ip spoofing. К счастью, спуфинг использовать возможно далеко не всегда (так как это блокируют многие интернет провайдеры), поэтому озаботиться защитой от такой атаки явно стоит. Ну и, наконец, существуют такие типы атаки как icmp и udp флуд, рассчитаны они обычно на полное заполнение канала атакуемого сервера. Это требует больших ресурсов от атакующего, но обычно означает конец борьбы для атакуемой стороны. Защита от таких атак одна - наращивать каналы, договариваться с вышестоящими провайдерами о фильтрации пакетов на магистральных каналах и т.д. Это не решается чисто программными средствами, защита от таких атак потребует немалой траты времени и денег. Но надеюсь, что вам не придется столкнуться с таким тяжёлым случаем.
Для защиты сервера apache от http и syn флуда я написал модуль mod_limit. Этот модуль позволяет задавать в настройках веб-сервера ограничения по приему запросов с одного IP адреса и блокировать клиентов превышающих эти ограничения. Здесь вы найдете бинарник и исходники модуля. Бинарник скомпилирован для apache 2.2 под windows и требует для работы наличия msvcr80.dll (установите Visual C++ 2005 SP1 Redistributable Package по ссылке http://www.microsoft.com/downloads/details.aspx?FamilyID=200b2fd9-ae1a-4a14-984d-389c36f85647&DisplayLang=en. Очень рекомендуется использовать модуль со сборкой apache с сайта http://www.apachelounge.com/, эта сборка тоже сделана в VC2005 и работает быстрее официальной. Скопируйте mod_limit.so в каталог modules и пропишите в httpd.conf строку:
LoadModule limit_module modules/mod_limit.so
Затем создайте в httpd.conf секцию конфигурации модуля. Типичная конфигурация будет выглядеть так:
<IfModule limit_module>
LimitMaxSyn 50
LimitSynAct HARDBAN
LimitSynTmo 10
LimitMaxReq 200
LimitReqAct SOFTBAN
LimitReqTmo 5
LimitBanMsg "Your IP is temporary blocked.
Please wait %d minutes."
LimitHtSize 8011
LimitWriteLog On
</IfModule>
Назначение этих параметров интуитивно понятно, но всё же я считаю не лишним пояснить их подробнее:
| LimitMaxSyn | задаёт лимит "пустых" соединений подряд. Пустым считается соединение, в котором не пришло ни одного верного http-запроса. Этот лимит определяет реакцию на syn flood. Установленное значение в 50 соединений достаточно, чтобы исключить ложные срабатывания, но тем не менее syn-флуд превышает этот лимит практически мгновенно. |
|---|---|
| LimitSynAct | задаёт действие, предпринимаемое при превышении LimitMaxSyn. Этот параметр может иметь три значения: PASS - игнорировать событие, HARDBAN - не принимать соединения атакующего и SOFTBAN - выдавать атакующему сообщение о блокировке. |
| LimitSynTmo | задаёт таймаут действия LimitSynAct в минутах. Время бана в 10 минут достаточно, чтобы отбить желание сканировать порты или заблокировать атаку с вебшеллов. В случае серьёзного ддоса рекомендуется увеличить это значение до нескольких часов. Отсчёт таймаута начинается с момента прекращения флуда атакующим. |
| LimitMaxReq | задаёт лимит количества http-запросов с одного IP адреса в минуту. Значение в 200 позволяет достаточно быстро реагировать на http-флуд, но тем не менее оставляет небольшой риск ложного срабатывания. В том случае, если посетители вашего сайта часто выкачивают множество страниц программной качалкой, рекомендуется увеличить это значение до 500-1000 |
| LimitReqAct | задаёт действие, предпринимаемое при превышении LimitMaxReq. Задается аналогично LimitSynAct. |
| LimitReqTmo | задаёт таймаут действия LimitReqAct в минутах. Отсчёт таймаута начинается с момента превышения лимита |
| LimitBanMsg | задаёт сообщение о блокировке, выдаваемое при действии SOFTBAN. С помощью идентификатора %d в сообщение можно вставить оставшееся время блокировки в минутах. |
| LimitHtSize | задаёт размер внутренней таблицы, предназначенной для поиска статистики, связанной с IP адресом. При значении 8011 модуль использует около 64кб памяти. Большие значения целесообразны только при экстремальных нагрузках. |
| LimitWriteLog | включает запись в error.log сервера сообщений о срабатывании mod_limit. Рекомендуется включить для сбора статистики срабатываний. |
Итак, с настройкой модуля я думаю всё понятно, в ином случае читайте по абзацу статьи перед сном вплоть до полного просветления. Багрепорты и пожелания по функционалу следующих версий прошу писать на форуме.