UFW Kural Sırasını Düzenleme ve Öncelik Ayarı

Firewall yönetiminde en çok gözden kaçan konulardan biri kural sırasıdır. UFW kullanıyorsanız ve kurallarınız beklediğiniz gibi çalışmıyorsa, büyük ihtimalle sorun kural önceliklerinde yatıyor. “Neden bu IP’yi engelledim ama hâlâ bağlanabiliyor?” ya da “Neden şu porta izin verdim ama bağlantı reddediliyor?” diye kafa yorduysanız, bu yazı tam size göre.

UFW’de Kural Sırası Neden Bu Kadar Önemli?

UFW (Uncomplicated Firewall), arka planda iptables veya nftables kullanır. Her iki altyapıda da kurallar sırayla işlenir ve bir paket ilk eşleşen kurala göre değerlendirilir. Yani bir paketle eşleşen ilk kural ne diyorsa, o kural uygulanır ve diğer kurallar artık o paket için incelenmez.

Bunu somutlaştıralım: Diyelim ki önce allow 80/tcp kuralı var, ardından deny from 192.168.1.100 to any port 80 kuralı. Kötü niyetli bir kullanıcı olan 192.168.1.100 IP’si 80. porta istek attığında, sistem önce “allow 80/tcp” kuralını görür, eşleşme bulur ve bağlantıya izin verir. Engelleme kuralınız hiç çalışmaz.

Bu nedenle özel ve kısıtlayıcı kuralları genel ve izin verici kurallardan önce yerleştirmeniz gerekir.

Mevcut Kuralları Numaralarıyla Görüntüleme

UFW’de kural sırasını yönetmenin ilk adımı, mevcut kuralları numaralarıyla birlikte görmektir.

sudo ufw status numbered

Bu komutun çıktısı şöyle görünür:

Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22/tcp                     ALLOW IN    Anywhere
[ 2] 80/tcp                     ALLOW IN    Anywhere
[ 3] 443/tcp                    ALLOW IN    Anywhere
[ 4] 80/tcp                     DENY IN     192.168.1.100
[ 5] 22/tcp                     ALLOW IN    Anywhere (v6)
[ 6] 80/tcp                     ALLOW IN    Anywhere (v6)
[ 7] 443/tcp                    ALLOW IN    Anywhere (v6)

Yukarıdaki listeye bakarsanız 4. kuraldaki engelleme hiçbir zaman çalışmaz. Çünkü 192.168.1.100’den gelen 80/tcp paketi daha önce 2. kuralla eşleşir ve izin verilir.

Belirli Bir Pozisyona Kural Ekleme

UFW, kural eklerken insert komutuyla belirli bir pozisyona kural yerleştirmenize imkân tanır. Bu sayede yeni kuralı listenin istediğiniz yerine oturtabilirsiniz.

sudo ufw insert 1 deny from 192.168.1.100 to any port 80

Bu komut, 192.168.1.100’den 80. porta gelen bağlantıları engelleyen kuralı 1. sıraya yerleştirir. Mevcut tüm kurallar bir aşağı kayar.

Sonucu kontrol edelim:

sudo ufw status numbered

Artık çıktı şöyle görünmeli:

Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 80/tcp                     DENY IN     192.168.1.100
[ 2] 22/tcp                     ALLOW IN    Anywhere
[ 3] 80/tcp                     ALLOW IN    Anywhere
[ 4] 443/tcp                    ALLOW IN    Anywhere
...

Artık 192.168.1.100’den gelen 80/tcp isteği ilk kuralda engellenir. Diğer tüm kullanıcılar 3. kuralla 80. porta erişebilir.

Gerçek Dünya Senaryosu 1: Belirli Bir IP’yi Engelleme

Diyelim ki bir sunucunuz var ve loglarınızda 203.0.113.45 IP adresinden sürekli brute-force saldırısı geldiğini fark ettiniz. Hızlıca bu IP’yi tamamen engellemeniz gerekiyor.

# Önce mevcut kuralları kontrol et
sudo ufw status numbered

# IP'yi tüm bağlantılar için engelle ve listeye birinci sıraya ekle
sudo ufw insert 1 deny from 203.0.113.45

# Durumu doğrula
sudo ufw status numbered

Burada dikkat edilmesi gereken nokta: Eğer sadece ufw deny from 203.0.113.45 yazsaydınız, bu kural listenin en sonuna eklenirdi. Eğer daha önce allow kuralları varsa, bu engelleme kuralı asla tetiklenmezdi. insert 1 ile kuralı en başa koyarak bu sorunu çözdük.

Gerçek Dünya Senaryosu 2: Yönetim Paneline Sadece Ofis IP’sinden Erişim

