Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
Скрипт защиты от DDOS
#1
Быть может кому понадобится:

Скрипт защиты от DDOS (ddos + iptables + настройка ядра sysctrl + netstat)
Ноябрь 23, 2009 Автор: stranger

Недавно столкнулся с проблемой DDOS "небольшого" выделенного сервера. Сервер к сожалению был один. Процессы Apache из-за выполнения сумасшедшего количества запросов съедали всю память, php съедал весь процессор а изза keepalive заканчивались сокеты.

Установив фронтендом Nginx (тема одной из следующих моих статей), мы несколько выиграли в производительности, но это не особо решало ситуацию. Тогда мы решили ограничивать количество соединений с помощью iptables + netstatИдея следующая: просматриваем все подключения к серверу при помощи netstat, далее убираем из списка подключений все адреса самого сервера, ну и там нужных нам серверов/машин. Следующим шагом убираем из списка все адреса с количеством подключений меньше 6. Ну и на последок забиваем список ip ботов в файл, блокируем траффик с них iptables.

Текст скрипта:

Код:
#!/bin/sh
while true; do echo > /tmp/newddosip netstat -ntu  | sed /"TIME_WAIT"/d | \
sed /"FIN_WAIT"/d | awk '{print $5}' | cut -d: -f1 | \
sort | uniq -c | sort -nr | sed /"IP_АДРЕС_СЕРВЕРА"/d  | \
sed /"ЕЩЕ_КАКОЙ-НИБУДЬ_АДРЕС_КОТОРЫЙ_НЕ_ДОЛЖЕН_БЫТЬ_ЗАБЛОКИРОВАН"/d | \
sed /"И_ЕЩЕ_1_БЕЛЫЙ_IP"/d | sed /"1 "/d | sed /"2 "/d | sed /"3 "/d | sed /"4 "/d | \
sed /"5 "/d | sed /"6 "/d |   awk '{print $2}' >> /tmp/newddosip
cat /tmp/newddosip >> /root/ddosip

list=`cat /tmp/newddosip`
for ip in $list; do
/sbin/iptables -I INPUT -s $ip -p tcp -j DROP
done
sleep 5;
done

Полный писок ip ботов можно будет посмотреть в /root/ddosip. Скрип можно легко изменить для нужного количества подключений добавляя или убирая конструкции вида:
| sed /"2 "/d |

Также мы изменили некоторые параметры ядра.

Для защиты от SYN атак включаем SYN-cookies:

Код:
echo 1 >/proc/sys/net/ipv4/tcp_syncookies

Увеличиваем размер очереди полуоткрытых соединений (также полезно при SYN флуде):

Код:
sysctl -w net.ipv4.tcp_max_syn_backlog="4096"

Поскольку мы знаем, что SYN атака/спуфинг это просто ряд SYN пакетов, главным образом с фиктивными IP адресами. В прошлом разделе мы увеличили размер очереди соединений. Теперь, когда наши системы могут обрабатывать большее количество SYN запросов, мы должны уменьшить полное время хранения полуоткрытых соединений в очереди. Когда сервер получает запрос, он немедленно посылает пакет с набором флагов SYN и ACK, помещает это полуоткрытое соединение в очередь, а затем ожидает от клиента пакет с флагом ACK. Если сервер не получает ответа от клиента, то он еще несколько раз передает ответный пакет (с флагами SYN и ACK), (количество ответов зависит от установок операционной системы), давая клиенту возможность для пересылки ACK пакета. Ясно, что в случае фиктивности исходного IP адреса клиента, ACK пакет никогда не прибудет. После нескольких минут ожидания сервер удаляет это полуоткрытое соединение. Мы можем ускорить процесс удаления соединений в состоянии в SYN RECEIVED из очереди соединений, изменяя время первой перепередачи и общего количества перепередач.

Другая методика защиты от SYN атак заключается в отключении некоторые параметров TCP, которые всегда активны в течение процесса установления связи сервера с клиентом. Некоторые из этих параметров автоматически выключаются механизмами Syncookies.

Теперь настроим переменные стека TCP/IP, которые позволяют уменьшить время хранения полуоткрытых соединений в очереди задач:

Рассмотрим параметр tcp_synack_retries, который управляет количеством перепередач в операционной системе Linux. По умолчанию, для большинства операционных систем Linux, это значение равно 5, что означает удаление полуоткрытого соединения через 3 минуты. Сделаем так, чтобы перепередача осуществлялась на 3 секунде и полное время хранения полуоткрытых соединений в очереди составило 9 секунд:

Код:
sysctl -w net.ipv4.tcp_synack_retries=1

Изменяем время ожидания приема FIN до полного закрытия сокета:

Код:
sysctl -w net.ipv4.tcp_fin_timeout = 10

Практически отключаем TCP keepalive:

Код:
sysctl -w net.ipv4.tcp_keepalive_time=1

Изменяем количество пакетов проверки keepalive, которые пошлет сервер прежде чем соединение будет закрыто:

Код:
sysctl -w net.ipv4.tcp_keepalive_probes=1

При помощи этих нехитрых действий мы пережили DDOS атаку среднего масштаба. Если возникли какие-либо вопросы пишите в комментарии - постараемся ответить.
Ответ
#2
Источник бы указали http://tty.org.ru/node/30
Ответ
#3
http://www.inetbase.com/scripts/ddos/install.sh - а он типо уже не в моде ?

Нужно помнить 3 вещи
1. гавно проект ляжет по любому и нечего не поможет
2. нет ни одной нормальной статьи, каждый параметр нужно выгугливать
3. если у вас нормальный проект - закажите настройку и не парьтесь (все равно так как вам за $ сделают, вы долго будете настраивать)
Ответ
#4
Place Написал:http://www.inetbase.com/scripts/ddos/install.sh - а он типо уже не в моде ?

Нужно помнить 3 вещи
1. гавно проект ляжет по любому и нечего не поможет
2. нет ни одной нормальной статьи, каждый параметр нужно выгугливать
3. если у вас нормальный проект - закажите настройку и не парьтесь (все равно так как вам за $ сделают, вы долго будете настраивать)

Полностью согласен, особенно с 1м и 2м! Big Grin
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  Кто как спасается от DDoS атак? CKREPKA 41 10,217 03-16-2021, 06:19 PM
Последний пост: Wdianane
  DDoS защита - как быть? Dementor 92 20,580 10-21-2012, 06:16 PM
Последний пост: Ozzy
  Каким антивирусом Вы пользуетесь для защиты компьютера? PROGRAMMATOR 54 19,092 07-19-2010, 10:44 PM
Последний пост: Johncrasher
  Скрипт DLE на ALT Linux 5.0 Ковчег nelegal 0 4,231 12-15-2009, 05:05 AM
Последний пост: nelegal

Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)