Tüm sistemler çalışıyor 6 offshore bölge No-KYC ödeme
Hands-on Saha kılavuzu

VPS'inize DDoS saldırısı: ilk saat çalışma kılavuzu

İlk on dakika, sonraki üç saatin nasıl geçeceğine karar verir ve çoğu insan bu dakikaları tahmin yürüterek harcar — servisleri yeniden başlatarak, rastgele adresler yasaklayarak, yalnızca sitenin çöktüğünü söyleyen bir gösterge panosunu okuyarak. Bu, filoda gerçekten uyguladığımız sıradır: saldırının gerçek olduğunu doğrulayın, şeklini ölçün, kutunun içinden atılabilecek yükü atın ve sunucuda artık yazdığınız hiçbir şeyin önemli olmadığı, yalnızca önündeki 1.5 Tbps yukarı akış temizleme kapasitesinin önemli olduğu tam noktayı fark edin. $8.00/aydan başlayan tek bir VPS için yazıldı, bir NOC için değil.

2026-09-06 tarihinde güncellendi · 15 dk okuma · Filo operasyonları
Bu sayfada
  1. Önce, gerçekten bir saldırı olduğundan emin olun
  2. Beş dakikalık triyaj
  3. Kutunun içinden düzeltemeyeceğiniz şey
  4. Katman 7: trafiğe benzeyen sel
  5. Dört kontrol, dakika başına etkiye göre sıralı
  6. Savaşı verinizi barındıran makineden vermeyin
  7. Hedef değil de yansıtıcı olduğunuz gün
  8. Durduktan sonra: post-mortem ve kalıcı araç seti
  9. Adım adım
SP·01

Önce, gerçekten bir saldırı olduğundan emin olun

Bir kesinti sırasındaki en maliyetli hata, yanlış şeyi tedavi etmektir. "Site yavaş", gerçek bir selin, indekslenmemiş bir sorguyu yayına alan bir deploy'un, her saat aynı dakikada veritabanını dökmeye başlayan bir cron görevinin, fasetli aramanızı keşfeden bir crawler'ın, büyük bir yerin ana sayfasına ulaşmış bir bağlantının ve dolmuş bir diskin ortak semptomudur. Bunların hepsi bir tarayıcıdan aynı görünür ve yanıtlar birbirini dışlar: bir migration bir indeksi unuttuğu için gerçek müşterileri hız sınırlamak istemezsiniz.

Üç soru bunları bir dakikadan kısa sürede ayırt eder. Trafik hacmi gerçekten anormal mi, yoksa trafik normal de sunucu mu yavaş? Bir sel, paket ya da saniye başına istek sayısında ani bir sıçrama olarak görünür; kötü bir deploy ise normal istek hacmi ve çökmüş bir yanıt süresi olarak görünür. Son bir saatte kendi tarafınızda bir şey değişti mi? Güvenlik duvarından önce deploy günlüğünü kontrol edin — küçük altyapılarda kendi kendine verilen zararlar saldırıları büyük farkla geride bırakır. Yük sitenin geneline mi yayılmış, yoksa tek bir yolda mı yoğunlaşmış? Gerçek seller genellikle ayrım gözetmez ya da ana sayfayı hedef alır; yüz istemci tarafından bombardımana tutulan pahalı bir uç nokta, bir DDoS'tan çok kötüye kullanıma yakındır ve çok daha ucuz bir çözümü vardır.

Bunları yanıtlayın, sonra devam edin. Bu rehberin geri kalanı şu yanıtı varsayar: hacim anormal, kendi tarafınızda hiçbir şey değişmedi ve kutu boğuluyor.

SP·02

Beş dakikalık triyaj

Önemli olan yalnızca iki arıza biçimi vardır ve bunlar birbirine zıt tepkiler gerektirir. Ya boru doludur — paketler, yukarı bağlantınızın ya da çekirdeğinizin işleyebileceğinden daha hızlı gelir ve sunucunuz, yazılımınızın herhangi biri onu görmeden önce trafik kaybeder — ya da boru sorunsuzdur ve uygulama tükenmiştir, çünkü biçimi kusursuz istekler, uygulamanın yanıtlayabileceğinden daha hızlı gelmektedir. Bunları birbirine karıştırmak saati boşa harcar: nginx ince ayarı doymuş bir hatta karşı hiçbir işe yaramaz, daha fazla bant genişliği satın almak da bir istek seline karşı hiçbir işe yaramaz.

