UFW ile Nginx ve Apache için Hazır Profil Kullanımı

Sunucunu kurup Apache ya da Nginx’i ayarladıktan sonra “şimdi firewall’ı nasıl yapılandırayım” diye düşünmeye başladıysan, doğru yerdesin. UFW (Uncomplicated Firewall), adı üstünde, karmaşık iptables kurallarını sıradan insanların anlayabileceği bir arayüze indirgeyen bir araç. Ama UFW’nin en az bilinen özelliklerinden biri, Nginx ve Apache gibi popüler web sunucuları için hazır profillerin zaten sistemde tanımlı olması. Bu yazıda bu profillerin ne olduğunu, nasıl çalıştığını ve gerçek senaryolarda nasıl kullanacağını adım adım ele alacağız.

UFW Uygulama Profilleri Nedir?

UFW kurulduğunda /etc/ufw/applications.d/ dizinine bakar. Bu dizindeki dosyalar, belirli uygulamalara ait port ve protokol tanımlarını barındırır. Bir uygulama kurulduğunda kendi profil dosyasını bu dizine bırakabilir. Nginx ve Apache kurduğunda otomatik olarak bu profiller oluşur ve ufw app list komutuyla bunları görebilirsin.

sudo ufw app list

Tipik bir çıktı şöyle görünür:

Available applications:
  Apache
  Apache Full
  Apache Secure
  Nginx HTTP
  Nginx HTTPS
  Nginx Full
  OpenSSH

Bu profillerin her biri aslında birer kısayol. Örneğin “Nginx Full” dediğinde UFW hem 80 hem de 443 portunu açıyor. Tek tek port numarası girmek zorunda kalmıyorsun. Bu hem pratik hem de daha okunabilir kural yönetimi sağlıyor.

Profil Detaylarını İnceleme

Bir profili uygulamadan önce içinde ne olduğunu görmek iyi bir alışkanlık. ufw app info komutu tam da bunun için var:

sudo ufw app info 'Nginx Full'

Çıktı şuna benzer:

Profile: Nginx Full
Title: Web Server (Nginx, HTTP + HTTPS)
Description: This profile opens both 80 and 443.

Ports:
  80,443/tcp

Apache için de benzer şekilde bakabilirsin:

sudo ufw app info 'Apache Full'
Profile: Apache Full
Title: Web Server (Apache, HTTP + HTTPS)
Description: This profile opens both 80 and 443.

Ports:
  80,443/tcp

Gördüğün gibi “Full” profili her iki port için de TCP bağlantısına izin veriyor. “HTTP” veya “Secure” profillerini ayrı ayrı incelersen:

sudo ufw app info 'Nginx HTTP'
sudo ufw app info 'Nginx HTTPS'

Nginx HTTP: Sadece 80/tcp açar. SSL sertifikası henüz yokken ya da Let’s Encrypt sertifikası alırken kullanmak için idealdir.

Nginx HTTPS: Sadece 443/tcp açar. Tüm trafiği HTTPS üzerinden zorunlu kıldığında HTTP’yi kapatıp sadece bunu bırakabilirsin.

Nginx Full: Hem 80 hem 443 açar. En yaygın kullanım senaryosu budur; HTTP’den HTTPS’e yönlendirme yapsan bile 80 portunu açık tutman gerekir.

Temel Kullanım: Profilleri Aktif Etme

UFW’yi ilk kez kurup kullanıyorsan önce durumunu kontrol et:

sudo ufw status

Eğer “inactive” görüyorsan, etkinleştirmeden önce SSH erişimini kaybetmemek için OpenSSH’e izin vermeyi unutma:

sudo ufw allow OpenSSH
sudo ufw enable

Şimdi Nginx için profil ekleyelim. Yeni bir web sunucusu kuruyorsun ve henüz SSL sertifikası yok. Önce sadece HTTP’ye izin ver:

sudo ufw allow 'Nginx HTTP'

Let’s Encrypt ile sertifikayı aldıktan sonra kuralı güncelle:

sudo ufw allow 'Nginx Full'
sudo ufw delete allow 'Nginx HTTP'

Kuralı silmek için delete allow kullanıyorsun. Sadece Nginx HTTP kuralını kaldırıp Nginx Full‘u aktif bırakıyorsun.

Gerçek Dünya Senaryosu 1: Yeni Bir VPS’e Nginx Kurulumu

Diyelim ki DigitalOcean ya da Hetzner’dan yeni bir Ubuntu 22.04 sunucu aldın. Nginx kuracaksın ve SSL sertifikası alacaksın. İşte adım adım güvenli yapılandırma:

# Nginx kur
sudo apt update
sudo apt install nginx -y

# UFW'yi kontrol et
sudo ufw status verbose

# SSH ve HTTP'ye izin ver (Let's Encrypt için HTTP gerekli)
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx HTTP'
sudo ufw enable

# Certbot ile sertifika al
sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d example.com -d www.example.com

