Бормотухи.НЕТ

Вернуться   Бормотухи.НЕТ > Web-мастеру > Сайтостроение > Локальный сервер
Расширенный поиск

Локальный сервер Информация, мануалы и вопросы по локальным серверам

Ответ
 
Опции темы Поиск в этой теме
Старый 17.11.2014, 20:02 Вверх   #1
Коварный тип
 
Аватар для Serberg
Serberg вне форума
Доп. информация
Хорошо Оптимальная защита от DDoS с помощью netstat и iptables

Оптимальная защита от DDoS с помощью netstat и iptables

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

Совсем недавно столкнулся с такой проблемой, как DDoS. Сразу скажу, я вообще ни разу не линуксоид, но зато чуточку программист, так что все что ниже, основано чисто на логике, а не на фактах, плюс переписанное с некоторыми добавками от уже известного.

Перекопав полчища статей и опробовав множество вариантов, так и не нашел, что помогло бы с защитой. Взяв за основу статьи Простой и эффективный метод отразить http DDoS от 50мбит с помощью nginx и iptables и (D)DoS Deflate решил написать свой скрипт. Ну вернее не решил, а методом тыка и исправлений он получился сам.

Должен заметить, что статья от Алексея Кузьмина не идеальна, т.к. в логах nginx`a не достаточно копаться, да и обработка логов может потребовать много ресурсов. А именно в моем случае создавались логи более 50 Гиг, плюс запросы шли не «GET / HTTP/1.1», а «GET / HTTP/1.0», плюс, как оказалось, мой сервер сам от себя получал редиректы (127.0.0.1), которые не отображались в логах, которые отображались в запросе
PHP код:
netstat -ntu awk '{print $5}' cut -d: -f1 sort uniq -sort -

Суть скрипта такова, что через определенное время кроном запускается скрипт и проверяет все соединения с сервером, ip и кол-во их соединений которые записываются в файл. Потом запускается другой скрипт, который смотрит, если соединения, превышают заданное число (у меня стоит 20), то создается скрипт с блокировкой этих айпишников через iptables.

Я создавал отдельные файлы, чтобы прослеживать весь ход работы отдельно, и по своей некомпетентности, легко было обнаружить где и что не срабатывало.

Теперь к практике:
создаем каталог, где будет скрипт
PHP код:
mkdir /usr/local/ddos 
в нем создаем файл ddos.sh и меняем его права:
PHP код:
chmod 0755 /usr/local/ddos/ddos.sh 
записываем в него:

PHP код:
#!/bin/sh

# находим все соединения и записываем их во временный файл ddos.iplist в каталоге tmp
netstat -ntu awk '{print $5}' cut -d: -f1 sort uniq -sort -> /tmp/ddos.iplist

# очищаем скрипт бана айпишников
cat /dev/null > /tmp/iptables_ban.sh

# создаем DROP правила для 50 самых агрессивных ботов
awk '{if ($1 > 20) {print "/sbin/iptables -I INPUT -p tcp --dport 80 -s " $2 " -j DROP" }}' /tmp/ddos.iplist >> /tmp/iptables_ban.sh

# следующая строка нужна только для того, чтобы создавался файл с просмотром всех правил iptables
echo "/sbin/iptables -L INPUT -v -n > /tmp/iptables.log" >> /tmp/iptables_ban.sh

# запускаем скрипт бана айпишников
bash /tmp/iptables_ban.sh

# делаем ротацию лога
cat /dev/null > /var/log/ddos/error.log
[ ! -/var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid

Вот в принципе и все. Теперь запускаем кронтаб, предпочитаю команду:
PHP код:
EDITOR=mcedit crontab -
ну или просто
PHP код:
crontab -
и добавляем новую задачу в него, выполняющуюся каждые 10 минут:
PHP код:
*/10 * * * * /bin/sh /usr/local/ddos/ddos.sh 

Также я изменил ротацию логов в файле /etc/logrotate.d/nginx от nginx`a, чтобы многогиговые файлы не создавались
PHP код:
/var/log/nginx/*.log {
    daily
    size 20M
    missingok
    rotate 150
    compress
    delaycompress
    notifempty
    create 640 root adm
    sharedscripts
    postrotate
        [ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
    endscript

и записал еще задачу в крон, выполняющуюся каждый час
PHP код:
* * * * /usr/sbin/logrotate /etc/logrotate.conf 

ну и для больше комфорта еще и раз в сутки решил перезагружать сервак, опять же через крон:
PHP код:
0 4 * * * /sbin/reboot 

общий список заданий, выведенный через crontab -l:
PHP код:
*/10 * * * * /bin/sh /usr/local/ddos/ddos.sh
* * * * /usr/sbin/logrotate /etc/logrotate.conf
0 4 
* * * /sbin/reboot 

я записывал все под пользователем root, поэтому если вы не под этим пользователем, перед каждой командой стоит добавить root, типа:
PHP код:
*/10 * * * * root /bin/sh /usr/local/ddos/ddos.sh 

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

Надеюсь кому-нибудь пригодится данная статейка. Прошу строго не судить по самому коду, т.к. я вообще впервые сам что-то делал на серваке )

Стащил тут
  Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 21:04. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, vBulletin Solutions, Inc. Перевод: zCarot
 

Время генерации страницы 0.08153 секунды с 11 запросами