İki sayıyı karşılaştırarak bunları birbirinden ayırın. Arayüz sayaçlarına ve CPU dağılımına aynı anda bakın. rx bayt sayısı port hızınıza yakın bir yerde sabitlenmişse, dropped ya da overrun sayaçları yükseliyorsa ve zaman uygulamanıza değil de yazılımsal kesmelere gidiyorsa, sel Katman 3 ya da 4'tedir ve bu bir kapasite sorunudur. Bant genişliği sıra dışı değilse ama worker havuzu doymuşsa, bağlantılar kuyruğa giriyorsa ve erişim günlüğü makul görünen isteklerle doluysa, bu Katman 7'dir ve bir filtreleme sorunudur.

Ardından Katman 3/4 durumunu bir adım daha sınıflandırın, çünkü alt türler farklı davranır. Bir SYN seli, SYN-RECV durumunda on binlerce yarı açık soket olarak görünür; çekirdek, syncookies açık olduğunda bunu iyi kaldırır. Bir UDP ya da amplifikasyon seli, hiç dinlemediğiniz portlarda — DNS, NTP, memcached, CLDAP yansımaları — devasa bir gelen hacim olarak görünür ve çalıştırdığınız hiçbir şey yardımcı olamaz, çünkü paketler ağ kartınıza ulaştığında hasar çoktan verilmiştir. Bir parçalanma ya da ham paket seli, mütevazı bir bant genişliğiyle birlikte yüksek saniye başına paket sayısı olarak görünür; bu da hattı değil CPU'yu aç bırakır. Config dosyasına dokunmadan önce hangisine sahip olduğunuzu not edin.

SP·03

Kutunun içinden düzeltemeyeceğiniz şey

Çoğu makalenin atladığı kısım budur ve saatinizin verimli olup olmayacağına karar veren kısım da budur. Hedef üzerindeki bir güvenlik duvarı kuralı, doymuş bir yukarı bağlantıyı kurtarmaz. iptables DROP'unuz, borunun sonundaki makinede çalışır — paket geçiş bağlantısını çoktan geçmiştir, ödediğiniz bant genişliğini çoktan tüketmiştir ve gerçek bir kullanıcının paketinin yerini çoktan almıştır. Bunu yerel olarak düşürmek, uygulamanızı döngüleri boşa harcamaktan korur ki bunun bir değeri vardır, ama bant genişliğinizi hiçbir şekilde korumaz.

Tek bir sunucu için dürüst tavan, kabaca iki sayının küçüğüdür: bağlı olduğu port hızı ve CPU'sunun sınıflandırabileceği saniye başına paket sayısı. Kural setiniz ne kadar zarif olursa olsun, 1 Gbps'lik bir port 1 Gbps'te doludur ve küçük paketlerden oluşan mütevazı bir sel, bant genişliği sayısı alarm verici görünmeden çok önce birkaç çekirdeği kesme işlemede tüketebilir. Bu noktadan sonra, işe yarayan tek şey, saldırıdan daha fazla kapasiteye sahip olan ve trafiği hattınıza hiç ulaşmadan düşüren, daha yukarıda bir cihazdır. Temizleme dediğimiz şey budur ve filomuzdaki her makinenin daha büyük bir güvenlik duvarı yerine 1.5 Tbps kesintisiz temizleme kapasitesinin arkasında durmasının nedeni de budur.

Bundan çıkan sonuç da aynı derecede önemlidir: yukarı akış korumanız yoksa, sağlayıcınızın büyük hacimsel bir saldırıya yanıtı adresinizi null-route etmektir, çünkü alternatifi o hat üzerindeki diğer her müşteriyi kötü etkilemektir. Bu kötü niyet değildir, aritmetiktir — ve bu, saldırganın hiçbir şeyi kırmadan sizi pahalıya mal ederek kazandığı anlamına gelir. Temizlemenin planınıza dahil mi yoksa hiç etkinleştirmediğiniz ücretli bir ek mi olduğunu önceden bilmek, olay sırasında değil bugün yapmaya değer beş dakikalık bir kontroldür. Bizimki her planda dahildir, ki sabahın 3'ünde işe yarayan tek düzenleme de budur.

SP·04

Katman 7: trafiğe benzeyen sel

Uygulama katmanı seli daha zordur, çünkü her bir istek tek tek meşrudur. İyi kurulmuş bir HTTP seli, TCP el sıkışmasını tamamlar, TLS müzakeresi yapar, makul bir user agent ile geçerli bir GET / gönderir ve yanıtı okur. İçindeki hiçbir paket bozuk değildir. Sizi öldüren şey aritmetiktir: bir istek, saldırganın göndermesine neredeyse hiçbir şeye mal olmaz, ama size bir veritabanı sorgusuna, bir şablon render'ına ve artık başka kimseye hizmet vermeyen bir worker'ın yüz milisaniyesine mal olur.

