Linux sunucularında SYN flood DDoS saldırıları anında SYN Cookies mekanizmasının devreye girişini simüle edin. Yanlış hardening nedeniyle kapatılan tcp_timestamps parametresinin bant genişliğini nasıl 64 KB tavanına kilitlediğini inceleyin; doğru kuyruk ve sysctl yapılandırmalarını üretin.
SYN flood baskısı altında Window Scale çöküşünü engelleyen ve çekirdek belleğini koruyan konfigürasyonlar.
# /etc/sysctl.d/99-tcp-synflood-hardening.conf # SYN Flood Saldiri Korumasi ve Pencere Olcekleme (Window Scale) Koruyucusu # 1. SYN Cookies'i aktif et (Sadece kuyruk tastiginda devreye girer) net.ipv4.tcp_syncookies = 1 # KRITIK: TCP Timestamps kesinlikle 1 olmalidir! # Eger timestamps=0 yapilirsa SYN cookie durumunda Window Scale (Pencere Olcekleme) # kaybedilir ve tum baglantilar 64 KB tavanina cakilarak bant genisligi %90+ coker. net.ipv4.tcp_timestamps = 1 # SYN-ACK tekrar deneme sayisini 5'ten 2'ye dusur (Hold suresini 63s'den 7s'ye indirir) net.ipv4.tcp_synack_retries = 2 # SYN dinleme kuyrugu kapasiteleri net.ipv4.tcp_max_syn_backlog = 8192 net.core.somaxconn = 8192 # Dinleme soketi tastiginda paketi sessizce dusur (1 yapilmasi RST gonderip saldirgana bilgi verir) net.ipv4.tcp_abort_on_overflow = 0
TCP protokolü bağlantı kurarken durum bilgisi (state) tutmak zorundadır. Bir istemciden SYN paketi geldiğinde, Linux çekirdeği tcp_request_sock yapısı oluşturur ve bunu dinleme kuyruğuna (SYN backlog) ekler. Saldırganlar sahte IP adreslerinden saniyede on binlerce SYN paketi gönderdiğinde, sunucu yanıt olarak SYN-ACK gönderir ancak karşıdan asla ACK gelmez.
Varsayılan ayarlarda Linux, her yanıtsız SYN paketi için 5 kez üstel geri çekilme (exponential backoff) ile tekrar deneme yapar. Bu süreç tam 63 saniye sürer. 1024 boyutundaki bir varsayılan kuyruk, saniyede yalnızca 50 saldırı paketi geldiğinde dahi saniyeler içinde dolar ve meşru kullanıcıların web sitesine erişimi kesilir.
SYN kuyruğu taştığında net.ipv4.tcp_syncookies = 1 devredeyse çekirdek hafıza tahsis etmeyi durdurur:
İnternetteki pek çok eski güvenlik kılavuzunda, "sunucunun kaç gündür açık olduğunu gizlemek" amacıyla net.ipv4.tcp_timestamps = 0 yapılması tavsiye edilir. Bu, bir üretim sunucusu için en tehlikeli yapılandırma hatalarından biridir:
SYN Cookies durumunda sunucu hafızada durum tutmadığı için, istemcinin TCP Window Scale (RFC 7323) desteğini hatırlayamaz. Çekirdek geliştiricileri bu bilgiyi saklamak için TCP Timestamps alanının düşük seviyeli bitlerini bir karalama defteri (scratchpad) gibi kullanır. Eğer timestamps kapalıysa, Window Scale kaybolur ve TCP penceresi katı 64 KB tavanına kilitlenir. 60 ms RTT'li bir bağlantıda hat hızınız 10 Gbps olsa bile elde edebileceğiniz maksimum hız 8.7 Mbps'ye düşer (%99 kayıp).
1. tcp_synack_retries Değerini 2'ye İndirin: Varsayılan 5 tekrar denemesi sahte paketlerin kuyrukta 63 saniye kalmasına sebep olur. Bu değeri 2'ye düşürdüğünüzde tutma süresi 7 saniyeye iner; hafıza tüketimi %89 azalır.
2. Kuyruk Boyutlarını Eşitleyin: tcp_max_syn_backlog ve net.core.somaxconn değerlerini en az 8192 veya 16384 seviyesine çıkarın. Nginx veya HAProxy yapılandırmanızdaki listen ... backlog=16384 parametresini çekirdek limitiyle uyumlu tutun.
3. nftables ile Çekirdeğe Ulaşmadan Filtreleyin: IP başına aşırı yüksek oranda gelen SYN paketlerini (örneğin IP başına 50 SYN/sn üzeri) nftables veya iptables kurallarıyla doğrudan ağ kartı seviyesinde düşürerek TCP yığınının gereksiz yere yorulmasını önleyin.