UFW ile Ubuntu Güvenlik Duvarı Yapılandırması

Sunucunu internete açtığın anda saat başlar. Kötü niyetli botlar, otomatik tarayıcılar ve brute-force araçları dakikalar içinde portlarını keşfeder ve saldırıya geçer. Bu gerçekliğe karşı en temel savunma hattın güvenlik duvarıdır. Ubuntu üzerinde bu işi yapmanın en pratik ve kullanıcı dostu yolu ise UFW yani Uncomplicated Firewall’dur. Bugün sıfırdan başlayarak production ortamında gerçekten işe yarayan bir UFW yapılandırması kuracağız.

UFW Nedir ve Neden Kullanmalısın?

UFW, aslında arka planda iptables kullanır. Ama iptables’ın karmaşık söz dizimi yerine son derece sade komutlarla aynı işi yapmanı sağlar. Ubuntu’da varsayılan olarak kurulu gelir, ancak aktif değildir.

“Zaten iptables varken neden UFW?” diye sorabilirsin. Çünkü bir web sunucusu kurarken, bir servis restart ederken, gece 2’de bir incident sırasında hızlı kural eklemen gerektiğinde iptables komutlarını ezberden yazmak yerine ufw allow 443 gibi bir komutla işini bitirmek hayat kurtarır. Üstelik UFW, kuralları kalıcı olarak kaydeder, yani sunucu yeniden başladığında kurallar kaybolmaz.

Kurulum ve Temel Kontroller

Ubuntu 20.04 ve üzeri sistemlerde UFW zaten kurulu gelir. Ama emin olmak için şunu çalıştır:

sudo apt update
sudo apt install ufw

Mevcut durumu kontrol etmek için:

sudo ufw status verbose

Henüz aktif etmediysen Status: inactive çıktısını görürsün. Burası kritik: UFW’yu aktif etmeden önce mutlaka SSH kuralını ekle. Uzak bir sunucudaysan ve SSH kuralı olmadan UFW’yu açarsan, sunucuya erişimini kaybedersin. Bu hatayı bir kez yapanlar bir daha yapmaz, söz veriyorum.

SSH Kilitleme Hatasından Kaçınmak

Pek çok sysadmin’in başına gelmiş klasik senaryo şu: VPS’e UFW kur, hemen etkinleştir, bağlantı kesilir. Hosting paneline koş, VNC ile bağlan, UFW’yu kapat. Saatler kaybol.

Bunu yaşamamak için sırayla şunu yap:

# Önce SSH'a izin ver
sudo ufw allow ssh

# Veya port numarasını açıkça belirt
sudo ufw allow 22/tcp

# SSH'ı farklı bir portta çalıştırıyorsan (örneğin 2222)
sudo ufw allow 2222/tcp

# Şimdi UFW'yu aktif et
sudo ufw enable

ufw enable komutunu çalıştırdığında sana bir uyarı verecek: “Mevcut SSH bağlantıları etkilenebilir, devam etmek istiyor musun?” Eğer yukarıdaki adımları yaptıysan y diyebilirsin.

Varsayılan Politikaları Ayarlamak

UFW’nun temel felsefesi “deny-first” yani önce her şeyi reddet, sonra ihtiyaç duyduklarını açtır prensibidir. Bu yaklaşım güvenlik açısından en doğrusudur. Varsayılan politikaları şöyle ayarlayalım:

# Gelen tüm trafiği varsayılan olarak reddet
sudo ufw default deny incoming

# Giden tüm trafiğe varsayılan olarak izin ver
sudo ufw default allow outgoing

# Durumu kontrol et
sudo ufw status verbose

Bu ayarlarla sunucun dışarıdan gelen hiçbir bağlantıyı kabul etmez, ama sunucunun kendisi dışarıya bağlantı kurabilir. Bu yapılandırma, paket güncellemeleri için internete çıkman gerektiğinden dolayı önemlidir.

Bazı yüksek güvenlikli ortamlarda giden trafiği de kısıtlamak isteyebilirsin. Bu senaryoya yazının ilerleyen bölümünde değineceğiz.

Uygulama Profilleri

UFW, bilinen servisler için hazır profiller içerir. Bu profiller /etc/ufw/applications.d/ dizininde saklanır. Mevcut profilleri listelemek için:

