Снова меня DDOS-ят. В этот раз атака не сильная и заметил я ее случайно во время очередного этапа самообразования с целью заполнения пробелов в знаниях в области безопасности.
Если кто-то открыл эту статью просто так, то рекомендую все же ее прочитать. Я все писал "понятным"языком для лучшего восприятия.
DoS-атака (Denial of Service) — закидывание неугодных ресурсов различным флудом, приводящее их к нокдауну. А DDoS-атака — это такая DoS-атака, которую осуществляет не один энтузиаст, а разгневанная толпа, желающая Страшный Суд, Ад и Погибель неправославному ресурсу. Весь профит этого метода заключается в том, что грамотно спланированную атаку невозможно отразить вообще. В результате сервер начинает как минимум безбожно тормозить при ответах на нормальные запросы, а то и вовсе ложится, не вынеся такого издевательства.
Проще говоря, что такое DoS? Это, к примеру, когда ведёшь разговор с кем-то, но тут подходит алкаш, и начинает громко нести бред. Говорить либо невозможно, либо очень сложно. Решение: зовёшь охрану, она скручивает синяка и уводит.
DDoS же отличается тем, что алкашей вбегает толпа многотысячная, и даже если позвать охрану, она банально не сумеет всех скрутить и увести.
Наиболее же эффективная атака такого плана выполняется не тысячами набежавших алкашей (ибо набор добровольцев, организация, синхронизация и прочее), а превращением в зомби уже имеющихся вокруг мирных юзеров. Они уже есть, уже ходят вокруг, уже оборудованы ртом — осталось только заставить их начать орать пациенту в ухо. Всем сразу и независимо от их желания, по команде, с исполнительностью и настойчивостью компьютера. В компьютерном мире такой захват душ обычно выполняется с помощью трояна.
Луркоморье
Для начала нужно посмотреть сколько запросов идет с IP адресов клиентов. Для этого в консоли выполним команду:
netstat -ntu | awk '{print $5}'| cut -d: -f1 | sort | uniq -c | sort -nr | more
Видно, что с IP 192.230.77.217 поступило 129 обращений. "Алкаш" (смотреть выше) один, значит не DDOS, а просто DOS-атака. Заголовок статьи менять уже не буду - позже поймете почему.
Ради интереса, можно посмотреть на какие порты идут обращения с этого IP адреса выполнив команду:
netstat -na | grep 192.230.77.217
Ага. 443 порт пользуется популярностью. Я думал как обычно на 80-й будет, но в принципе не важно.
Блокирую по всем портам исходящие и входящие соединения с этого IP адреса командами:
iptables -A INPUT -s 192.230.77.217 -j DROP
iptables -A INPUT -d 192.230.77.217 -j DROP
Исходящие блокирую "на всякий случай". Вдруг меня взломают и начнут атаковать с моего сервера. Неприятностей потом будет куча, поэтому лучше подстраховаться.
Все порты блокирую на случай, если будет идти подбор паролей к FTP или еще к чему-то.
Проверяем заново текущую ситуацию после применения блокировки командой:
netstat -ntu | awk '{print $5}'| cut -d: -f1 | sort | uniq -c | sort -nr | more
Все чисто. Враг не пройдет!
Автоматизация защиты при DDoS атаке
Понятно, что все вышеописанное ручками выполнять лениво и не практично. Давайте этот процесс автоматизируем для нашего удобства и оперативности реагирования на атаки.
На основе одного примера, найденного в Интернете, я написал свой скрипт для защиты от DoS и DDoS атак. Он получился простой, но очень эффективный. Скрипт блокирует IP адреса, количество подключений с которых превысило 50. Это значение можно изменять - скрипт хорошо прокомментирован.
Код скрипта:
#!/bin/sh
# Находим все соединения на все порты и записываем их в файл ddos.iplist
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | grep -v "127.0.0.1" > /usr/local/ddos/ddos.iplist# создаем DROP правила (не выдавать ответа сервера на запросы забаненых) для IP с количеством подключений более 50 и добавляем их в файл
awk '{if ($1 > 50) {print "/sbin/iptables -A INPUT -s " $2 " -j DROP"; print "/sbin/iptables -A INPUT -d " $2 " -j DROP";}}' /usr/local/ddos/ddos.iplist >> /usr/local/ddos/iptables_ban.sh# запускаем скрипт бана IP атакующих
bash /usr/local/ddos/iptables_ban.sh# Очищаем скрипт, который производит бан
cat /dev/null > /usr/local/ddos/iptables_ban.sh
Давайте его установим.
Для начала, необходимо создать рабочую папку для нашего скрипта. Вводим в консоли команду:
mkdir /usr/local/ddos
Теперь перейдем в эту папку командой:
cd /usr/local/ddos
Загружаем скрипт в эту папку командой:
wget https://geekelectronics.org/wp-content/files/ddos.sh
Выставляем права 755 на файл скрипта командой:
chmod 777 /usr/local/ddos/ddos.sh
Запускаем скрипт для теста командой:
/bin/sh /usr/local/ddos/ddos.sh
В папке со скриптом появятся два файла:
ddos.iplist - в него скидываются все подключения
iptables_ban.sh - сформированный скрипт для блокировки IP адресов
Теперь открываем файл /etc/crontab и добавляем в него следующие строки
*/5 * * * * root /bin/sh /usr/local/ddos/ddos.sh
@monthly root iptables -F
- Первая строка - запускает наш скрипт каждые 5 минут.
- Вторая - производит раз в месяц очистку всех блокировок (амнистия).
За неделю работы скрипта ситуация с банами IP сложилась следующая (команда iptables -L).
На этом все. Возникнут вопросы - пишите в комментариях.
Зачем атакуют ? Но ведь это же круто! Он всем будет хвастаться, какой он крутой и доссил сервак. Если честно, не вижу смысла атаковать.. Если бы это был крупняцкий проект, неработоспособность которого приносит много миллионов, миллиардов убытков, а так, просто для шалости. Пусть детишки поиграют)
Сегодня скинули ссылочку на видео, в котором школьники DoS-ят разные сайты. Запускают прогу, вводит адрес, выставляет 99999 потоков и стартуют.
Потом демонстрируют, что атакуемый сайт не грузится.
Было видно, как у него Skype на компе отваливается. Ну понятно - канал-то они свой забивают - вот ничего и не грузится.
Эх..детишки... Учите матчасть :)
Кстати, я статью обновил.
Кстати всегда подобные детостатьи\ролики улыбают) так мило)
Получается если пользователь обновит страницу 50 раз его забанит? или подключитсяк игравому серверу 50 раз тоже? в течении какого времени считаютсяэти 50 раз?
50 подключений с одного IP на момент выполнения команды
Запустил скрипт, а мне выдало следующее:
root@raspberrypi:~# sudo /bin/sh /usr/local/ddos/ddos.sh
: not foundddos/ddos.sh: 1: /usr/local/ddos/ddos.sh: #!/bin/sh
: not foundddos/ddos.sh: 2: /usr/local/ddos/ddos.sh:
: not foundddos/ddos.sh: 5: /usr/local/ddos/ddos.sh:
awk: cannot open /usr/local/ddos/ddos.iplist (No such file or directory)
: not foundddos/ddos.sh: 8: /usr/local/ddos/ddos.sh:
: not foundddos/ddos.sh: 11: /usr/local/ddos/ddos.sh:
Указанные файлы появились и скрипт висит в процессах. Это правильно? Привилегии для скрипта изначально задал.
попробуй поставить на саму папку 775
При попытке войти в папку пишет так
root@project:/usr/local/ddos# /etc/crontab
-bash: /etc/crontab: Отказано в доступе
Будет ли работать скрипт , если всё выше по теме я выполнил
Я так понимаю, что последние действия нужны, чтобы скрипт подтягиваться после рестарта оборудования?
Спасибо
проверьте владельца папки - скорее всего поэтому не пускает в папку
после рестарта оборудования ничего не подтягивается
скрипт просто запускается через указанные промежутки времени и после выполнения закрывается. То есть ничего в памяти постоянно не висит - в этом просто нет необходимости
Здравствуй автор! Подскажи как добавить в исключения определённые ip и диапазон ip.
Великолепно! Огромное спасибо за статью!!!
Подскажите а в этот скриптик можно добавить исключения для ip ? Он кладет сервер при использовании ip самого сервера ..
конечно
Делается это в строке:
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | grep -v "127.0.0.1" > /usr/local/ddos/ddos.iplist
добавил для примера IP 8.8.8.8 (перед > дописал это: | grep -v "8.8.8.8"):
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | grep -v "127.0.0.1" | grep -v "8.8.8.8" > /usr/local/ddos/ddos.iplist
сейчас при выdоде информации о подключениях просто не будет данных с этим IP
Сам так десяток IP добавил в исключения.
спасибо большое
C:\Users\lipen>netstat -ntu | cut -d: -f1 | sort | uniq -c | sort -nr | more
"cut" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
C:\Users\lipen>netstat -ntu | awk '{print $5}'| cut -d: -f1 | sort | uniq -c | sort -nr | more
"awk" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
Тоесть так.
Может потому что, netstat и awk это юниксовые утилиты и в винде их как таковой и нет ? :)
не пробовали sudo apt-get install gawk file
При вызове скрипта файлы вывода получают такие вот кривые имена и как следствие ошибка скрипта - файл не найден. Созданный файл невозможно ни открыть, ни переименовать, только удалить. Подскажите, как исправить?
на саму папку установите права 755
Капец у меня 2 файла создается iptables_ban.sh
Чего-то не выходит, хотя вроде как все доступно, может и вправду мама говорил что это не мое. Может кто-то подскажет по сервисам типа Stormwall? Как они в работе, стоит ли подключаться?
автор, в твоем скрипте пару ошибок, из за которых у других он не запускается. эти 4 строчки кода в том варианте, что ты предоставил - не работают. мне пришлось их записать одной строкой, разделив знаком ";" - только тогда скрипт заработал без ошибок - вот почему выбивает "not foundddos/ddos.sh: 2 8 11" и "(No such file or directory)". исправьте пожалуйста
Еще момент. Те, кто уже сидит под рутом (не создавал пользователей) в "crontab -e" пишите эту строку "*/5 * * * * /bin/sh /usr/local/ddos/ddos.sh". Слово "root" писать не надо - как бы, доступ уже есть (только для тех, кто уже под рутом!)
РаботаеТ?
Если атака более серьезная более лучшим вариантом на мой взгляд использование бесплатной услуги от ddos-guard, ваш вариант в моем случает не сработал, после всех манипуляций с nginx и фаерволом, nginx грузил процессор под 100процентов(8 ядер квм) нагрузка сети была 200мегабит при 1гб канале сервера.
А что делать если ты хочешь настроить защиту на Entware.
А можно было просто настроить fail2ban:)
Но опыт полезный, конечно.