Salgın hastalık döneminde bir acil serviste çalıştığınızı düşünün. Bulaş riskini sıfırlamak için hastane yönetimi kapıya tam korumalı, sarı tulumlu ve filtreli gaz maskeli özel bir güvenlik ve dezenfeksiyon ekibi yerleştirir. Dışarıdan gelen her hasta bu ekibin kontrolünden geçer, hastanın üzerine steril bir örtü örtülür ve kapıdaki görevli hastayı sedyeyle içeri alır. İçerideki hekim ise hastaların hiçbirinin yüzünü görmez; sedyenin başındaki o güvenlik görevlisinin yakasındaki kimlik kartına bakar.

Bir gün acil servise kabul edilen hastalardan biri içeride taşkınlık yapar, camları kırar. Hekim öfkeyle kapıdaki polise seslenir: "Şu sarı tulumlu adamı derhal tutuklayın ve hastaneye bir daha sokmayın!" Polis emri uygular; kapıdaki dezenfeksiyon görevlisini kelepçeleyip içeri girmesini yasaklar. Sonuç ne olur? Kapı mühürlenir. O görevlinin getireceği diğer 500 ağır yaralı hasta sokakta kalır, içeri tek bir hasta giremez ve hastane kendi güvenliğini sağlayacağım derken tamamen işlevsiz hale gelir.

Web altyapısında ve ağ güvenliğinde de Cloudflare gibi bir Ters Vekil (Reverse Proxy / CDN) kalkanı kurup, arkadaki kök sunucuda gerçek IP çözümlemesini (mod_remoteip / restore_real_ip) yapılandırmamak, tam olarak bu trajikomik hekim hatasının dijital kopyasıdır.

Koruma Kalkanının Arkasındaki Körlük

Bir web sitesi sahibi veya sistem yöneticisi, sitesini DDoS saldırılarından, bot istilasından korumak ve önbellekleme (caching) ile hızlandırmak için harika bir karar verir: Alan adının DNS kayıtlarını Cloudflare'e devreder ve "Turuncu Bulut" (Proxy status: Proxied) özelliğini açar.

Bu andan itibaren dünyadaki hiçbir ziyaretçi doğrudan sizin sunucunuzun IP adresine (185.120.xx.xx) bağlanmaz. Ziyaretçi önce Cloudflare'in dünya geneline yayılmış 300'den fazla veri merkezindeki kenar (edge) sunucularından birine bağlanır. Cloudflare trafiği filtreler, temizler ve ardından kendi IP adreslerinden biriyle sizin sunucunuza bağlanıp içeriği çeker (Origin Fetch).

Buraya kadar her şey bir mühendislik harikasıdır. Ancak kök sunucudaki (Apache, Nginx veya LiteSpeed) web sunucusu yazılımı, gelen bu bağlantıların TCP el sıkışmasında Cloudflare'in IP bloklarını görür (173.245.48.0/20, 103.21.244.0/22, 141.101.64.0/32 vb.).

Eğer sunucunuzda gerekli tercüman modülü kurulu değilse, sunucunuz için dünyadaki tüm ziyaretçiler (Almanya'daki Ayşe Hanım, Ankara'daki Mehmet Bey, Çin'deki zararlı bot) tek bir kişidir: Cloudflare!

Gece Yarısı Kriz: CSF'nin İntikamı

Sunucuda koşan otomatik bir güvenlik duvarı vardır: CSF (ConfigServer Security & Firewall), fail2ban veya iptables.

Gece saat 02:15'te sitenin WordPress giriş sayfasına (/wp-login.php) Rusya'dan bir bot kaba kuvvet (brute force) parola denemesi başlatır. Bot saniyede 15 şifre denemektedir. İstek Cloudflare üzerinden sunucuya akar.

Sunucu güvenlik duvarı bakar: "172.68.22.45 IP adresinden son 60 saniyede 50 başarısız şifre denemesi yapıldı!"

Güvenlik duvarı acımasız kuralını işletir:

csf -d 172.68.22.45 "Brute force attack on wp-login"
# veya iptables:
iptables -A INPUT -s 172.68.22.45 -j DROP

İşte felaket tam bu saniyede patlar. 172.68.22.45, saldırganın değil; Cloudflare'in Türkiye, Balkanlar ve Ortadoğu trafiğini taşıyan devasa bir aktarma istasyonudur!

Güvenlik duvarı bu IP'yi banladığı an, o aktarma istasyonundan gelen binlerce masum ziyaretçinin, şirketin kurumsal müşterilerinin ve e-ticaret alıcılarının bağlantısı duvara toslar. Tarayıcılarda o meşhur Cloudflare hata sayfası belirir:

Error 522: Connection Timed Out
"Cloudflare is unable to reach your origin server."

Site bir saniyede dünya genelinde karanlığa gömülür.

Destek Masasında Gece Nöbeti

Sabah saat 08:30'da sistem yöneticisinin telefonu çalar: "Sitemiz çöktü, Cloudflare 522 veriyor!"

Yönetici Cloudflare paneline bakar; "Her şey yeşil, saldırı yok" demektedir. Kök sunucuya SSH ile girer; CPU %5, RAM %20'dir; web sunucusu ayaktadır. "Sunucu çalışıyor ama siteye girilemiyor, kesin Cloudflare'de global kesinti var!" diyerek suçu Cloudflare'e atar.

Oysa CSF loglarına (/var/log/messages veya /etc/csf/csf.deny) baktığında, Cloudflare'in neredeyse tüm IP havuzunun sunucu tarafından tek tek tutuklanıp hücreye atıldığını görür! Kendi kalkanını kendi eliyle kurşuna dizmiştir.

Gerçek Kimliği Görmek: CF-Connecting-IP ve mod_remoteip

Bir ters vekil arkasında çalışırken sunucunun kör olmasını engellemek, tıp dilindeki "hasta bilekliğini okumak" kadar basit ve hayati bir protokoldür. Cloudflare, kök sunucuya istek atarken HTTP paketinin başlığına (header) ziyaretçinin gerçek ev IP'sini iliştirir:

CF-Connecting-IP: 195.175.44.12
X-Forwarded-For: 195.175.44.12, 172.68.22.45

Sunucunun yapması gereken tek şey, TCP soketindeki IP'yi değil, bu başlığın içindeki IP'yi "gerçek IP" olarak kabul etmektir:

  1. Apache için mod_remoteip:
    Apache konfigürasyonuna (remoteip.conf) şu satırlar eklenir:
    RemoteIPHeader CF-Connecting-IP
    RemoteIPTrustedProxy 173.245.48.0/20
    RemoteIPTrustedProxy 103.21.244.0/22
    RemoteIPTrustedProxy 172.64.0.0/13
    # Tüm Cloudflare IP blokları tanımlanır
  2. Nginx için ngx_http_realip_module:
    set_real_ip_from 173.245.48.0/20;
    set_real_ip_from 103.21.244.0/22;
    real_ip_header CF-Connecting-IP;
  3. Güvenlik Duvarı İzni (Whitelisting): CSF veya iptables üzerinde Cloudflare'in tüm resmi IP blokları csf.allow dosyasına eklenerek güvenlik duvarının bu IP'leri asla otomatik banlamaması garanti altına alınır.

Kalkan taşımak savaşçıyı korur; ancak kalkanın arkasındaki gözü kör ederseniz, dost askeri düşman sanıp kendi ordunuzu katledersiniz. Cloudflare bir lütuftur; fakat altyapınızın dilini onunla konuşacak şekilde eğitmezseniz, en büyük koruyucunuz en büyük felaketiniz haline gelir.