sudo ufw app list

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

  • Apache: HTTP ve HTTPS trafiğini açar
  • Apache Full: Hem 80 hem 443 portunu açar
  • Apache Secure: Sadece 443 portunu açar
  • Nginx Full: Nginx için HTTP ve HTTPS
  • Nginx HTTP: Sadece 80 portu
  • Nginx HTTPS: Sadece 443 portu
  • OpenSSH: SSH bağlantısı için 22. port

Profil kullanmak son derece pratiktir:

# Nginx için hem HTTP hem HTTPS'i aç
sudo ufw allow 'Nginx Full'

# Sadece HTTPS trafiğine izin ver (HTTP'yi kesmeden önce Let's Encrypt kurulu olmalı)
sudo ufw allow 'Nginx HTTPS'

# Profil hakkında detay gör
sudo ufw app info 'Nginx Full'

Gerçek Dünya Senaryosu: Web Sunucusu Yapılandırması

Diyelim ki bir VPS üzerinde WordPress çalıştırıyorsun. Nginx, MySQL ve SSH var. İşte bu senaryo için tipik bir UFW yapılandırması:

# Sıfırdan başla, varsayılanları ayarla
sudo ufw default deny incoming
sudo ufw default allow outgoing

# SSH erişimi (önce bunu yap!)
sudo ufw allow ssh

# Web trafiği
sudo ufw allow 'Nginx Full'

# MySQL'e sadece localhost'tan erişim (dışarıya açmıyoruz)
# MySQL zaten sadece localhost dinliyorsa UFW'da ek kural gerekmez
# Ama uzak bir DB sunucundan bağlanacaksan:
# sudo ufw allow from 10.0.0.5 to any port 3306

# UFW'yu aktif et
sudo ufw enable

# Kuralları kontrol et
sudo ufw status numbered

status numbered komutu kuralları numaralandırarak listeler. Bu numaralar kural silme işleminde işine yarar.

IP Adresi Bazlı Kısıtlamalar

Belirli IP adreslerine özel kurallar tanımlamak, güvenliği birkaç kat artırır. Özellikle yönetim panellerini, veritabanı portlarını ve SSH’ı sadece belirli IP’lerden erişilebilir yapabilirsin.

# Belirli bir IP'ye tam erişim ver
sudo ufw allow from 203.0.113.10

# Belirli bir IP'ye sadece belirli porta erişim ver
sudo ufw allow from 203.0.113.10 to any port 22

# Bir IP bloğuna (subnet) erişim ver
sudo ufw allow from 10.0.0.0/8

# Belirli bir IP'yi tamamen engelle
sudo ufw deny from 45.33.32.156

# Belirli bir IP'nin belirli porta erişimini engelle
sudo ufw deny from 185.220.101.0/24 to any port 80

Örneğin ofis IP’nden sunucuya yönetim erişimi verip başka tüm yerlerden SSH’ı kapatmak istiyorsan:

# Önce ofis IP'ne SSH izni ver
sudo ufw allow from 203.0.113.0/24 to any port 22

# Sonra diğer IP'lerden SSH'ı kapat
sudo ufw deny 22

UFW kuralları sırayla işlenir. İlk eşleşen kural geçerli olur. Bu yüzden daha spesifik kurallar daha önce gelmelidir.

Kural Silme ve Düzenleme

Yanlış kural eklediysen veya artık gerekmeyen bir kuralı silmek istiyorsan:

# Numaralı listeyi gör
sudo ufw status numbered

# Numaraya göre sil (örneğin 3 numaralı kural)
sudo ufw delete 3

# Veya kural tanımını yazarak sil
sudo ufw delete allow 80/tcp

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

ufw reset komutu UFW’yu devre dışı bırakır ve tüm kuralları siler. Eğer yeniden aktif etmeyi unutursan sunucu korumasız kalır. Bu komutu kullandıktan sonra mutlaka kuralları yeniden kur ve ufw enable ile aktif et.

Rate Limiting ile Brute-Force Koruması

UFW’nun güzel özelliklerinden biri basit rate limiting desteğidir. Özellikle SSH için bu özellik çok değerlidir. Bir IP adresi 30 saniye içinde 6’dan fazla bağlantı kurmaya çalışırsa UFW otomatik olarak o IP’yi geçici olarak engeller.

# SSH için rate limiting aktif et
sudo ufw limit ssh

