Борьба с медленным DDoS на CentOS

Тема в разделе "Защита от Ddos-атак", создана пользователем admin, 21 окт 2014.

  1. Источник: http://ru-nix.livejournal.com/35106.html

    Установим из репозитария дополнительные модули connlimit, ipset для iptables:
    Код:
    # yum install kmod-connlimit
    # yum install ipset kmod-ipset
    
    Создаем талицу вида hash для ipset:
    Код:
    # ipset -N blacklist iphash
    
    Добаляем правила вида в /etc/sysconfig/iptables:
    Код:
    -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
    
    Добавить в таблицу ipset самых активных исходя из логов httpd (свыше 100 запросов с одного IP):
    Код:
    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
    
    или при помощи скрипта чуть адаптированного для ipset:
    Код:
    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
    
    Ну и тонкий тюнинг через sysctl тоже не забываем:
    Код:
    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
     
    21 окт 2014

Поделиться этой страницей