firewalld Rich Rule nedir?
Rich Rule, firewalld içinde kaynak/hedef adresi, servis veya port, protokol, log/limit
ve accept, reject ya da drop eylemini tek bir okunabilir kuralda birleştiren
rich-language sözdizimidir. Basit --add-service veya --add-port işleminin ifade
edemediği “yalnız bu IP bu porta erişsin ve reddedilenleri sınırlı logla” gibi kurallar
için kullanılır.
Rich Rule bir zone veya policy parçasıdır. Bu nedenle komutta --zone değerini açıkça
belirtmek, aktif zone'u tahmin etmekten daha güvenlidir.
Değişiklikten önce mevcut durumu oku
sudo firewall-cmd --state
sudo firewall-cmd --get-active-zones
sudo firewall-cmd --zone=public --list-all
sudo firewall-cmd --zone=public --list-rich-rules
sudo firewall-cmd --permanent --zone=public --list-rich-rules
İlk liste runtime, --permanent kullanılan liste kalıcı yapılandırmadır. İkisi farklıysa
reload sonrası runtime-only değişiklik kaybolabilir.
Rich Rule sözdizimi
Temel yapı şöyledir:
rule [family] [priority]
[source]
[destination]
service|port|protocol|...
[log|nflog|audit]
[accept|reject|drop|mark]
Örnek:
rule family="ipv4"
source address="203.0.113.10"
port port="443" protocol="tcp"
log prefix="HTTPS_ALLOW " limit value="5/m"
accept
Adresler örnektir. Production komutuna kendi yönetim IP'nizi yazmadan önce mevcut SSH oturumunu ve ikinci erişim kanalını koruyun.
Rich Rule nasıl eklenir?
Önce runtime kuralıyla davranışı test et:
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="203.0.113.10" port port="443" protocol="tcp" accept'
Doğrulama başarılıysa aynı kuralı permanent yapılandırmaya ekle:
sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="203.0.113.10" port port="443" protocol="tcp" accept'
Son olarak yapılandırmayı kontrol edip reload et:
sudo firewall-cmd --check-config
sudo firewall-cmd --reload
sudo firewall-cmd --zone=public --list-rich-rules
--permanent değişikliği tek başına runtime'a uygulanmaz. Resmî firewall-cmd
dokümantasyonuna göre permanent yapılandırma reload veya servis yeniden başlatma sonrası
runtime olur.
Rich Rule nasıl sorgulanır?
RULE='rule family="ipv4" source address="203.0.113.10" port port="443" protocol="tcp" accept'
sudo firewall-cmd --zone=public --query-rich-rule="$RULE"
echo $?
Çıkış kodu 0 kuralın bulunduğunu, 1 bulunmadığını belirtir. Otomasyon scriptinde
yalnız ekrana yazılan yes/no metnine değil çıkış koduna göre karar verilebilir.
Rich Rule nasıl silinir?
Silme komutundaki kural, eklenen sözdizimiyle eşleşmelidir:
RULE='rule family="ipv4" source address="203.0.113.10" port port="443" protocol="tcp" accept'
sudo firewall-cmd --zone=public --remove-rich-rule="$RULE"
sudo firewall-cmd --permanent --zone=public --remove-rich-rule="$RULE"
sudo firewall-cmd --reload
Silmeden önce hem runtime hem permanent listede kuralı doğrulayın.
IP adresine izin verme
Belirli bir IPv4 adresinden tüm bağlantılara izin vermek:
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="203.0.113.10" accept'
Bu kural geniş yetki verir. Çoğu durumda servis veya port ile daraltmak daha doğrudur:
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="203.0.113.10" service name="ssh" accept'
IP adresini engelleme: reject ve drop
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="198.51.100.25" reject'
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="198.51.100.26" drop'
reject paketi reddeder ve karşı tarafa hata cevabı üretebilir. drop paketi sessizce
atar. Hangisinin kullanılacağı tehdit modeli ve teşhis ihtiyacına göre seçilir.
IP + port kısıtlama
Yalnız belirli ağdan TCP 5432 erişimi:
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="10.20.0.0/16" port port="5432" protocol="tcp" accept'
Bu kuralın anlamlı olması için aynı porta daha geniş izin veren başka zone/port/rule
olmadığını --list-all ve --list-rich-rules ile kontrol edin.
TCP ve UDP
DNS gibi TCP ve UDP gerektiren serviste iki port kuralı gerekir:
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="10.20.0.0/16" port port="53" protocol="udp" accept'
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="10.20.0.0/16" port port="53" protocol="tcp" accept'
Servis tanımı ihtiyacı doğru karşılıyorsa service name="dns" daha anlaşılır olabilir.
IPv6 kuralı
IPv4 kuralı IPv6 trafiğini kapsamaz:
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv6" source address="2001:db8:100::/64" service name="ssh" accept'
IPv6 etkin bir sunucuda yalnız IPv4 filtreleyip sistemi güvenli varsaymayın.
Logging ve rate limit
Sınırsız paket loglamak disk ve log pipeline'ını doldurabilir. Prefix ve limit ekleyin:
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="198.51.100.0/24" port port="22" protocol="tcp" log prefix="SSH_REJECT " level="warning" limit value="5/m" reject'
Logun hangi journal/syslog hedefinde göründüğü dağıtımın log yapılandırmasına bağlıdır:
sudo journalctl -u firewalld --since "10 minutes ago"
Paket seviyesindeki kayıtlar kernel/journal tarafında farklı facility altında görülebilir; test paketini üretip gerçek log hedefini doğrulayın.
Runtime, permanent ve timeout
Geçici teşhis kuralı için timeout kullanılabilir:
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="203.0.113.10" service name="ssh" accept' --timeout=20m
Resmî dokümana göre --timeout, --permanent ile birlikte kullanılamaz. Süre dolunca
runtime kural otomatik kaldırılır.
Rule priority
Birden fazla kural çakışıyorsa değerlendirme sırası önemlidir. Rich Rule priority
değeri -32768 ile 32767 aralığındadır; düşük değer daha önce değerlendirilir.
sudo firewall-cmd --zone=public --add-rich-rule='rule priority=-100 family="ipv4" source address="203.0.113.10" service name="ssh" accept'
Priority kullanmak yerine önce zone tasarımını sadeleştirmek tercih edilir. Priority verildiğinde kural envanterinde gerekçesi belgelenmelidir.
Güvenli uygulama sırası
- Aktif interface ve zone eşleşmesini oku.
- Mevcut runtime/permanent kural listesini kaydet.
- Yönetim erişimini kesmeyecek dar runtime kuralı ekle.
- Ayrı istemciden gerçek bağlantıyı test et.
--query-rich-ruleve port/servis testiyle sonucu doğrula.- Aynı kuralı permanent ekle.
--check-config, reload ve tekrar bağlantı testi çalıştır.
Sık hatalar
| Belirti | Olası neden | Doğrulama |
|---|---|---|
| Kural eklendi ama trafik değişmedi | Yanlış zone/interface | --get-active-zones, --get-zone-of-interface |
| Reload sonrası kural kayboldu | Yalnız runtime eklendi | Permanent listeyi kontrol et |
| Permanent kural hemen çalışmadı | Reload yapılmadı | Runtime ve permanent listeleri karşılaştır |
| Silme komutu kuralı bulamadı | Sözdizimi/zone farklı | --list-rich-rules çıktısını aynen kullan |
| IPv6 erişimi açık kaldı | Yalnız IPv4 kuralı var | IPv6 listener ve rule family kontrolü |
| SSH bağlantısı kesildi | Allow kuralından önce geniş deny | Konsol erişimi ve priority/zone incelemesi |
İlgili rehberler
- Sunucu Güvenliği, Ağ ve Erişim Kontrolü
- firewalld Zone, Service ve Kalıcı Kural Tasarımı
- nftables ile Stateful Linux Firewall Tasarımı