- CDN olmadan HTTP protokolü/IP aralıkları/istemci sinyalleri/TCP özellikleri/TLS parmak izi/içerik sıkıştırması kombinasyonuyla, uygulaması veya yapılandırması zayıf olan botların çoğunu engelleme yöntemlerini derliyor
- Tüm yöntemler seçici olarak ayarlanmalı; önce 1-3 yıllık erişim logları analiz edilmezse VPN kullanıcıları/arama motorları/CDN'ler/okullar/kütüphaneler/belirli dil kullanıcıları da birlikte engellenebilir
- HTTP/1.1 istemcilerini ve veri merkezi AS/CIDR aralıklarını engellemek çok sayıda botu temizleyebilir; ancak GoogleBot dahil arama motorları ve veri merkezini meşru kullananlar da dışlanabilir
- Nginx başlık denetimi ve nftables'ın TCP pencere boyutu/MSS/TTL filtreleri basit tarayıcıları ve tarayıcı botlarını azaltır; ancak LTE/VPN/Windows gibi normal ortamlarda yanlış pozitif üretebilir
- Uzun vadede JA4 TLS parmak izi tespiti ve yalnızca Brotli yanıtlarını alternatif olarak öneriyor; fakat tam engelleme garantisi vermiyor ve gelir üreten hizmetlerde kullanılmaması gerektiği konusunda uyarıyor
Engelleme kapsamı ve uygulama varsayımları
- Önce engelleme hedefinin bazı botlar/çoğu bot/tüm botlar arasından hangisi olduğuna karar vermek gerekir
- Burada ele alınan yaklaşım, tüm gelişmiş otomasyon araçlarını değil, uygulaması veya yapılandırması zayıf olan botların çoğunu nispeten basit şekilde engellemeye odaklanır
- Her yöntem için meşru kullanıcıları ve arama motorlarını engelleme riski birlikte belirtilir
- 26 Temmuz 2026'da Hacker News'te paylaşıldıktan sonra, engelleme işlevlerinin çoğunu blogdan ayrı bir demo sitesine taşıyıp, okurun yöntemi okuduktan sonra bizzat erişmeyi denediği bir bulmaca biçimine dönüştürmeyi planlıyor
- Tüm ayarlar isteğe göre değiştirilebilir veya atlanabilir; gerçek uygulama öncesinde yeterli araştırma ve test gerekir
- Meşru kullanıcılar/kurum içi sistemler/bağımlı olunan dış hizmetler engellenebileceği için uygulama sorumluluğu tamamen işletmeciye aittir
- Gelir üreten üretim ortamlarında kullanmayın
Yöntem 1: HTTP protokolüne göre ayırma
- Meşru kullanıcıları engelleme riski düşüktür, bazı arama motorlarını engelleme riski ise orta düzeydedir
- Normal tarayıcıların HTTP/2.0 kullanması, birçok botun ise HTTP/1.1 kullanması farkından yararlanır
- GoogleBot'un HTTP/1.1 kullandığı ve bu yöntemle engelleneceği varsayılır
- Bing ve Facebook tarayıcıları HTTP/2.0 kullanır
- HTTP/1.1 ile bağlantı başlığı veya kısa önizleme alan servisler de engellenebilir
- Opera Mini de kapsam dışı bırakılır
- Nginx'te
$server_protocol HTTP/2.0 değilse başka bir sayfaya yönlendirecek veya 200, 403, 444 döndürecek şekilde yapılandırır
if ($server_protocol != HTTP/2.0) {
return 403 'Upgrade your client';
}
444 döndürülürse ayrı bir yanıt vermeden bağlantı kesilebilir
- Google arama trafiğini engellemenin kaybından daha büyük bir fayda sağlayıp sağlamadığına her kurumun kendisinin karar vermesi gerekir
Yöntem 2: Veri merkezi IP aralıklarını engelleme
- Meşru ev/LTE kullanıcılarını engelleme riski düşüktür; VPN kullanıcılarında orta düzeydedir; veri merkezinde çalışan arama motorlarında ise risk yüksektir
- Son 1-2 yılın erişim loglarında aşağıdaki sinyalleri birleştirerek şüpheli istekleri bulur
- HTTP protokolü
- User-Agent
Accept-Language
Sec-Fetch-Mode
Accept
- Şüpheli IP'leri BGP Tools veya Hurricane Electric BGP Toolkit üzerinde sorgulayarak ait oldukları AS'i ve ilan edilen prefix'leri kontrol eder
- Sağlanan ağ kara delik listesi, CDN ve arama motoru aralıklarını da içerebileceği için seçerek uygulanmalıdır
- Ayrı listelerden önce
3/8, 10/8, 11/8, 25/8, 26/8, 38/8, 41/8, 60/8, 61/8, 200/8, 224/3 aralıklarını zaten kara delik olarak işleyen bir yapı kullanır
- AS'in Prefix sayfasını kopyalayıp kabuk fonksiyonuyla yalnızca CIDR'leri çıkarır, sıralar, tekrarları kaldırır ve birleştirir
- sum_cidr.pl kullanılır ve
Net::CIDR::Lite Perl modülü gerekir
- Oluşturulan sonuç gözden geçirildikten sonra
/usr/local/etc/*.netset dosyasına taşınır
- Sunucu başlatılırken her CIDR için kara delik rotası eklenir
for CflIP in $(grep -E ^[1-9] /usr/local/etc/_cloudflare.netset); do
/sbin/ip route add blackhole "${CflIP}" 2>/dev/null
done
- Örnekte, Workers vb. üzerinden gelen istekleri almamak için Cloudflare'ın tüm aralıkları engellenir
- Güvenlik duvarındaki ipset kurallarına göre Linux kara delik yönlendirmesi daha az CPU kullandığı için yönlendirme yaklaşımı seçilmiştir
- Mevcut sunucunun bulunduğu barındırma sağlayıcısının aralıkları da engellenebilir
- DNS/yapılandırma/iç hizmetlerde aynı adres alanı kullanılmamalıdır
- Doğrudan bağlı ağ geçidi rotaları, kara delik rotalarına göre önceliklidir
Yöntem 3: Ülke/proxy/Tor/kötü amaçlı IP engelleme
- FireHOL Blocklists deposundaki listeleri indirip gerekli aralıkları kara delik rotası olarak ekler
- Liste dosyalarında yorum satırları bulunduğu için işleme almadan önce
grep -Ev '^#' ile temizlenmelidir
- Özellikle şu listeleri önerir
firehol_abusers_30d.netset
firehol_level2.netset
- Büyük listeler başlangıç betiğinin çalışma süresini uzatabilir
- Gerçek sunucu ve güvenlik duvarı kurulumunda kullandığı yapılandırma dosyaları da paylaşılır
Yöntem 4: HTTP istemci sinyallerini inceleme
- User-Agent veya başlıklar taklit edilebilir; ancak hızı öncelikleyen basit botların bunları çoğu zaman düzgün taklit etmediği varsayımını kullanır
Curl, Wget isteklerine düz metin döndürür; Bot, GPT, LLM, Spider içeren isteklere 410 Gone döndürür
if ($http_user_agent ~* Curl) { return 200 '\nGNU Terry Pratchett\n\n'; }
if ($http_user_agent ~* Wget) { return 200 '\nGNU Terry Pratchett\n\n'; }
if ($http_user_agent ~* Bot) { return 410 '1000101'; }
if ($http_user_agent ~* GPT) { return 410 '1000101'; }
if ($http_user_agent ~* LLM) { return 410 '1000101'; }
if ($http_user_agent ~* Spider) { return 410 '1000101'; }
- Gözlemlenen bazı User-Agent dizelerini tek uzun bir düzenli ifadede kontrol ederek tarayıcıları/tarama araçlarını/veri toplama araçlarını engeller
Go-http, Java, libwww, okhttp, urllib, python, nmap, zgrab, semrush, shodan, rss, scrap, crawler, headless, github, facebook, google, bing vb. alt dizelerini içerir
- Uygulamadan önce son 2-3 yılın User-Agent kayıtları toplanıp gerçekten meşru istemcilerin bu düzenli ifadeyle eşleşip eşleşmediği doğrulanmalıdır
sort access-user-agents.txt | uniq -c | sort
- Eşleşen istek HTTP/1.1 ise bot olma olasılığı yüksek kabul edilir; ancak GoogleBot istisna olarak değerlendirilir
- HTTP/2.0 isteği ise BGP araçlarıyla IP aidiyeti ayrıca doğrulanır
Sec-Fetch-Mode
Sec-Fetch-Mode erişim loguna eklenir; değer cors, no-cors, navigate değerlerinden biri değilse engellenir
if ($http_sec_fetch_mode !~ (cors|no-cors|navigate)) {
return 410 '1000101';
}
Referer kontrolü
- Başka sitelerden içerik gömen veya tarayan istekleri engellemek için
Referer içinde belirli dizeler varsa istek engellenir
- Yönetici sayfaları/arama motorları/sosyal ağlar/kripto para/yetişkin içerik/tarayıcılar/WordPress ile ilgili dizeleri kontrol eder
https://www.google.com/ kök sayfasını Referer olarak iddia eden belirli bir bot türü ayrıca engellenir
- Eski Android gibi davranan isteklerde gözlemlenen bir örüntüdür
HTTP metodunu sınırlama
- Normal tarayıcı istekleri için gereken
GET ve POST dışında tüm metodları engeller
if ($request_method !~ (^GET$|^POST)) {
return 410 '1000101';
}
- Gerçek uygulamada
POST gerektiren yollar daha ayrıntılı sınırlandırılabilir veya kullanılmıyorsa tamamen çıkarılabilir
Proxy ve tarayıcı biçimi kontrolü
X-Forwarded-For başlığı varsa bunu proxy isteği sayıp engeller
- Okul veya kütüphane gibi meşru paylaşımlı proxy ortamları da engellenebilir
- User-Agent içinde
Linux, BSD, Macintosh, Windows, Mozilla, WhatsApp değerlerinden hiçbiri yoksa isteğin tarayıcı gibi görünmediğine karar verir
Accept-Language içinde en veya es yoksa engelleyen bir kural da kullanır
- Bu, bazı tarayıcıları ve İngilizce/İspanyolca kullanmayan meşru kullanıcıları engelleme ihtimali taşır
- Dil ayarında
br veya sy geçenleri ayrıca engelleyen isteğe bağlı bir kural da önerir
Hassas yol taramalarını engelleme
- Aşağıdaki dosya veya yollar istenirse bunu otomatik tarama sayıp engeller
Yöntem 5: nftables ile TCP tarayıcılarını engelleme
- nftables'ın
raw tablosundaki PREROUTING zincirinde TCP SYN paket özelliklerini inceler
- Yanlış pozitifleri azaltmak için örnek sunucu adresi
172.238.221.88 özellikle hedef olarak belirtilir; böylece paket kaybı durumlarında oluşabilecek hatalar azalır
- 80/443 portlarına gelen SYN paketlerinde şu koşulları engeller
- TCP pencere boyutu 12.288 bayttan küçükse
- MSS 1.220-1.460 aralığı dışındaysa
- Gerçek istemcilerin daha büyük pencere boyutu kullandığı ve bu aralığın dışındaki MSS'nin meşru istemci olma ihtimalinin düşük olduğu varsayılır
- MSS'yi tam olarak
1460 ile sınırlandırmak daha katıdır; ancak çoğu LTE ve VPN kullanıcısını engelleyebilir
TTL tabanlı isteğe bağlı sınırlama
- TCP SYN TTL değeri
128'den büyükse çoğu LTE cihazı engellenebilir
- TTL
64'ten büyükse Windows sistemlerinin çoğu da engellenir
- Varsayılan TTL ölçütü şöyle açıklanır
- Linux/Mac/BSD:
64
- Windows:
128
- LTE: bundan daha büyük değerler
Bağlantı takibini devre dışı bırakma
- 80/443 portlarını
notrack olarak işaretleyip web trafiğini conntrack tablosuna sokmaz
- Bu durumda filter tablosunda da giden/gelen yönler için durumsuz kuralların doğrudan tanımlanması gerekir
- Örnekte, istemcinin kaynak portu
1000-65535 ile sunucunun 80/443 portları arasındaki trafiğe izin verilir
Yöntem 6: Yetişkin içerik ve robot başlıkları
- Yetişkin içeriğe erişim kısıtlaması için RTA: Restricted To Adults başlığını kullanır
- RTA dışındaki yaş doğrulama yöntemlerini kullanıcı takibi ve gelir elde etme amaçlı görür
- Nginx yanıtına şu başlıkları her zaman ekler
add_header Rating 'RTA-5042-1996-1400-1577-RTA' always;
add_header adult 'porn, sex, politics, religion, philosophy' always;
add_header X-Robots-Tag "none,noindex,nofollow,nosnippet,noai" always;
- Genel botlar bu başlıkları yok sayabilir; ancak arama motorları veya yetişkin içerikten kaçınacak şekilde tasarlanan botlar üzerinde etkili olabilir
Yöntem 7: TLS parmak izi tespiti
- Yukarıdaki 1-6. yöntemlerin tümü kaba sezgisel kurallardır; uzun vadede TLS parmak izi analizi daha iyi bir seçenek olabilir
- Botların TLS parmak izini normal tarayıcıyla aynı hale getirmediği durumda JA4 kullanılabilir
- Önce Deploying JA4 yazısındaki dağıtım yöntemine bakıp ardından FoxIO JA4 uygulamasını önerir
Yöntem 8: Yalnızca Brotli sıkıştırılmış içerik sunma
- Site içeriğini önceden Brotli ile sıkıştırıp web sunucusunun yalnızca sıkıştırılmış dosyaları döndürmesini sağlar
- Birçok botun Brotli sıkıştırılmış HTML'i çözememesinden yararlanır
- Uygulamadan sonra birçok botun artık sayfa bağlantılarını takip etmediği, yani HTML'i gerçekten ayrıştıramadığı doğrulanmıştır
- Nginx'te statik Brotli dosyalarını her zaman sunacak şekilde ayarlanır
brotli_static always;
- HTML dosyaları şöyle önceden sıkıştırılır
cat ./i.html | brotli --best -fncv > ./i.html.br
Yöntem 9: Tarayıcıların kendini ele vermesini sağlama
- Tekrarlı olarak zafiyet yollarını yoklayan acemi saldırganları ve tarayıcıları azaltmaya yönelik ayrı bir yöntem Help Attackers Self Report yazısında ele alınıyor
1 yorum
Hacker News yorumları
Birden fazla herkese açık web sitesi işleten ve başka siteleri kazıyıp araçlarında kullanan biri olarak, insanların botları neden bu kadar dert ettiğini merak ediyorum.
Önbelleğe alınmış WordPress bile en ucuz VPS’te saniyede yaklaşık 1.000 istek işleyebiliyor; düzgün yapılmış statik bir site bunun 10 katını bile yapabilir gibi. Acaba bloglarını Lambda gibi bir şeyle mi sunuyorlar, yoksa bu takıntı mı, zafiyetlere karşı savunma mı, yoksa taramanın gerçekten hizmeti etkilediği dönemlerden kalma bir alışkanlık mı, merak ediyorum.
Depolar açık kaynak olduğu için bilerek herkese açık bıraktım. Şimdilik basit bir çerez kontrolüyle savunuyorum ve yalnızca az sayıda bot geçebiliyor; ama bu, arama motoru görünürlüğünden feragat etmeyi gerektiren bir ödün.
Forumlara, imageboard’lara, sohbet sunucularına vb. uygulanabilecek yöntemleri göstermeyi amaçlıyor; tüm seçenekler ayarlanabilir veya kapatılabilir. Gerçek uygulamadan önce bir test sunucusunda doğrulanmalı; isterseniz sadece gülüp geçmeniz de sorun değil.
DMZ tıkandığı için yerel IMAP sunucusunu kontrol etmenin birkaç saniye daha uzun sürmesi büyük mesele değil; ama bu, bundan hoşlanmamı ya da sürekli izin vermemi gerektirmez.
Hafta sonu 10–20 yıldır çalıştırdığım viewvc (CVS·Subversion) ve hgweb (Mercurial) web arayüzlerini kapattım. Konut tipi proxy IP’lerinden günde 2,7 milyon, ortalama saniyede 30 istek geliyordu; bu da eski uWSGI/CGI programlarına ve aynı sunucudaki diğer sitelere yük bindiriyordu, trafik de VPS sınırı olan aylık 1 TB’a yaklaşıyordu.
Dinamik VCS URL kombinasyonları milyonları bulabildiği için önbelleğin etkisi de belirsizdi; sunucuyu daha fazla ayarlamaya zaman harcamaya değmeyeceğinden, sonunda merkezi internet yönünde bir adım daha atmış oldum.
“Onaylı” user agent’lar dışındaki her şeyi engellerseniz mevcut tarayıcı tekelini güçlendirir ve distopyayı hızlandırırsınız. RMS’in onlarca yıldır uyardığı şey de tam olarak bu tür bir sorun.
Bir sorun varsa trafik hacmine ve istek sıklığına göre engellenmeli. Ben de siteye erişemiyorum ama buna göre davranmayı düşünmüyorum; DRM’de olduğu gibi, yeterince kararlı bir karşı taraf eninde sonunda geçecektir.
Ancak herhangi bir tarayıcıyı kullanabilme iddiasından ayrı olarak, anlık üretilmiş kod olan ya da kötü niyetli sitelere karşı yeterince doğrulanmamış tarayıcılara özellikle dikkat etmek gerekir. Okuyucu uygulamaları da bir sızma testi uzmanının kapsamlı üçüncü taraf kod incelemesinden geçmediyse kötü niyetli sunuculara karşı savunmasız olabilir.
169.254.169.254adresini gösteren sahte bir cpanel alt alan adı ekleme fikri hoşuma gitti; acemi saldırganın kendi barındırma sağlayıcısını port taramasından geçirmesine yol açıp tespit edilmesini veya engellenmesini sağlayabilir.Kaynak IP’ler dünyanın dört bir yanına dağılmıştı ama gerçek tarama gürültüsü tek bir kişiden geliyormuş.
IP tabanlı engelleme konusunda dikkatli olunmalı. IP aralıkları zaman zaman yeniden tahsis edildiği için yanlış kişileri engelleyebilirsiniz; ayrıca bölge ya da veri merkezi olduğu gerekçesiyle engellenen aralıkların konut tipi ISP’lere geçtiğini de defalarca gördüm
HTTP/1.1 engellemesi de eski tarayıcı kullanan gerçek kullanıcıları engelleme riski taşıyor. Ayrıca çapraz kaynaklı isteklerde tam URL’yi göndermeyen tarayıcılar var; Google aramasından gelindiğinde yönlendiren yalnızca Google’ın kök sayfasını gösterebilir. Bunu botun yalanı sayıp engellerseniz Google arama trafiği de yok olabilir
Buna karşılık HTTP/1.1 engellemesini makul buluyorum. Neredeyse tüm tarayıcıların bunu aşan protokolleri desteklemesinin üzerinden 10 yıldan fazla geçti; o kadar eski bir tarayıcıysa zaten ana akım web’in çoğu bozuluyordur, dolayısıyla bir kişisel sitenin daha çalışmaması istisna değil, gündelik durum olur
Eski tarayıcıları ve API araçlarını kaçıracak olsam da HTTP/1.1 engellemesini sürdüreceğim. Eski bir finans sisteminin özel kodu olsa anlarım ama açık internet kendi iyiliği için güncellenmeli
Google’ı uzun süredir engellediğim için Google’dan geldiğini iddia eden tüm istekler yalandır. Blogu rastgele birkaç alan adı arasında döndürerek ilişkilendirmeleri ve anlık görüntüleri koparmaya, insanların yazılarımı keşfetme yollarını kontrol etmeye çalışıyorum
Bu sayede ücretsiz sızma testi de almış oldum; savunmaların ve işleme hattının sağlam olduğu sonucuna vardım. Hayatta kalma baskısı nedeniyle bot trafiğinin %90’ı VPN’e taşındı, bu yüzden VPN uç noktaları Noel ağacı gibi parlıyor
Tek kullanımlık erişim IP akışı da sağlayabilirim ama kullanıcıların düzgün doğrulanması ve kullanım amaçlarının onaylanması gerekir. Bu sürecin kendisi eğlenceli
Okuyamıyorsanız arşiv kopyasından bakabilirsiniz: https://archive.ph/d3236
Bot bile değilken bir şey okumak için iCloud Private Relay’i kapatmak istemem. Yazarın diğer yanıtlarına göre test sitesi olarak iyi bir uygulama ama diğer web yöneticilerinin mümkünse tüm yöntemleri aynen benimsememesini isterim
Yanıt gövdesinde yalnızca 410 ve
Sec-Fetch-Mode:dizgisi göründüğüne göre beni bot sanmış gibi. Okunacak ya da görülecek bir şey olmadığından öylece ayrılıyorum; modern web berbatDestek durumu https://caniuse.com/?search=sec-fetch-mode adresinden, bazı başlıklar da https://nochan.net/.env adresinden görülebilir
PR_END_OF_FILE_ERRORoluştuWeb trafiğinin %99’dan fazlasının bot veya ajan olacağını tahmin ettiğim için ziyaretçi sayacı göstermeyi kaldırmayı düşünüyorum. Sayılar anlamsız ve siteyi olduğundan çok daha kalabalık gösteriyor; ama gerçek insanların yazıları okuyamamasına ya da kitapları indiremeyecek olmasına yol açarım diye müdahale etmekte tereddüt ediyorum
Engelleme gerekiyorsa genelde izin listesi, ret listesinden daha etkilidir; izin listesi uygulanamıyorsa bu yöntem de iyi bir çözüm olmayabilir
Cloudflare ve Anubis gibi araçlar ciddi erişilebilirlik sorunlarına yol açabildiği için istek hızı sınırlamasını tercih ediyorum. Erişilebilirliği bozmadan temiz bir çözüm; geçici sorunlarda kısa süreli IP engellemesi de iyi çalışıyor
Kişisel olarak fail2ban ile HTTP günlüklerini analiz edip
robots.txtiçinde yasakladığım URL’leri veyawp-login.phpgibi yolları isteyen ya da istek hızı sınırını fazla sık aşan IP’leri N saat engelliyorum. Şu anda Git web arayüzünde Anubis’i deniyorumfail2ban tek başına bile epey iyi engelleyebilir, ama ilk birkaç ay ortama göre ince ayar yapmak gerekir
Önce
failregex = ^ - \S+ \[\] ".*?" 40[034]filtresiyle tespit edip daha spesifik listelere ekledim; şimdi yaklaşık 80 regex ile tüm trafiği engellediğim için sıradan40[034]filtresine kadar ulaşan istekler uzun zamandır olmadıAncak yük dengeleyici veya proxy arkasında gerçek IP’yi elde etmenin bir yolu gerekir; bu da hem fail2ban’i hem de özgün metindeki yöntemi zahmetli hale getirir
Bu yorumlara ve kendi erişim denememe bakılırsa yalnız botları değil, normal trafiğin tamamını da engelliyor gibi
Pazar günleri insanların web’de gezinirken kullandığı sıra dışı tarayıcıları ve uygulamaları en çok görebiliyorsunuz; hafta içi ise sıradan ana akım tarayıcılar daha fazla olduğu için iyi bir test oluyor