Sunucunuzu yönetirken fark edersiniz ki gelen trafiğin önemli bir kısmı hiçbir işinizin olmadığı ülkelerden geliyor. Brute force denemeleri, port taramaları, spam bağlantıları… Bunların büyük çoğunluğunun belirli coğrafi bölgelerden geldiğini gördüğünüzde, ülke bazlı erişim kısıtlaması aklınıza gelen ilk çözüm oluyor. CSF (ConfigServer Security & Firewall), bu iş için hem güçlü hem de kullanımı pratik bir araç sunuyor. Bu yazıda CSF’in GeoIP özelliğini kullanarak nasıl ülke bazlı kısıtlama yapacağınızı, hangi senaryolarda ne yapmanız gerektiğini ve dikkat etmeniz gereken kritik noktaları ele alacağız.
CSF GeoIP Kısıtlaması Nasıl Çalışır?
CSF, ülke bazlı filtreleme için iki farklı yöntem kullanır. Birincisi CC_DENY ve CC_ALLOW direktifleri üzerinden çalışan temel GeoIP filtrelemesi, ikincisi ise daha granüler kontrol sağlayan CC_ALLOW_PORTS ve CC_DENY_PORTS mekanizmaları. Temel mantık şu: CSF bir GeoIP veritabanı kullanarak gelen IP adresinin hangi ülkeye ait olduğunu tespit eder ve buna göre izin verir ya da reddeder.
CSF bu işlemi iptables kuralları aracılığıyla gerçekleştirir. GeoIP veritabanından elde ettiği IP bloklarını iptables’a besler ve bu sayede kernel seviyesinde filtreleme yapılır. Bu yaklaşım, uygulama katmanında filtreleme yapmaya kıyasla çok daha verimlidir çünkü paketler sunucunuzdaki herhangi bir servise ulaşmadan düşürülür.
Şunu da belirtmek gerekir: GeoIP filtrelemesi yüzde yüz güvenilir değildir. VPN kullanan bir saldırgan kolayca izin verilen bir ülkeden görünebilir. Dolayısıyla bu özelliği tek başına bir güvenlik çözümü olarak değil, savunma katmanlarından biri olarak değerlendirin.
Gerekli Paketlerin Kurulumu
CSF’in GeoIP özelliğini kullanabilmek için öncelikle sistemde bazı bağımlılıkların kurulu olması gerekiyor.
# CentOS/RHEL için
yum install -y perl-Geo-IP GeoIP GeoIP-devel
# Ubuntu/Debian için
apt-get install -y libgeo-ip-perl geoip-database geoip-bin
# MaxMind GeoIP veritabanını indirmek için gerekli araç
apt-get install -y geoipupdate
CSF kurulumunuz yoksa önce onu kuralım:
cd /usr/src
wget https://download.configserver.com/csf.tgz
tar -xzf csf.tgz
cd csf
sh install.sh
Kurulum tamamlandıktan sonra CSF’in iptables modüllerini tanıyıp tanımadığını test edin:
perl /usr/local/csf/bin/csftest.pl
Bu komut çıktısında herhangi bir “FATAL” hata görmemeniz gerekiyor. Eğer GeoIP ile ilgili bir uyarı görürseniz, Perl modülünün eksik olduğunu anlayabilirsiniz.
GeoIP Veritabanı Güncellemesi
CSF, ülke tespiti için yerel bir GeoIP veritabanı kullanır. Bu veritabanının güncel tutulması şart, aksi takdirde yanlış eşleşmeler yaşanabilir.
# CSF'in kendi GeoIP güncelleme scriptini çalıştırın
/usr/local/csf/bin/csf --geoipdb
# Veritabanının doğru yüklenip yüklenmediğini kontrol edin
ls -la /usr/local/csf/lib/geo/
Bu komutu düzenli çalıştırmak için cron’a ekleyin:
# crontab -e ile açın ve şunu ekleyin
0 3 * * 0 /usr/local/csf/bin/csf --geoipdb > /dev/null 2>&1
Her Pazar sabahı saat 03:00’da veritabanı otomatik güncellenecektir. MaxMind veritabanları genellikle her iki haftada bir güncelleniyor, haftalık kontrol yeterli.
csf.conf Temel Ayarları
Şimdi asıl işe geçelim. CSF’in ana konfigürasyon dosyası /etc/csf/csf.conf içinde GeoIP ile ilgili direktifleri bulup düzenlemeniz gerekiyor.
# Konfigürasyon dosyasını açın
nano /etc/csf/csf.conf
Dosya içinde aşağıdaki direktifleri arayın:
CC_DENY: Erişimini tamamen engellemek istediğiniz ülkelerin ISO 3166-1 alpha-2 kodlarını buraya girersiniz. Örneğin Çin için CN, Rusya için RU, Kuzey Kore için KP.
CC_ALLOW: Sadece belirli ülkelerden erişime izin vermek istiyorsanız kullanırsınız. Bu direktif CC_DENY‘dan önce gelir.
CC_ALLOW_FILTER: Bu ayar aktif edildiğinde yalnızca CC_ALLOW listesindeki ülkeler erişebilir, geri kalan her yer engellenir. Türkiye bazlı hizmet veriyorsanız ve yurt dışından erişim gereksinimi yoksa çok işe yarar.
CC_DENY_PORTS: Belirli portları sadece belirli ülkeler için kapatır. SSH’ı sadece Türkiye’ye açık tutmak istiyorsanız buraya bakın.
CC_ALLOW_PORTS: Belirli portları sadece belirli ülkelere açar.
Pratik Senaryo 1: Belirli Ülkeleri Tamamen Engelleme
Sunucunuza sürekli Çin, Rusya ve Ukrayna kaynaklı brute force saldırıları geldiğini varsayalım. Bu ülkeleri tamamen engellemek için:
# /etc/csf/csf.conf dosyasında
CC_DENY = "CN,RU,UA,KP,KR,VN,ID"
Değişikliği kaydettikten sonra CSF’i yeniden başlatın:
csf -r
Bu kadar basit. CSF şimdi bu ülkelerden gelen tüm bağlantıları reddedecek. Doğrulama yapmak için:
# Aktif iptables kurallarını kontrol edin
iptables -L -n | grep -i "geoip|cc_deny" | head -20
# CSF log dosyasını izleyin
tail -f /var/log/lfd.log | grep "CC_DENY"
Pratik Senaryo 2: Sadece Türkiye’ye İzin Verme
Sadece Türkiye’den erişim kabul eden, diğer her yerden bağlantıyı reddeden bir yapı kurmak istiyorsanız:
# /etc/csf/csf.conf dosyasında
CC_ALLOW = "TR"
CC_ALLOW_FILTER = "1"
CC_DENY = ""
Dikkat: Bu ayarı yapmadan önce mevcut SSH bağlantınızın TR bloğundan geldiğinden emin olun, yoksa kendinizi kilitlersiniz. IP adresinizi önceden csf.allow dosyasına ekleyin:
# Kendi IP'nizi önce whitelist'e ekleyin
csf -a YOUR_IP_HERE "Admin whitelist"
# Sonra konfigürasyonu değiştirin ve restart edin
csf -r
Pratik Senaryo 3: Port Bazlı Ülke Kısıtlaması
Bu senaryo en sık kullanılan ve en pratik olanı. Diyelim ki SSH portunu (22) sadece Türkiye ve Almanya’ya açmak, web trafiğini (80, 443) ise herkese açık bırakmak istiyorsunuz.
# /etc/csf/csf.conf dosyasında
CC_DENY_PORTS = "TR,DE;22"
Hayır, yanlış anlamayın. Bu direktif biraz kafa karıştırıcı isimlendirilmiş. CC_DENY_PORTS aslında “bu ülkeler dışında engelle” değil, doğrudan bu ülkeler için port engeli koyar. Port bazlı ülke yönetimi için daha temiz yol CC_ALLOW_PORTS kullanmak:
# Sadece TR ve DE'den SSH bağlantısı kabul et
CC_ALLOW_PORTS = "TR,DE;22"
# Yukarıdaki ayarla birlikte diğer ülkelerden SSH'ı kapat
CC_DENY_PORTS = "!TR,!DE;22"
CSF’i restart edin:
csf -r
service lfd restart
Pratik Senaryo 4: cPanel Sunucusunda GeoIP
Eğer cPanel/WHM barındıran bir sunucu yönetiyorsanız, CSF plugin arayüzü üzerinden de bu ayarları yapabilirsiniz. Ama komut satırı her zaman daha hızlı.
Tipik bir cPanel hosting sunucusu için önerilen yapı:
# Bilinen kötü niyetli trafiği yüksek olan bölgeleri engelle
CC_DENY = "KP,CN,RU,NG,ET,GH,CI,ZA"
# Web portlarını herkese açık bırak
# SSH ve WHM portlarını sadece yönetimsel ülkelere kısıtla
CC_ALLOW_PORTS = "TR,DE,US,GB;22,2087,2083"
Bu yapıyla hem hosting müşterilerinizin web sitelerine erişim engellenmez hem de yönetim panelleri koruma altına alınır.
Ülke Kodlarını Doğrulama
Yanlış ülke kodu girmek işe yaramaz ayar oluşturur ve fark etmesi zordur. Bir IP’nin hangi ülkeden geldiğini doğrulamak için:
# CSF kendi geoiplookup aracını sağlar
/usr/local/csf/bin/geoiplookup 8.8.8.8
# Sistem üzerinde geoiplookup varsa
geoiplookup 185.220.101.1
# Belirli bir ülkenin tüm IP bloklarını görmek için
grep "^TR," /usr/local/csf/lib/geo/GeoIPCountryWhois.csv | wc -l
Ülke kodlarının doğru olduğundan emin olmak için ISO 3166-1 standardını referans alın. Yaygın hatalar: İngiltere için EN veya UK yazmak (doğrusu GB), Güney Kore için KO yazmak (doğrusu KR).
LFD ile Entegrasyon ve Loglama
CSF’in yardımcı daemon’u olan LFD (Login Failure Daemon), GeoIP kısıtlamalarıyla çok iyi çalışır. Engellenen ülkelerden gelen bağlantı denemelerini loglamak için:
# /etc/csf/csf.conf içinde
LF_LOG_LEVEL = "3"
CC_LOOKUPS = "1"
CC_LOOKUPS = "1" ayarı, log dosyalarına ülke bilgisini de ekler. Bu sayede hangi ülkeden ne kadar saldırı geldiğini net görebilirsiniz.
Log analizi için basit bir bash scripti:
#!/bin/bash
# /usr/local/bin/geo_attack_report.sh
echo "Son 24 saatte engellenen bağlantılar (ülkeye göre):"
echo "======================================================"
grep "$(date +%b)" /var/log/lfd.log |
grep "CC_DENY|GEOIP" |
grep -oP '[([A-Z]{2})]' |
sort | uniq -c | sort -rn | head -20
Bu scripti çalıştırılabilir yapıp cron’a ekleyerek günlük rapor alabilirsiniz:
chmod +x /usr/local/bin/geo_attack_report.sh
# Her sabah 08:00'de mail gönder
0 8 * * * /usr/local/bin/geo_attack_report.sh | mail -s "GeoIP Raporu" [email protected]
Whitelist ile İstisna Yönetimi
Bir ülkeyi engelledikten sonra o ülkeden meşru bağlantı yapması gereken birisi ortaya çıkabilir. Bu durumda ülke engelini kaldırmak yerine tek IP’ye istisna tanımak çok daha güvenli bir yaklaşım.
# Tek IP'ye whitelist
csf -a 1.2.3.4 "Çin'deki iş ortağı - John Wu"
# IP aralığına whitelist
csf -a 1.2.3.0/24 "Çin ofis network'ü"
# Whitelist listesini görüntüle
csf -g 1.2.3.4
Kalıcı whitelist için /etc/csf/csf.allow dosyasını düzenleyin. Bu dosyaya eklenen IP’ler CSF restart sonrasında da korunur:
nano /etc/csf/csf.allow
# Dosyaya şu formatta ekleyin:
# 1.2.3.4 # Açıklama
# 1.2.3.0/24 # Ağ bloğu
Önemli not: csf.allow dosyasındaki IP’ler CC_DENY kurallarından önce işlenir. Yani bir IP whitelist’teyse, ülkesi engellenmiş olsa bile bağlanabilir.
Performans Optimizasyonu
Çok fazla ülkeyi engellemek veya çok fazla GeoIP kuralı oluşturmak iptables’ı şişirebilir ve performans sorunlarına yol açabilir. Bunu yönetmek için:
# Mevcut iptables kuralı sayısını kontrol edin
iptables -L -n | wc -l
# CSF'in ipset desteğini aktif edin (büyük listeler için çok daha verimli)
# /etc/csf/csf.conf içinde
LF_IPSET = "1"
LF_IPSET = "1" ayarı, CSF’in ayrı ayrı iptables kuralları yerine ipset kullanmasını sağlar. Yüzlerce IP bloğunu tek bir set olarak sakladığı için kernel lookup çok daha hızlı gerçekleşir. Özellikle Çin ve Rusya gibi çok sayıda IP bloğuna sahip ülkeleri engellerken bu ayar kritik önem taşır.
ipset’in kurulu olduğunu doğrulayın:
which ipset
ipset --version
# Yoksa kurun
# CentOS: yum install ipset
# Ubuntu: apt-get install ipset
Sorun Giderme
Ülke kısıtlamaları bazen beklenmedik sorunlara yol açar. En sık karşılaşılan durumlar:
CDN arkasındaki gerçek IP sorunu: Cloudflare veya başka bir CDN kullanıyorsanız, CSF CDN’in IP adresini görür, ziyaretçinin gerçek IP’sini değil. Bu durumda CDN IP bloklarını whitelist’e eklemeniz gerekir.
# Cloudflare IP'lerini whitelist'e eklemek için
# https://www.cloudflare.com/ips/ adresindeki IP bloklarını csf.allow'a ekleyin
cat >> /etc/csf/csf.allow << 'EOF'
173.245.48.0/20 # Cloudflare
103.21.244.0/22 # Cloudflare
103.22.200.0/22 # Cloudflare
103.31.4.0/22 # Cloudflare
141.101.64.0/18 # Cloudflare
108.162.192.0/18 # Cloudflare
190.93.240.0/20 # Cloudflare
188.114.96.0/20 # Cloudflare
197.234.240.0/22 # Cloudflare
198.41.128.0/17 # Cloudflare
162.158.0.0/15 # Cloudflare
104.16.0.0/13 # Cloudflare
104.24.0.0/14 # Cloudflare
172.64.0.0/13 # Cloudflare
131.0.72.0/22 # Cloudflare
EOF
csf -r
GeoIP eşleşme hatası: Bazı IP’ler veritabanında yanlış ülkeye atanmış olabilir. Bu durumda ilgili IP’yi elle whitelist’e eklemek en pratik çözüm.
CSF restart sonrası kuralların kaybolması: /etc/csf/csf.conf dosyasındaki değişiklikleri kaydetmeden restart yaptıysanız kurallar geri gelir. Ayrıca csf -r yerine yanlışlıkla csf -f (flush) çalıştırmak tüm kuralları temizler.
# Mevcut durumu kontrol etmek için
csf -l
csf --status
# GeoIP kurallarının aktif olup olmadığını görmek için
iptables -L GEOIP_CHECK -n --line-numbers 2>/dev/null | head -30
Gerçek Dünya Notları
Bir e-ticaret sitesi yönetiyorsanız ve müşterilerinizin tamamı Türkiye’deyse, CC_ALLOW_FILTER = "1" ile sadece Türkiye’ye izin vermek mantıklı. Ancak Google, Bing ve diğer arama motoru crawlerlarının farklı ülkelerden gelebileceğini unutmayın. SEO açısından bu botlara erişim izni vermek isteyebilirsiniz.
Bu durumda bot IP’lerini whitelist’e almak yerine 80 ve 443 portlarını kısıtlama dışında tutmak daha akıllıca:
# 80 ve 443 herkese açık, yönetim portları sadece TR
CC_ALLOW_FILTER = "0"
CC_DENY = "KP,CN,RU,NG"
CC_ALLOW_PORTS = "TR;22,2083,2087,10000"
CC_DENY_PORTS = "!TR;22,2083,2087,10000"
Bir başka gerçek dünya senaryosu: Finans sektöründe çalışıyorsanız ve PCI-DSS uyumu gerekiyorsa, GeoIP kısıtlamaları denetçilere gösterebileceğiniz somut bir güvenlik katmanı oluşturur. Konfigürasyonunuzu ve günlük logları düzenli arşivleyin.
Sonuç
CSF ile ülke bazlı erişim kısıtlaması, sunucu güvenliğinizi önemli ölçüde artıran ve uygulaması görece kolay bir yöntem. Özellikle brute force saldırılarını ve otomatik taramaları azaltmada çok etkili olduğunu pratikte görüyorsunuz.
Ancak birkaç şeyi aklınızda tutun: GeoIP filtrelemesi kesin bir koruma değil, ek bir katmandır. VPN ve proxy kullanan saldırganlar bu engeli kolayca aşabilir. Dolayısıyla fail2ban, güçlü parola politikaları ve düzenli güvenlik güncellemeleriyle birlikte kullanmanız gerekiyor.
Konfigürasyon değişikliklerinizi her zaman önce test ortamında deneyin. Üretim sunucusunda kendinizi kilitlemek can sıkıcı olduğu kadar kritik sistemlerde ciddi sonuçlar doğurabilir. Değişiklik yapmadan önce mevcut SSH oturumunuzu açık tutun ve başka bir terminalden bağlantı test edin.
Son olarak, GeoIP veritabanını düzenli güncelleyin ve kısıtlama listelerinizi periyodik olarak gözden geçirin. Ülkelerin IP blokları değişir, yanlış eşleşmeler ortaya çıkabilir. Aylık bir kontrol rutini oluşturmak, uzun vadede sizi gereksiz baş ağrısından kurtarır.