На вас идет SYN-флуд? Надо действовать!
Для начала проверяем, действительно ли это SYN-флуд:
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 Мбит.