Показать сообщение отдельно
Непрочитано 22.04.2011, 14:31   #1
Изгнанные

Автор темы (Топик Стартер) Скрипт защиты от DDOS

Быть может кому понадобится:

Скрипт защиты от 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 атаку среднего масштаба. Если возникли какие-либо вопросы пишите в комментарии - постараемся ответить.
flashboom777 вне форума Ответить с цитированием