# Veya port numarasıyla
sudo ufw limit 22/tcp

# Özel bir port için de kullanabilirsin
sudo ufw limit 2222/tcp

Bu basit kural, otomatik brute-force saldırılarının büyük bölümünü def eder. Ama unutma, bu tam bir koruma değil. Fail2ban gibi araçlarla birlikte kullanmak çok daha güçlü bir savunma sağlar.

Gelişmiş Senaryo: Database Sunucusu Güvenliği

Üç katmanlı bir mimari düşün: web sunucusu, uygulama sunucusu ve veritabanı sunucusu. Veritabanı sunucusunda sadece uygulama sunucusundan gelen PostgreSQL bağlantılarına izin vermek istiyorsun.

Veritabanı sunucusunda (10.0.0.3):

sudo ufw default deny incoming
sudo ufw default allow outgoing

# Sadece yönetim IP'sinden SSH
sudo ufw allow from 10.0.0.1 to any port 22

# Sadece uygulama sunucusundan PostgreSQL
sudo ufw allow from 10.0.0.2 to any port 5432

# Monitoring sunucusundan SNMP veya node_exporter
sudo ufw allow from 10.0.0.10 to any port 9100

sudo ufw enable

Bu yapılandırmayla veritabanı sunucusu internetten tamamen izole edilmiş olur, sadece iç ağdan belirli sunucular bağlanabilir. Bu gerçek production ortamlarında görmen gereken bir yaklaşımdır.

UFW Loglarını Yönetmek

Güvenlik olaylarını takip etmek için loglama şarttır. UFW’nun loglama seviyeleri şunlardır:

  • off: Loglama kapalı
  • low: Sadece engellenen paketleri logla
  • medium: Engellenen ve bazı izin verilen paketleri logla
  • high: Tüm paketleri logla (disk dolabilir, dikkat et)
  • full: En detaylı loglama
# Orta seviye loglama (production için genellikle yeterli)
sudo ufw logging medium

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

# Belirli bir IP'nin trafiğini filtrele
sudo grep "45.33.32.156" /var/log/ufw.log

# Engellenen bağlantıları listele
sudo grep "BLOCK" /var/log/ufw.log | tail -20

UFW logları syslog üzerinden gelir ve genellikle /var/log/ufw.log veya /var/log/syslog içinde bulunur. Logları düzenli olarak incelemek, saldırı pattern’larını anlamana yardımcı olur.

IPv6 Desteği

Eğer sunucun IPv6 adresi varsa UFW’nun IPv6 trafiğini de yönetmesi gerekir. /etc/default/ufw dosyasındaki IPV6 ayarının yes olduğunu kontrol et:

sudo nano /etc/default/ufw

Dosyada şunu gör:

IPV6=yes

Bu ayar aktifken UFW hem IPv4 hem IPv6 kurallarını birlikte yönetir. ufw allow ssh komutunu verdiğinde hem IPv4 hem IPv6 için kural oluşturulur. ufw status verbose çıktısında bunu görebilirsin.

Giden Trafiği Kısıtlamak

Çoğu durumda giden trafiği açık bırakmak yeterlidir. Ama kritik bir finansal sistem veya yüksek güvenlik gerektiren bir ortamdaysan giden trafiği de kontrol altına almak isteyebilirsin.

# Varsayılan olarak giden trafiği reddet
sudo ufw default deny outgoing

# Sadece gerekli servislere giden trafiğe izin ver
sudo ufw allow out 53    # DNS
sudo ufw allow out 80    # HTTP (paket güncellemeleri için)
sudo ufw allow out 443   # HTTPS
sudo ufw allow out 123   # NTP (zaman senkronizasyonu)

# Yurt içi bir apt mirror'a spesifik izin
sudo ufw allow out to 91.189.91.38 port 80

Bu yaklaşım “zero trust” mantığına yakındır ama yönetimi zorlaşır. Her yeni servis için giden kural eklemeyi unutursan servis çalışmaz. Production’a uygulamadan önce test ortamında dene.

UFW Kurallarını Dosyadan Yüklemek

Büyük bir sunucu filonun varsa her sunucuda tek tek kural girmek yerine bir betik hazırlamak çok daha verimlidir:

#!/bin/bash
# ufw-setup.sh - Web sunucusu UFW yapılandırması

