firewalld ile Bölge Tabanlı Güvenlik Duvarı Yönetimi

Sunucularınızı yönetirken güvenlik duvarı konfigürasyonu genellikle en kritik ve aynı zamanda en çok hata yapılan adımlardan biridir. CentOS 7 ile hayatımıza giren ve Rocky Linux ile de standart haline gelen firewalld, geleneksel iptables yaklaşımından farklı olarak bölge tabanlı bir güvenlik modeli sunar. Bu model, özellikle birden fazla ağ arayüzü olan sunucularda veya farklı güven seviyelerinde trafik yönetimi gereken ortamlarda oldukça güçlü bir esneklik sağlar. Bu yazıda firewalld’ı gerçek dünya senaryolarıyla derinlemesine inceleyeceğiz.

firewalld Nedir ve Neden Farklıdır?

Klasik iptables ile çalışanlar bilir: bir kural eklemek için komut yazarsınız, sunucu yeniden başladığında kural gider. iptables-save ve iptables-restore ile bu sorunu çözersiniz ama yönetim hâlâ zahmetlidir. firewalld bu problemi temelden çözer.

firewalld’ın getirdiği temel yenilikler şunlardır:

  • Kalıcı kurallar: --permanent flag’i ile yapılan değişiklikler sistem yeniden başlasa bile korunur
  • Bölge (zone) kavramı: Her ağ arayüzü veya IP aralığı farklı güven seviyesine atanabilir
  • Dinamik yönetim: Servisi yeniden başlatmadan kural ekleyip çıkarabilirsiniz
  • D-Bus entegrasyonu: Uygulamalar güvenlik duvarını programatik olarak yönetebilir
  • Rich rules: Karmaşık kurallar için gelişmiş sözdizimi desteği

firewalld arka planda hâlâ nftables (veya eski sistemlerde iptables) kullanır. Yani aslında tanıdık bir altyapının üzerine oturmuş, daha kullanıcı dostu bir yönetim katmanıdır.

Bölge (Zone) Kavramını Anlamak

firewalld’ın kalbi bölge sistemidir. Her bölge, o bölgeye atanan ağ trafiğine ne kadar güvenildiğini tanımlar. Sisteminizde varsayılan olarak gelen bölgeler şunlardır:

  • drop: Gelen tüm paketler sessizce düşürülür, giden trafiğe izin verilir
  • block: Gelen bağlantılar reddedilir, icmp-host-prohibited mesajı döner
  • public: Güvenilmez genel ağlar için. Seçili servislere izin verilir
  • external: NAT masquerading aktif. Router senaryoları için
  • dmz: DMZ sunucuları için. Sınırlı iç ağ erişimi
  • work: İş ağı. Çoğu bilgisayara güvenilir
  • home: Ev ağı. Diğer bilgisayarlara daha çok güvenilir
  • internal: İç ağ. Neredeyse tüm trafiğe güvenilir
  • trusted: Tüm ağ bağlantıları kabul edilir

Mevcut bölgeleri ve durumlarını görmek için:

# Tüm bölgelerin kısa listesi
firewall-cmd --get-zones

# Aktif bölgeleri ve atanmış arayüzleri göster
firewall-cmd --get-active-zones

# Belirli bir bölgenin detaylı konfigürasyonunu göster
firewall-cmd --zone=public --list-all

# Tüm bölgelerin detaylı bilgisini göster
firewall-cmd --list-all-zones

Temel Kurulum ve Servis Yönetimi

Rocky Linux veya CentOS üzerinde firewalld genellikle kurulu gelir. Değilse:

# firewalld kurulumu
dnf install firewalld -y

# Servisi başlat ve sistem açılışında otomatik başlamasını sağla
systemctl enable --now firewalld

# Servis durumunu kontrol et
systemctl status firewalld

# firewalld'ın çalışıp çalışmadığını doğrula
firewall-cmd --state

Çıktı running diyorsa hazırsınız demektir.

Servis Tabanlı Kural Yönetimi

firewalld’ın en kullanışlı özelliklerinden biri önceden tanımlı servis konfigürasyonlarıdır. Port numarası ezberlemek yerine servis adıyla çalışırsınız.

# Mevcut tanımlı servisleri listele
firewall-cmd --get-services

# Public bölgesine HTTP ve HTTPS ekle (geçici - reboot'ta gider)
firewall-cmd --zone=public --add-service=http
firewall-cmd --zone=public --add-service=https

# Kalıcı olarak ekle
firewall-cmd --zone=public --add-service=http --permanent
firewall-cmd --zone=public --add-service=https --permanent

# Değişiklikleri yeniden yükle (permanent kuralları aktif hale getirir)
firewall-cmd --reload

# Servisi kaldır
firewall-cmd --zone=public --remove-service=http --permanent
firewall-cmd --reload

