среда, 17 декабря 2014 г.

iptables виртуализация ipset centos 6 и ddos

сервер ддосили (CentOS release 6.6, ядро 3.10.23-xxxx-std-ipv6-64) и на помощь пришла статья http://habrahabr.ru/post/204508/, но к большому сожалению сервер OVH как часто бывает на виртуализированных серверах (например VMware vSphere и других) правила вида 
iptables -I INPUT -s x.x.x.x -j DROP
ничего не блокируют и типа заблокированная айпиха конектится и дальше, почему я нигде не нашел (имеется ввиду что за фигня с iptables на виртуальных машинах) и никто мне до сих пор не рассказал (в свое время чуть голову не слома думая как такое может быть), если кто-то из читающих будет знать отпишитесь в коментах
зато на этом сервере заработал ipset (которые кстати и благодаря своему бинарному дереву работает побыстрее iptables) и наработка автора статьи на хабре была модифицирована под ipset, которые в отличии от iptables работал. Собственно создаем таблицу ipset

cat /etc/ipset.conf
#!/bin/bash
/usr/sbin/ipset -N access iphash

не забываем 

chmod +x /etc/ipset.conf
/etc/ipset.conf

а также прописывает в автозапуск

tail -3 /etc/rc.local
/etc/ipset.conf
/sbin/service iptables start
/sbin/service fail2ban restart
 
2 последние строки нужно поскольку rc.local выполнится уже после запуска iptables, а сервис iptables не стартанет поскольку таблица ipset не создана, а fail2ban после запуска iptables конечно лучше рестартануть. Также первым правилом в /etc/sysconfig/iptables добавляем
-A INPUT -p tcp -m set --match-set access src -m tcp -m multiport --dports 80,443 -j DROP

сам скрипт который будет блокировать айпихи, у которых больше 50 подключений (можете поставить 20 например), также не забываем chmod +x /usr/local/ddos/ddos.sh

cat /usr/local/ddos/ddos.sh
#!/bin/sh

# find all connection and save them to file ddos.iplist in tmp dir
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | grep -v x.x.x.x | uniq -c | sort -n > /tmp/ddos.iplist

# empty script which ban ips
cat /dev/null > /tmp/iptables_ban.sh

# create DROP rule for 50 more aggresive bots
awk '{if ($1 > 50) {print "/usr/sbin/ipset -A access " $2 "" }}' /tmp/ddos.iplist >> /tmp/iptables_ban.sh

# this rule need for for creating file with analysing all iptables rules
echo "/usr/sbin/ipset -L access > /tmp/iptables.log" >> /tmp/iptables_ban.sh

# start script for ip banning
bash /tmp/iptables_ban.sh

где x.x.x.x - на всякий случай айпиха самого хоста (осталось от iptables теста), так на всякий случай. Задача в крон

*/10    *       *       *       *       /bin/sh /usr/local/ddos/ddos.sh >/dev/null 2>&1

вот собственно и все - спасибо автору на хабре за скрипт.

Также не забываем вырубить в апаче ipv6, поскольку скрипт будет некоректно получать айпихи
vim /etc/httpd/conf.d/httpd.conf
Listet 0.0.0.0:80
service httpd restart
вырубать нужно если в выводе
netstat -ant | grep :80

вы видите ffff
tcp        0      0 ::ffff:3.18.16.2:80     ::ffff:5.135.39.9:3571      TIME_WAIT
tcp        0      0 ::ffff:3.18.16.2:80     ::ffff:200.93.191.251:1534  TIME_WAIT