Linux'ta Ülkeye Göre Trafik Engelleme: GeoIP, nftables | INTROSERV
EUR
european

EUR

usa

USD

Turkish Tr
Ex. VAT Ex. VAT 0%

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)

Info

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)

Warning

Ü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.

Info

Ü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

Warning

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

Warning

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

Tip

Ç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.

Info

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"

Warning

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:

  1. 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

  2. crashkernel parametresinin önyükleyici yapılandırmanızda ayarlı olduğunu kontrol edin:

    cat /proc/cmdline | grep crashkernel

    crashkernel=256M gibi 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çin 256M güvenli bir varsayılandır.

  3. kdump hizmetinin etkin olduğunu doğrulayın:

    sudo systemctl status kdump

Info

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 iptables ile kurun.
  • nftables.service is not active: sudo systemctl enable --now nftables komutunu çalıştırın.
  • AlmaLinux'ta boş /etc/sysconfig/nftables.conf: Kuralları yapılandırmak için /etc/nftables.conf yerine 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

Info

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

Warning

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

VAT

  • Other

    Ex. VAT

    0%
  • austria

    Austria

    20%
  • Belgium

    Belgium

    21%
  • Bulgaria

    Bulgaria

    20%
  • Croatia

    Croatia

    25%
  • Cyprus

    Cyprus

    19%
  • Czech Republic

    Czech Republic

    21%
  • Denmark

    Denmark

    25%
  • Estonia

    Estonia

    22%
  • France

    France

    20%
  • Finland

    Finland

    24%
  • Germany

    Germany

    19%
  • Greece

    Greece

    24%
  • Hungary

    Hungary

    27%
  • Ireland

    Ireland

    23%
  • Italy

    Italy

    22%
  • Latvia

    Latvia

    21%
  • Lithuania

    Lithuania

    21%
  • Luxembourg

    Luxembourg

    17%
  • Malta

    Malta

    18%
  • Netherlands

    Netherlands

    21%
  • Poland

    Poland

    23%
  • Portugal

    Portugal

    23%
  • Romania

    Romania

    19%
  • Slovakia

    Slovakia

    20%
  • Slovenia

    Slovenia

    22%
  • Spain

    Spain

    21%
  • Sweden

    Sweden

    25%
  • USA

    USA

    0%
european
states
  • germany
  • Español
  • Italiano
  • Poland
  • Русский
  • Slovenski
  • Türkçe
  • ukraine
  • kingdom
  • French
  • Hrvatska
  • Other
  • Austria
  • Belgium
  • Bulgaria
  • Croatia
  • Cyprus
  • Czech Republic
  • Denmark
  • Estonia
  • Finland
  • France
  • Germany
  • Greece
  • Hungary
  • Ireland
  • Italy
  • Latvia
  • Lithuania
  • Luxembourg
  • Malta
  • Netherlands
  • Poland
  • Portugal
  • Romania
  • Slovakia
  • Slovenia
  • Spain
  • Sweden
  • USA