Önemli not: --permanent ile eklediğiniz kurallar hemen aktif olmaz, --reload yapmanız gerekir. Ya da hem geçici hem kalıcı eklemek için her iki komutu da çalıştırın.

Port Tabanlı Kural Yönetimi

Özel portlar için port numarasıyla çalışabilirsiniz:

# 8080 TCP portunu aç
firewall-cmd --zone=public --add-port=8080/tcp --permanent

# Birden fazla port aynı anda
firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd --zone=public --add-port=8443/tcp --permanent

# Port aralığı ekle (örneğin passive FTP için)
firewall-cmd --zone=public --add-port=40000-40100/tcp --permanent

# UDP port ekle (DNS için)
firewall-cmd --zone=public --add-port=53/udp --permanent

firewall-cmd --reload

# Mevcut açık portları kontrol et
firewall-cmd --zone=public --list-ports

Bölgeye Arayüz ve IP Atama

Gerçek dünyada sunucunuzun birden fazla ağ kartı olabilir. Örneğin bir web sunucusunda eth0 internet tarafına, eth1 ise iç ağa bakıyor olabilir.

# eth0 arayüzünü public bölgesine ata
firewall-cmd --zone=public --add-interface=eth0 --permanent

# eth1 arayüzünü internal bölgesine ata
firewall-cmd --zone=internal --add-interface=eth1 --permanent

# Bir arayüzün hangi bölgede olduğunu öğren
firewall-cmd --get-zone-of-interface=eth0

# Bir IP aralığını (source) belirli bir bölgeye ata
# 192.168.1.0/24 ağından gelen trafiği trusted olarak işaretle
firewall-cmd --zone=trusted --add-source=192.168.1.0/24 --permanent

# Belirli bir IP'yi block bölgesine at (yasakla)
firewall-cmd --zone=drop --add-source=203.0.113.50/32 --permanent

firewall-cmd --reload

Source tabanlı atama çok güçlüdür. Bir IP adresi hem source hem de interface kuralıyla eşleşirse, source kuralı öncelik alır.

Gerçek Dünya Senaryosu: Web Sunucusu Güvenliği

Diyelim ki bir web uygulaması sunuyorsunuz. HTTP ve HTTPS herkese açık olacak, SSH sadece belirli yönetim IP’lerinden erişilebilecek, veritabanı portu ise sadece iç ağdan erişilecek.

# Önce mevcut durumu kontrol edelim
firewall-cmd --zone=public --list-all

# HTTP ve HTTPS'i herkese aç
firewall-cmd --zone=public --add-service=http --permanent
firewall-cmd --zone=public --add-service=https --permanent

# Varsayılan SSH'ı public'ten kaldır
firewall-cmd --zone=public --remove-service=ssh --permanent

# Yönetim ağı için internal bölgesi oluştur
# 10.10.10.0/24 yönetim ağını trusted bölgesine ekle
firewall-cmd --zone=trusted --add-source=10.10.10.0/24 --permanent

# Trusted bölgesinde SSH ve veritabanı portuna izin ver
firewall-cmd --zone=trusted --add-service=ssh --permanent
firewall-cmd --zone=trusted --add-port=5432/tcp --permanent

# Değişiklikleri uygula
firewall-cmd --reload

# Sonucu doğrula
firewall-cmd --zone=public --list-all
firewall-cmd --zone=trusted --list-all

Bu konfigürasyonla artık SSH sadece 10.10.10.0/24 ağından erişilebilir. Dışarıdan SSH denemesi yapan biri public bölgesindeki kurallara takılır.

Rich Rules ile Gelişmiş Kural Yazımı

Standart servis ve port kuralları bazen yetmez. Belirli bir IP’den belirli bir porta erişimi sınırlamak veya loglama eklemek isteyebilirsiniz. Bu durumlarda rich rules devreye girer.

# Belirli bir IP'ye SSH erişimi ver
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="203.0.113.10" service name="ssh" accept' --permanent

# Belirli IP'den gelen trafiği engelle ve logla
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="198.51.100.5" drop' --permanent

# HTTP trafiğini logla (saniyede maksimum 5 log kaydı)
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" service name="http" log prefix="HTTP_ACCESS" level="info" limit value="5/m" accept' --permanent

# Belirli IP aralığından 8080 portuna erişimi reddet
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="10.0.0.0/8" port port="8080" protocol="tcp" reject' --permanent

# Mevcut rich rule'ları listele
firewall-cmd --zone=public --list-rich-rules

# Rich rule kaldır
firewall-cmd --zone=public --remove-rich-rule='rule family="ipv4" source address="198.51.100.5" drop' --permanent

firewall-cmd --reload

