Teknik derinlik
DDoS için Linux Ağ Yığını Tuning: NIC Kuyrukları, RSS/RPS ve XDP
Son güncelleme: Ağustos 2026 · NIC kuyrukları, paket dağıtımı, IRQ yakınlığı ve XDP · Okuma süresi ~20 dk

Saldırı bant genişliği değil paket hızıysa, bir CPU çekirdeği softirq içinde yüzde yüze çıkarken diğerleri boşta kalır ve hiçbir sysctl ayarı bunu çözmez. Çare sürücü ve kesme katmanıdır: NIC halka tamponları, paketleri çekirdeklere yayan RSS/RPS/RFS, IRQ yakınlığı ve yığından önce sürücüde düşüren XDP. Bu rehber, sysctl sıkılaştırmasının paket hızı tarafındaki tamamlayıcısıdır.
Bu rehber, Linux sunucu sıkılaştırma rehberinin paket hızı tarafındaki tamamlayıcısıdır. O rehber bağlantı durumunu sysctl ile savunur: SYN kuyrukları, conntrack, dosya tanıtıcıları. Bu rehber ise paket işleme yolunu savunur. NIC’i, kuyruklarını, kesmeleri ve alım yolunu, yani saldırı durumla değil saniyedeki paket sayısıyla ölçüldüğünde devreye giren her şeyi.
Sizi buraya getiren belirti çok özeldir. Bir CPU çekirdeği softirq içinde yüzde yüze yakın
sabitlenmişken diğerleri boştadır ve bant genişliği hattın sınırının çok altındadır. Küçük
paketlerden oluşan bir sel, hattı doldurmadan çok önce tek bir çekirdeğin paket işlemesini
doyurabilir ve diğer rehberdeki hiçbir sysctl buna dokunmaz. Aşağıdaki her ayar, kendi ethtool
ya da sysfs komutu ve işe yaradığını gösteren sayacıyla birlikte gelir.
| Cihaz | Belirti | Katman | Komut |
|---|---|---|---|
| Bir çekirdek yüzde yüz softirq, diğerleri boşta | RSS / RPS dağıtımı, IRQ yakınlığı | ethtool -L; /sys .../rps_cpus; /proc/irq | |
| softnet 'dropped' sütunu artıyor | NIC halka tamponu; netdev backlog/budget | ethtool -G; sysctl net.core.netdev_* | |
| softnet 'squeezed' sütunu artıyor | softirq bütçesi; kesme birleştirme | netdev_budget; ethtool -C | |
| Yığına ulaşan yüksek pps çöp trafik | conntrack öncesi, sürücüde XDP ile düşürme | ip link set ... xdp; küçük bir XDP programı | |
| Çekirdekler arasında akış yerelliği kayboluyor | RFS (receive flow steering) | rps_flow_cnt; rps_sock_flow_entries |
Her satır sürücü ve kesme katmanına aittir; Linux sunucu rehberindeki sysctl sıkılaştırmasının altındadır. Sizi buraya getiren belirti, bant genişliği sınırın çok altındayken CPU'nun softirq içinde harcanmasıdır. Hattın kendisi dolduğunda ise bunların hiçbiri işe yaramaz.
0. Önce temel ölçüler: paketlerin ve CPU’nun nerede olduğunu okuyun
En önemli okuma, çekirdek başına softirq süresi ve softnet istatistikleridir:
# Çekirdek başına softirq — bir çekirdek sıcakken diğerleri boşta mı?
mpstat -P ALL 1 3 # her CPU için %soft sütununu izleyin
# ya da
watch -n1 "grep . /proc/softirqs | head"
# softnet_stat: sütun1 işlenen, sütun2 DÜŞEN, sütun3 zaman/bütçe SIKIŞAN (CPU başına, hex)
cat /proc/net/softnet_stat
# Hangi IRQ'lar tetikleniyor ve hangi CPU'da
cat /proc/interrupts | grep -Ei 'eth|ens|enp|mlx|i40e|ixgbe'
# NIC düzeyinde düşmeler ve hatalar
ethtool -S eth0 | grep -Ei 'drop|miss|error|fifo|rx_no_buffer'
Diğerleri boştayken tek bir sıcak %soft çekirdeği, paket hızının imzasıdır. softnet_stat
ikinci sütunu (düşmeler) ve üçüncü sütunu (sıkışmalar), kısıtın backlog mu bütçe mi olduğunu
söyler. Aşağıdaki her değişiklik bu temel ölçülere göre değerlendirilir.
1. NIC halka tamponları: paketlerin ilk kaybedildiği yer
Alım halka tamponu, NIC’in paketleri çekirdeğin alması için bıraktığı yerdir. Bir paket seli altında, küçük boyutlu bir halka, herhangi bir dağıtım yardıma yetişemeden paketleri düşürür:
# Mevcut ve maksimum halka boyutları
ethtool -g eth0
# RX (ve TX) değerlerini NIC'in desteklediği maksimuma doğru yükseltin
ethtool -G eth0 rx 4096 tx 4096
# Değişiklikten sonra düşme sayacının artmayı bıraktığını doğrulayın
ethtool -S eth0 | grep -Ei 'rx_no_buffer|rx_missed|fifo'
Daha büyük bir halka biraz bellek ve gecikmeye mal olur; paket seli alan bir sunucuda bu takas
neredeyse her zaman değer. rx_no_buffer_count maksimum halka boyutunda hâlâ artıyorsa kısıt
CPU’ya kaymış demektir, ki sonraki bölümlerin konusu odur.
2. RSS: alım işlemeyi donanımda çekirdeklere yayın
Receive Side Scaling gelen akışları, her biri kendi çekirdeğinde kendi kesmesine sahip birden çok NIC alım kuyruğuna hashler. Tek bir çekirdeğin darboğaz olmasını durdurmanın en verimli yolu budur:
# NIC kaç combined/alım kanalına sahip ve kaçı etkin?
ethtool -l eth0
# Servis edebileceğiniz çekirdek sayısı kadar combined kuyruk etkinleştirin
ethtool -L eth0 combined 8
# RSS yönlendirme tablosunu göster (her hash kovasının hangi kuyruğa gittiği)
ethtool -x eth0
# Etkinleştirdikten sonra /proc/interrupts NIC IRQ'larını çekirdeklere yayılmış göstermeli,
# ve mpstat tek sıcak çekirdek yerine %soft'u yayılmış göstermeli
mpstat -P ALL 1 3
RSS ilk tercihtir, çünkü yayma donanımda ve sıfır CPU bedeliyle olur. Sınırı, NIC’in sağladığı kuyruk sayısıdır. Bu sayı yetersiz kaldığında, ki sanallaştırılmış NIC’lerde yaygındır, boşluğu yazılımda RPS doldurur.
3. RPS ve RFS: donanımın yetmediği yerde yazılım dağıtımı
Receive Packet Steering paketleri çekirdek içinde çekirdeklere yayar; Receive Flow Steering ise akış yerelliği ekleyerek bir akışı, uygulamasının çalıştığı çekirdeğe düşürür:
# RPS: bir alım kuyruğu için CPU maskesini (çekirdeklerin hex bit maskesi) ayarla
echo ff > /sys/class/net/eth0/queues/rx-0/rps_cpus
# RFS: önce genel akış tablosu boyutu, sonra kuyruk başına
echo 32768 > /proc/sys/net/core/rps_sock_flow_entries
echo 32768 > /sys/class/net/eth0/queues/rx-0/rps_flow_cnt
# Yayılımın gerçekleştiğini doğrula: artık hiçbir çekirdek tüm softirq yükünü taşımamalı
grep NET_RX /proc/softirqs
RPS’i her alım kuyruğu için, uygulamaya ayırdığınız çekirdekleri dışlayan bir maskeyle etkinleştirin.
Üstüne RFS bir akışın paketlerini tek bir çekirdeğe göndererek önbellek yerelliğine yardım eder.
rps_sock_flow_entries ile kuyruk başına rps_flow_cnt değerini birlikte ayarlayın.
4. IRQ yakınlığı: kuyrukları sabitleyin, irqbalance’ı kapatmayı düşünün
RSS kuyrukları yerindeyken her kuyruğun kesmesini adanmış bir çekirdeğe sabitlemek, irqbalance’ın
yük altında yer değiştirmesine izin vermek yerine, yayılımı öngörülebilir kılar:
# NIC'in kuyruk başına IRQ numaralarını bul
grep -Ei 'eth0|ens|enp' /proc/interrupts | awk '{print $1}' | tr -d ':'
# Bir IRQ'yu belirli bir çekirdeğe sabitle (çekirdeğin hex maskesini smp_affinity'ye yaz)
echo 2 > /proc/irq/145/smp_affinity # çekirdek 1
echo 4 > /proc/irq/146/smp_affinity # çekirdek 2
# Adanmış, yüksek hızlı bir host'ta irqbalance'ın yeniden karıştırmasını durdur
systemctl stop irqbalance
systemctl disable irqbalance
irqbalance’ı kapatmak evrensel değil, ölçümle verilecek bir karardır. Paket hızı saldırısı
altındaki adanmış bir host’ta elle sabitleme daha öngörülebilirdir; genel amaçlı bir sunucuda
irqbalance çoğu zaman yeterlidir. NIC kesmelerini taşıyan çekirdekleri ayırın ve uygulamayı o
çekirdeklerden uzak tutun.
5. softirq bütçesi ve kesme birleştirme
Üçüncü softnet_stat sütunu (sıkışan) artıyorsa, softirq işleyicisi bütçesine ulaşıp kuyruğu
boşaltmadan yerini bırakıyor demektir. Bütçeyi yükseltin ve paket başına kesme yükünü kesmek için
birleştirmeyi kullanın:
# Bir softirq geçişinin kaç paket ve ne kadar süre işleyebileceğini yükselt
sysctl -w net.core.netdev_budget=60000
sysctl -w net.core.netdev_budget_usecs=8000
sysctl -w net.core.netdev_max_backlog=250000
# Kesme birleştirme: kesmeleri toplu işle; adaptive hız yükseldikçe artırır
ethtool -C eth0 adaptive-rx on rx-usecs 64
# Sıkışan sütun (her satırda 3.) artmayı bırakmalı
awk '{print strtonum("0x"$3)}' /proc/net/softnet_stat
Birleştirme, sel altında biraz gecikmeyi büyük bir verimlilikle takas eder. Agresif bir rx-usecs
değerine bağlanmadan önce normal işleyişte gecikmeye duyarlı yolu ölçün.
6. Offload’lar: saldırı sırasında ne kalsın, ne kapansın
Durumsuz offload’lar (sağlama toplamı, GRO/GSO/TSO) genelde yarar sağlar ve açık kalmalıdır. İncelenmesi gereken tek offload LRO’dur, çünkü paketleri, yönlendirmeyi ve bazı incelemeleri bozabilecek biçimde birleştirir:
# Offload durumunu göster
ethtool -k eth0 | grep -Ei 'gro|gso|tso|lro|rx-checksum'
# Generic Receive Offload genelde yardımcı olur; açık bırakın
ethtool -K eth0 gro on
# Host yönlendirme/köprüleme yapıyorsa ya da paket başına görü gerekiyorsa LRO kapalı
ethtool -K eth0 lro off
7. XDP: yığından önce, sürücüde düşürün
Dağıtım katmanının yayamadığı bir paket seli için, büyüklük mertebesini değiştiren tek host aracı XDP’dir. Sürücüde, paket ağ yığınına girmeden önce küçük bir program çalıştırır. conntrack’ten önce, nftables’tan önce, bellek ayırmadan önce. Ve saniyede milyonlarca paketi, aynı düşürmenin sonradan yiyeceği CPU’nun çok küçük bir kısmıyla düşürebilir:
# Derlenmiş bir XDP programı bağla (uyguladığı ölçüte göre düşürür)
ip link set dev eth0 xdp obj xdp_drop.o sec xdp
# Bağlı olduğunu ve hangi modda olduğunu doğrula (native en iyisi; generic yedektir)
ip link show eth0 | grep -o 'xdp[a-z]*'
# Ayır
ip link set dev eth0 xdp off
Native XDP sürücü desteği ister; olmadığında program generic modda daha az yararla çalışır. XDP diğer bölümlerden daha zahmetlidir ve ilk başvurulacak yer değildir. Ama saldırı saniyedeki paket sayısıysa ve dağıtım tükenmişse, sürücüde düşürmek, adanmış bir cihazın donanımda yaptığını host kenarında yazılımla yapmaktır.
İzlemeye bağlanacak sinyaller
# 1. Çekirdek başına softirq — sıcak çekirdek imzası
mpstat -P ALL 1 1 | awk '/%soft|Average/{print}'
# 2. softnet düşmeleri ve sıkışmaları
awk '{d+=strtonum("0x"$2); s+=strtonum("0x"$3)} END{print "dropped",d,"squeezed",s}' /proc/net/softnet_stat
# 3. NIC düzeyinde düşmeler
ethtool -S eth0 | grep -Ei 'rx_no_buffer|rx_missed|drop'
# 4. Toplam kesme hızı
grep NET_RX /proc/softirqs
Sıkışan sayacı artan tek bir sıcak çekirdek, paket hızının imzasıdır. Maksimuma çekilmiş bir halka tamponunda NIC düşmelerinin artması ise darboğazın halka değil CPU olduğu, sıradaki hamlenin de dağıtım ya da XDP olduğu anlamına gelir.
Bu katmanın dürüst sınırı
Bu katman paket hızına karşı savunur; yani bant genişliği sınırının çok altında bile vurabilen, saniyedeki paket sayısının CPU’yu doyurmasına karşı. İki durum bunun dışında kalır.
Birincisi bant genişliğidir. Saldırı erişim hattını doldurursa, paketler NIC onları görmeden önce üst tarafta düşürülür ve hiçbir kuyruk, dağıtım ya da XDP ayarı devreye giremez.
İkincisi durum tükenmesidir, ki diğer rehberin konusudur: bağlantı tabloları ve kuyruklar, paket işleme değil. İki rehber birlikte host’u kapsar. Bu rehber CPU’nun paket işleyebilir kalmasını, sunucu sıkılaştırma rehberi ise bağlantı durumunun dolmamasını sağlar. Hattın üzerinde cevap şebeke tarafındadır, ki bu rehberin XDP ile yaptığı düşürmenin donanımda ölçekli hâli oradadır.
Uygulama sırası
- Belirtiyi doğrulayın (Bölüm 0): tek sıcak softirq çekirdeği, bant genişliği sınırın çok altında.
- NIC halka tamponlarını yükseltin; NIC düşmelerinin durduğunu doğrulayın.
- Çekirdeklerin servis edebileceği kadar kuyrukla RSS’i etkinleştirin; yayılımı doğrulayın.
- Donanım kuyrukları az kaldığında RPS/RFS ekleyin.
- IRQ yakınlığını sabitleyin; irqbalance kararını ölçümden verin.
- Sıkışmalar sürüyorsa softirq bütçesini yükseltin ve uyarlanabilir birleştirmeyi açın.
- Dağıtımın yayamadığı bir sel için bir XDP düşürme programı devreye alın.
- Dört sinyali izlemeye bağlayın.
Üçüncü ve dördüncü adımlar paket hızı sorunlarının çoğunu yükü yayarak çözer; yedinci adımdaki XDP, yalnızca yaymanın soğuramadığı yük için tırmanma seçeneğidir.
Sık sorulan sorular
- Bu katmana mı yoksa sysctl ayarına mı ihtiyacım olduğunu nasıl anlarım?
- Belirtiden anlarsınız. Bir CPU çekirdeği softirq süresinde yüzde yüze yakın sabitlenmişken diğerleri boştaysa ve toplam bant genişliği hattın sınırının çok altındaysa, paket hızına takılmışsınız demektir ve ayarlanacak katman burasıdır. Buna karşılık bağlantı tabloları, kuyruklar ya da dosya tanıtıcıları dolarken CPU rahatsa, bu durum tükenmesidir ve Linux sunucu rehberindeki sysctl sıkılaştırmasına aittir. İkisi birbirini tamamlar: sysctl bağlantı durumunu, bu katman paket işleme yolunu savunur.
- RSS, RPS ve RFS arasındaki fark nedir?
- Paket işlemeyi çekirdeklere farklı düzeylerde dağıtırlar. RSS (Receive Side Scaling) NIC donanımında yapılır ve akışları birden çok alım kuyruğuna, her biri kendi kesmesiyle, hashler. En verimlisidir ve NIC yeterli kuyruk destekliyorsa ilk tercihtir. RPS (Receive Packet Steering) bunun yazılım karşılığıdır ve donanım RSS'i yoksa ya da kuyruğu azsa çekirdek içinde dağıtır. RFS (Receive Flow Steering) ise RPS'in üstüne akış yerelliği ekler ve bir akışı, uygulamasının çalıştığı çekirdeğe yönlendirerek önbellek davranışını iyileştirir. Yapabildiğiniz yerde RSS, yapamadığınız yerde RPS, çok çekirdekli sunucularda RPS ile birlikte RFS kullanın.
- XDP DDoS için gerçekten değer mi katar, yoksa aşırı mı kaçar?
- Yüksek paket hızlı saldırılarda host düzeyindeki en etkili savunmadır, çünkü paketleri ağ yığınına girmeden, sürücüde düşürür. conntrack'ten önce, iptables/nftables'tan önce, herhangi bir bellek ayırmasından önce. Basit bir ölçüte göre düşüren küçük bir XDP programı (bir kaynak kümesi, bozuk paket denetimi ya da bir port) saniyede milyonlarca paketi, aynı düşürmenin nftables'ta yiyeceği CPU'nun çok küçük bir kısmıyla eleyebilir. Kurulumu daha zahmetlidir ve tam yarar için sürücünün yerel XDP desteğini ister, dolayısıyla ilk başvurulacak araç değildir. Ama dağıtım katmanının yayamadığı bir paket seli için, büyüklük mertebesini değiştiren tek host aracı budur.
- Kesme birleştirme saldırı sırasında yarar mı sağlar zarar mı verir?
- Gecikmeyi verimlilikle takas eder ve paket seli altında genelde verimlilik tarafı kazanır. Birleştirme, CPU'nun paket başına kesilmemesi için kesmeleri toplu işler; uyarlanabilir birleştirme (adaptive-rx) hız yükseldikçe topluluğu artırır. Bu, kesme yükünü tam da paket hızı sorun olduğu anda azaltır. Bedeli biraz gecikmedir ve bu, normal işleyişte gecikmeye duyarlı iş yükleri için önemlidir. Bu yüzden dürüst yaklaşım, birleştirmeyi körlemesine artırmak değil, iki durumu da ölçmektir.
- irqbalance'ı kapatıp elle sabitlemeli miyim?
- Paket hızı saldırısı altındaki bir sunucuda çoğu zaman evet. irqbalance kesmeleri dinamik olarak taşır; bu genelde iyidir ama dikkatle yapılmış RSS kuyruğu-çekirdek sabitlemesini bozar ve yük altında bir akışı çekirdekler arasında zıplatabilir. Adanmış, yüksek verimli ya da saldırı altındaki bir host için her NIC alım kuyruğunun kesmesini belirli bir çekirdeğe sabitlemek, ve o çekirdekleri uygulamadan uzak tutmak, daha öngörülebilirdir. Genel amaçlı bir sunucuda ise irqbalance'ı açık bırakmak çoğu zaman doğrudur. Bu, evrensel bir aç-kapat değil, ölçümle verilecek bir karardır.
- Bu ayarlar hacimsel (bant genişliği) bir saldırıyı durdurur mu?
- Hayır. Saldırı erişim hattını doldurursa paketler NIC onları görmeden önce üst tarafta düşürülür ve hiçbir kuyruk, dağıtım ya da XDP ayarı devreye giremez. Bu katman paket hızına karşı savunur; yani küçük paketlerle bant genişliği sınırının çok altında bile CPU'yu doyuran saniyedeki paket sayısına karşı. Hattın üzerindeki bant genişliği host'un sorunu değildir ve host'ta çözülmez.
Yayım: Ağustos 2026
Bu rehber, üreticiler yeni modeller ve fiyatlandırma açıkladıkça güncellenir. Üreticileri nasıl karşılaştırıyoruz