İpuçları kendi erişim günlüğünüzdedir ve onlara bakmak yerine onları aramaya başladığınızda genellikle bariz hale gelirler. Önbellek atlatan sorgu dizeleri/?1234567 adresine giden, her biri sahip olduğunuz her önbelleği alt eden benzersiz bir URL olan binlerce istek — tek başına en yaygın imzadır. Uzun kuyruğu olmayan bir user-agent dağılımı: gerçek trafik, yüzlerce tarayıcı sürümünün karmakarışık bir karışımıdır, bir sel ise genellikle bir milyon kez tekrarlanan üç dize ya da hiçbir gerçek kullanıcının kullanmadığı bir tanedir. Her yerde aynı olan bir referrer alanı. Statik varlıklarınızı tamamen atlayan istekler — gerçek bir tarayıcı, HTML'den sonra CSS'i, fontları ve görselleri getirir; bir sel istemcisi ise HTML'yi ister ve ayrılır. Ve fazla düz olan bir kaynak dağılımı: on bin konut adresine yayılmış ve her biri saniyede iki istek gönderen bir botnet, adres başına oran şüpheli derecede tekdüze olduğunu fark edene kadar popülerlik gibi görünür.

Sonra neredeyse hiç trafiğe ihtiyaç duymayan çeşit gelir: yavaş saldırı. Açılan, her yirmi saniyede bir başlık gönderen ve hiç bitmeyen birkaç yüz bağlantı, bant genişliği grafiğiniz düz kalırken sahip olduğunuz her worker'ı işgal eder. Çözüm bir hız sınırı değildir — istek oranı zaten çok küçüktür — çözüm agresif başlık ve gövde zaman aşımlarıdır; bu yüzden bunlar aşağıda sonradan akla gelen bir fikir olarak değil ilk yapılandırma bloğunda yer alır.

SP·05

Dört kontrol, dakika başına etkiye göre sıralı

Baskı altında, önce en yüksek kaldıraçlı şeyi yapın. Aşağıdaki sıra rastgele değildir; her birinin, dikkatinizin her dakikasında ne kadar yük attığına göre kabaca azalan sırayladır.

  • Ucuz bir şey sunun. Uygulamanızın önünde otuz saniyelik bir mikro önbellek, saniyede bin aynı isteği tek bir orijin isteğine ve 999 bellek okumasına dönüştürür. Neredeyse her HTTP selinde tek başına en büyük kaldıraçtır, bir direktif bloğuna mal olur ve anonim trafik için neredeyse her zaman güvenlidir. Bir önbellek kaçırmasının backend'e kalabalık bir hücum göndermemesi için proxy_cache_lock ekleyin.
  • Eşzamanlılığı sınırlayın ve zaman aşımlarını kısaltın. Adres başına limit_conn artı sıkı başlık, gövde ve keepalive zaman aşımları, yavaş saldırıları kökünden öldürür ve tek bir istemcinin worker havuzunuzu kilitlemesini engeller. Bu, gerçek kullanıcılara en az maliyeti olan kontroldür.
  • Hız sınırlayın, burst ile. Makul bir burst ile limit_req hassastır ama ayarlanması daha yavaştır ve kendi baseline'ınızdan değil panikten ayarlarsanız yanlış pozitif üreten kontrol de budur. Bir sayı seçebilmeden önce istemci başına normal saniye başına istek sayınızı bilmeniz gerekir — bu yüzden bu rehberin sonundaki post-mortem, kulağa geldiğinden daha önemlidir.
  • Dar kapsamlı ve isteksizce engelleyin. Belirli ağları düşürmek, kaynaklar yoğunlaşmışsa işe yarar, değilse hiçbir işe yaramaz. Ayrıca kötü yaşlanır: bir olay sırasında eklediğiniz her engelleme, üç ay sonra sessizce reddediyor olabileceğiniz bir müşteridir. Kuralların kendiliğinden sona ermesi için zaman aşımlı bir set kullanın.

Listede olmayana dikkat edin: tek tek IP adreslerini elle yasaklamak, web sunucusunu tekrar tekrar yeniden başlatmak ve "işe yarıyor mu bir bakalım" diye güvenlik duvarını devre dışı bırakmak. Birincisi, dağıtık bir kaynağa karşı önemli olamayacak kadar yavaştır, ikincisi sahip olduğunuz her sıcak bağlantıyı çöpe atar ve üçüncüsü bir olayın nasıl bir ele geçirilmeye dönüştüğüdür.

