Ярлыки

Memories ( 25 ) Unix ( 14 ) FreeBSD ( 8 ) www ( 4 ) Scripts ( 3 ) GEOM ( 2 ) PART ( 2 ) smtp ( 2 ) Cacti ( 1 ) Jabber ( 1 ) KVM ( 1 ) Kohana ( 1 ) RAID ( 1 ) Sip ( 1 ) Ubuntu ( 1 ) Zyxel ( 1 ) nginx ( 1 ) php-fpm ( 1 ) portwfd ( 1 ) rewrite ( 1 ) security ( 1 )

Поиск по этому блогу

вторник, 23 ноября 2010 г.

Защита от SYN flood при помощи iptables

В один прекрасный момент наблюдаю большую, ничем не обоснованную загрузку http сервера. В логах наблюдаем большое количество запросов стартовой страницы.

Защитимся динамическим правилом в фаерволе, создаем файл /etc/iptables.rules:


# Generated by iptables-save v1.3.5 on Tue Nov 23 09:47:33 2010
*filter
:INPUT ACCEPT [751509:115729779]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [867438:174074250]
:syn_flood - [0:0]

-A INPUT -m recent --update --seconds 60 --name bad_hosts --rsource -j DROP
-A INPUT -i ppp0 -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j syn_flood

#Ветка контроля syn flood
-A syn_flood -m limit --limit 6/sec --limit-burst 150 -j RETURN
-A syn_flood -j LOG --log-prefix "SYN flood: "
-A syn_flood -m recent --set --name bad_hosts --rsource -j DROP 

COMMIT
# Completed on Tue Nov 23 09:47:33 2010

где:
  • -limit 6/sec --limit-burst 150 - шесть соединений в секунду не больше 150 раз подряд
  • -seconds 60 - блокируем на 60 секунд
Добавляем в /etc/rc.local:
/sbin/iptables-restore < /etc/iptables.rules
Список попавших в бан:

cat /proc/net/ipt_recent(xt_recent)/bad_hosts
src=133.133.133.134 ttl: 50 last_seen: 1074288758 oldest_pkt: 0 1074288730, 1074288733, 1074288735, 1074288738, 1074288738, 1074288740, 1074288743, 1074288745, 1074288745, 1074288748, 1074288750, 1074288750, 1074288753, 1074288753, 1074288755, 1074288758, 1074288760, 1074288760, 1074288763, 1074288765
Очистка списка:
echo / > /proc/net/ipt_recent/bad_hosts
Если не очищается сбрасываем правила очищаем и опять запускаем:
iptables -F
echo / > /proc/net/ipt_recent/bad_hosts
iptables-restore < iptables.rules

Схожий функционал также присутствует в PF:

table <bad_hosts> persist
block quick from <bad_hosts> to any
pass in on $int_ip to any flags S/SA keep state (max-src-conn 100, max-src-conn-rate 30/10, overload <bad_hosts> flush global)

Где:


max-src-conn-rate 30/10 30 - коннекты, 10 - секунды


Список заблокированных:

pfctl -t bad_hosts -T show

Коннекты:

pfctl -s Sources

Также для высоко нагруженных серверов помогут параметры:

/etc/sysctl.conf
# Custom
net.ipv4.conf.all.accept_redirects=0
net.ipv4.conf.all.secure_redirects=0
net.ipv4.conf.all.send_redirects=0
net.ipv4.tcp_max_orphans=65536
net.ipv4.tcp_fin_timeout=1
net.ipv4.tcp_keepalive_time=30
net.ipv4.tcp_keepalive_intvl=15
net.ipv4.tcp_keepalive_probes=3
net.ipv4.tcp_max_syn_backlog=262144
net.ipv4.tcp_synack_retries=1
net.ipv4.tcp_mem=50576   64768   98152
net.ipv4.tcp_rmem=4096 87380 16777216
net.ipv4.tcp_wmem=4096 65536 16777216
net.ipv4.tcp_orphan_retries=0
net.ipv4.tcp_syncookies=1
net.ipv4.netfilter.ip_conntrack_max=1048576
net.netfilter.nf_conntrack_max=1048576
net.ipv4.tcp_timestamps=1
net.ipv4.tcp_sack=1
net.ipv4.tcp_congestion_control=htcp
net.ipv4.tcp_no_metrics_save=1
net.ipv4.route.flush=1
net.ipv4.conf.all.rp_filter=1
net.ipv4.conf.lo.rp_filter=1
net.ipv4.conf.eth0.rp_filter=1
net.ipv4.conf.default.rp_filter=1
net.ipv4.conf.all.accept_source_route=0
net.ipv4.conf.lo.accept_source_route=0
net.ipv4.conf.eth0.accept_source_route=0
net.ipv4.conf.default.accept_source_route=0
net.ipv4.ip_local_port_range=1024 65535
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_window_scaling=1
net.ipv4.tcp_rfc1337=1
net.ipv4.ip_forward=0
net.ipv4.icmp_echo_ignore_broadcasts=1
net.ipv4.icmp_echo_ignore_all=0
net.ipv4.icmp_ignore_bogus_error_responses=1
net.core.somaxconn=262144
net.core.netdev_max_backlog=100000
net.core.rmem_default=8388608
net.core.wmem_default=4194394
net.core.rmem_max=33554432
net.core.wmem_max=33554432
net.ipv4.tcp_max_tw_buckets = 720000
net.ipv4.tcp_tw_recycle = 1
fs.file-max=200000
/etc/security/limits.conf
* soft nofile 200000
* hard nofile 200000


Комментариев нет :

Отправить комментарий