Bir web uygulamanızın yönetim paneli 8443 portunda çalışıyor. Bu porta yalnızca ofis IP adresinizden (örneğin 10.0.0.50) erişime izin vermek, diğer her yerden engellemek istiyorsunuz.

# Önce ofis IP'sine izin ver
sudo ufw insert 1 allow from 10.0.0.50 to any port 8443

# Ardından herkesi engelle
sudo ufw insert 2 deny to any port 8443

# Sonucu kontrol et
sudo ufw status numbered

Bu yapıda sıra çok kritik. 10.0.0.50’den gelen istek önce 1. kuralla eşleşir ve izin verilir. Başka herhangi bir IP’den gelen istek ise 1. kuralla eşleşmez, 2. kuralla eşleşir ve engellenir. Sırayı tersine çevirirseniz, ofis bilgisayarınız da dahil hiç kimse 8443’e ulaşamaz.

Var Olan Bir Kuralı Silme

Kural sırasını yeniden düzenlerken bazen mevcut bir kuralı silip farklı bir pozisyona yeniden eklemeniz gerekir. Silme işlemi de numara üzerinden yapılır.

# Önce numaraları gör
sudo ufw status numbered

# 4 numaralı kuralı sil
sudo ufw delete 4

Silme işlemi onay ister:

Deleting:
 deny from 192.168.1.100
Proceed with operation (y|n)?

y diyerek onaylarsanız kural silinir. Geri kalan kurallar otomatik olarak yeniden numaralandırılır.

Dikkat: Bir kural sildiğinizde numaralar değişir. Eğer birden fazla kural silecekseniz, arkadan başlayarak silin. Yani önce büyük numaralı kuralı silin, sonra küçük numaralıyı. Aksi hâlde yanlış kuralı silebilirsiniz.

# Yanlış yaklaşım (2'yi silince 3 olan kural 2'ye dönüşür, kafanız karışır)
# sudo ufw delete 2
# sudo ufw delete 3  <-- artık bu eski 4. kural!

# Doğru yaklaşım: arkadan başla
sudo ufw delete 4
sudo ufw delete 3
sudo ufw delete 2

Kural Öncelik Mantığını Anlamak: Allow vs Deny Çakışmaları

UFW’de bir paket için hem allow hem deny kuralı varsa, ilk eşleşen kazanır. Bu basit ama güçlü bir mantık. Bunu iyi anlarsanız karmaşık güvenlik politikalarını bile kolayca uygulayabilirsiniz.

Şu senaryoyu düşünün: Bir e-ticaret sunucusunuz var. 80 ve 443 portlarına herkesten erişim istiyorsunuz. Ama bilinen bazı kötü niyetli IP aralıklarını engellemek istiyorsunuz.

# Kötü niyetli IP bloğunu en başa engelle
sudo ufw insert 1 deny from 198.51.100.0/24

# Normal izinleri bunların arkasına ekle
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

# Durumu kontrol et
sudo ufw status numbered

Bu yapıda 198.51.100.0/24 bloğundan gelen herhangi bir IP, hangi porta bağlanmaya çalışırsa çalışsın, ilk kuralda engellenir. Diğer tüm kullanıcılar 80 ve 443’e serbestçe erişir.

Gerçek Dünya Senaryosu 3: SSH Kısıtlaması ve Beyaz Liste

Üretim sunucunuzda SSH’ı herkese açık bırakmak riskli. Sadece belirli IP’lerden SSH erişimine izin vermek, geri kalanını engellemek istiyorsunuz.

# Önce izin verilecek IP'leri ekle
sudo ufw insert 1 allow from 10.10.0.10 to any port 22
sudo ufw insert 2 allow from 10.10.0.11 to any port 22
sudo ufw insert 3 allow from 192.168.50.5 to any port 22

# Diğer herkesten SSH'ı engelle
sudo ufw insert 4 deny 22/tcp

# Kontrol et
sudo ufw status numbered

Bu yapıyla sadece üç IP adresi SSH bağlantısı kurabilir. Başka herhangi bir IP’den bağlanmaya çalışan biri, 4. kuralda bloklanır.

Burada önemli bir uyarı: Bu ayarı yapmadan önce mevcut SSH bağlantınızın kopmamasına dikkat edin. Kendi IP adresinizi listeye eklediğinizden emin olun, yoksa sunucuya erişiminizi kaybedebilirsiniz.

UFW Verbose Çıktısıyla Detaylı İnceleme

Bazen standart ufw status çıktısı yeterli bilgi vermez. Daha fazla detay için verbose seçeneğini kullanabilirsiniz.

sudo ufw status verbose