SP·06

Savaşı verinizi barındıran makineden vermeyin

Yukarıdaki her kontrol, veritabanınızı barındıran kutunun dışında bir yerde çalıştığında daha değerlidir. Edge'iniz ayrı bir düğümse, sel, tüm işi selleri sonlandırmak olan bir makinede sonlanır: elinde gerçek istemci adresiyle önbellekler, hız sınırlar ve düşürür; orijin ise özel bir tünel üzerinden yalnızca küçük, filtrelenmiş kalıntıyı görür. Edge çöktüğünde onu 15 min içinde değiştirirsiniz ve hiçbir şey kaybetmezsiniz, çünkü üzerinde hiçbir şey yoktur. Orijin çöktüğünde ise bir kesintiniz ve bir geri yükleme işiniz olur.

Bu ayrım, aynı zamanda çoğu temizlemeyi süse dönüştüren atlatma yolunu da kapatır. Orijinin hâlâ herkese açık bir dinleyicisi varsa, adresini bulan bir saldırgan — pasif DNS, bir sertifika şeffaflığı girdisi, bir MX kaydı ya da bir bağlantı önizlemesi yoluyla — yapılandırdığınız her kontrolü aşarak doğrudan uygulamayı vurabilir. Bu, aksi kanıtlanana kadar herhangi bir "korumalı" sitenin varsayılan durumu olarak ele alınmaya değecek kadar yaygındır. Tutan versiyonu inşa etmek başlı başına bir rehberdir: orijininde hiç herkese açık dinleyicisi olmayan bir offshore reverse proxy.

Bir olayın ortasına dair bir uyarı: bu mimaridir, ilk yardım değildir. Saldırı altındayken bir edge ayağa kaldırmak, DNS'i taşımak ve bir tüneli yeniden inşa etmek, baskı altında kötü yapılan iki saatlik bir iştir ve yalnızca DNS değişikliği bile TTL'nizin söylediği süre boyunca etkili olmayacaktır. Elinizde varsa, kullanın. Yoksa, saati elinizdeki kontrollerle atlatın ve bunu daha sonraki sakin haftada inşa edin — ki tam olarak kimsenin yapmadığı şey de budur.

SP·07

Hedef değil de yansıtıcı olduğunuz gün

Bu olayın, sunucunuzun kurban olmadığı ve kimsenin size söylemediği ikinci bir versiyonu vardır. Açık bir resolver, açığa çıkmış bir NTP daemon'ı, herkese açık bir arayüzde kimlik doğrulaması olmayan bir memcached, bir konteynerin içinde bir SSDP ya da CLDAP yanıtlayıcısı — bunların her biri, başkasına yönelik küçük, sahte bir isteği çok daha büyük bir yanıtla cevaplar. Sizin tarafınızdan bakıldığında belirtiler tersine döner: giden bant genişliği yüksektir, gelen mütevazıdır, uygulamanız sorunsuzdur ve ilk gerçek sinyal bir kötüye kullanım bildirimi ya da askıya alınmış bir porttur.

Bu kontrol bir dakika sürer ve aynı çalışma kılavuzuna aittir, çünkü triyaj sırasında zaten çalıştırdığınız komutun aynısıdır. ss -tulpn, bilerek koymadığınız herkese açık bir adrese bağlı hiçbir şeyi listelememelidir ve UDP servisleri, amplifikasyon yapan servisler oldukları için özellikle şüpheyi hak eder. Özyinelemeli bir resolver, yalnızca localhost'a ya da bir tünel adresine bağlı olmalıdır; memcached ve Redis, internetten asla erişilebilir olmamalıdır; ve -p 0.0.0.0: ile bir port yayınlayan herhangi bir konteyner, yapılandırdığınız güvenlik duvarında tam da bir delik açmıştır, çünkü Docker kendi kurallarını sizinkilerden önce yazar. Bu sonuncusu insanları her seferinde şaşırtır.

Aynı örüntü, bir sağlayıcının bir adresi aniden null-route etmesinin diğer nedeni olan, zaten ele geçirilmiş bir makineden gelen giden selleri de kapsar. Giden grafiğiniz yüksek ve uygulamanız boştaysa, yapılandırmayı okumayı bırakıp süreçleri kontrol etmeye başlayın — bu bir kapasite sorunu değil bir sızmadır ve yanıt, onu filtrelemek değil, kutuyu bilinen iyi durumdaki bir yedekten yeniden inşa etmektir.

SP·08