Rich rules sözdizimi başta karmaşık gelebilir ama mantığı oturduktan sonra çok esnek bir yapı sunar.

Özel Servis Tanımı Oluşturma

Uygulamanız standart dışı bir port kullanıyorsa kendi servis tanımınızı oluşturabilirsiniz. Bu, kural yönetimini çok daha okunabilir hale getirir.

# Yeni servis XML dosyası oluştur
# /etc/firewalld/services/ dizinine kopyalanır
firewall-cmd --new-service=myapp --permanent

# Servise açıklama ekle
firewall-cmd --service=myapp --set-description="My Custom Application" --permanent

# Servise port ekle
firewall-cmd --service=myapp --add-port=9090/tcp --permanent
firewall-cmd --service=myapp --add-port=9091/tcp --permanent

# Ya da doğrudan XML dosyası oluşturun
cat > /etc/firewalld/services/myapp.xml << 'EOF'
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>MyApp</short>
  <description>My Custom Application running on port 9090</description>
  <port protocol="tcp" port="9090"/>
  <port protocol="tcp" port="9091"/>
</service>
EOF

# firewalld'ı yeniden yükle
firewall-cmd --reload

# Yeni servisi bölgeye ekle
firewall-cmd --zone=public --add-service=myapp --permanent
firewall-cmd --reload

Masquerading ve Port Forwarding

Router veya NAT senaryolarında masquerading ve port forwarding ihtiyacı doğar. Örneğin sunucunuzun dışarıdan gelen 80 portunu iç ağdaki bir sunucuya yönlendirmek istiyorsunuz.

# external bölgesinde masquerading'i aktif et
firewall-cmd --zone=external --add-masquerade --permanent

# Masquerading durumunu kontrol et
firewall-cmd --zone=external --query-masquerade

# Port forwarding: Dışarıdan gelen 80 portunu 192.168.1.100:80'e yönlendir
firewall-cmd --zone=external --add-forward-port=port=80:proto=tcp:toaddr=192.168.1.100 --permanent

# Farklı porta yönlendirme: 8080 geleni iç sunucunun 80'ine at
firewall-cmd --zone=external --add-forward-port=port=8080:proto=tcp:toport=80:toaddr=192.168.1.100 --permanent

firewall-cmd --reload

# Ayarları doğrula
firewall-cmd --zone=external --list-all

Panic Mode ve Acil Durumlar

Sunucunuza saldırı geldiğinde veya test sırasında tüm trafiği anında kesmek istediğinizde panic mode kullanabilirsiniz.

# Panic mode'u aktif et (TÜM ağ trafiği kesilir, mevcut bağlantılar dahil!)
# DİKKAT: Bunu remote sunucuda çalıştırırsanız bağlantınız kesilir
firewall-cmd --panic-on

# Panic mode durumunu kontrol et
firewall-cmd --query-panic

# Panic mode'u kapat
firewall-cmd --panic-off

Uyarı: Panic mode’u uzak sunucuda etkinleştirirseniz SSH bağlantınız kesilir ve fiziksel erişim olmadan geri alamazsınız. Test ortamlarında veya konsol erişiminiz varken kullanın.

Konfigürasyonu Yedekleme ve Geri Yükleme

Önemli bir değişiklik yapmadan önce mevcut konfigürasyonu yedeklemek iyi bir alışkanlıktır.

# firewalld konfigürasyonunu yedekle
tar -czvf firewalld-backup-$(date +%Y%m%d).tar.gz /etc/firewalld/

# Yedekten geri yükle
tar -xzvf firewalld-backup-20240115.tar.gz -C /

# Geri yüklemeden sonra servisi yeniden başlat
systemctl restart firewalld

# Konfigürasyonu sıfırla (fabrika ayarlarına dön)
firewall-cmd --complete-reload

# Kalıcı konfigürasyonu çalışan konfigürasyona yükle
firewall-cmd --reload

# Çalışan konfigürasyonu kalıcı hale getir (runtime'dan permanent'a)
firewall-cmd --runtime-to-permanent

firewall-cmd ile Toplu Konfigürasyon Scripti

Gerçek ortamlarda sunucu konfigürasyonunu script haline getirmek en iyi pratiktir. İşte bir web sunucusu için örnek bir konfigürasyon scripti:

#!/bin/bash
# web-server-firewall.sh
# Rocky Linux web sunucusu için firewall konfigürasyonu

set -e

echo "=== Firewall konfigürasyonu basliyor ==="

# Mevcut tüm kalıcı kuralları temizle (dikkatli kullanın)
# firewall-cmd --complete-reload

# Public bölgesini yapılandır
echo "[+] Public bolge yapılandırılıyor..."
firewall-cmd --zone=public --add-service=http --permanent
firewall-cmd --zone=public --add-service=https --permanent