# UFW'yu sıfırla
ufw --force reset

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

# SSH - sadece yönetim ağından
ufw allow from 10.0.0.0/24 to any port 22

# Web trafiği
ufw allow 80/tcp
ufw allow 443/tcp

# Monitoring
ufw allow from 10.0.0.10 to any port 9100

# SSH rate limiting
ufw limit 22/tcp

# Loglama
ufw logging medium

# Aktif et
ufw --force enable

echo "UFW yapılandırması tamamlandı."
ufw status verbose

Bu betiği Ansible, Chef veya basit bir bash script dağıtımıyla tüm sunucularına uygulayabilirsin. --force parametresi interaktif onay istemeden çalıştırır, otomasyon için şarttır.

Yaygın Sorunlar ve Çözümleri

Sorun: UFW aktif ama kurallar çalışmıyor

Bazen Docker kurulu sistemlerde iptables kuralları çakışır. Docker kendi iptables kurallarını yönetir ve UFW kurallarını bypass edebilir. Çözüm için /etc/docker/daemon.json dosyasına şunu ekle:

{
  "iptables": false
}

Sonra Docker’ı yeniden başlat ve UFW kurallarını yeniden düzenle. Bu konuyu ayrı bir yazıda detaylı işlemek gerekir ama bu konfigürasyonun başka trade-off’ları olduğunu bil.

Sorun: Sunucu yeniden başladıktan sonra UFW devreye girmiyor

# UFW servisinin aktif olup olmadığını kontrol et
sudo systemctl status ufw

# Eğer aktif değilse enable et
sudo systemctl enable ufw
sudo systemctl start ufw

Sorun: Belirli bir kuralın çalışıp çalışmadığını test etmek

# UFW kurallarını iptables olarak görüntüle
sudo ufw show raw

# Belirli bir porta erişimi test et (başka bir sunucudan)
nc -zv sunucu_ip 443

# Ya da nmap ile (test amaçlı)
nmap -p 22,80,443 sunucu_ip

UFW Durumunu İzlemek

Rutin kontroller için birkaç pratik komut:

# Kısa durum özeti
sudo ufw status

# Detaylı durum
sudo ufw status verbose

# Numaralı liste (kural silmek için)
sudo ufw status numbered

# UFW'nun aktif olup olmadığını script içinde kontrol et
sudo ufw status | grep -q "Status: active" && echo "UFW aktif" || echo "UFW pasif"

Monitoring sistemine UFW durumunu da eklemeni tavsiye ederim. Prometheus ve node_exporter kullanıyorsan UFW durumunu custom bir script ile kontrol edip alert ayarlayabilirsin.

Production Öncesi Kontrol Listesi

Sunucunu canlıya almadan önce şu maddeleri geçtiğinden emin ol:

  • SSH erişiminin çalıştığını farklı bir terminal penceresinden test et
  • UFW status verbose ile tüm kuralları gözden geçir
  • Gereksiz açık port olmadığını sudo ss -tlnp ile doğrula
  • Rate limiting kuralının SSH’a uygulandığını kontrol et
  • Loglama seviyesinin uygun olduğunu gör
  • Sunucuyu yeniden başlatıp UFW’nun otomatik başladığını test et
  • Dışarıdan bir portscanner ile açık portları doğrula

Sonuç

UFW, doğru yapılandırıldığında gerçekten güçlü bir güvenlik katmanı sağlar. Söz dizimi basit, yönetimi kolay ama arkasında iptables’ın tüm gücü var. Burada anlattığım yapılandırmaları birebir kopyalamak yerine kendi ortamının ihtiyaçlarına göre uyarlamanı tavsiye ederim. Her sunucunun amacı farklı, her portun açık olmasının gerekçesi iyi düşünülmeli.

En sık yaptığım tavsiye şu: Hiçbir portu “belki lazım olur” diye açık bırakma. İhtiyaç olduğunda açmak her zaman mümkün. Ama bir kez açılan ve unutulan port, aylarca güvenlik açığı olmaya devam eder. “Default deny” felsefesini benim, kuralları da ihtiyaca göre ekle.

UFW’yu Fail2ban ile birleştirirsen SSH brute-force saldırılarına karşı çok daha güçlü bir savunma hattı kurmuş olursun. Bir sonraki yazıda tam da bunu ele alacağız.

Yorum yapın