Durduktan sonra: post-mortem ve kalıcı araç seti

Saldırılar durur. Genellikle saldırgan sıkılır, bazen temizleme bunu anlamsız kılar, arada sırada da sabit süreli bir booter aboneliğinin süresi basitçe dolmuştur. O anki cazibe, her şeyi tam olarak olduğu gibi bırakıp yatağa girmektir; bir geçici hız sınırının dokuz ay sonra bütün bir ülke için kalıcı, unutulmuş, sessiz bir 429'a dönüşmesi de tam olarak böyle olur. Taze haldeyken döngüyü kapatmak için yirmi dakika ayırın.

Üretmeye değer üç çıktı vardır. Bir baseline: normal saniye başına isteğiniz, normal istemci başına oranınız, zirvedeki normal bant genişliğiniz. Bu sayılar olmadan, bir sonraki olay sırasında koyduğunuz her sınır bir tahmindir ve yarısı müşterilere zarar veren yönde yanlış olacaktır. Bir geri alma listesi: tarih ve gerekçesiyle birlikte değiştirdiğiniz her şey; böylece acil durum yapılandırması sessizce kalıcı olana dönüşmez. Dört komut uzunluğunda ve site çöktüğünde ulaşabileceğiniz bir yerde duran bir çalışma kılavuzu — sunucunun üzerinde değil, ve yalnızca kendi kafanızda da değil.

Ardından iki yapısal boşluğu kapatın, çünkü katmanın yığındaki yeri tam olarak burasıdır. Temizleme hacmi emen şeydir, edge selin verinizden uzak durmasını sağlayan şeydir ve arkalarındaki kutunun yine de düzgünce sertleştirilmesi ve geri yüklenebilir uzak konum yedeklerine sahip olması gerekir, çünkü bundan sonraki olay hiç de bir sel olmayabilir. Bir DDoS'tan sağ çıkıp bir ay sonra diskini kaybeden bir sunucu hiçbir zaman dirençli değildi — iki kez şanslıydı.

SP·09

