Firewall kurallarını tek tek port numaralarıyla yönetmek, özellikle onlarca servisi olan sistemlerde kaosa dönüşebilir. “80’i mi açtım, 443’ü mü unuttum, 8080 neydi?” soruları geceleri seni uyandırıyorsa, UFW’nin uygulama profilleri tam sana göre. Bu özellik, servis bazlı düşünmeni ve kuralları insan okunabilir isimlerle yönetmeni sağlıyor. Port numaralarını ezberleme devri bitiyor.
UFW Uygulama Profilleri Nedir?
UFW (Uncomplicated Firewall), standart iptables veya nftables altyapısının üzerine oturmuş, kullanımı kolaylaştırmak için tasarlanmış bir araç. Uygulama profilleri ise bu aracın en kullanışlı ama en az konuşulan özelliklerinden biri.
Temel mantık şu: /etc/ufw/applications.d/ dizininde saklanan INI formatındaki dosyalar, servis adlarını port numaraları ve protokollerle eşleştiriyor. Apache yüklediğinde apache2 paketi bu dizine kendi profilini bırakıyor, Nginx de öyle, OpenSSH de öyle. Sen port numarasını bilmeden sadece servis adıyla kural yazabiliyorsun.
Bu yaklaşımın gerçek faydası şurada: Bir servisi silerken onun açtığı portları tek tek kapatmak zorunda kalmıyorsun. Profil üzerinden kuralı kaldırman yeterli. Üstelik başka bir sysadmin sunucuya baktığında ne anlama geldiği belli olmayan port listesi yerine anlamlı servis isimleri görüyor.
Mevcut Profilleri Keşfetmek
Sisteme yüklü paketlerin bıraktığı profilleri görmek için:
sudo ufw app list
Tipik bir Ubuntu sunucusunda çıktı şöyle görünür:
Available applications:
Apache
Apache Full
Apache Secure
Nginx Full
Nginx HTTP
Nginx HTTPS
OpenSSH
Postfix
Samba
Belirli bir profilin detayına bakmak istiyorsan:
sudo ufw app info "Apache Full"
Çıktı:
Profile: Apache Full
Title: Web Server (HTTP,HTTPS)
Description: Apache v2 is the next generation of the omnipresent Apache web
server.
Ports:
80,443/tcp
Profil hem başlık hem açıklama hem de hangi portları kapsadığını açıkça gösteriyor. Bu bilgi, bir kural eklerken veya silerken tam olarak ne yaptığını anlamana yardımcı oluyor.
Profil Dosyasının Anatomisi
Bir profil dosyasının içine bakalım. /etc/ufw/applications.d/apache2.ufw dosyasını açtığında şunu görürsün:
[Apache]
title=Web Server (HTTP)
description=Apache v2 is the next generation of the omnipresent Apache web server.
ports=80/tcp
[Apache Full]
title=Web Server (HTTP,HTTPS)
description=Apache v2 is the next generation of the omnipresent Apache web server.
ports=80,443/tcp
[Apache Secure]
title=Web Server (HTTPS)
description=Apache v2 is the next generation of the omnipresent Apache web server.
ports=443/tcp
Her bölüm köşeli parantezle başlıyor, bu bölüm adı aynı zamanda ufw allow komutunda kullandığın isim. ports satırında virgülle ayrılmış port numaraları ve eğik çizgiyle protokol var. Birden fazla protokol gerekiyorsa | karakteriyle ayırabilirsin, mesela 80/tcp|80/udp veya daha kısa yazımıyla 80.
Kendi Uygulama Profilini Oluşturmak
Diyelim ki bir Node.js API uygulaması çalıştırıyorsun, 3000 portunda HTTP ve 3001 portunda WebSocket bağlantıları var. Bunun için özel profil oluşturalım:
sudo nano /etc/ufw/applications.d/nodejs-api
Dosya içeriği:
[NodeJS API]
title=Node.js API Server
description=Production Node.js API with WebSocket support. HTTP on 3000, WebSocket on 3001.
ports=3000,3001/tcp
Dosyayı kaydettikten sonra UFW’nin profil listesini güncellemesi için:
sudo ufw app update "NodeJS API"
Artık bu profili normal bir uygulama gibi kullanabilirsin:
sudo ufw allow "NodeJS API"
Kontrol edelim:
sudo ufw app info "NodeJS API"
Profile: NodeJS API
Title: Node.js API Server
Description: Production Node.js API with WebSocket support. HTTP on 3000, WebSocket on 3001.
Ports:
3000,3001/tcp
Gerçek Dünya Senaryosu: Web Sunucusu Kurulumu
Yeni bir Ubuntu 22.04 sunucusu kurduğunu ve üzerine Nginx + Let’s Encrypt kurduğunu varsayalım. Standart akış şöyle olurdu:
# UFW'yi aktif et
sudo ufw enable
# Önce SSH'yi kapat, bağlantını kesme!
sudo ufw allow OpenSSH
# Başlangıçta sadece HTTP açık olsun, sertifika aldıktan sonra HTTPS ekleriz
sudo ufw allow "Nginx HTTP"
# Certbot ile sertifika aldıktan sonra profili yükselt
sudo ufw delete allow "Nginx HTTP"
sudo ufw allow "Nginx Full"
# Durumu kontrol et
sudo ufw status verbose
Çıktı:
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To Action From
-- ------ ----
OpenSSH ALLOW IN Anywhere
Nginx Full ALLOW IN Anywhere
OpenSSH (v6) ALLOW IN Anywhere (v6)
Nginx Full (v6) ALLOW IN Anywhere (v6)
Port numaraları yerine anlamlı isimler görmek, kurallara bir bakışta ne olduğunu anlatan temiz bir tablo sunuyor. Üç ay sonra sunucuya baktığında “80 neydi?” diye sorgulamak zorunda kalmıyorsun.
Gelişmiş Profil: Çoklu Protokol ve Port Aralığı
Bazı servisler hem TCP hem UDP kullanır, bazıları da geniş port aralıklarına ihtiyaç duyar. Bir VoIP uygulaması için profil örneği:
sudo nano /etc/ufw/applications.d/voip-server
[VoIP SIP]
title=VoIP SIP Signaling
description=SIP signaling for VoIP server. TCP for reliable transport, UDP for standard SIP.
ports=5060/tcp|5060/udp
[VoIP RTP]
title=VoIP RTP Media
description=RTP media streams for voice and video calls.
ports=10000:20000/udp
[VoIP Full]
title=VoIP Server Complete
description=Complete VoIP server setup including SIP and RTP.
ports=5060/tcp|5060/udp|10000:20000/udp
Buradaki : karakteri port aralığı anlamına geliyor. 10000:20000/udp ifadesi 10000’den 20000’e kadar tüm UDP portlarını kapsıyor. Gerçek bir Asterisk ya da FreeSWITCH sunucusunda bu kadar port açmak gerekiyor.
Profili ekledikten sonra sadece SIP için kural yazabilir, RTP için ayrı kural yazabilir ya da her şeyi tek seferde açabilirsin:
sudo ufw app update all
sudo ufw allow "VoIP Full"
Profilleri Belirli IP Adreslerine Kısıtlamak
Uygulama profilleri from yönergesiyle birleşince çok güçlü bir kombinasyon oluşturuyor. Veritabanı sunucusuna sadece uygulama sunucularının erişmesi gereken bir senaryo:
sudo nano /etc/ufw/applications.d/postgresql
[PostgreSQL]
title=PostgreSQL Database Server
description=PostgreSQL relational database management system.
ports=5432/tcp
[PostgreSQL Replica]
title=PostgreSQL Replication
description=PostgreSQL streaming replication port.
ports=5432,5433/tcp
Kuralları yazarken:
# Sadece uygulama sunucusundan PostgreSQL erişimine izin ver
sudo ufw allow from 10.0.1.10 to any app PostgreSQL
# Replica sunucudan replication erişimine izin ver
sudo ufw allow from 10.0.1.20 to any app "PostgreSQL Replica"
# Monitoring sunucusundan da erişim lazım
sudo ufw allow from 10.0.1.30 to any app PostgreSQL
Bu kombinasyon sayesinde hem port bazlı kısıtlama hem de IP bazlı kısıtlama aynı anda işliyor. Tüm bunları port numarasıyla yazmak zorunda kalsaydın her satırda 5432/tcp yazman gerekirdi ve bir gün birileri 5433‘ü unuturdu.
Profil Güncelleme ve Versiyon Yönetimi
Servisler güncellendikçe portlar değişebilir. Örneğin uygulamanın yeni versiyonu 3000 yerine 8080’de çalışmaya başladı. Profili güncellemenin doğru yolu:
sudo nano /etc/ufw/applications.d/nodejs-api
Dosyada portu değiştir:
[NodeJS API]
title=Node.js API Server
description=Production Node.js API v2 with WebSocket support.
ports=8080,8081/tcp
Sonra UFW’ye güncellemeyi bildir:
sudo ufw app update "NodeJS API"
Önemli bir uyarı: ufw app update komutu profil dosyasını günceller ama mevcut aktif kuralları otomatik olarak değiştirmez. Eğer kural halihazırda aktifse, onu silip yeniden eklemeniz gerekir:
# Eski kuralı kaldır
sudo ufw delete allow "NodeJS API"
# Yeni kuralla tekrar ekle
sudo ufw allow "NodeJS API"
# Değişikliği doğrula
sudo ufw status numbered
Bu adımı atlamak sıkça yapılan bir hata. Profili güncelliyorsun, güzel görünüyor, ama firewall hala eski portlara göre çalışıyor. Mutlaka kuralı yeniden uygula.
Tüm Profilleri Toplu Güncelleme
Sistem paketlerini güncelledikten sonra bazı uygulama profilleri de değişmiş olabilir. Tüm profilleri tek seferde güncellemek için:
sudo ufw app update all
Bu komut /etc/ufw/applications.d/ altındaki tüm profil dosyalarını okuyup UFW’nin iç veritabanını günceller. Büyük sistem güncellemelerinden sonra bu komutu çalıştırmayı alışkanlık haline getirmek mantıklı.
Hangi paketlerin profil bıraktığını merak ediyorsan:
ls -la /etc/ufw/applications.d/
total 48
drwxr-xr-x 2 root root 4096 Jan 15 09:23 .
drwxr-xr-x 4 root root 4096 Jan 15 09:10 ..
-rw-r--r-- 1 root root 373 Jan 12 14:02 apache2.ufw
-rw-r--r-- 1 root root 212 Jan 10 11:45 cups
-rw-r--r-- 1 root root 426 Jan 12 14:15 nginx
-rw-r--r-- 1 root root 180 Jan 10 11:45 openssh-server
-rw-r--r-- 1 root root 245 Jan 14 16:30 nodejs-api
-rw-r--r-- 1 root root 387 Jan 14 17:45 voip-server
-rw-r--r-- 1 root root 312 Jan 14 18:00 postgresql
Docker ve Konteyner Ortamlarında Dikkat Edilecekler
Docker kullandığında bir sorunla karşılaşırsın: Docker kendi iptables kurallarını yazıyor ve UFW’yi bypass edebiliyor. Bu durumda UFW uygulama profilleri çalışıyor gibi görünse de Docker portları dışarıya açmaya devam ediyor.
Bu sorunu aşmak için /etc/docker/daemon.json dosyasına şunu ekleyebilirsin:
sudo nano /etc/docker/daemon.json
{
"iptables": false
}
Ama bu sefer Docker ağ yönetimi bozulabiliyor. Daha güvenli yaklaşım konteyner portlarını 127.0.0.1 üzerinden bind etmek:
docker run -p 127.0.0.1:3000:3000 myapp
Sonra UFW profilinle dışarıya açarsın:
sudo ufw allow "NodeJS API"
Bu şekilde UFW gerçekten kontrolü elinde tutar ve profil bazlı yönetim düzgün çalışır.
Profil Silme ve Temizlik
Bir servis kaldırıldığında profil dosyası genellikle sistemde kalır. Temizlik yapmak için:
# Önce ilgili kuralları sil
sudo ufw delete allow "NodeJS API"
# Sonra profil dosyasını kaldır
sudo rm /etc/ufw/applications.d/nodejs-api
# UFW listesini güncelle
sudo ufw app update all
# Profilin gittiğini doğrula
sudo ufw app list
Eski profil dosyaları zararlı değil ama kalabalık yaratıyor. Üç ay önce kaldırdığın servislerin profilleri listede duruyorsa, yeni birisi sunucuya baktığında o servislerin hala aktif olduğunu sanabilir.
Uygulama Profillerini Betiklere Entegre Etmek
Server provisioning betiklerinde uygulama profillerini kullanmak, kurulum süreçlerini çok daha okunabilir yapıyor. Örnek bir kurulum betiği:
#!/bin/bash
# web-server-setup.sh - Nginx + PostgreSQL sunucu kurulum betiği
set -euo pipefail
echo "UFW başlangıç ayarları yapılıyor..."
ufw default deny incoming
ufw default allow outgoing
echo "Temel servis kuralları ekleniyor..."
ufw allow OpenSSH
ufw allow "Nginx Full"
echo "Veritabanı profili oluşturuluyor..."
cat > /etc/ufw/applications.d/internal-services << 'EOF'
[Internal API]
title=Internal API Service
description=Internal microservice API endpoints.
ports=8080,8443/tcp
[Metrics]
title=Prometheus Metrics
description=Prometheus metrics scraping endpoint.
ports=9090,9100/tcp
EOF
ufw app update all
echo "İç servis kuralları ekleniyor..."
# Monitoring sunucusuna metrics erişimi
ufw allow from 10.0.2.5 to any app Metrics
# İç ağdan API erişimi
ufw allow from 10.0.0.0/24 to any app "Internal API"
echo "UFW aktif ediliyor..."
ufw --force enable
echo "Mevcut kurallar:"
ufw status verbose
Bu betiği Ansible playbook’una entegre etmek de mümkün. Sonuç her zaman tutarlı ve anlaşılır bir firewall konfigürasyonu oluyor.
Sorun Giderme
Profil bazlı kurallarla çalışırken karşılaşılan yaygın durumlar:
Profil görünüyor ama kural çalışmıyor: ufw status çıktısında profil adı yerine port numarası görünüyorsa, eski port bazlı bir kural aktif demektir. ufw status numbered ile tüm kuralları görüp çakışanları temizle.
“ERROR: Couldn’t determine iptables version” hatası: UFW servisini yeniden başlatmak çoğu zaman çözüyor: sudo systemctl restart ufw
Profil güncellendi ama eski portlar hala açık: Yukarıda da belirttiğimiz gibi, app update kuralları değiştirmez. Kuralı silip yeniden eklemen gerekiyor.
IPv6 kuralları uygulanmıyor: /etc/ufw/ufw.conf dosyasında IPV6=yes olduğundan emin ol. Profil bazlı kurallar hem IPv4 hem IPv6 için otomatik uygulanıyor ama bu ayar kapalıysa IPv6 tarafı çalışmaz.
grep IPV6 /etc/ufw/ufw.conf
# IPV6=yes olmalı
Sonuç
UFW uygulama profilleri, firewall yönetimini port numarası karmaşasından kurtarıp servis odaklı bir yaklaşıma taşıyor. Küçük bir VPS’den onlarca servisi olan kurumsal bir sunucuya kadar her ölçekte işe yarıyor.
Pratikte en büyük faydayı şu üç senaryoda görüyorsun: Yeni bir sysadmin sunucuya baktığında ne olduğunu anlıyor, servis kaldırırken ilgili portları unutmuyorsun ve provisioning betiklerin insan tarafından okunabilir hale geliyor.
Başlamak için tek yapman gereken sudo ufw app list komutuyla mevcut profillere bakmak ve bir sonraki kural ekleyişinde port numarası yerine profil adı kullanmak. Alışkınlık bir kez oturdu mu, port numarasıyla kural yazmak sana eski ve zahmetli gelmeye başlıyor.
Kendi profillerini oluştururken /etc/ufw/applications.d/ dizinini düzenli tut, her profil dosyasına açıklayıcı description yaz ve ekip üyelerinin de bu convention’ı kullandığından emin ol. Firewall kuralları sadece teknik bir konfigürasyon değil, sistemin nasıl çalıştığını anlatan bir dokümantasyon da aynı zamanda.