Tag: sistem

  • firewall-cmd ve Firewalld Mimarisi

    firewall-cmd ve Firewalld Mimarisi

    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: docker0

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

    1. Runtime (Geçici) Yapılandırma: Komutu yazdığınız an etkindir ancak sunucu yeniden başlatıldığında veya firewalld servisi reload edildiğinde silinir. Test amaçlı kullanılır.
    2. Permanent (Kalıcı) Yapılandırma: --permanent parametresi ile yapılır. Ayarlar /etc/firewalld/zones/ altındaki XML dosyalarına yazılır. Ancak komutu yazdığınız an devreye girmez; reload gerektirir.

    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-services

    HTTP ve HTTPS servisine izin verme (Kalıcı):

    sudo firewall-cmd --permanent --add-service=http
    sudo firewall-cmd --permanent --add-service=https
    sudo firewall-cmd --reload

    Bir servisi kaldırma:

    sudo firewall-cmd --permanent --remove-service=http
    sudo firewall-cmd --reload

    2. 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 --reload

    Bir port aralığını açma (Örn: 5000-5100 arası):

    sudo firewall-cmd --permanent --add-port=5000-5100/tcp
    sudo firewall-cmd --reload

    3. 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=ssh

    Ardı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 --reload

    Loglama 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-masquerade

    Ardından yönlendirme kuralı:

    sudo firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toport=8080
    sudo firewall-cmd --reload

    Panic 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-on

    Not: 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

    1. Conf Dosyaları: Tüm kalıcı ayarlar /etc/firewalld/zones/ altında .xml dosyaları olarak saklanır. Bu dosyaları yedeklemek, firewall kurallarınızı yedeklemek anlamına gelir.
    2. Runtime to Permanent: Eğer test ederken (runtime) birçok kural eklediniz ve bunların hepsini beğendiyseniz, tek tek --permanent ile yazmak yerine şu komutu kullanabilirsiniz:
      sudo firewall-cmd –runtime-to-permanent
    3. Ö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.