# SSH'ı public'ten kaldır (sadece yönetim ağından erişilecek)
firewall-cmd --zone=public --remove-service=ssh --permanent

# Yönetim ağını trusted bölgesine ekle
echo "[+] Yönetim ağı yapılandırılıyor..."
MGMT_NETWORK="10.10.10.0/24"
firewall-cmd --zone=trusted --add-source=${MGMT_NETWORK} --permanent
firewall-cmd --zone=trusted --add-service=ssh --permanent
firewall-cmd --zone=trusted --add-service=http --permanent
firewall-cmd --zone=trusted --add-service=https --permanent

# Monitoring için ICMP'ye izin ver
firewall-cmd --zone=public --add-icmp-block-inversion --permanent
firewall-cmd --zone=public --add-icmp-block=echo-request --permanent

# Kötü niyetli IP'leri drop bölgesine at (örnek)
# firewall-cmd --zone=drop --add-source=198.51.100.0/24 --permanent

# Değişiklikleri uygula
echo "[+] Degisiklikler uygulanıyor..."
firewall-cmd --reload

echo "=== Konfigürasyon tamamlandi ==="
echo ""
echo "=== Mevcut Public Bolge Durumu ==="
firewall-cmd --zone=public --list-all

echo ""
echo "=== Mevcut Trusted Bolge Durumu ==="
firewall-cmd --zone=trusted --list-all

Hata Ayıklama ve İzleme

Firewall kurallarınızın beklediğiniz gibi çalışıp çalışmadığını doğrulamak için birkaç yöntem vardır:

# Firewalld loglarını izle
journalctl -u firewalld -f

# Kural eşleşmelerini görmek için loglama ekle
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" service name="ssh" log prefix="SSH_ATTEMPT" level="warning" limit value="3/m" accept' --permanent
firewall-cmd --reload

# Kernel mesajlarında firewall loglarını izle
journalctl -k | grep -i "SSH_ATTEMPT"

# nftables kurallarını doğrudan göster (arka plandaki gerçek kurallar)
nft list ruleset

# Bağlantı testleri için nc kullanımı
nc -zv 192.168.1.100 80
nc -zv 192.168.1.100 443

# firewall-cmd ile kural sorgulama
firewall-cmd --zone=public --query-service=ssh
firewall-cmd --zone=public --query-port=8080/tcp

Yaygın Hatalar ve Çözümleri

Sistem yöneticilerinin sık yaptığı hatalar ve çözümleri:

–permanent unutmak: Kural eklediğinizde --permanent kullanmazsanız sistem yeniden başladığında kural gider. Her zaman hem geçici hem kalıcı eklemeyi düşünün.

–reload yapmamak: --permanent ile eklediğiniz kurallar --reload yapmadan aktif olmaz. Scriptin sonuna mutlaka firewall-cmd --reload ekleyin.

Zone önceliğini anlamamak: Source tabanlı kurallar interface tabanlı kurallardan önce işlenir. Bir IP hem trusted source hem de public interface üzerinden geliyorsa trusted bölgesi uygulanır.

SSH’ı kilitlemek: --remove-service=ssh komutunu çalıştırmadan önce erişiminizi garanti altına alın. Her zaman alternatif bir erişim yolu (konsol, IPMI) hazır olsun.

firewalld ve iptables çakışması: İkisini aynı anda kullanmayın. Sisteminizde iptables servisi varsa devre dışı bırakın: systemctl disable --now iptables.

Sonuç

firewalld’ın bölge tabanlı yaklaşımı ilk başta karmaşık görünse de bir kez oturduktan sonra güvenlik duvarı yönetimini ciddi ölçüde kolaylaştırır. Geleneksel iptables’ın satır satır kural yazma zahmetinden kurtulup, mantıksal bölgeler üzerinden çalışmak hem okunabilirliği artırır hem de hata yapma olasılığını azaltır.

Özellikle şu noktaları aklınızda tutun: Kalıcı kurallar için her zaman --permanent kullanın ve ardından --reload yapın. Source tabanlı zone ataması, belirli IP veya ağlara özel politika uygulamanın en temiz yoludur. Önemli değişiklikler öncesi mutlaka /etc/firewalld/ dizinini yedekleyin. Rich rules, standart kuralların yetersiz kaldığı durumlarda güçlü bir araçtır ama sözdizimini test ortamında önce deneyin.

firewalld, Rocky Linux ve CentOS ekosisteminin ayrılmaz bir parçası haline gelmiştir. Bu aracı iyi öğrenmek, hem günlük operasyonlarınızı hızlandıracak hem de sunucularınızın güvenlik duruşunu önemli ölçüde güçlendirecektir. Bir sonraki yazıda firewalld’ı Ansible ile otomatize etmeyi ele alacağız.

Yorum yapın