Adım adım

  1. 01

    Herhangi bir şeyi değiştirmeden önce doğrulayın

    Bir config dosyasına dokunmadan önce makinenin dürüst bir görüntüsünü alın. Paketlerde ya da isteklerde ani bir sıçrama ve zamanın nereye gittiği ile ilgileniyorsunuz — yazılımsal kesmeler yüzünden CPU'dan mahrum kalmış bir uygulama, bir veritabanını bekleyen bir uygulamadan çok farklı bir olaydır.

    # is the box alive, and where is the time going?
    uptime                     # load average against your core count
    vmstat 1 5                 # 'in' and 'cs' high, 'id' near zero = packet work
    mpstat -P ALL 1 3          # %soft pinned on one core = interrupt saturation
    
    # is the pipe full, or just busy?
    ip -s link show eth0       # rx bytes, and the errors/dropped counters
    ethtool eth0 | grep -i speed
    
    # requests per second from your own log, minute by minute
    tail -n 20000 /var/log/nginx/access.log \
      | awk -F'[][]' '{print $2}' | cut -d: -f2-4 | uniq -c | tail -5

    Bunun bir saldırı olduğu sonucuna varmadan önce kendi deploy günlüğünüzü ve cron tablonuzu kontrol edin. Kendi kendine verilen kesintiler, tek bir VPS'te sellerden daha yaygındır ve dışarıdan aynı görünürler.

  2. 02

    Trafiğin şeklini altmış saniyede ölçün

    Şimdi sınıflandırın. Üç soru: kaç farklı kaynak var, hangi protokol ve durumda, ve — HTTP ise — hangi yollar ve hangi agent'lar. Yanıtlar, hangi kontrole başvuracağınıza karar verir ve toplanmaları yaklaşık bir dakika sürer.

    # top source addresses on the wire right now
    timeout 20 tcpdump -nn -i eth0 -c 20000 2>/dev/null \
      | awk '{print $3}' | rev | cut -d. -f2- | rev \
      | sort | uniq -c | sort -rn | head -20
    
    # TCP state census: a wall of SYN-RECV is a SYN flood
    ss -tan | awk '{print $1}' | sort | uniq -c | sort -rn
    
    # layer 7: talkers, paths, agents over the last 50k requests
    L=/var/log/nginx/access.log
    tail -n 50000 $L | awk '{print $1}' | sort | uniq -c | sort -rn | head -20
    tail -n 50000 $L | awk '{print $7}' | sort | uniq -c | sort -rn | head -20
    tail -n 50000 $L | cut -d'"' -f6   | sort | uniq -c | sort -rn | head -10

    Sonucu ipuçlarına göre okuyun: tek bir yolda benzersiz sorgu dizeleri, uzun kuyruğu olmayan bir user-agent listesi, statik varlıklarınıza yönelik hiç istek olmaması ya da tuhaf biçimde tekdüze bir adres başına oran. Bant genişliği hiç dinlemediğiniz portlarda yüksekse, burada durun — bu hacimsel bir seldir ve önemli olan tek adım altıncı adımdır.

  3. 03

    Ucuz bir şey sunun ve bağlantıları sınırlayın

    Önce en yüksek kaldıraç. Otuz saniyelik bir mikro önbellek, aynı anonim isteklerden oluşan bir seli tek bir orijin isteğine indirger ve sıkı zaman aşımları, bir hız sınırının göremediği yavaş saldırıları öldürür. İkisini de http bloğuna koyun, ardından sıcak bağlantılarınızı korumak için yeniden başlatmak yerine yeniden yükleyin.

    # /etc/nginx/nginx.conf — http block
    limit_conn_zone $binary_remote_addr zone=perip:10m;
    limit_req_zone  $binary_remote_addr zone=flood:20m rate=10r/s;
    
    client_header_timeout 10s;
    client_body_timeout   10s;
    send_timeout          10s;
    keepalive_timeout     20s;
    reset_timedout_connection on;
    
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=hot:64m
                     max_size=2g inactive=10m use_temp_path=off;
    # the server block — cap concurrency, serve the cached copy
    limit_conn perip 20;
    
    location / {
        proxy_cache hot;
        proxy_cache_valid 200 301 302 30s;
        proxy_cache_lock on;
        proxy_cache_use_stale error timeout updating
                              http_500 http_502 http_503 http_504;
        add_header X-Cache $upstream_cache_status;
        proxy_pass http://127.0.0.1:8080;
    }
    nginx -t && systemctl reload nginx
    curl -sI https://example.com/ | grep -i x-cache   # want: HIT on the second call
  4. 04

    Kendi proxy'nizi değil, gerçek istemciyi hız sınırlayın

    nginx'in önünde bir şey duruyorsa, her istek tek bir adresten gelir ve adres başına bir sınır, saldırganı değil proxy'yi kısar — ya da onu doğrudan yasaklar ve siz onu savunurken siteyi çökertir. Forward edilen başlığa yalnızca proxy adresinden güvenin, internetten asla, ardından sınırı uygulayın.

    # /etc/nginx/conf.d/realip.conf — the tunnel or edge address only
    set_real_ip_from 10.66.0.1;
    real_ip_header   X-Forwarded-For;
    real_ip_recursive off;
    # burst absorbs bursty humans; nodelay keeps the page fast for them
    location / {
        limit_req zone=flood burst=20 nodelay;
        limit_req_status 429;
    }
    
    # the expensive paths get a much tighter bucket of their own
    location ~ ^/(search|login|register|api/) {
        limit_req zone=flood burst=5;
        limit_req_status 429;
    }

    Sonra az önce ne yaptığınızı izleyin: tail -f /var/log/nginx/error.log | grep limiting. Sınırlanan adresler müşterilerinize benziyorsa, oran çok düşüktür — yükseltin. Gerçek kullanıcıları engelleyen bir sınır, kendi kendinize neden olduğunuz bir kesintidir.

  5. 05

    Dar kapsamlı engelleyin ve her engellemeye bir sona erme süresi verin

    Yalnızca ikinci adım yoğunlaşmış kaynaklar gösterdiğinde yapmaya değer. Bin kural değil bir set kullanın — bir ipset araması sabit zamanlıdır, uzun bir iptables zinciri ise her paket için baştan sona taranır ve kendi başına bir hizmet reddine dönüşür. Bugünün acil durumunun gelecek yılın sessiz engelleme listesine dönüşmemesi için her girdiye bir zaman aşımı verin.

    ipset create flood hash:net timeout 3600 -exist
    iptables -I INPUT -m set --match-set flood src -j DROP
    
    # feed it from the census: /24s you actually verified, not guesses
    for n in 203.0.113.0/24 198.51.100.0/24; do ipset add flood $n -exist; done
    
    # SYN flood: let the kernel do the part it is good at
    sysctl -w net.ipv4.tcp_syncookies=1
    sysctl -w net.ipv4.tcp_max_syn_backlog=8192
    sysctl -w net.core.somaxconn=8192
    
    ipset list flood | head -20      # keep a copy of this for the post-mortem

    Kestiğiniz müşterileri isim isim sayamıyorsanız, koca bir ülkeyi coğrafi olarak engellemekten kaçının. Ve bir teoriyi test etmek için asla ufw disable yapmayın: aktif bir saldırı altında güvenlik duvarsız bir kutu, bir bant genişliği olayının nasıl bir ihlale dönüştüğüdür.

  6. 06

    Gerçekten emebilecek katmana yükseltin

    Arayüz sayaçları hattın doymuş olduğunu söylüyorsa ya da CPU'nuz boştayken düşüşler yükseliyorsa, sunucuda yapabileceğiniz her şeyin tavanına ulaşmışsınız demektir. Bu okumayı doğrulayın, ardından ayarlamaya devam etmek yerine yükseltin.

    # drops in the stack itself — second column is 'dropped'
    awk '{print strtonum("0x" $2)}' /proc/net/softnet_stat | paste -sd+ | bc
    
    # interface-level loss against link speed
    ip -s link show eth0 | sed -n '3,6p'

    Yukarı akış temizlemesi devredeyken genellikle yapacak bir şey yoktur: tespit kesintisizdir ve sel, portunuza ulaşmadan önce ağ içinde düşürülür — filomuzda bu, her planın önünde duran 1.5 Tbps kapasitedir, dolayısıyla olay çoğu zaman ancak sonradan bir grafik olarak görünür hale gelir. Saldırı hacimsel değil de iyi biçimlendirilmiş bir HTTP seliyse, bu tam olarak bir L7 kalkanının işidir, çünkü istek selleri paket düzeyinde kullanıcılardan ayırt edilemez ve daha yukarıda değerlendirilmesi gerekir. Hiç temizlemeniz yoksa, gerçekçi seçenekleriniz, temizlemesi olan bir edge'in arkasına geçmek ya da beklemektir — ve bir sonraki saldırıdan önce ilkini planlamaktır.

  7. 07

    Döngüyü kapatın: doğrulayın, geri alın, sonra yazıya dökün

    Makine üzerindeki bir kabuktan değil, makinenin dışından doğrulayın. Ardından acil durum önlemlerini bilinçli olarak geri alın, her zaman iyi bir fikir olanları koruyun ve bir sonraki olayın bir tahminle değil bir baseline ile başlaması için sayıları kaydedin.

    # from somewhere else entirely: is the site healthy for a normal user?
    curl -s -o /dev/null -w 'code=%{http_code} ttfb=%{time_starttransfer}s\n' \
         https://example.com/
    
    # did you leave a limit that is biting real people?
    grep -c 'limiting requests' /var/log/nginx/error.log
    
    # what is still blocked, and when does it expire?
    ipset list flood | head -30

    Önbelleği, zaman aşımlarını ve syncookies'i koruyun — bunlar kalıcı iyileştirmelerdir. Agresif hız sınırlarını, ölçtüğünüz baseline'a artı biraz pay bırakarak geri alın ve ipset girdilerinin kendiliğinden sona ermesine izin verin. Ardından bir ve iki numaralı adımlardaki dört komutu, normal saniye başına isteğinizin ve normal zirve bant genişliğinizin yanında, bu sunucu olmayan bir yerde saklanan bir çalışma kılavuzuna yazın. Bir sonraki saldırı, yalnızca bu iki sayı var olduğu için daha kısa bir olay olur.

