Источник: http://ru-nix.livejournal.com/35106.html
Установим из репозитария дополнительные модули connlimit, ipset для iptables:
Создаем талицу вида hash для ipset:
Добаляем правила вида в /etc/sysconfig/iptables:
Ниже строки хоть и снижают производительность, но затупляют сканеры и делают невозможными ряд атак:
Добавить в таблицу ipset самых активных исходя из логов httpd (свыше 100 запросов с одного IP):
или при помощи скрипта чуть адаптированного для ipset:
Отладка:
Список забаненых IP:
Ну и тонкий тюнинг через sysctl тоже не забываем:
Установим из репозитария дополнительные модули connlimit, ipset для iptables:
Код:
# yum install kmod-connlimit
# yum install ipset kmod-ipset
Код:
# ipset -N blacklist iphash
Код:
-A INPUT -p tcp -m tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -m set --set blacklist src -j DROP
-A INPUT -p tcp -m tcp --dport 80 --tcp-flags FIN,SYN,RST,ACK SYN -m connlimit --connlimit-above 15 --connlimit-mask 32 -j DROP
Код:
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT
-A INPUT -p tcp -m tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j REJECT --reject-with tcp-reset
-A INPUT -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j DROP
Код:
while true; do tail -n 10000 xxx.ru.access.log | sort | awk '{print $1}' | uniq -c | sort -n | awk '{if($1>100){print $2}}' | xargs -tl -I _ ipset -A blacklist _; sleep 60; done
Код:
while read ip
do
echo look $ip
ipset -L blacklist | grep -wq $ip
if [ $? = 1 ] ; then
ipset -A blacklist $ip
else
echo IPSET filter for $ip already exists
fi
done
Код:
# tail -n 100000 totalrating.ru.access.log | sort | awk '{print $1}' | uniq -c | sort -n | awk '{if($1>100){print $2}}' | ./ipset_add
Список забаненых IP:
Код:
# ipset -L blacklist
Статистика по дропнутым iptables:
# iptables -vL
Код:
net.ipv4.conf.all.rp_filter = 1
kernel.sysrq = 1
net.ipv4.conf.default.send_redirects = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.ip_dynaddr = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 4294967295
kernel.shmall = 268435456
net.ipv4.tcp_keepalive_time = 15
net.ipv4.tcp_keepalive_intvl = 10
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_window_scaling = 0
net.ipv4.tcp_sack = 0
net.ipv4.tcp_timestamps = 0
net.ipv4.netfilter.ip_conntrack_max = 224000
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close = 30
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 30
net.ipv4.netfilter.ip_conntrack_tcp_timeout_last_ack = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 30
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 190
net.ipv4.netfilter.ip_conntrack_tcp_timeout_syn_recv = 30
net.ipv4.netfilter.ip_conntrack_tcp_timeout_syn_sent = 30
net.ipv4.netfilter.ip_conntrack_generic_timeout = 100
net.ipv4.netfilter.ip_conntrack_icmp_timeout = 5