Защита от DoS/DDoS атак своими силами

tnAnGel

Проверенные
Сообщения
1,231
Реакции
906
Баллы
3,465
Данная тема будет постоянно пополняться новыми способами защиты от идиотов.
В данной статье я предложу лишь раз перейти на защищенный хостинг.
Начнем с выбора на чем вы сидите: хостинг или VPS/VDS.

Хостинг:
1. JS заглушка: многие боты настолько тупые, что не поддерживают JS, а те, что поддерживают заслуживают особого внимания. Простая JS заглушка:
Создаем простой index.html со следующим годом:
Код:
<script language="JavaScript">
windows.location="https://domen.zona/index.php";
</script>
Спасет от большинства атак идиотов. Теперь поговорим про ботов, которые оборудованы парсером window.location. Для таких случаев мы просто должны закриптовать нашу заглушку и дело с концом. Минус в том, что мы пошлем и поисковых ботов.
2. Cookie заглушка. Работает точно так же как и JS. На просторах сети очень много статей по таим заглушкам, так что вам не составит труда найти с JS + COOKIE
Код:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html><head>
<META HTTP-EQUIV="pragma" CONTENT="no-cache" />
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache" />
</head><body onload="document.cookie = 'DDOS=OK'; location.reload(true);">
</body>
</html>

VPS/VDS:
Тут уже огромное пространство для действий! Хочешь iptables, хочешь ipset, а может geoip или все сразу?! Может быть nginx+apache? Или просто apache?! :D Если желаете защищаться нормально, то эта статья именно для вас! Я не буду углубляться в то "А КАК ПОСТАВИТЬ!!!", все это давно описано в Интернете, я лишь расскажу кратко о методах защиты. Скажу сразу, если не знаете что такое linux - покупайте защищенный хостинг.
1. Самый простой способ, это iptables. Прежде чем идти дальше, поищите информацию по netstat и поймите для чего эта штука нужна, а я пойду дальше. Дос/ДДос начался. Подсчитаем кол-во школьных соединений к нашему веб серверу:
Код:
netstat -na | grep ":443\ " | wc -l
864 - много.
Теперь, посмотрим ближе какие IP адреса к нам коннектятся.
Код:
netstat -na | grep ":443\ " | sort | uniq -c | sort -nr
Копируем все что выдал терминал в нотепад и разгребаем. Там где вы видите много коннектов - выписываем и баним в iptables.
Код:
iptables -I INPUT -s 10.10.10.10 -j DROP
Не забудьте сохранить правила! Это будет также касаться ipset и geoip.

2. Ipset. Чем он хорош? Просто баним список IP адресов/диапазонов, но нужно будет "подключить" список от ipset в iptables.
3. Geoip. Ну просто самый простой способ забанить целую страну одной командой. Способ для самых линевых. Вам не нужно писать диапазоны как с ipset/iptables, просто достаточно дать команду и к примеру Китай никогда не увидит ваш сайт без VPN/proxy.
Код:
iptables -A INPUT -p tcp --dport 443 -m geoip --src-cc CN -j REJECT
5. Настройка nginx на лимитирование запросов с 1 IP (также можно сделать и с iptables)
6. hosts.deny - мой любимый способ. Я анализирую атакующие IP адреса и выделяю диапазон, если первые 2 - 3 значения одинаковы. Например:
15.12.15.12
15.12.15.85
15.12.15.65
15.12.15.88
или
15.12.15.54
15.12.65.54
15.12.0.59
15.12.14.55
Приходится банить диапазоном /24 /16. Также hosts.deny поддерживает просто IP адреса и вы можете просто написать их в файл. (белый трафик от пользователей кидайте в hosts.allow)

7. Модули на apache - бред на мой взгляд. Мне не удалось его защитить на своем сервере, но есть много статей как это сделать. Из-за неудач и частых падений я перешел на php-fpm. Никаких падений не было до сих пор.
8. Свое проксирование. Если вы имеете достаточно денег для снятия хорошего оборудования для фильтрации трафика, то эта статья для вас:
Фактически 10 ядер процессора Intel Xeon E5-2680v3 могут обрабатывать до 10 гигабит трафика. Один физический сервер способен обрабатывать более 40 гигабит трафика.
Гитхаб:
9. Временный способ с помощью CloudFlare. Я сам пользуюсь бесплатным тарифом, но он не спасет вас от стрессеров. При превышении допустимой нагрузке он напрямую посылает этот трафик, а не добавляет в бан как хотелось бы. В итоге нет фильтрации и вы лежите. При выборе этого метода ваш ресурс не ляжет от школьной атаки, но помрет от стрессера. Сегодня такаю атаку я наблюдал у себя. Отбился с помощью 3х записей в iptables. Смешная атака была, но 4 ядра были загружены полностью, что затрудняло использование моего сайта пользователями.
10. Мод на nginx. Описание:
Вкратце: защита основана на cookies и JavaScript.
Гитхаб:

