Після певних подій, сайти УГКЦ підпали під потужний DDoS штурм. Важко було не те, що на сайт зайти, а й підключитися по SSH до консолі. Боротьба тривала кілька днів. Розповім, що саме мені допомогло подолати цю напасть.
Тюнінг iptables
На рівні мережевого екрану, я додав додаткові правила:
# DDoS # Не відповідаємо на ping iptables -A INPUT -p icmp -j DROP --icmp-type 8 # Блокуємо більше 2-х звернень на головну сторінку з одного IP за 10 сек. iptables -A INPUT -p tcp -m tcp --dport 80 -m string --string "GET / HTTP" --algo kmp --to 1024 -m recent --set --name httpddos --rsource iptables -A INPUT -p tcp -m tcp --dport 80 -m string --string "GET / HTTP" --algo kmp --to 1024 -m recent --update --seconds 10 --hitcount 2 --name httpddos --rsource -j DROP # Блокуємо більше 32 конектів з 1 IP iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 32 -j DROP iptables -A INPUT -p tcp --dport 80 -j ACCEPT
Це дозволило трохи розвантажити Apache.
Тюнінг TCP
Сервер під управлінням Debian Linux. В /etc/sysctl.conf було прописано:
# Controls the use of TCP syncookies net.ipv4.tcp_syncookies = 1 # Controls the maximum size of a message, in bytes kernel.msgmnb = 65536 # Controls the default maxmimum size of a mesage queue kernel.msgmax = 65536 # Controls the maximum shared segment size, in bytes kernel.shmmax = 4294967295 # Controls the maximum number of shared memory segments, in pages kernel.shmall = 268435456 # через 60 секунд с момента наступления тишины в канале сервером выполняется проба. Если клиент жив, то серверу высылается ответный пакет net.ipv4.tcp_keepalive_time = 60 # если ответа на проверку нет, то с интервалом в 10 секунд повторить 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 = 65536 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
Це допомогло мені отримати доступ до сервера по ssh навіть при потужних атаках.
Блокуємо цілі країни
Атаки йшли з Китаю, Іран та інших країн. З допомогою простого скрипта, блокуємо ці країни:
#!/bin/bash
### Block all traffic from AFGHANISTAN (af), CHINA (CN), IRAN (IR) and BRASIL (BR). Use ISO code ###
ISO="af cn ir br"
### Set PATH ###
IPT="`which iptables`"
WGET="`which wget`"
EGREP="`which egrep`"
### No editing below ###
SPAMLIST="BLK-List-01-INPUT"
ZONEROOT="/var/cache/iptables/country"
DLROOT="http://www.ipdeny.com/ipblocks/data/countries"
cleanOldRules(){
$IPT -t filter -F "$SPAMLIST"
$IPT -t filter -X "$SPAMLIST"
}
# create a dir
[ ! -d $ZONEROOT ] && /bin/mkdir -p $ZONEROOT
# clean old rules
cleanOldRules
# create a new iptables list
$IPT -t filter -N $SPAMLIST
for c in $ISO
do
# local zone file
tDB=$ZONEROOT/$c.zone
# get fresh zone file
$WGET -O $tDB $DLROOT/$c.zone
# country specific log message
SPAMDROPMSG="Dropping country: [$c] "
# get
BADIPS=$(egrep -v "^#|^$" $tDB)
for ipblock in $BADIPS
do
$IPT -A $SPAMLIST -s $ipblock -j LOG --log-prefix "$SPAMDROPMSG"
$IPT -A $SPAMLIST -s $ipblock -j DROP
done
done
# Drop everything
$IPT -I INPUT -j $SPAMLIST
$IPT -I OUTPUT -j $SPAMLIST
$IPT -I FORWARD -j $SPAMLIST
# call your other iptable script
# /path/to/other/iptables.sh
exit 0
Переходимо до хмарного захисту
Знайшов сервіс CloudFlare, який дозволив прийняти на себе основний удар, а лише «живі» запити перенаправляти на Web-сервер.

Такими 4-ма кроками було цілком подолано DDoS атаку на сервер.