Bu komut varsayılan politikaları, yönlendirme bilgilerini ve tüm kuralları ayrıntılı biçimde gösterir. Özellikle Default: deny (incoming), allow (outgoing) gibi satırlar, temel güvenlik politikanızı anlamanızı sağlar.

UFW Kurallarını Doğrudan Düzenleme

Bazen UFW’nin komut satırı arayüzü yetersiz kalabilir. Özellikle toplu düzenleme yapmak istediğinizde UFW’nin altında yatan yapılandırma dosyalarını doğrudan düzenlemek daha pratik olabilir.

UFW kuralları şu dizinde saklanır:

  • /etc/ufw/user.rules: IPv4 kuralları
  • /etc/ufw/user6.rules: IPv6 kuralları
  • /etc/ufw/before.rules: İşlenmeden önce uygulanan kurallar
  • /etc/ufw/after.rules: İşlendikten sonra uygulanan kurallar
# User kurallarını görüntüle
sudo cat /etc/ufw/user.rules

# Düzenlemek için
sudo nano /etc/ufw/user.rules

Dosyayı düzenledikten sonra UFW’yi yeniden yüklemeniz gerekir:

sudo ufw reload

Uyarı: Bu dosyaları doğrudan düzenlemek güçlüdür ama risklidir. Söz dizimi hatası yaparsanız tüm güvenlik duvarı kurallarınız bozulabilir. Düzenleme yapmadan önce mutlaka yedek alın:

sudo cp /etc/ufw/user.rules /etc/ufw/user.rules.backup
sudo cp /etc/ufw/user6.rules /etc/ufw/user6.rules.backup

Kural Sırasını Sıfırlama ve Yeniden Yapılandırma

Kurallar karışık hâle geldiyse ve baştan başlamak istiyorsanız, UFW’yi sıfırlayabilirsiniz. Ancak bu komutu çalıştırmadan önce hangi kuralların gerekli olduğunu not alın. Yoksa kendinizi sunucuya erişemez hâlde bulabilirsiniz.

# Tüm kuralları sıfırla (dikkatli kullan!)
sudo ufw reset

Bu komut tüm kuralları siler ve UFW’yi devre dışı bırakır. Ardından sıfırdan yapılandırabilirsiniz:

# UFW'yi etkinleştir
sudo ufw enable

# Varsayılan politikaları ayarla
sudo ufw default deny incoming
sudo ufw default allow outgoing

# Temel kuralları ekle
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

Gerçek Dünya Senaryosu 4: Rate Limiting ile Kural Önceliği

UFW’nin limit özelliği brute-force saldırılarına karşı etkili bir önlemdir. Ancak bunu diğer kurallarla doğru sırayla kullanmak önemlidir.

# Önce güvenilir iç ağdan gelen SSH'a sınırsız izin ver
sudo ufw insert 1 allow from 10.0.0.0/8 to any port 22

# Dış dünyadan gelen SSH'ı rate limit ile sınırla
sudo ufw insert 2 limit 22/tcp

# Sonucu kontrol et
sudo ufw status numbered

Bu yapıda iç ağdan gelen SSH bağlantıları limit kuralına takılmaz (iç ağ için ayrı bir allow kuralı var ve önce eşleşir). Dışarıdan gelen bağlantılar ise rate limiting’e tabi tutulur. 30 saniye içinde 6’dan fazla bağlantı denemesi yapan bir IP otomatik olarak geçici engellenir.

IPv6 Kurallarında Sıra Yönetimi

UFW, IPv4 ve IPv6 kurallarını ayrı ayrı saklar. ufw status numbered çıktısında her iki türü de görürsünüz. IPv6 kuralları için ayrıca dikkat etmeniz gerekir.

sudo ufw status numbered

Çıktıda (v6) ile işaretlenmiş satırlar IPv6 kurallarıdır. Bir kural eklerken UFW genellikle hem IPv4 hem IPv6 versiyonunu otomatik oluşturur. Ancak insert komutunu kullanırken sadece IPv4 için ekleme yapılır. IPv6 için ayrıca ekleme gerekebilir.

# IPv4 için
sudo ufw insert 1 deny from 192.0.2.100 to any port 80

# IPv6 için (farklı söz dizimi)
sudo ufw insert 1 deny from 2001:db8::100 to any port 80

Uygulamalar için Kural Önceliği

UFW, uygulamalara özel profiller destekler. ufw allow OpenSSH gibi komutları muhtemelen kullanmışsınızdır. Bu profiller /etc/ufw/applications.d/ dizininde tanımlıdır.

# Mevcut uygulama profillerini listele
sudo ufw app list

# Belirli bir profili görüntüle
sudo ufw app info 'Nginx Full'