Не большое заключение:
Эта статья не завершенная и она будет постоянно пополняться новыми методами. Есть люди, которые знают еще способы как защищаться от атак, прошу выкладывать свой опыт тут.
ПО на Windows для анализа логов apache/nginx - 10-Strike Log-Analyzer.
Для успешного отражения ддос атаки вы должны владеть вышеперечисленными знаниями и нормальным оборудованием. Оборудование должно быть от 2 ядер и 2Гб озу минимум.
На момент написании статьи отбил 2 атаки с помощью ipset и hosts.deny.
Оборудование:
ЦП: 4 ядра
ОЗУ: 12Гб
Канал: 100Мб\с
Стоит проксирование от CloudFlare (нужен только внешний фаервол)
 
Smalesh, и почему же? У тебя есть другое решение?
 
Да потому что не пиши х##ни. Честно, не надо раздавать советы там, где не разбираешься. Нужно понимать, когда лучше использовать ipset, а когда blackhole. Что атаки бывают разные и под каждую атаку выбирается свой механизм. Что простейший limit_req иногда сделает больше чем сложный яваскрипт. Что нужно знать и понимать модель osi, сетевой стек и уметь применять эти знания. Что есть такое как xtables-addons, только если ресурсов хватит. Что в сложных случаях перед сервером ставится железяка, часто дорогая. Что при нормальной атаке ты не то что не запустишь netstat, а даже не достучишься до сервера. И еще много-много подобных букв.
я перешел на php-fpm
И не перешел, а перетянули. И маленький секрет - апач + mod_php/fcgi (как минимум последних версий) выдерживает большие нагрузки, он работает там, где php-fpm дохнет буквально секунд за 30-40.
 
Последнее редактирование:
Smalesh, ну а почему ты просто не распишешь все это тут? Мне интересно тебя слушать
 
Smalesh, тогда ресурс просто перестанет работать. (если я правильно понял глагол "не встревать")
Через ipset баню только IP в России и других странах откуда у меня трафик идет. Если в ЕС, то диапазоном, потому что за ним кроме атаки и брут может быть. В allow занес сразу свои IP и поисковых ботов.
Про limit_req_zone я не знал, я обязательно ознакомлюсь
И не перешел, а перетянули.
Не полностью с этим согласен, меня пугал сам переход с апача. Не могу объяснить сейчас почему.
На счет оси прям обидно стало если честно. Знаю я это. Не умею знаниями пользоваться. Нас отправляли на ccna, успешно сдал и от меня декан отвязался. Стыдно, что ничего не помню сейчас уже :(

Не хочешь мне давать пинков для квеста "вспомнить все"? Ты видимо это образование имеешь :)
 
Не хочешь мне давать пинков для квеста "вспомнить все"? Ты видимо это образование имеешь :-)
А когда лучше напрямую iptables, а когда лучше через ipset? А как работает hosts.deny? А почему netstat, а не ss? А что такое sysctl и за что оно отвечает? А что такое tcpdump?
Элементарщина начального уровня администрирования.

А почему netstat, а не ss?
Как раз за ss вспоминал
 
Smalesh, про iptables и ipset не знаю как нормально объяснить, просто iptables не предназначен для большого списка правил. Проще подключить один раз ipset и в него добавлять. А в iptables мне приходилось сохранять список каждый раз, когда в ipset добавил и забыл. hosts.deny/allow - запрещает/разрешает подключение к smtp/httpd или вообще ко всему серверу (удобное разграничение для меня). Отличие вроде то, что hosts смотрит на список allow, а потом уже на deny и блокирует в случае чего (ничего не отдает клиенту, как будто ip мертвый), а при iptables посылается клиенту RST. " А почему netstat, а не ss?", потому что про ss я не знал)
sysctl дает возможность копаться в ядре в режиме реального времени и применять правки, я подобное делал не так давно. tcpdump - сниффер трафика. Мне бы найти пример как с ним написать скрипт для бана атакующих и на крон закинуть можно тогда
 
Smalesh, про iptables и ipset не знаю как нормально объяснить, просто iptables не предназначен для большого списка правил. Проще подключить один раз ipset и в него добавлять.
Нет. Разберись что такое iptables и что такое ipset.

hosts.deny/allow - запрещает/разрешает подключение к smtp/httpd или вообще ко всему серверу
Можешь показать пальцем, на каком этапе?

nf-packet-flow.png

а при iptables посылается клиенту RST
А в чем разница между DROP и REJECT?

sysctl дает возможность копаться в ядре в режиме реального времени и применять правки
Нет, у него другая задача.

Мне бы найти пример как с ним написать скрипт для бана атакующих и на крон закинуть можно тогда
Не надо лезть в дебри, предварительно не набив шишек на простеньком.

