Тестовый стенд: Centos 6.2 (kernel 2.6.32-220.4.2.el6.x86_64), apache+php+mysql
Имеем очень много соединений с состоянием SYN_RECV (syn flood):
$netstat -ntu
...
tcp 0 0 XX.XX.XX.XX:80 202.51.102.34:40700 SYN_RECV
tcp 0 0 XX.XX.XX.XX:80 190.225.143.29:40123 SYN_RECV
tcp 0 0 XX.XX.XX.XX:80 101.255.71.7:38725 SYN_RECV
tcp 0 0 XX.XX.XX.XX:80 122.226.122.201:48952 SYN_RECV
tcp 0 0 XX.XX.XX.XX:80 186.91.63.97:44343 SYN_RECV
tcp 0 0 XX.XX.XX.XX:80 109.230.156.97:56149 SYN_RECV
...
Как с ними бороться?
В первую очередь подтюнить sysctl, как это показано здесь и использовать скрипт для блокировки ненужных IP через ipset. Тупо iptables использовать нельзя, так как при блокировки больше 100 IP начинаются жуткие тормоза. И так, ставим ipset:
#yum install ipset.x86_64
После установки добавлем правило блокировки в iptables:
#iptables -I INPUT 1 -m set --match-set dos src -j DROP
где dos это наша таблица из ipset.
Создадим хешь dos:
#ipset -N dos iphash
Если нужно блокировать подсети, тогда вместо iphash используем nethash
Обязательно сохраняем iptables:
#/sbin/service iptables save
Для автоматической блокировки пишем такой скрипт и помещаем его в крон на выполнение раз в минуту:
#!/bin/bash
IFCONFIG=/sbin/ifconfig
GREP=/bin/grep
AWK=/bin/awk
CUT=/bin/cut
NETSTAT=/bin/netstat
IPSET=/usr/sbin/ipset
IPTABLES=/sbin/iptables
SORT=/bin/sort
UNIQ=/usr/bin/uniq
srvIP=`$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 ${srvIP}`
do
$IPSET -A dos $i
done
$IPSET -S > /etc/sysconfig/ipset
Для просмотра заблокированных адресов выполняем команду
# ipset -L | head
Name: dos
Type: hash:ip
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 20104
References: 1
Members:
200.170.151.14
196.21.39.13
180.250.209.2
203.89.27.150
# ipset -L | wc -l
269
Нашёл недавно ПО ( http://synflood-defender.net/docs ) типа для защиты от атак, но не сильно верю, что оно поможет ))