Uygulama profilleriyle eklenen kurallar da sıra mantığına tabidir. Örneğin Nginx profilini belirli bir pozisyona eklemek için:

# Nginx'e erişimi belirli bir konuma ekle
sudo ufw insert 3 allow 'Nginx Full'

Kuralları Test Etmek ve Doğrulamak

Kural sırasını düzenledikten sonra değişikliklerinizin istediğiniz gibi çalıştığını doğrulamak önemli. Bunun için birkaç yöntem kullanabilirsiniz.

# UFW log seviyesini artır
sudo ufw logging medium

# Log dosyasını izle
sudo tail -f /var/log/ufw.log

Log çıktısında [UFW BLOCK] ile başlayan satırlar engellenen bağlantıları, [UFW ALLOW] ile başlayanlar ise izin verilen bağlantıları gösterir. Her satırda kaynak IP, hedef IP, port ve protokol bilgisi bulunur.

Başka bir makineden bağlantı testi yapmak için:

# Test makinesinden bağlantı dene (nmap ile)
nmap -p 80,443,8443 SUNUCU_IP

# Veya netcat ile
nc -zv SUNUCU_IP 8443

Yaygın Hatalar ve Çözümleri

Kural sırası yönetiminde sıkça karşılaşılan hataları ve çözümlerini aktarayım.

Hata 1: Engelleme kuralı çalışmıyor

Sebep: deny kuralı, allow kuralından sonra geliyor. Çözüm: ufw insert ile engelleme kuralını allow kuralının önüne taşıyın.

Hata 2: Beyaz listedeki IP de engellenmiş

Sebep: Geniş kapsamlı bir deny kuralı, özel allow kuralından önce geliyor. Çözüm: Özel allow kuralını deny kuralından önce yerleştirin.

Hata 3: Kural silince başka bir kural bozuldu

Sebep: Kural silindikten sonra numaralar kaydı, yanlış kural silindi. Çözüm: Birden fazla kural silerken her zaman büyük numaradan başlayın.

Hata 4: IPv6 trafiği hâlâ engelleniyor veya izin veriliyor

Sebep: IPv4 için kural eklendi ama IPv6 unutuldu. Çözüm: Her iki protokol için de kural eklendiğini ufw status numbered ile doğrulayın.

Kural Yönetimini Kolaylaştıran Bir Script

Karmaşık sunucularda kural yönetimini kolaylaştırmak için küçük bir bash scripti işinize yarayabilir. Aşağıdaki script, mevcut kuralları yedekler ve yeni kural ekler:

#!/bin/bash
# ufw_rule_manager.sh

# Kuralları yedekle
BACKUP_DIR="/root/ufw_backups"
mkdir -p $BACKUP_DIR
sudo cp /etc/ufw/user.rules "$BACKUP_DIR/user.rules.$(date +%Y%m%d_%H%M%S)"
sudo cp /etc/ufw/user6.rules "$BACKUP_DIR/user6.rules.$(date +%Y%m%d_%H%M%S)"

echo "Yedek alindi: $BACKUP_DIR"

# Mevcut kuralları göster
echo "Mevcut kurallar:"
sudo ufw status numbered

echo ""
echo "Yeni kural eklemek icin: sudo ufw insert [NUMARA] [KURAL]"
echo "Kural silmek icin: sudo ufw delete [NUMARA]"
chmod +x ufw_rule_manager.sh
sudo ./ufw_rule_manager.sh

Sonuç

UFW’de kural sırası, güvenlik duvarınızın doğru çalışması için olmazsa olmazdır. Kurallar yukarıdan aşağıya işlenir ve bir paket ilk eşleşen kurala göre değerlendirilir. Bu basit ama kritik mantığı kavradığınızda, neden bazı kuralların işe yaramadığını veya beklenmedik sonuçlar verdiğini anlarsınız.

Özetlemek gerekirse:

  • Özel ve kısıtlayıcı kurallar her zaman önce gelmeli
  • ufw status numbered kuralları sırayla görmek için temel araçtır
  • ufw insert [NUMARA] [KURAL] belirli bir pozisyona kural ekler
  • Kural silerken büyük numaradan başlayın
  • Her değişiklikten önce kural dosyalarını yedekleyin
  • Log takibi ile kuralların beklendiği gibi çalışıp çalışmadığını doğrulayın

UFW basit görünse de kural öncelikleri konusunda oldukça ince bir denge var. Üretim ortamında kural değişikliği yapmadan önce her zaman test etmenizi ve yedek almanızı öneririm. Güvenlik duvarı yanlış yapılandırılmış bir sunucu, hem saldırılara açık kalır hem de meşru trafiği engeller. İkisi de istemediğimiz sonuçlar.

Yorum yapın