Teknik derinlik
IIS DDoS Sıkılaştırma: Dynamic IP Restrictions, Request Filtering ve App Pool Kuyruğu
Son güncelleme: Ağustos 2026 · Dynamic IP Restrictions, Request Filtering ve app pool kuyruğu · Okuma süresi ~18 dk

IIS, çekirdekteki http.sys kuyruğunun üstünde, uygulama katmanında savunur. Taşıyıcı özellikler Dynamic IP Restrictions, Request Filtering ve app pool kuyruğudur. Kaynak başına oran ve eşzamanlılık sınırı, istek boyutu sınırı, sınırlı bir kuyruk ve rapid-fail protection. web.config veya appcmd ile yapılandırılır, Web Service sayaçlarıyla doğrulanır, kendi temel ölçülerinize göre boyutlanır.
Bu rehber, önünde herhangi bir cihaz olmadan, bir DDoS saldırısının istek ve bağlantı tüketen
kısmına karşı IIS’in kendisini sertleştirir. IIS, Windows Server rehberinde ele alınan
çekirdek istek kuyruğu olan http.sys’in bir katman
üstünde durur ve uygulama katmanında savunur. Kaynak başına sınırlar, istek boyutu sınırları ve
çırpınmak yerine öngörülebilir biçimde başarısız olan sınırlı bir işçi kuyruğu.
Her ayar hem bir web.config parçası hem de bir appcmd ya da PowerShell komutu olarak, işlediğini
gösteren performans sayacıyla birlikte gelir.
| Cihaz | Saldırı biçimi | IIS özelliği | Doğrulama |
|---|---|---|---|
| Az kaynaktan istek seli | Dynamic IP Restrictions: DenyByRequestRate | \Web Service\Total Requests; DIPR 429 kaydı | |
| Kaynak başına çok bağlantı | Dynamic IP Restrictions: maxConnections | \Web Service\Current Connections | |
| Yavaş başlık (Slowloris) | http.sys headerWaitTimeout; connectionTimeout | HTTP Service Request Queues sayaçları | |
| Büyük istek istismarı | Request Filtering: requestLimits | kayıtta 404.13 / 404.14 / 404.15 | |
| İşçi tükenmesi / çökme döngüsü | App pool queueLength; rapid-fail protection | \W3SVC_W3WP\Requests / Sec; 503 oranı |
IIS, http.sys'in üstünde durur; o çekirdek kuyruğu Windows rehberinde ele alınır. Buradaki özellikler uygulamayı savunur. Saldırı sunucunun önündeki hattı doldurduğunda hiçbiri işe yaramaz.
0. Önce temel ölçüler: Web Service sayaçlarını okuyun
IIS durumu Web Service ve W3SVC_W3WP performans sayacı kümelerinde durur. Normal bir haftayı
kaydedin.
# Tüm sitelerde geçerli bağlantı ve istek hızı
Get-Counter '\Web Service(_Total)\Current Connections',
'\Web Service(_Total)\Total Method Requests/sec' -SampleInterval 5 -MaxSamples 3
# İşçi başına istek hızı ve http.sys kuyruğu
Get-Counter '\W3SVC_W3WP(*)\Requests / Sec',
'\HTTP Service Request Queues(*)\CurrentQueueSize'
# IIS kaydından istemci başına istek sayısı (alan sırasını kayıt biçiminize göre ayarlayın)
Import-Csv -Delimiter ' ' C:\inetpub\logs\LogFiles\W3SVC1\*.log -Header (1..20) |
Group-Object 'H10' | Sort-Object Count -Descending | Select-Object -First 10
Current Connections ve istemci başına istek hızı, aşağıdaki her eşiğin ölçüldüğü temel
ölçülerdir.
1. Dynamic IP Restrictions: kaynak başına oran ve eşzamanlılık
Dynamic IP Restrictions (DIPR), IIS’in istek seli savunmasıdır ve nginx’in limit_req direktifinin
dahili karşılığıdır. IP and Domain Restrictions rol hizmetini, sonra bir oran ve bir eşzamanlılık
sınırını ister.
<!-- web.config ya da applicationHost.config -->
<system.webServer>
<security>
<dynamicIpSecurity enableLoggingOnlyMode="true">
<!-- eşzamanlılık: kaynak başına en fazla eşzamanlı istek -->
<denyByConcurrentRequests enabled="true" maxConcurrentRequests="20" />
<!-- oran: zaman penceresi (ms) başına kaynak başına en fazla istek -->
<denyByRequestRate enabled="true" maxRequests="100" requestIntervalInMilliseconds="2000" />
</dynamicIpSecurity>
</security>
</system.webServer>
# appcmd ile aynısı
appcmd set config /section:system.webServer/security/dynamicIpSecurity `
/denyByRequestRate.enabled:true /denyByRequestRate.maxRequests:100 `
/denyByRequestRate.requestIntervalInMilliseconds:2000
# 429 ile reddet ki kayıtlar ve istemciler doğru okusun (varsayılan 403)
appcmd set config /section:system.webServer/security/dynamicIpSecurity `
/denyAction:"TooManyRequests"
Yukarıdaki enableLoggingOnlyMode="true" değerine dikkat edin. Bu, IIS’in kuru çalışmasıdır.
Engellemeden, neyi engelleyeceğini kayda yazar; tıpkı nginx’in limit_req_dry_run direktifi gibi.
Onu bir hafta açık bırakın, reddedeceği kaynakların gerçek trafiğiniz olmadığını doğrulayın, sonra
false yapıp uygulatın.
# Yalnızca kayıt modunun neyi engelleyeceğini doğrula
Get-Counter '\Web Service(_Total)\Total Requests'
# DIPR olayları, yapılandırdığınız ret durumuyla IIS kaydında görünür
2. Proxy Mode: ARR ya da yük dengeleyici arkasında istemci IP’si
DIPR bağlantı adresine göre anahtarlanır. Bir vekil arkasında bu, X-Forwarded-For okuması için
proxy mode’u etkinleştirmedikçe vekilin adresidir.
<dynamicIpSecurity>
<denyByRequestRate enabled="true" maxRequests="100" requestIntervalInMilliseconds="2000" />
<!-- vekil bağlantısını değil, iletilen istemci adresini değerlendir -->
<proxyMode enabled="true" />
</dynamicIpSecurity>
Proxy mode olmadan her istek tek bir vekil kovasını paylaşır ve sınır hiçbir şeyi korumaz. Yanlış
yapılandırılmış bir nginx real_ip ayarıyla aynı başarısızlık biçimidir.
3. Request Filtering: büyük istek yüzeyi
Request Filtering, istek boyutlarını uygulamanın altındaki bir düzeyde sınırlar ve büyük bir isteği bir işçi ayrıştırmadan önce reddeder.
<system.webServer>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="10485760" <!-- 10 MB -->
maxUrl="4096"
maxQueryString="2048">
<headerLimits>
<add header="Content-type" sizeLimit="100" />
</headerLimits>
</requestLimits>
</requestFiltering>
</security>
</system.webServer>
appcmd set config /section:requestFiltering `
/requestLimits.maxAllowedContentLength:10485760 /requestLimits.maxUrl:4096
Retler kayıtta alt durum kodları olarak görünür: 404.13 (içerik uzunluğu), 404.14 (URL),
404.15 (sorgu dizesi). Bunları temel ölçülerinize göre izleyin.
Select-String -Path C:\inetpub\logs\LogFiles\W3SVC1\*.log -Pattern ' 404 1[345] ' | Measure-Object
4. App pool kuyruğu ve rapid-fail protection
App pool’un kendi istek kuyruğu ve kendi çökme yönetimi vardır. Bir selin öngörülebilir biçimde başarısız olması için kuyruğu sınırlayın; çöken bir uygulamanın yeniden başlatma döngüsüne girmemesi için rapid-fail’i yapılandırın.
# Kuyruk uzunluğu: 503'ten önce bir işçi bekleyebilecek istek sayısı
Set-ItemProperty "IIS:\AppPools\DefaultAppPool" -Name queueLength -Value 4000
# Rapid-fail: bir aralıkta N başarısızlıktan sonra havuzu çevrimdışına al, çırpınma
Set-ItemProperty "IIS:\AppPools\DefaultAppPool" -Name failure.rapidFailProtection -Value $true
Set-ItemProperty "IIS:\AppPools\DefaultAppPool" -Name failure.rapidFailProtectionMaxCrashes -Value 5
Set-ItemProperty "IIS:\AppPools\DefaultAppPool" -Name failure.rapidFailProtectionInterval -Value "00:05:00"
# Saldırı ortasında geri dönüşümü önlemek için sabit istek sayısına göre değil, takvime göre geri dönüştür
Set-ItemProperty "IIS:\AppPools\DefaultAppPool" -Name recycling.periodicRestart.requests -Value 0
# İşlemci kısıtı: bir sitenin makineyi aç bırakması yerine havuzu sınırla ya da kıs
Set-ItemProperty "IIS:\AppPools\DefaultAppPool" -Name cpu.limit -Value 80000 # 80%
Set-ItemProperty "IIS:\AppPools\DefaultAppPool" -Name cpu.action -Value Throttle
# Dolu kuyruk ya da çevrimdışı havuzdan gelen 503'ler
Get-Counter '\W3SVC_W3WP(*)\Total HTTP Requests Served'
Select-String -Path C:\inetpub\logs\LogFiles\W3SVC1\*.log -Pattern ' 503 ' | Measure-Object
İşçiler boş görünürken yükselen bir 503 oranı, kuyruğun ya da http.sys’in işçinin yukarısında reddettiği anlamına gelir. İstek hızının, havuzun soğurmasına izin verilen değeri aştığının imzasıdır.
5. Bağlantı süreleri
Bağlantı süresi ve http.sys başlık bekleme süresi yavaş bağlantıları atar. Başlık bekleme süresi IIS’e bakan Slowloris savunmasıdır ve http.sys katmanında ayarlanır.
# Site bağlantı süresi (boşta)
Set-WebConfigurationProperty -Filter system.applicationHost/sites/siteDefaults/limits `
-Name connectionTimeout -Value "00:01:00"
# http.sys başlık bekleme süresi — kayıt defteri, HTTP service parametreleri
# (OS katmanında Windows rehberinde ele alınır; bu, IIS'i ilgilendiren anahtardır)
İzlemeye bağlanacak sinyaller
Get-Counter @(
'\Web Service(_Total)\Current Connections',
'\Web Service(_Total)\Total Method Requests/sec',
'\HTTP Service Request Queues(_Total)\CurrentQueueSize',
'\HTTP Service Request Queues(_Total)\RejectedRequests',
'\W3SVC_W3WP(_Total)\Requests / Sec'
) -SampleInterval 5 -MaxSamples 1
İstek hızı düz dururken yükselen Current Connections, bağlantı tutan bir saldırıdır. Yükselen RejectedRequests, http.sys’in IIS’ten önce yük attığıdır. İşçiler boşken bir 503 oranı, app pool kuyruğunun dolu olduğudur. Her biri farklı bir sınırı işaret eder.
IIS sıkılaştırmasının dürüst sınırı
Buradaki her şey uygulama kenarını istek hızı ve bağlantı tükenmesine karşı savunur. İki durum bunun dışında kalır.
Birincisi hat doluluğudur. Hattı dolduran hacim http.sys’e bile ulaşmaz, IIS’e hiç.
İkincisi IIS’in altındaki katmandır: Windows TCP yığını, WFP ve http.sys kuyruğu. Bir istek, bir işçi onu görmeden önce bu katmandan geçer ve Windows Server sıkılaştırma rehberi bunu ele alır. IIS sıkılaştırması o katmanın yerinde olduğunu varsayar. Hattın üstünde cevap şebeke katmanıdır. IIS o zamana kadar uygulama kenarını ayakta tutar.
Uygulama sırası
- Temel ölçüleri kaydedin (Bölüm 0): bağlantılar, istek hızı, http.sys kuyruğu.
- IP and Domain Restrictions’ı kurun; DIPR oran ve eşzamanlılığı yalnızca kayıt modunda ekleyin.
- Önde bir vekil varsa, sınırlara güvenmeden önce proxy mode’u etkinleştirin.
- Yalnızca kayıt modunu bir hafta izleyin; sonra uygulatın.
- Request Filtering sınırlarını ekleyin.
- App pool kuyruğunu sınırlayın, rapid-fail protection ve işlemci kısıtını ayarlayın.
- Sayaçları izlemeye bağlayın.
Üçüncü adım, tıpkı nginx’te olduğu gibi, uygulatmadan önce gelir. Vekil adresine anahtarlanmış kaynak başına bir sınır, koruma gibi görünürken hiçbir şeyi korumaz.
Sık sorulan sorular
- Oran sınırını Dynamic IP Restrictions mı yoksa güvenlik duvarı kuralı mı yapar?
- HTTP farkında olan her şey için Dynamic IP Restrictions yapar. Bir Windows güvenlik duvarı kuralı bir adresi toptan engeller. DIPR ise bir pencerede kaynak başına istekleri ve eşzamanlı bağlantıları sayar, eşiği aşan kaynağa yapılandırılabilir bir durum kodu döner. Normal HTTP gibi görünen bir istek seli için istediğiniz budur. nginx'in limit_req direktifinin dahili IIS karşılığıdır. IP and Domain Restrictions rol hizmetini kurun, sonra DenyByRequestRate ve DenyByConcurrentRequests ayarlayın, ret durumu olarak da 429 seçin ki istemciler ve kayıtlar doğru okusun.
- Request Filtering neyi durdurur?
- Büyük istek yüzeyini, ucuza ve erkenden durdurur. requestLimits içerik uzunluğunu, URL uzunluğunu, sorgu dizesi uzunluğunu ve tekil başlık boyutunu sınırlar, böylece belleği ya da bir ayrıştırıcıyı tüketmek için kurulmuş bir istek, bir işçi işlemeden önce http.sys düzeyinde reddedilir. Normal boyutlu isteklerden oluşan bir seli durdurmaz; o Dynamic IP Restrictions'ın işidir. Ama tek bir devasa istek gönderen saldırı sınıfını kapatır ve çalıştırması hiçbir şeye mal olmaz.
- App pool kuyruğu ile http.sys kuyruğu nasıl ilişkilidir?
- Art arda iki kuyruktur. Önce çekirdek sürücüsü http.sys bağlantıları kabul eder ve istekleri kuyruklar. App pool'un ise bir işçi bekleyen istekler için kendi queueLength değeri vardır. Bir sel altında önce http.sys dolar ve IIS işçi süreçleri daha işin içine girmeden 503 ile reddetmeye başlar. Bir sitenin işçi boş görünürken 503 dönmesinin sebebi budur. Windows rehberi http.sys tarafını ele alır; burada app pool kuyruğunu sınırlar ve çöken bir işçinin yük altında yeniden başlatma döngüsüne girmemesi için rapid-fail protection'ı yapılandırırsınız.
- Rapid-fail protection nedir ve saldırıda neden önemlidir?
- Uygulama sürekli başarısız olurken IIS'in bir işçi sürecini durmadan yeniden başlatmasını keser. Bir uygulamayı tekrar tekrar çökmeye iten bir DDoS altında, birkaç saniyede bir yeniden başlayan bir işçi başlangıçta işlemci harcar ve hiç trafik sunmaz. Rapid-fail protection bir aralıkta belirli sayıda başarısızlıktan sonra havuzu çevrimdışına alır ve 503 döner. Bu, bir yeniden başlatma döngüsünden daha temiz bir başarısızlıktır, çünkü çırpınmak yerine öngörülebilir biçimde başarısız olur. Başarısızlık sayısını ve aralığı, gerçek bir geçici sorun tetiklemesin ama bir saldırı tetiklesin diye ayarlayın.
- ARR veya yük dengeleyici arkasında istemci IP'si nereden gelir?
- X-Forwarded-For başlığından gelir ve Dynamic IP Restrictions'a bunu okuması söylenmelidir, yoksa her istek vekile atfedilir. IIS bunu Dynamic IP Restrictions içindeki "Proxy Mode" seçeneği olarak sunar; bu, bağlantı adresi yerine iletilen istemci adresini değerlendirir. Proxy Mode olmadan tek bir vekil adresi tek bir oran kovasını paylaşır ve sınır anlamsızdır. Yanlış adrese anahtarlanmış bir nginx ile aynı başarısızlık biçimidir.
- Bu ayarlar hacimsel bir saldırıyı durdurur mu?
- Hayır. Saldırı sunucunun önündeki hattı doldurursa ne http.sys ne IIS istekleri alır ve hiçbir ayar geçerli olmaz. Buradaki her şey uygulama kenarındaki istek hızı ve bağlantı tükenmesine karşıdır. Hat kapasitesinin üzerindeki hacim şebeke katmanının sorunudur ve web.config içinde çö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