GeoIP Kurallarıyla Linux Güvenlik Duvarında Ülkeye Göre Trafik Nasıl Engellenir
Seviye: Profesyonel
Tahmini süre: ~35 dakika
Amaç: Bir Linux sunucusunda, iptables ile xtables-geoip modülünü veya nftables ile IP kümelerini (IP sets) kullanarak erişimi ülkeye göre kısıtlayan GeoIP güvenlik duvarı kurallarını yapılandırmak ve listelerin güncel kalması için güncellemeleri otomatikleştirmek.
Giriş
Hizmetleriniz belirli bir bölgeye yönelikse, dünyanın geri kalanından trafik kabul etmeniz için bir neden yoktur. Linux güvenlik duvarında coğrafi engelleme, paketleri uygulamanıza ulaşmadan önce kaynak ülkeye göre düşürmenizi sağlar; bu da kaba kuvvet (brute-force) gürültüsünü ve saldırı yüzeyini azaltır. Bu eğitimde GeoIP kurallarını kullanarak Linux güvenlik duvarında ülkeye göre trafiği engelleyeceksiniz: önce iptables ve xtables-addons ile, ardından nftables ve CIDR tabanlı IP kümeleriyle; ülkeye göre IP engelleme yapınızın doğru kalması için veritabanının otomatik güncellenmesi de dahil.
Ön koşullar
Başlamadan önce aşağıdaki koşulların karşılandığından emin olun:
- İşletim sistemi: Ubuntu 22.04/24.04 LTS, Debian 12/13, AlmaLinux/RHEL 9/10
- Erişim: sunucuya sudo veya root erişimi
- Güvenlik duvarı: xtables-addons ile iptables 1.8+ veya nftables 1.0+
- Gerekli paketler:
curl,iptables,linux-headers-$(uname -r)(Debian/Ubuntu); EPEL deposu etkin (RHEL/AlmaLinux 9)
Debian 12+, Ubuntu 22.04+ ve RHEL/AlmaLinux 9+ sistemlerinde iptables komutu, nftables arka ucunun (iptables-nft) üzerinde çalışan bir sarmalayıcıdır. -m geoip eşleşmesi bu arka uçla doğru çalışır.
- Ağ: hizmetlerinizin hangi ülkelerden trafik kabul etmesi gerektiğinin net bir şekilde anlaşılması
- Gerekli bilgi: Linux komut satırının rahat kullanımı, temel güvenlik duvarı kavramları ve dosya düzenleme
- Yedek erişim: bir kural sizi dışarıda bırakırsa kullanılmak üzere çalışan bir bant dışı (out-of-band) konsol (IPMI/KVM) veya sağlayıcının kurtarma modu (rescue mode)
Ülke düzeyindeki güvenlik duvarı kurallarını bir SSH oturumu üzerinden uygulamak doğası gereği risklidir. Kendi ülkenizi yanlışlıkla engellerseniz erişimi kaybedersiniz. Her zaman bant dışı bir yedek erişim yolu hazır bulundurun ve kuralları kalıcı hâle getirmeden önce test edin.
Adım 1: İzin verilen ve engellenen ülkeleri belirleme
Güvenlik duvarına dokunmadan önce politikanıza karar verin. İki yaklaşım vardır:
- İzin listesi (önerilir): Yalnızca ihtiyacınız olan ülkelere izin verin, diğerlerini düşürün. Bu daha katı ve daha güvenlidir.
- Engelleme listesi: Her şeye izin verin, belirli ülkeleri düşürün. Daha basittir ancak daha fazla saldırı yüzeyi bırakır.
Bu eğitimde izin listesi yaklaşımını kullanacağız; bu yaklaşım en az ayrıcalık ilkesiyle uyumludur. Hizmetlerinizin yalnızca ABD, Almanya ve Polonya'daki kullanıcılara hizmet verdiğini varsayalım. İki harfli ISO ülke kodları şunlardır: US, DE, PL.
Ülke kodları ISO 3166-1 alpha-2 standardını izler. Tam listeyi https://www.iso.org/obp/ui/#search/code/ adresinde bulabilirsiniz. Dikkatli olun; buradaki bir yazım hatası meşru trafiği sessizce engeller.
Adım 2: iptables ile GeoIP kurulumu (xtables-addons)
Bu yöntem, iptables'a -m geoip eşleşmesini ekleyen xtables-addons içindeki xt_geoip modülünü kullanır. Bu, Linux'ta ülkeye göre IP aralığını engellemenin en köklü yollarından biridir.
2.1 xtables-addons ve bağımlılıkları kurma
Debian/Ubuntu:
sudo apt install -y linux-headers-$(uname -r) sudo apt update && sudo apt install -y \ xtables-addons-common libtext-csv-xs-perl unzip iptables curl
xtables-addons, AlmaLinux 10 depolarında bulunmaz. Bunun yerine nftables yöntemini (Adım 3) kullanın veya xtables-addons'u kaynak koddan derleyin.
Kurulumdan sonra modülün kullanılabilir olduğunu doğrulayın:
modinfo xt_geoip
Beklenen çıktı şuna benzer bir satır içerir:
filename: /lib/modules/.../xt_geoip.ko description: Xtables: country matching via GeoIP
modinfo bir hata döndürürse modül doğru kurulmamıştır. Çekirdek başlık dosyalarınızın çalışan çekirdek sürümüyle eşleştiğini kontrol edin.
2.2 GeoIP veritabanını indirme ve oluşturma
xt_geoip modülü, ülke-IP eşlemelerinden oluşan yerel bir veritabanı gerektirir. Bunlar CSV dosyaları olarak dağıtılır ve ikili biçime dönüştürülmelidir.
Çalışma dizinini ve veritabanı dizinini oluşturun:
sudo mkdir -p /usr/share/xt_geoip
En güncel GeoIP CSV verilerini indirin. Kaynak, verileri xtables-addons araçları aracılığıyla sağlar:
cd /tmp /usr/libexec/xtables-addons/xt_geoip_dl
İndirilen CSV'yi ikili biçime dönüştürün:
/usr/libexec/xtables-addons/xt_geoip_build -D /usr/share/xt_geoip *.csv
Beklenen çıktı – işlenen ülke kodlarının listesi:
4540 IPv4 ranges for ZA 1071 IPv6 ranges for ZA 147 IPv4 ranges for ZW 94 IPv6 ranges for ZW ...
2.3 GeoIP eşleşmesiyle iptables kurallarını uygulama
Şimdi asıl GeoIP güvenlik duvarı kurallarını oluşturun. Aşağıdaki betik, seçtiğiniz ülkelerden gelen trafiğe izin verir ve INPUT zincirinde geri kalan her şeyi düşürür.
Önce mevcut kurallarınızı yedekleyin:
sudo iptables-save > /tmp/iptables-backup-$(date +%Y%m%d).rules
Ülke izin listesini uygulayın:
# Allow loopback sudo iptables -A INPUT -i lo -j ACCEPT # Allow established and related connections sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # Allow traffic from US, DE, PL only sudo iptables -A INPUT -m geoip --src-cc US,DE,PL -j ACCEPT # Log dropped packets sudo iptables -A INPUT -j LOG --log-prefix "GEOIP-DROP: " --log-level 4 # Drop everything else sudo iptables -A INPUT -j DROP
Son DROP kuralı, izin listesiyle eşleşmeyen tüm trafiği engeller. SSH kaynak ülkenizin dahil olduğundan emin olun, aksi hâlde hemen erişiminizi kaybedersiniz. Emin değilseniz, DROP kuralından önce kendi IP adresiniz için geçici bir ACCEPT kuralı ekleyin: sudo iptables -I INPUT -s <YOUR_IP_ADDRESS> -j ACCEPT.
Kuralların etkin olduğunu doğrulayın:
sudo iptables -L INPUT -v --line-numbers
Beklenen çıktı:
Chain INPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT all -- anywhere anywhere /* loopback */ 2 ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED 3 ACCEPT all -- anywhere anywhere -m geoip --source-country US,DE,PL 4 LOG all -- anywhere anywhere LOG level warning prefix "GEOIP-DROP: " 5 DROP all -- anywhere anywhere
2.4 iptables kurallarını yeniden başlatmalarda kalıcı hâle getirme
iptables ile uygulanan kurallar yeniden başlatmada kaybolur. Bunları kaydedin:
Debian/Ubuntu:
sudo apt install iptables-persistent -y sudo netfilter-persistent save
AlmaLinux/RHEL:
sudo service iptables save
Adım 3: nftables ile GeoIP kurulumu (IP kümeleri)
Sisteminiz nftables kullanıyorsa (Debian 11+, Ubuntu 22.04+ ve RHEL 9+ üzerinde varsayılan), ülke düzeyindeki CIDR blokları ile doldurulan IP kümeleri (IP sets) kullanarak aynı sonucu elde edebilirsiniz. Bu yaklaşım, nftables'ın zaten sağladıklarının ötesinde çekirdek modülü gerektirmez.
3.1 Ülke IP aralıklarını edinme
İzin vermek istediğiniz ülkeler için CIDR listelerini indirin. Birçok genel kaynak bunları sağlar; örneğin ipdeny.com:
sudo mkdir -p /etc/nftables/geoip cd /etc/nftables/geoip # Download CIDR blocks for US, DE, PL for CC in us de pl; do sudo curl -sS -o /etc/nftables/geoip/${CC}.zone \ "https://www.ipdeny.com/ipblocks/data/aggregated/${CC}-aggregated.zone"; done
Dosyaların CIDR aralıkları içerdiğini doğrulayın:
head -5 /etc/nftables/geoip/us.zone
Beklenen çıktı (CIDR aralıkları, her satırda bir tane):
1.178.0.0/23 1.178.4.0/22 1.178.8.0/21 ...
3.2 nftables yapılandırmasını oluşturma ve yükleme
CIDR dosyalarını okuyup bir nftables kümesi üreten bir betik oluşturun. Bunu /etc/nftables/geoip-update.sh olarak kaydedin:
sudo nano /etc/nftables/geoip-update.sh
Aşağıdakini yapıştırın:
#!/bin/bash # Generate nftables set from country CIDR files set -euo pipefail GEOIP_DIR="/etc/nftables/geoip" OUTPUT="/etc/nftables/geoip-sets.nft" echo "define ALLOWED_COUNTRIES = {" > "$OUTPUT" for zone_file in "$GEOIP_DIR"/*.zone; do while IFS= read -r cidr; do && continue echo " ${cidr}," >> "$OUTPUT" done < "$zone_file" done echo "}" >> "$OUTPUT" echo "GeoIP set generated: $(wc -l < "$OUTPUT") lines"
Betiği çalıştırılabilir yapın:
sudo chmod +x /etc/nftables/geoip-update.sh
Betiği çalıştırın:
sudo /etc/nftables/geoip-update.sh
Şimdi nftables yapılandırmanızda bu kümeye başvurun:
# Debian/Ubuntu: sudo nano /etc/nftables.conf # AlmaLinux/RHEL: sudo nano /etc/sysconfig/nftables.conf
include satırını ekleyin ve kümeyi input zincirinizde kullanın:
#!/usr/sbin/nft -f flush ruleset include "/etc/nftables/geoip-sets.nft" table inet filter { chain input { type filter hook input priority 0; policy drop; ct state invalid drop iif lo accept ct state established,related accept # Allow ICMP ip protocol icmp accept ip6 nexthdr icmpv6 accept # GeoIP: allow only listed countries ip saddr $ALLOWED_COUNTRIES accept # Log dropped packets log prefix "geoip-drop: " level info # Everything else is dropped by policy } chain forward { type filter hook forward priority 0; policy drop; } chain output { type filter hook output priority 0; policy accept; } }
Uygulamadan önce sözdizimini doğrulayın:
sudo nft -c -f /etc/nftables.conf
Hata yoksa uygulayın ve doğrulayın:
sudo nft -f /etc/nftables.conf sudo systemctl enable --now nftables sudo nft list ruleset | head -20
Çok büyük IP kümelerinde (100 bin+ girdi) nftables, iptables'tan belirgin biçimde daha iyi performans gösterir. nftables'taki küme tabanlı eşleştirme dahili olarak karma tabloları (hash maps) kullanır; bu nedenle arama performansı küme boyutundan bağımsız olarak sabit kalır.
Adım 4: GeoIP veritabanı güncellemelerini otomatikleştirme
IP-ülke eşlemeleri sürekli değişir. Geçen aydan kalma bir veritabanında boşluklar olur. Otomatik güncellemeleri cron ile zamanlayın.
4.1 Güncelleme betiğini oluşturma
/usr/local/sbin/geoip-refresh.sh dosyasını oluşturun:
sudo nano /usr/local/sbin/geoip-refresh.sh
iptables için (xtables-addons):
#!/bin/bash set -euo pipefail cd /tmp /usr/libexec/xtables-addons/xt_geoip_dl /usr/libexec/xtables-addons/xt_geoip_build \ -D /usr/share/xt_geoip *.csv rm -f /tmp/*.csv /tmp/*.zip logger "GeoIP database updated successfully"
nftables için:
#!/bin/bash set -euo pipefail GEOIP_DIR="/etc/nftables/geoip" for CC in us de pl; do curl -sS -o "${GEOIP_DIR}/${CC}.zone" \ "https://www.ipdeny.com/ipblocks/data/aggregated/${CC}-aggregated.zone" done /etc/nftables/geoip-update.sh systemctl reload nftables logger "GeoIP nftables sets updated and reloaded"
Betiği çalıştırılabilir yapın:
sudo chmod +x /usr/local/sbin/geoip-refresh.sh
4.2 Cron ile zamanlama
Cron görevini zamanlamadan önce nftables hizmetinin etkin ve çalışır durumda olduğundan emin olun (nftables yöntemini kullanıyorsanız):
sudo systemctl enable --now nftables
Güncellemeyi haftalık çalıştırın:
sudo crontab -e
Ekleyin:
0 3 * * 0 /usr/local/sbin/geoip-refresh.sh >> /var/log/geoip-update.log 2>&1
Bu görev her Pazar günü saat 03:00'te çalışır. İlk zamanlanmış çalışmadan sonra başarılı olduğunu doğrulayın:
cat /var/log/geoip-update.log
Adım 5: Doğrulama ve test
5.1 İzin verilen bir ülkeden test etme
İzin verilen ülkelerden birindeki bir makineden SSH ile bağlanın veya bir HTTP isteği gönderin:
curl -v http://<YOUR_SERVER_IP>
Bağlantı sorunsuz şekilde kurulmalıdır.
5.2 Engellenen bir ülkeyi simüle etme
Engellenen bir ülkeye ait bilinen bir IP ile bir proxy üzerinden curl kullanın veya kendi ülkenizi geçici olarak izin listesinden çıkarıp ikinci bir terminalden bağlanmayı deneyerek yerel olarak test edin.
https://ipinfo.io gibi çevrimiçi hizmetler, belirli bir IP'nin hangi ülkede kayıtlı olduğunu doğrulamanızı sağlar. Doğrulamak için curl https://ipinfo.io/<YOUR_IP_ADDRESS> komutunu kullanın.
5.3 Güvenlik duvarı sayaçlarını kontrol etme
iptables:
sudo iptables -L INPUT -v -n
DROP kuralındaki paket sayaçlarına bakın; engellenen trafik geldikçe artıyor olmalıdırlar.
nftables:
sudo nft list chain inet filter input
5.4 Sistem günlüklerini izleme
Sistem günlüğünde düşürülen paketleri kontrol edin:
sudo journalctl -k --since "1 hour ago" | grep -i "geoip-drop"
Düşürülen paketlerle ilgili çok sayıda çekirdek günlüğü mesajı görüyorsanız ve sisteminiz yanıt vermez hâle gelirse, nedeni bir günlükleme taşkını olabilir. En kötü durumda bu, bir kernel panic'i tetikleyebilir. crashkernel parametresini ve kdump hizmetini yapılandırdıysanız, bir kernel panic /var/crash dizininde daha sonra analiz edebileceğiniz bir çökme dökümü (vmcore) üretir. kdump olmadan yalnızca bir yeniden başlatma elde edersiniz ve hiçbir tanılama verisi olmaz. Kısa bir genel bakış için aşağıdaki bölüme bakın.
Adım 6: Güvenlik duvarı değişiklikleri sırasında kernel panic'e karşı koruma
Yoğun bir üretim sunucusunda yapılan agresif güvenlik duvarı değişiklikleri – özellikle ani trafik artışlarına veya günlükleme taşkınlarına yol açanlar – nadir durumlarda kernel panic'e neden olabilir. Bu olursa ve hazırlıklı değilseniz hiçbir şey elde edemezsiniz: yalnızca bir yeniden başlatma ve neyin ters gittiğine dair hiçbir veri.
Kdump, kernel panic oluştuğunda çökme dökümünü yakalamak için kullanılan standart Linux mekanizmasıdır. Sistem yeniden başlamadan önce bellek imajını (vmcore) diske yazan ikincil bir yakalama çekirdeğini (capture kernel) başlatmak için kexec kullanır.
Tanılama verilerine sahip olduğunuzdan emin olmak için:
- kdump'ın kurulu ve etkin olduğunu doğrulayın. RHEL/AlmaLinux'ta genellikle önceden kuruludur. Debian/Ubuntu'da:
sudo apt install kdump-tools kexec-tools -y
crashkernelparametresinin önyükleyici yapılandırmanızda ayarlı olduğunu kontrol edin:cat /proc/cmdline | grep crashkernel
crashkernel=256Mgibi bir değer görmelisiniz. Eksikse GRUB'da crashkernel parametresini yapılandırmanız ve yeniden başlatmanız gerekir. Linux'ta kdump için ayrılacak belleğin tam miktarı toplam RAM'inize bağlıdır; 4 GB veya daha fazla belleğe sahip sunucular için256Mgüvenli bir varsayılandır.- kdump hizmetinin etkin olduğunu doğrulayın:
sudo systemctl status kdump
Bir kernel panic gerçekten oluşursa sistem, yakalama çekirdeğini başlatmak için kexec'i kullanır, vmcore dosyasını /var/crash dizinine yazar ve ardından normal şekilde yeniden başlar. Daha sonra kök nedeni belirlemek için crash aracıyla Linux'ta vmcore analizi yapabilirsiniz. Bu, üretim sistemlerinde Linux kernel panic sorun gidermenin standart bir parçasıdır. Linux'ta kdump'ın nasıl etkinleştirileceğine ve Linux'ta kexec kdump yapılandırmasına ilişkin eksiksiz bir kılavuz için ayrı bir kdump eğitimine bakın.
Sorun giderme
- SSH üzerinden erişimin kaybedilmesi: Bant dışı (out-of-band) konsolu / kurtarma modunu (rescue mode) kullanın.
modinfo xt_geoip: not found:linux-headers-$(uname -r)paketini kurun.iptables: command not found(Debian 13): iptables'ısudo apt install iptablesile kurun.nftables.serviceis not active:sudo systemctl enable --now nftableskomutunu çalıştırın.- AlmaLinux'ta boş
/etc/sysconfig/nftables.conf: Kuralları yapılandırmak için/etc/nftables.confyerine bu yolu kullanın.
Geri alma (Rollback)
Ülkeye dayalı engellemeyi geri almak ve açık erişimi yeniden sağlamak için:
iptables – yedekten geri yükleme:
sudo iptables-restore < /tmp/iptables-backup-*.rules
GeoIP kurallarını daha önce hiçbir güvenlik duvarı yapılandırması olmayan bir sunucuda uyguladıysanız yedek dosya boş olacaktır. Bu durumda iptables-restore yerine aşağıdaki temizleme ve politika komutlarını kullanın.
Veya tüm kuralları temizleyin:
sudo iptables -F INPUT sudo iptables -P INPUT ACCEPT
ACCEPT politikasına temizleme yapmak tüm güvenlik duvarı korumasını kaldırır. Hemen ardından standart güvenlik kural kümenizi uygulayın.
nftables – varsayılanı geri yükleme:
sudo nft flush ruleset
Ardından temel nftables yapılandırmanızı (GeoIP olmadan) geri yükleyin:
sudo nft -f /etc/nftables.conf.backup
GeoIP bileşenlerini tamamen kaldırmak için:
sudo rm -rf /etc/nftables/geoip sudo rm -f /etc/nftables/geoip-sets.nft /etc/nftables/geoip-update.sh sudo crontab -l | grep -v geoip-refresh | sudo crontab -
xtables-addons'u kaldırın (kuruluysa):
Debian/Ubuntu:
sudo apt remove xtables-addons-common -y
AlmaLinux/RHEL:
sudo dnf remove xtables-addons -y
Sonuç
Sunucunuz artık Linux'ta ülkeye göre trafiği engellemek için GeoIP güvenlik duvarı kurallarını kullanıyor; bunu ya xt_geoip ile iptables ya da CIDR tabanlı IP kümeleriyle nftables üzerinden yapıyor. Veritabanı otomatik güncelleniyor, bir geri alma planınız var ve bir kernel panic durumunda çökme dökümü yakalamak üzere yapılandırılmış kdump sayesinde üretim ortamınız hem rutin tehditlere hem de en kötü senaryolara karşı korunuyor.
Belge sürümü: 1.0
Son güncelleme: Mayıs 2026
Sahibi: Teknik Dokümantasyon Ekibi