SP·10 — SSS

Hızlı yanıtlar

Gerçek bir DDoS'u bir trafik sıçramasından nasıl ayırt ederim?

Büyüklüğe değil şekle bakın. Organik sıçramaların bir yapısı vardır: birçok ağdan gelirler, user agent'lar karmakarışık bir uzun kuyruktur, istemciler HTML'den sonra CSS'inizi ve görsellerinizi getirir ve referrer genellikle gerçek bir yere işaret eder. Bir sel ise düz ve tekrarlıdır — aynı bir avuç agent, statik varlık isteği yok, tekdüze istemci başına oranlar ve genellikle önbelleklemeyi alt etmek için tasarlanmış benzersiz sorgu dizeleri. İki şey de kendini hızla eler: kimseyi suçlamadan önce deploy günlüğünüzü ve cron tablonuzu kontrol edin, çünkü bir saat önce yayına alınmış yavaş bir sorgu aynı belirtileri üretir ve tam tersi bir çözüm gerektirir.

iptables ya da fail2ban bir DDoS'u durdurabilir mi?

Küçük ve yoğunlaşmış saldırılara karşı yardımcı olurlar, hacimsel olanlara karşı ise hiçbir işe yaramazlar. İkisi de borunun sonundaki makinede çalışır, dolayısıyla bir kural devreye girdiğinde paket bant genişliğinizi çoktan tüketmiştir — link kapasitesini değil CPU döngülerini kurtarıyorsunuzdur. fail2ban ayrıca tasarımı gereği reaktiftir: bir günlüğü olay bittikten sonra okur, ki bu bir sel için dakikalarca geç kalmak demektir, ve gerçek istemci adresini yapılandırmadıysanız kendi reverse proxy'nizi yasaklayabilir. Bunları kaba kuvvete ve tarayıcılara karşı hijyen olarak kullanın; hacme karşı yukarı akış temizlemesi kullanın.

