Cloudflare Firewall Rules ile IP ve Ülke Engelleme
Cloudflare hesabınızı açıp da ilk kez “Firewall Rules” sekmesine tıkladığınızda, karşınıza çıkan seçeneklerin zenginliği sizi biraz şaşırtabilir. Ama endişelenmeyin, bu yazıda sıfırdan başlayarak IP engelleme, ülke bazlı erişim kısıtlama ve gelişmiş kural kombinasyonlarını nasıl kuracağınızı adım adım anlatacağım. Üstelik gerçek dünya senaryolarıyla, yani “bunu neden yapmalıyım?” sorusunun cevabıyla birlikte.
Cloudflare Firewall Rules Nedir ve Neden Önemlidir?
Cloudflare, sitenizin önünde bir proxy görevi görür. Bu sayede gelen tüm trafik önce Cloudflare’in sunucularına uğrar, ardından sizin sunucunuza iletilir. Firewall Rules ise bu süreçte devreye girerek belirli kriterlere uyan istekleri durdurmanıza ya da farklı şekilde işlemenize olanak tanır.
Geleneksel bir .htaccess veya iptables kuralıyla IP engellemek mümkündür, doğru. Ama bu yöntemlerin önemli bir dezavantajı var: Zararlı istek sunucunuza kadar ulaşır, sunucunuz kaynakları tüketir ve ancak o noktada reddedilir. Cloudflare’in firewall’u ise bu isteği sunucunuza hiç iletmez. Bant genişliğinizi, CPU’nuzu ve belleğinizi korur.
Özellikle şu durumlarda Cloudflare Firewall Rules hayat kurtarır:
- Belirli ülkelerden gelen yoğun bot trafiğini kesmek istiyorsunuz
- Kötü amaçlı IP aralıklarını kalıcı olarak engellemek istiyorsunuz
- Admin paneline sadece kendi IP’nizden erişilmesini istiyorsunuz
- API endpoint’lerinizi belirli kaynaklarla sınırlamak istiyorsunuz
- DDoS saldırılarını erken aşamada durdurmak istiyorsunuz
Cloudflare API ile Firewall Rules Yönetimi
Cloudflare’in web arayüzü kullanışlıdır, ancak bir sistem yöneticisi olarak işleri otomatize etmek istersiniz. Cloudflare’in REST API’si bu noktada devreye giriyor.
Öncelikle ihtiyaç duyduğunuz bilgileri toplayalım:
# Zone ID'nizi öğrenmek için
curl -X GET "https://api.cloudflare.com/client/v4/zones"
-H "X-Auth-Email: [email protected]"
-H "X-Auth-Key: API_ANAHTARINIZ"
-H "Content-Type: application/json" | python3 -m json.tool
Bu komut size hesabınızdaki tüm zone’ları ve ID’lerini döndürür. Zone ID’yi bir yere not edin, bundan sonraki tüm işlemlerde kullanacaksınız.
# Mevcut firewall kurallarını listeleyin
ZONE_ID="zone_id_buraya"
API_KEY="api_key_buraya"
EMAIL="[email protected]"
curl -X GET "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/firewall/rules"
-H "X-Auth-Email: ${EMAIL}"
-H "X-Auth-Key: ${API_KEY}"
-H "Content-Type: application/json" | python3 -m json.tool
Tek IP Adresi Engelleme
En basit senaryo: Sürekli brute force deneyen, scraping yapan ya da kötü amaçlı istekler gönderen bir IP adresini engellemek. Bunu iki adımda yapıyoruz. Önce bir “filter” (filtre) oluşturuyoruz, ardından bu filtreye bir “action” (eylem) bağlayan kural oluşturuyoruz.
# Adım 1: Filtre oluştur
ZONE_ID="zone_id_buraya"
API_KEY="api_key_buraya"
EMAIL="[email protected]"
BLOCKED_IP="192.168.1.100"
curl -X POST "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/filters"
-H "X-Auth-Email: ${EMAIL}"
-H "X-Auth-Key: ${API_KEY}"
-H "Content-Type: application/json"
--data '{
"expression": "(ip.src eq '"${BLOCKED_IP}"')",
"description": "Kotu amacli IP engeli"
}'
Komutun döndürdüğü JSON yanıtında bir id alanı göreceksiniz. Bu filter ID’yi bir sonraki adımda kullanacaksınız:
# Adım 2: Kural oluştur (filtre ID'sini kullan)
FILTER_ID="filter_id_buraya"
curl -X POST "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/firewall/rules"
-H "X-Auth-Email: ${EMAIL}"
-H "X-Auth-Key: ${API_KEY}"
-H "Content-Type: application/json"
--data '[{
"filter": {
"id": "'"${FILTER_ID}"'"
},
"action": "block",
"description": "192.168.1.100 IP engellemesi"
}]'
Action değeri olarak şunları kullanabilirsiniz:
- block: İsteği tamamen reddeder, 403 döner
- challenge: CAPTCHA sayfası gösterir
- js_challenge: JavaScript challenge uygular
- managed_challenge: Cloudflare’in akıllı challenge sistemi
- allow: Diğer kuralların önüne geçerek izin verir
- log: Sadece loglar, işlem yapmaz (Pro ve üstü)
- bypass: WAF kurallarını atlar
IP Aralığı (CIDR) Engelleme
Bazen tek bir IP değil, tüm bir IP bloğu saldırı kaynağı olabilir. Bunu da kolayca halledebilirsiniz:
# Bir IP aralığını engelle
curl -X POST "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/filters"
-H "X-Auth-Email: ${EMAIL}"
-H "X-Auth-Key: ${API_KEY}"
-H "Content-Type: application/json"
--data '{
"expression": "(ip.src in {192.168.1.0/24 10.0.0.0/8})",
"description": "Zararli IP araligini engelle"
}'
Birden fazla IP’yi tek bir filter expression’da belirtebilirsiniz. Bu hem yönetimi kolaylaştırır hem de kural limitinizi verimli kullanmanızı sağlar. Cloudflare’in ücretsiz planında beş kural hakkınız var, bu yüzden IP’leri tek tek değil gruplar halinde engellemek mantıklı.
Ülke Bazlı Engelleme
Bu, Cloudflare’in en güçlü özelliklerinden biri. IP adresi bazlı engelleme yanıltıcı olabilir, çünkü VPN kullanan biri kolayca bu engeli aşabilir. Ama bazı durumlarda coğrafi engelleme gerçekten işe yarar.
Örneğin Türkiye’ye hizmet veren bir e-ticaret siteniz var ve Rusya, Çin, Kuzey Kore gibi ülkelerden hiç meşru müşteri gelmesi mümkün değil ama sürekli bot ve saldırı geliyor. İşte bu durumda ülke engeli mantıklıdır.
# Belirli ülkeleri engelle (ISO 3166-1 alpha-2 kodları kullanılır)
curl -X POST "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/filters"
-H "X-Auth-Email: ${EMAIL}"
-H "X-Auth-Key: ${API_KEY}"
-H "Content-Type: application/json"
--data '{
"expression": "(ip.geoip.country in {"RU" "CN" "KP" "IR"})",
"description": "Yuksek riskli ulkelerden gelen trafigi engelle"
}'
Peki tam tersini de yapabilir misiniz? Evet, sadece belirli ülkelere izin vermek de mümkün:
# Sadece Türkiye ve yakın coğrafyadan erişime izin ver, geri kalanını engelle
curl -X POST "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/filters"
-H "X-Auth-Email: ${EMAIL}"
-H "X-Auth-Key: ${API_KEY}"
-H "Content-Type: application/json"
--data '{
"expression": "(not ip.geoip.country in {"TR" "DE" "NL" "GB" "US"})",
"description": "Izin verilen ulkeler disindaki trafigi engelle"
}'
Bu yaklaşımda dikkatli olmanız gereken bir nokta var: Cloudflare’in kendi botları ve arama motoru crawlerları farklı ülkelerden gelebilir. Özellikle allow aksiyonuyla “iyi bot” trafiğini önce beyaz listeye almak iyi bir pratiktir.
Gelişmiş Kural Kombinasyonları
Firewall Rules’un gerçek gücü, birden fazla kriteri birleştirebildiğinizde ortaya çıkar. Cloudflare’in expression syntax’ı oldukça yeteneklidir.
Senaryo 1: Admin Panelini Sadece Kendi IP’nize Açın
Bu, en sık kullanılan ve en değerli güvenlik önlemlerinden biri. WordPress, cPanel, phpMyAdmin gibi hassas yönetim arayüzlerine sadece sizin IP adresinizden erişilsin:
# Admin sayfalarına sadece belirli IP'den izin ver
curl -X POST "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/filters"
-H "X-Auth-Email: ${EMAIL}"
-H "X-Auth-Key: ${API_KEY}"
-H "Content-Type: application/json"
--data '{
"expression": "(http.request.uri.path contains "/wp-admin" or http.request.uri.path contains "/wp-login.php") and (not ip.src eq 85.100.200.50)",
"description": "WP admin paneli - sadece ofis IP izni"
}'
Bu kurala action olarak block atarsanız, admin sayfalarına ofis IP’niz dışından gelen tüm istekler reddedilir.
Senaryo 2: API Endpoint Koruması
API’nize sadece belirli ülkelerden, belirli bir User-Agent ile erişilmesini istiyorsanız:
# API koruması - sadece TR'den ve dogru UA ile
curl -X POST "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/filters"
-H "X-Auth-Email: ${EMAIL}"
-H "X-Auth-Key: ${API_KEY}"
-H "Content-Type: application/json"
--data '{
"expression": "(http.request.uri.path matches "^/api/.*") and (not ip.geoip.country eq "TR") and (not http.user_agent contains "MyApp/")",
"description": "API - TR disindaki ve yanlis UA kullanan istekleri engelle"
}'
Senaryo 3: Bot Trafik Filtreleme
Bazı kötü amaçlı botlar kendilerini belli User-Agent’larla tanıtır. Bunu da engelleyebilirsiniz:
# Bilinen kotu amacli bot UA'larini engelle
curl -X POST "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/filters"
-H "X-Auth-Email: ${EMAIL}"
-H "X-Auth-Key: ${API_KEY}"
-H "Content-Type: application/json"
--data '{
"expression": "(http.user_agent contains "sqlmap") or (http.user_agent contains "nikto") or (http.user_agent contains "masscan") or (http.user_agent eq "")",
"description": "Kotu amacli tarayici ve bot engeli"
}'
Boş User-Agent’ı da engellemek (http.user_agent eq ""), scriptkiddie düzeyindeki saldırıların büyük çoğunluğunu durdurur.
Toplu IP Engelleme ile Bash Scripti
Gerçek dünyada bazen bir saldırı dalgasıyla karşılaşırsınız ve onlarca IP’yi hızlıca engellemeniz gerekir. Bunun için bir bash scripti işinizi çok kolaylaştırır:
#!/bin/bash
# cloudflare_block_ips.sh - Toplu IP engelleme scripti
ZONE_ID="zone_id_buraya"
API_KEY="api_key_buraya"
EMAIL="[email protected]"
IP_LIST_FILE="blocked_ips.txt"
if [ ! -f "$IP_LIST_FILE" ]; then
echo "Hata: $IP_LIST_FILE dosyasi bulunamadi"
exit 1
fi
# IP listesini Cloudflare expression formatina donustur
IPS=$(cat "$IP_LIST_FILE" | tr 'n' ' ' | sed 's/ $//')
EXPRESSION="(ip.src in {${IPS}})"
echo "Olusturulan expression: $EXPRESSION"
# Filtre olustur
FILTER_RESPONSE=$(curl -s -X POST
"https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/filters"
-H "X-Auth-Email: ${EMAIL}"
-H "X-Auth-Key: ${API_KEY}"
-H "Content-Type: application/json"
--data "{"expression": "${EXPRESSION}", "description": "Toplu IP engel - $(date +%Y-%m-%d)"}")
FILTER_ID=$(echo "$FILTER_RESPONSE" | python3 -c "import sys,json; data=json.load(sys.stdin); print(data['result']['id'])")
if [ -z "$FILTER_ID" ]; then
echo "Hata: Filtre olusturulamadi"
echo "$FILTER_RESPONSE"
exit 1
fi
echo "Filtre olusturuldu: $FILTER_ID"
# Kural olustur
curl -s -X POST
"https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/firewall/rules"
-H "X-Auth-Email: ${EMAIL}"
-H "X-Auth-Key: ${API_KEY}"
-H "Content-Type: application/json"
--data "[{"filter": {"id": "${FILTER_ID}"}, "action": "block", "description": "Toplu IP engel - $(date +%Y-%m-%d)"}]"
echo ""
echo "Islem tamamlandi. $(wc -l < $IP_LIST_FILE) IP engellendi."
blocked_ips.txt dosyanıza her satıra bir IP veya CIDR yazarsınız, scripti çalıştırırsınız ve hepsi tek bir Cloudflare kuralına dönüştürülür.
Cloudflare WAF ile Firewall Rules Arasındaki Fark
Bunu kafasına takıp soran çok sistem yöneticisi oluyor. Kısaca açıklayayım:
- Firewall Rules (Custom Rules): Sizin yazdığınız özel kurallar. IP, ülke, URL, header, User-Agent gibi kriterlere göre trafik yönetimi yaparsınız.
- WAF (Web Application Firewall): Cloudflare’in önceden tanımlanmış kural setleri. SQL injection, XSS, OWASP Top 10 gibi saldırı kalıplarını otomatik tespit eder.
İkisi birbirini tamamlar. WAF genel saldırı kalıplarını yakalarken, Firewall Rules size sitenize özel politikalar belirleme imkanı verir.
IP Listelerini Otomatik Güncelleme
Bazı güvenlik hizmetleri düzenli olarak güncellenen kötü amaçlı IP listeleri yayınlar. Bu listeleri otomatik olarak Cloudflare’e eklemek için bir cron job kurabilirsiniz:
#!/bin/bash
# update_threat_ips.sh - Tehdit istihbarat listesini otomatik guncelle
ZONE_ID="zone_id_buraya"
API_KEY="api_key_buraya"
EMAIL="[email protected]"
RULE_DESCRIPTION="Otomatik tehdit listesi"
# Firehol gibi acik kaynak tehdit listelerinden IP cek
wget -q -O /tmp/threat_ips.txt
"https://raw.githubusercontent.com/firehol/blocklist-ipsets/master/firehol_level1.netset" 2>/dev/null
# Yorum satirlarini temizle ve sadece gecerli IP'leri al
grep -v "^#" /tmp/threat_ips.txt | grep -v "^$" | head -50 > /tmp/clean_ips.txt
# Mevcut kurali bul ve sil
EXISTING_RULE=$(curl -s -X GET
"https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/firewall/rules"
-H "X-Auth-Email: ${EMAIL}"
-H "X-Auth-Key: ${API_KEY}"
-H "Content-Type: application/json" |
python3 -c "
import sys, json
data = json.load(sys.stdin)
for rule in data.get('result', []):
if rule.get('description') == '${RULE_DESCRIPTION}':
print(rule['id'])
break
")
if [ ! -z "$EXISTING_RULE" ]; then
curl -s -X DELETE
"https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/firewall/rules/${EXISTING_RULE}"
-H "X-Auth-Email: ${EMAIL}"
-H "X-Auth-Key: ${API_KEY}"
-H "Content-Type: application/json"
echo "Eski kural silindi: $EXISTING_RULE"
fi
echo "Liste guncellendi: $(wc -l < /tmp/clean_ips.txt) IP eklendi"
Bu scripti crontab’a ekleyin:
# Her gece saat 02:00'de calistir
0 2 * * * /opt/scripts/update_threat_ips.sh >> /var/log/cloudflare_update.log 2>&1
Kural Önceliği ve Sıralama
Cloudflare Firewall Rules’da kural sırası önemlidir. Kurallar yukarıdan aşağıya doğru işlenir. Önemli noktalar:
- allow aksiyonlu bir kural eşleşirse, diğer firewall kuralları çalışmaz (ama WAF çalışmaya devam eder)
- bypass aksiyonu WAF’ı da atlar
- block aksiyonlu bir kural eşleşirse, istek hemen reddedilir
Bu yüzden kural sıralamasını şu mantıkla yapın:
- En başa “güvenilir kaynaklar için allow kuralları” koyun
- Ortaya “challenge ve managed_challenge kuralları” koyun
- En sona “block kuralları” koyun
Örneğin önce ofis IP’nize allow, sonra Rusya’ya challenge, sonra diğer yüksek riskli ülkelere block koyarsanız, ofis IP’niz hiçbir zaman challenge ile karşılaşmaz.
Gerçek Dünya Senaryosu: DDoS Saldırısı Altında
Geçen yıl bir müşterimin sitesine koordineli bir layer 7 DDoS saldırısı geldi. Saniyede 50 binden fazla istek, tamamı farklı IP’lerden, ama hepsi aynı ülkeden. Sunucu çökmüştü.
Cloudflare üzerinde yaptıklarımız:
- Anlık durum: Security Level’i “Under Attack” moduna aldık. Bu, tüm ziyaretçilere 5 saniyelik JavaScript challenge uygular.
- İkinci adım: Saldırının geldiği ülkeyi tespit edip o ülkeye
challengeaksiyonu uyguladık. - Uzun vadeli: Saldırı bittikten sonra kural analizi yaptık, gerçek kullanıcıların %95’i Türkiye ve Almanya’dan geliyordu. Diğer tüm ülkelere
managed_challengeuyguladık.
Sonuç? Sitenin normal kullanıcıları hiçbir şey fark etmedi, saldırı trafiği Cloudflare’in edge ağında emildi, sunucuya tek paket bile ulaşmadı. Müşteri de çok mutlu oldu.
Kural Limitlerini Aşma Yöntemleri
Ücretsiz planda 5 kural limitiniz var. Bunu aşmadan maksimum verim almak için:
- Birden fazla IP’yi tek bir expression’da gruplayın:
(ip.src in {1.1.1.1 2.2.2.2 3.3.3.3}) - Birden fazla ülkeyi tek kurala sıkıştırın:
(ip.geoip.country in {"RU" "CN" "KP"}) - OR operatörüyle farklı kriterleri birleştirin
- Pro plana geçmeyi düşünün: 20 kural ve daha gelişmiş özellikler sunar
Cloudflare’in yeni nesil “Custom Rules” arayüzü artık Filter ve Rule’u birleştiriyor. Eğer arayüzden kullanıyorsanız bu iki adımlı süreci tek sayfada halledebiliyorsunuz.
Sonuç
Cloudflare Firewall Rules, sistem yöneticisinin araç kutusundaki en güçlü silahlardan biri. Öğrenme eğrisi düşük, etkisi yüksek ve sunucu kaynakları üzerindeki baskıyı ciddi ölçüde azaltıyor.
Bu yazıda anlattıklarımı özetleyecek olursam:
- Tek IP ve IP aralığı engellemesi için filter + rule kombinasyonunu kullanın
- Ülke engelleme için ISO 3166-1 alpha-2 kodlarını expression’a yazın
- Kural önceliğini doğru ayarlayın: önce allow, sonra challenge, en son block
- Bash scriptleriyle toplu ve otomatik kural yönetimini kurun
- Kural limitinizi verimli kullanmak için IP’leri ve ülkeleri gruplama
Cloudflare API’sini öğrendikten sonra bu işleri web arayüzünden yapmayı zaten bırakacaksınız. Bir bash scriptiyle 50 IP’yi engellemek mü, yoksa tek tek form doldurmak mı? Cevap belli.
Bir sonraki yazıda Cloudflare Workers ile daha gelişmiş trafik yönetimini ele alacağım. Rate limiting, edge’de request manipulation ve A/B testing gibi konuları işleyeceğiz.