Например, скрипт-задачка. По крону дергать список стран (пусть выведены в переменную в шапку скрипта) и вносить в iptables. Bash (а желательно sh), внешних бинарников по минимуму (т.е. curl вместо wget и так далее). Это полезно и как конечный скрипт и как решение определенной задачи.
 
  • Мне нравится
Реакции: Hope
Smalesh, неудобно получается у меня с ответами совсем из-за частого оффлайна.. Не могу картинку посмотреть вообще, не прогружает инет вовсе.
upd: загрузилась спустя n- время, помню что говорили, что фильтрация возможна в исключительных случаях в nat prerouting, но вся фильтрация вообще проходит в filter input. н7е могу дать точного ответа тут, но остановлюсь на последнем.
А в чем разница между DROP и REJECT?
оба блокируют соединение, только последний посылает ответный пакет, что соединение закрыто
Нет, у него другая задача.
Я понимаю что оно делает, но не могу объяснить корректно (дальше вики)
sysctl — в BSD и Linux — команда, предназначенная для управления параметрами ядра на лету. Позволяет читать и изменять параметры ядра. Например - такие параметры как размер сегмента разделяемой памяти, ограничение на число запущенных процессов, а также включать функции наподобие .

Я пока что не могу написать, но обязательно дойду до этого
 
помню что говорили, что фильтрация возможна в исключительных случаях в nat prerouting, но вся фильтрация вообще проходит в filter input. н7е могу дать точного ответа тут, но остановлюсь на последнем.
Одной из задач во время ддос - блокировка атакующего с минимальным потреблением ресурсов сервера, потому что они (ресурсы) в этот момент на вес золота. Вот ты говоришь, hosts.deny крут. А что будет, если просто завернуть трафик в /dev/null через ip route add blackhole 1.2.3.4/24 ?

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

команда, предназначенная для управления параметрами ядра на лету
Да. Это команда для просмотра и настройки (частичной) параметров ядра и окружения.Это громадный черный ящик с кучей индикаторов и крутилок, и от этих крутилок зависит как быстро у тебя упадет сервер при некоторых видах атак. А еще рядом же стоит limits.conf (правда в systemd это дело несколько иначе рулится).
 
/dev/null через ip route add blackhole 1.2.3.4/24 ?
сразу на роутере заблокируем весь трафик с диапазона 1.2.3.4/24
Да, это на много лучше)

Я вот думаю, а что если взять CloudFare -> VPS (Nerwork Firewall) -> Server. Просто трафик дополнительно пропускать через еще одну машину и на ней уже производимость фильтрацию. Я помню что ты говорил про дорогую железку перед сервером, но вот поменять не смогу местами ту на которой сайт или покупать такую же или еще лучше для фильтра. Нагрузка на первую будет не такая высокая, максимум канал могут забить и это минус, т.к. я не встречал дешевые VPS'ки с 1Gb каналом. Сервер также имеет пропускную способность в 100Mb\s, так что разницы нет что первое забьют в принципе (конечно же есть, IP сменить в CF на другой сервер и продолжить защищаться уже на последнем рубеже). Имеется мечта отказаться вовсе от CF, т.к. от него толк лишь от небольшого флуда.
С последней самой сильной атакой он меня просто послал можно сказать и пришлось самому защищаться. Ниже скрины с CF о последней атаке.
upload_2016-9-17_14-52-18.pngupload_2016-9-17_14-52-56.png
 
Еще раз
Не надо лезть в дебри, предварительно не набив шишек на простеньком.
Например нельзя защищать сервер, не зная ядра, сетевой и прикладной уровень, не анализируя характер атаки и не набив на этом шишек.
 
Последнее редактирование:
Все постепенно изучу, но и нужно же думать на будущее об такой виде фильтрации)
Уже начал набивать ставя все без панелей на виртуалке на дебиан

У меня атаки всегда направлены не на забив канал, а только на ресурсы, следовательно трафик только http будет, на большее не способны они. Но было пару раз и syn flood, но это капля в море
 
Можно еще рекомендациями из статьи воспользоваться:
 
Идет DoS атака. Не могу справится.
Некоторое время назад была такая же атака. Помогло забанивание ай пи.
Сейчас не помогает.
Хелп.
 
Последнее редактирование модератором:
DoS.
Хостинг в прошлый раз прислал письмо, что заблокирует сайт, если не снизим нагрузку.
было 35 тыс запросов от одного ай пи (сейчас уже написано, 300 тыс)
Это помогло

Order Allow,Deny
Allow from all
Deny from 223.112.130.90

Сейчас не помогает. Уже 70 тыс запросов
 
Последнее редактирование модератором:
temza, если не получается, то возьмите проксирование у компании, которая специализируется на атаках
 
Современный облачный хостинг провайдер | Aéza
Назад
Сверху Снизу