Sunucumun IP adresini değiştirmek yardımcı olur mu?

Kısa süreliğine ve nadiren, ve bu size dünyadaki her DNS önbelleğine mal olur. Saldırgan bir hostname'i hedefliyorsa, yeni adres dakikalar içinde DNS'e girer ve sel onu takip eder; bu hamle yalnızca hedef ham adres olduğunda ve saldırganın onu yeniden çözümlemenin kolay bir yolu olmadığında bir işe yarar. Gerçekten işe yarayan versiyon kozmetik değil yapısaldır: önüne değiştirilebilir bir edge koyun, orijini herkese açık internetten erişilemez tutun; o zaman saldırı altındaki adres, verinize dokunmadan 15 min içinde atabileceğiniz bir adres olur.

DDoS koruması gecikme ekler mi ya da bir şeyi bozar mı?

Katman 3/4 temizleme kesintisizdir ve etkin biçimde görünmezdir — paketler yalnızca bir olay sırasında yönlendirilmek yerine bir filtreleme yolundan geçer, dolayısıyla ne bir yedeğe geçiş anı ne de normal trafik üzerinde ölçülebilir bir bedel vardır. Uygulama katmanı filtreleme farklıdır, çünkü bir isteğin insan olup olmadığına karar vermek bazen onu sınamayı gerektirir ve her sınama az sayıda alışılmadık istemciyi etkiler. Planlamaya değer iki arıza biçimi vardır: oturum açmış kullanıcılara sunulan önbelleğe alınmış yanıtlar — ki bu bir temizleme sorunu değil bir önbellek anahtarı sorunudur — ve bir sınamayı yanıtlayamayan API istemcileri; bu yüzden API yollarınızı bunu sonradan keşfetmek yerine bilerek muaf tutarsınız.

Sunucum başka birine saldıran taraf olabilir mi?

İnsanların beklediğinden daha sık olur ve belirtiler tersine döner: yüksek giden bant genişliği, normal gelen, sorunsuz hissettiren bir uygulama ve ilk gerçek sinyal olarak bir kötüye kullanım bildirimi. Olağan nedenler, açık bir DNS resolver, açığa çıkmış bir NTP ya da memcached servisi ya da bir portu 0.0.0.0'a yayınlayıp kendi güvenlik duvarı kuralını sizinkinden önce yazan bir konteynerdir. ss -tulpn çalıştırın ve amaçlamadığınız hiçbir şeyin herkese açık bir adrese bağlı olmadığından emin olun. Giden trafik yüksekse ve bunu açıklayan meşru bir servis yoksa, bunu bir ele geçirilme olarak ele alın ve filtreleyerek kurtulmaya çalışmak yerine bilinen iyi durumdaki bir yedekten yeniden inşa edin.

L3/4 koruması dahil — yine de bir L7 kalkanına ihtiyacım var mı?

Bu tamamen ne çalıştırdığınıza bağlıdır. Statik bir site, bir oyun sunucusu ya da yükün sayfa render'ları değil de paketler olduğu her şey, yalnızca ağ seviyesindeki temizleme ile iyi bir şekilde karşılanır. Arama, giriş, ödeme, veritabanına dokunan bir API gibi pahalı uç noktaları olan dinamik bir uygulama, hiçbir paket filtresinin asla itiraz etmeyeceği, saniyede birkaç bin tamamen geçerli istek tarafından çökertilebilir ve bir uygulama katmanı kalkanının tam olarak işe yaradığı yer de burasıdır. Ama ucuz ilk hamle bu ek özellik değildir: üçüncü ve dördüncü adımlardaki mikro önbellek ve yol başına hız sınırlarıdır; bunlar aritmetik avantajın çoğunu bedavaya ortadan kaldırır.

Pratiğe dökün

VPS 15 min içinde çevrimiçi, özel sunucu 2–12 h içinde teslim edilir. $30.00'den kripto ile yükleyin — kimlik bağlı değil.

VPS dağıt