# Sertifika alındıktan sonra HTTPS'i de aç
sudo ufw allow 'Nginx Full'
sudo ufw delete allow 'Nginx HTTP'

# Durumu doğrula
sudo ufw status numbered

Son komutun çıktısı şöyle görünmeli:

Status: active

     To                         Action      From
     --                         ------      ----
[ 1] OpenSSH                    ALLOW IN    Anywhere
[ 2] Nginx Full                 ALLOW IN    Anywhere
[ 3] OpenSSH (v6)               ALLOW IN    Anywhere (v6)
[ 4] Nginx Full (v6)            ALLOW IN    Anywhere (v6)

IPv6 kurallarının otomatik oluştuğuna dikkat et. UFW hem IPv4 hem IPv6 için aynı anda kural oluşturuyor, bu da önemli bir kolaylık.

Gerçek Dünya Senaryosu 2: Apache ile SSL Geçişi

Apache kullanan ve HTTP’den HTTPS’e geçiş yapan bir sistem yöneticisinin senaryosuna bakalım. Mevcut kurallar var, bunları bozmadan geçiş yapmak gerekiyor:

# Mevcut durumu kontrol et
sudo ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] OpenSSH                    ALLOW IN    Anywhere
[ 2] Apache                     ALLOW IN    Anywhere

Burada “Apache” profili sadece 80/tcp açıyor. SSL sertifikasını aldıktan sonra önce Full’u ekle, sonra eskiyi sil:

# Önce ekle (kesinti yaşamamak için)
sudo ufw allow 'Apache Full'

# Sonra eskiyi sil
sudo ufw delete allow 'Apache'

# Kontrol et
sudo ufw status

Bu sırayı korumak önemli. Önce silersin sonra eklersenin aksine, önce ekle sonra sil yaklaşımı servis kesintisini önler. Özellikle production ortamında bu detay kritik.

Gerçek Dünya Senaryosu 3: Sadece HTTPS Zorunlu Kılmak

Bazı durumlarda HTTP’yi tamamen kapatmak ve sadece HTTPS bağlantısına izin vermek isteyebilirsin. Bu yaklaşım daha kısıtlayıcı ama bazı edge case’ler yaratabilir. Eğer Nginx yapılandırmasında HTTP’den HTTPS’e yönlendirme varsa, HTTP portu kapalıyken bu yönlendirme çalışmaz ve kullanıcılar bağlanamaz. O yüzden 80’i Nginx düzeyinde kapatmak yerine UFW düzeyinde kapatmayı dikkatli düşün.

Ama bir API sunucusu gibi sadece programatik istemcilerin erişeceği bir hizmet kuruyorsan ve tüm istemcilerin HTTPS kullanacağını garantileyebiliyorsan:

# Sadece HTTPS'e izin ver
sudo ufw allow 'Nginx HTTPS'

# HTTP'yi tamamen kapat (dikkatli kullan!)
sudo ufw deny 'Nginx HTTP'

Ya da daha temiz bir yaklaşım: sadece Nginx HTTPS‘i allow et, HTTP için hiç kural ekleme. UFW varsayılan davranışı deny olduğu için tanımsız portlar zaten engellenir.

Kural Silme ve Yönetim

Numaralı silme yöntemi en güvenli yaklaşım:

# Numaralı listeyi göster
sudo ufw status numbered

# Belirli bir numarayı sil
sudo ufw delete 3

Bir onay sorusu gelir, y ile onaylarsın. Bu yöntem özellikle birden fazla benzer kural varsa karışıklığı önler.

Kural adıyla silme de mümkün ama dikkatli olunmalı:

sudo ufw delete allow 'Apache Full'

Bu komut hem IPv4 hem IPv6 kuralını tek seferde siler.

Profil Dosyalarını Anlamak ve Özelleştirmek

/etc/ufw/applications.d/ dizinine girip Nginx profil dosyasına bakalım:

cat /etc/ufw/applications.d/nginx
[Nginx HTTP]
title=Web Server (Nginx, HTTP)
description=Small, but very powerful and efficient web server
ports=80/tcp

[Nginx HTTPS]
title=Web Server (Nginx, HTTPS)
description=Small, but very powerful and efficient web server
ports=443/tcp

[Nginx Full]
title=Web Server (Nginx, HTTP + HTTPS)
description=Small, but very powerful and efficient web server
ports=80,443/tcp

Bu dosya formatını anlayınca kendi özel profillerin oluşturabilirsin. Diyelim ki Node.js uygulamaları için 3000 portunu sık sık açıp kapatıyorsun. Bunun için bir profil dosyası oluştur:

sudo nano /etc/ufw/applications.d/nodejs
[Node.js]
title=Node.js Application Server
description=Default Node.js application port
ports=3000/tcp

[Node.js Dev]
title=Node.js Development
description=Common Node.js development ports
ports=3000,3001,4000/tcp

Dosyayı kaydedip UFW’ye güncelleme yaptığını bildiriyorsun:

sudo ufw app update Node.js
sudo ufw app list

Artık sudo ufw allow 'Node.js' diyebilirsin. Bu özellikle ekip ortamlarında tutarlılık sağlar ve dokümantasyon görevi de görür.

UFW Profilleri ve IP Kısıtlaması Kombinasyonu

Profiller yalnızca belirli IP adreslerine izin vermek için de kullanılabilir. Örneğin bir staging sunucusu sadece ofis IP’sinden erişilebilir olsun istiyorsun:

# Sadece belirli IP'den Nginx Full'a erişim
sudo ufw allow from 203.0.113.50 to any app 'Nginx Full'

# Veya bir subnet için
sudo ufw allow from 203.0.113.0/24 to any app 'Nginx HTTP'

Bu sözdizimi UFW’nin güzel özelliklerinden biri. Profil adını kullanırken kaynak IP kısıtlaması da ekleyebiliyorsun.

Log Yönetimi ve İzleme

Firewall kurallarını aktif ettikten sonra logları takip etmek önemli. UFW loglama seviyeleri var:

# Loglama aç (low, medium, high seviyeleri var)
sudo ufw logging medium

# Logları izle
sudo tail -f /var/log/ufw.log

Nginx veya Apache trafiğini izlemek için grep ile filtrele:

# 80 portuna gelen reddedilen bağlantılar
sudo grep "DPT=80" /var/log/ufw.log | tail -20

# 443 portuna gelen izinli bağlantılar
sudo grep "DPT=443 ACT=ALLOW" /var/log/ufw.log | tail -20

Eğer çok fazla port tarama girişimi görüyorsan ve bunları loglamak sistemi yavaşlatıyorsa, loglama seviyesini low olarak bırakmak yeterli olur.

Profil Güncellemeleri ve Paket Yöneticisi Etkileşimi

Nginx veya Apache güncellendiğinde profil dosyaları da güncellenebilir. Bu durumda aktif kurallar değişmez ama profil tanımları değişebilir. ufw app update komutunu zaman zaman çalıştırmak iyi bir pratik:

# Tüm profilleri güncelle
sudo ufw app update all

# Belirli profili güncelle
sudo ufw app update Nginx

Bu komut disk üzerindeki profil dosyasını okuyup UFW’nin dahili profillerini senkronize eder. Aktif kuralları etkilemez.

Yaygın Hatalar ve Çözümleri

Profil bulunamıyor hatası: ERROR: Could not find a profile matching 'Nginx' gibi bir hata alıyorsan büyük ihtimalle Nginx yüklü değil ya da profil dosyası oluşturulmamış. Önce ufw app list ile mevcut profilleri kontrol et.

UFW etkin değil ama kurallar var: ufw enable komutunu çalıştırmadan kurallar eklemiş olabilirsin. Bu sorun değil, kurallar kaydedilir ama aktif olmaz. ufw enable dediğinde hepsi devreye girer.

SSH bağlantısı koptu: UFW’yi etkinleştirirken SSH kuralını unutmak çok yaygın bir hata. Eğer cloud provider kullanıyorsan genellikle web konsolu üzerinden bağlanıp kuralı ekleyebilirsin. Bu yüzden şu sırayı asla atlatma: önce ufw allow OpenSSH, sonra ufw enable.

IPv6 devre dışı ama kurallar oluşuyor: /etc/default/ufw dosyasında IPV6=yes satırı var. Eğer sunucunda IPv6 kullanmıyorsan bunu no olarak değiştirip sudo ufw disable && sudo ufw enable yapabilirsin. Ama modern sunucularda IPv6’yı açık bırakmak genellikle daha iyi.

Sonuç

UFW’nin uygulama profilleri özelliği, sysadmin hayatını ciddi anlamda kolaylaştıran ama yeterince ilgi görmeyen bir özellik. Port numaralarını ezbere bilmek zorunda kalmadan, anlaşılır isimlerle firewall kuralları yönetmek hem hız hem de hata önleme açısından büyük avantaj sağlıyor. Özellikle birden fazla sunucu yönetiyorsan ve her birinde standart bir yapılandırma istiyorsan, özel profil dosyaları oluşturmak bu standartlaşmayı otomatik hale getirir.

Nginx veya Apache profillerini gerçek senaryolarda kullanırken şu pratik kuralları aklında tut: SSL geçişlerinde önce ekle sonra sil, Let’s Encrypt sertifikası alırken HTTP portunu açık tut, staging ortamlarında IP kısıtlamasını profil kombinasyonuyla kullan ve üretim sunucularında ufw status numbered çıktısını periyodik olarak kaydet.

UFW basit görünüyor ama doğru kullanıldığında iptables’ın tüm gücünü sana soyutlanmış bir arayüzle sunuyor. Profil sistemi de bu soyutlamanın en güzel parçalarından biri. Bir dahaki sunucu kurulumunda port numaraları yerine profil isimleri kullanmayı dene, farkı hemen göreceksin.

Yorum yapın