Syn flood атака или комплексная защита

Для начала проверяем, действительно ли это Syn Flood:

netstat -n | grep SYN_RECV | wc -l

Если больше 5 соединений, значит, это syn атака.

1) Вводим для iptables правила:

iptables -N syn_flood
iptables -A INPUT -p tcp --syn -j syn_flood
iptables -A syn_flood -m limit --limit 30/s --limit-burst 100 -j RETURN
iptables -A syn_flood -j DROP

*На данный момент не советуем пользоваться этим пунктом, т.к., по какой-то причине, блокирует все подряд

2) Устанавливаем лимиты в /etc/sysctl.conf:

net.ipv4.tcp_max_syn_backlog = 40000
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_syncookies = 1
net.core.somaxconn = 60000
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_keepalive_time = 15
net.core.netdev_max_backlog = 40000
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.conf.default.rp_filter = 1
net.ipv4.tcp_max_syn_backlog = 4096

net.ipv4.tcp_window_scaling = 0
net.ipv4.tcp_sack = 0
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1

net.netfilter.nf_conntrack_max=400000
net.netfilter.nf_conntrack_tcp_timeout_close = 5
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 5
net.netfilter.nf_conntrack_tcp_timeout_last_ack = 1
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 5
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 1
net.netfilter.nf_conntrack_tcp_timeout_established = 30
net.netfilter.nf_conntrack_tcp_timeout_syn_recv = 1
net.netfilter.nf_conntrack_tcp_timeout_syn_sent = 1
net.netfilter.nf_conntrack_tcp_loose = 0

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

Принимаем настройки:

sysctl -p

3) Через Iptables ставим ограничение одновременных число коннектов к веб-серверу с одного ip

iptables -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 3 --connlimit-mask 24 -j DROP

Самое действенное правило!

4) Ставим ipset и настраиваем firewall

yum install -y ipset

ipset -N dos iphash

service iptables save
iptables -I INPUT -m set --set dos src -j DROP

Далее создаем скрипт со следующим содержимым:

#!/bin/bash
serverip=`ifconfig eth0 | grep 'inet addr' | awk '{print $2}' | cut -f2 -d ":"`
for i in `netstat -ntu | grep SYN_RECV | awk '{print $5}' | cut -f1 -d ":" | sort | uniq | grep -v ${serverip}`
do
ipset -A dos $i
done
ipset -S > /etc/sysconfig/ipset

Далее, проверить, какие айпи адреса были отброшены, можно командой

ipset -L dos

5) Также можно поставить ddos deflate, НО если у вас Centos, то его необходимо допиливать, иначе он начинает блокировать не то что нужно.

Например надо изменить скрипт проверки на

netstat -ntu | grep ':' | awk '{print $5}' | sed 's/::ffff://' | cut -f1 -d ':' | sort | uniq -c | sort -nr > $BAD_IP_LIST

Эти манипуляции позволили отбить ddos на 80-100 мбит/с. Порт, кстати, тоже был 100 Мбит.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *