Linux sunucu yönetiminde güvenlik, opsiyonel bir özellik değil, bir zorunluluktur. Yıllarca iptables komut zincirleri ile boğuştuktan sonra, modern Linux dağıtımları (RHEL 7+, CentOS 7+, Fedora, Suse vb.) daha dinamik ve yönetilebilir bir çözüm olan Firewalld servisine geçiş yaptı.
Bu makalede, Firewalld servisinin yönetim aracı olan firewall-cmd komutunu, mimarisini, “Zone” kavramını ve gerçek hayat senaryolarında nasıl kullanılacağını en ince detayına kadar inceleyeceğiz.
Firewalld Nedir ve Neden İhtiyacımız Var?
Geleneksel iptables veya onun modern hali nftables, paket filtreleme işlemini çekirdek seviyesinde (kernel space) yapar. Ancak bu araçların kurallarını yönetmek statiktir. Yani bir kural setini değiştirmek için genellikle güvenlik duvarını “flush” (tüm kuralları silip yeniden yükleme) yapmak gerekir. Bu işlem sırasında saniyelik de olsa bağlantı kayıpları yaşanabilir.
Firewalld ise, çekirdek paket filtreleme mekanizmalarının (netfilter/nftables) üzerinde çalışan dinamik bir yönetim katmanıdır. En büyük avantajı, D-Bus arayüzü sayesinde kuralları dinamik olarak yönetebilmesidir. Yani çalışan sisteme, mevcut bağlantıları koparmadan yeni bir kural ekleyebilir veya çıkarabilirsiniz.
firewall-cmd ise bu servisi terminal üzerinden yönetmemizi sağlayan istemci (client) aracıdır.
Temel Kavram: Zones (Bölgeler)
Firewalld mantığını anlamak için “Zone” kavramını içselleştirmek gerekir. Firewalld, ağ arayüzlerinizi (network interfaces) ve kaynaklarınızı farklı güvenlik seviyelerine ayırır. Bir sunucunun dış dünyaya bakan bacağı (eth0) ile yerel ağa bakan bacağı (eth1) aynı güvenlik kurallarına tabi olmamalıdır.
İşte en sık kullanılan bölgeler ve anlamları:
- drop: En paranoyak seviyedir. Gelen tüm paketleri reddeder ve karşı tarafa hiçbir cevap (ICMP hatası dahil) dönmez. Sadece dışarı giden (outgoing) bağlantılara izin verilir.
- block: Gelen bağlantıları reddeder ancak karşı tarafa “IPv4 için icmp-host-prohibited” hatası döner. Karşı taraf, portun kapalı olduğunu anlar ama zaman aşımına uğramaz.
- public: (Varsayılan) Halka açık alanlarda kullanım içindir. Bilgisayarınıza gelen bağlantılara güvenmezsiniz. Sadece seçtiğiniz portlar açıktır.
- internal: İç ağlar içindir. Ağdaki diğer bilgisayarlara çoğunlukla güvenirsiniz.
- trusted: Tüm ağ bağlantılarına izin verilir. (Dikkatli kullanılmalıdır).
Kurulum ve Servis Kontrolü
Çoğu modern dağıtımda yüklü gelir, ancak emin olmak ve başlatmak için aşağıdaki adımları izleyin.
Durum Kontrolü:
sudo systemctl status firewalld
sudo firewall-cmd --state
Varsayılan Bölgeyi Öğrenme: Sistemin, yeni bir ağ arayüzü eklendiğinde onu hangi bölgeye atayacağını gösterir.
sudo firewall-cmd --get-default-zone
# Çıktı genellikle: public
Aktif Bölgeleri Listeleme: Hangi ağ kartının hangi bölgeye bağlı olduğunu görmek için kritiktir.
sudo firewall-cmd --get-active-zones
Örnek Çıktı:
public
interfaces: eth0 wlan0
docker
interfaces: docker0Kural Yönetimi: Runtime vs. Permanent
Firewalld kullanırken yapılan en büyük hata, kuralların kalıcılığını karıştırmaktır.
- Runtime (Geçici) Yapılandırma: Komutu yazdığınız an etkindir ancak sunucu yeniden başlatıldığında veya firewalld servisi
reloadedildiğinde silinir. Test amaçlı kullanılır. - Permanent (Kalıcı) Yapılandırma:
--permanentparametresi ile yapılır. Ayarlar/etc/firewalld/zones/altındaki XML dosyalarına yazılır. Ancak komutu yazdığınız an devreye girmez;reloadgerektirir.
Altın Kural: Bir ayarı kalıcı yapmak istiyorsanız --permanent kullanın ve ardından --reload yapın.
Uygulamalı Kural Yönetimi
1. Servis Bazlı İzinler (Önerilen Yöntem)
Port numaralarını (örn. 80, 443, 22) ezberlemek yerine servis isimlerini kullanmak daha yönetilebilirdir. Firewalld, /usr/lib/firewalld/services/ altında yüzlerce servisi tanımlı tutar.
Mevcut servisleri listeleme:
sudo firewall-cmd --get-servicesHTTP ve HTTPS servisine izin verme (Kalıcı):
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reloadBir servisi kaldırma:
sudo firewall-cmd --permanent --remove-service=http
sudo firewall-cmd --reload2. Port Bazlı İzinler
Tanımlı olmayan özel bir uygulamanız varsa (örneğin 8080 portunda çalışan bir Node.js uygulaması), doğrudan port açabilirsiniz.
TCP 8080 portunu açma:
sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --reloadBir port aralığını açma (Örn: 5000-5100 arası):
sudo firewall-cmd --permanent --add-port=5000-5100/tcp
sudo firewall-cmd --reload3. Yapılandırmayı Kontrol Etme
sudo firewall-cmd --list-allÖrnek Çıktı:
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: cockpit dhcpv6-client http ssh
ports: 8080/tcp
protocols:
masquerade: noİleri Seviye Özellikler
Sıradan port açıp kapatmanın ötesine geçmek isteyenler için Firewalld güçlü araçlar sunar.
Rich Rules (Zengin Kurallar)
Standart kurallar “herkese açık” veya “herkese kapalı” mantığındadır. Ancak “Sadece X IP adresi SSH yapabilsin, diğerleri yapamasın” demek istiyorsanız Rich Rules kullanmalısınız.
Senaryo: Sadece 192.168.1.50 IP adresinden gelen SSH bağlantılarına izin ver, diğerlerini reddet.
Önce varsayılan SSH servisini kaldıralım (dikkat, bağlantınız kopabilir, bunu konsoldan veya dikkatli yapın):
sudo firewall-cmd --permanent --remove-service=sshArdından özel kuralı ekleyelim:
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.50" service name="ssh" accept'
sudo firewall-cmd --reloadLoglama ile Reddetme: Belirli bir alt ağdan gelen trafiği reddetmek ve bunu loglara kaydetmek istiyorsanız:
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.0/24" service name="http" log prefix="HTTP_BLOCK: " level="info" reject'Port Yönlendirme (Port Forwarding)
Sunucunuza gelen trafiği farklı bir porta veya tamamen farklı bir sunucuya yönlendirebilirsiniz (NAT).
Örnek: Dışarıdan 80. porta gelen isteği, içeride 8080. portta çalışan uygulamaya yönlendirme.
Önce “masquerade” özelliğini açmalıyız:
sudo firewall-cmd --permanent --add-masqueradeArdından yönlendirme kuralı:
sudo firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toport=8080
sudo firewall-cmd --reloadPanic Mode (Panik Modu)
Sisteminiz saldırı altındaysa veya ağ trafiğinde şüpheli bir durum fark ettiyseniz, kabloyu çekmek yerine yazılımsal olarak tüm trafiği kesebilirsiniz.
Aktif etme:
sudo firewall-cmd --panic-onNot: Bu komut SSH bağlantınızı da koparır! Sadece fiziksel erişiminiz varsa veya konsol bağlantınız varsa kullanın.
Kapatma:
sudo firewall-cmd --panic-offİpuçları ve Sorun Giderme
- Conf Dosyaları: Tüm kalıcı ayarlar
/etc/firewalld/zones/altında.xmldosyaları olarak saklanır. Bu dosyaları yedeklemek, firewall kurallarınızı yedeklemek anlamına gelir. - Runtime to Permanent: Eğer test ederken (runtime) birçok kural eklediniz ve bunların hepsini beğendiyseniz, tek tek
--permanentile yazmak yerine şu komutu kullanabilirsiniz:
sudo firewall-cmd –runtime-to-permanent - Öncelik: Rich Rules, standart kurallardan önce işlenir. Sıralama önemlidir.
Firewalld ve firewall-cmd, modern Linux sistem yöneticisinin çantasındaki en değerli araçlardan biridir. Esnek yapısı, XML tabanlı yönetimi ve D-Bus entegrasyonu ile sunucu güvenliğinizi sağlam temellere oturtmanızı sağlar.
