UFW Kurulumu ve Temel Kullanım: Linux Güvenlik Duvarına Giriş

Linux sunucunuzu internete açtığınız anda, otomatik tarama botları, brute-force denemeleri ve çeşitli saldırı girişimleriyle karşı karşıya kalırsınız. Bu gerçekliğe karşı ilk savunma hattınız bir güvenlik duvarıdır. Ubuntu ve Debian tabanlı sistemlerde bu işin en pratik yolu UFW (Uncomplicated Firewall) kullanmaktır. iptables‘ın karmaşıklığını soyutlayan UFW, hem yeni başlayanlar hem de deneyimli sysadmin’ler için güçlü ama sade bir araç sunar. Bu yazıda UFW’yi sıfırdan kurup yapılandıracak, gerçek dünya senaryolarına göre kurallar yazacak ve sunucunuzu güvenli hale getireceğiz.

UFW Nedir ve Neden Kullanmalısınız?

UFW, Ubuntu ekibi tarafından geliştirilen ve iptables üzerinde çalışan bir güvenlik duvarı yönetim aracıdır. iptables doğrudan çok güçlüdür ama sözdizimi karmaşıktır. Birkaç satır kural yazmak için ciddi zaman harcamanız gerekebilir. UFW ise bunu basitleştirir.

Bir web sunucusunda port 80 açmak istediğinizde iptables ile yapmanız gereken:

iptables -A INPUT -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

UFW ile aynı işlem:

ufw allow 80/tcp

Bu fark her şeyi anlatıyor. Ama UFW’nin basit görünmesi onu güçsüz yapmaz. Servis bazlı kurallar, uygulama profilleri, IPv6 desteği ve loglama özellikleriyle kurumsal ortamlarda bile rahatlıkla kullanılabilir.

Kurulum ve İlk Yapılandırma

Çoğu Ubuntu sisteminde UFW zaten yüklü gelir. Kontrol etmek için:

sudo ufw status

Eğer yüklü değilse veya farklı bir Debian tabanlı dağıtım kullanıyorsanız:

sudo apt update && sudo apt install ufw -y

Etkinleştirmeden Önce Kritik Adım: SSH Erişimini Koruyun

Bu adımı atlarsanız sunucunuzdan kendinizi kilitleyebilirsiniz. UFW’yi etkinleştirmeden önce SSH portunu izin verin. Standart port 22 kullanıyorsanız:

sudo ufw allow ssh

Özel bir SSH portu kullandıysanız (örneğin 2222):

sudo ufw allow 2222/tcp

Bunu yapmadan ufw enable derseniz ve o an SSH üzerinden bağlıysanız, bağlantınız kesilebilir. Özellikle VPS veya uzak sunucularda bu hata ciddi sorun çıkarır. Fiziksel erişiminiz yoksa konsol erişimi (KVM, IPMI) olmadan durumunuz kötüye gidebilir.

UFW’yi Etkinleştirme

SSH kuralını ekledikten sonra güvenlik duvarını açabilirsiniz:

sudo ufw enable

Sistem size bir uyarı verecektir. y diyerek onaylayın. Artık UFW aktif ve sistem yeniden başladığında da otomatik başlayacak.

Durumu kontrol etmek için:

sudo ufw status verbose

Bu komut mevcut kuralları, varsayılan politikaları ve aktif/pasif durumu gösterir.

Varsayılan Politikalar

UFW’nin gücü varsayılan politikalardan gelir. Deny all, allow specific prensibi en güvenli yaklaşımdır. Yani her şeyi engelle, sadece ihtiyaç duyduklarına izin ver.

sudo ufw default deny incoming
sudo ufw default allow outgoing

Bu iki komut şunu yapar: Gelen tüm trafiği engelle, giden tüm trafiğe izin ver. Çoğu sunucu senaryosu için bu başlangıç noktası idealdir.

Eğer çok güvenli bir ortam kuruyorsanız ve giden trafiği de kontrol etmek istiyorsanız:

sudo ufw default deny outgoing

Ama bu durumda DNS, HTTP ve diğer giden bağlantılar için ayrı ayrı kural yazmanız gerekir. Başlangıç için bunu önermiyorum, gereksiz yere karmaşıklaştırır.

Temel Kural Yazımı

Port Bazlı Kurallar

En temel kullanım şekli port numarasıyla izin vermek veya engellemektir:

# HTTP ve HTTPS için izin ver
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

# MySQL portunu engelle (zaten varsayılan olarak engellidir ama açıkça belirtmek isterseniz)
sudo ufw deny 3306/tcp

# Belirli bir port aralığına izin ver (örneğin FTP passive mode için)
sudo ufw allow 49152:65535/tcp

Servis İsmiyle Kural Yazma

UFW, /etc/services dosyasındaki servis isimlerini tanır. Port numarasını ezberlemek zorunda kalmazsınız:

sudo ufw allow http
sudo ufw allow https
sudo ufw allow ftp
sudo ufw allow smtp

IP Adresi Bazlı Kurallar

Belirli bir IP’den gelen trafiğe izin vermek veya engellemek çok yaygın bir senaryodur. Örneğin sadece ofis IP’nizden SSH erişimine izin vermek:

# Belirli bir IP'ye tamamen izin ver
sudo ufw allow from 203.0.113.50

# Belirli bir IP'nin sadece belirli porta erişimine izin ver
sudo ufw allow from 203.0.113.50 to any port 22

# Bir subnet'ten erişime izin ver
sudo ufw allow from 192.168.1.0/24 to any port 3306

Son örnekteki senaryo çok gerçekçidir. MySQL’i internete açmazsınız ama iç ağdaki uygulama sunucularının erişmesi gerekir. Sadece iç subnet’e izin vermek doğru yaklaşımdır.

Kural Silme

Yanlış bir kural eklediyseniz veya artık gerekli değilse silmek için iki yöntem vardır:

Kural numarasıyla silme (en kolay yol):

sudo ufw status numbered

Bu komut çıktısında her kuralın başında bir numara görürsünüz. Örneğin 3 numaralı kuralı silmek için:

sudo ufw delete 3

Kural içeriğiyle silme:

sudo ufw delete allow 80/tcp

Uygulama Profilleri

UFW’nin güzel özelliklerinden biri uygulama profilleridir. Nginx, Apache, OpenSSH gibi yaygın uygulamalar kendi profil dosyalarını /etc/ufw/applications.d/ dizinine koyar.

Mevcut profilleri görmek için:

sudo ufw app list

Bir profilin detaylarına bakmak için:

sudo ufw app info 'Nginx Full'

Bu komut size profilin hangi portları kapsadığını gösterir. Nginx Full hem 80 hem 443 portunu içerir. Kullanmak için:

sudo ufw allow 'Nginx Full'

Eğer sunucunuzda henüz HTTPS sertifikanız yoksa ve sadece HTTP ile başlamak istiyorsanız:

sudo ufw allow 'Nginx HTTP'

Sertifikayı aldıktan sonra HTTP kuralını silip Full ekleyebilirsiniz.

Gerçek Dünya Senaryoları

Senaryo 1: Temel Web Sunucusu

Bir VPS üzerinde web sitesi barındırıyorsunuz. SSH, HTTP ve HTTPS açık olacak, geri kalan her şey kapalı:

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

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

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

# Aktifleştir
sudo ufw enable

# Kontrol et
sudo ufw status verbose

Bu kurulum çoğu web sunucusu için yeterlidir.

Senaryo 2: Veritabanı Sunucusu

Bir uygulama sunucunuz (192.168.10.5) ve ayrı bir veritabanı sunucunuz var. Veritabanı sunucusunda sadece uygulama sunucusunun MySQL’e erişmesine izin vereceksiniz:

sudo ufw default deny incoming
sudo ufw default allow outgoing

# Yönetim için SSH sadece iç ağdan
sudo ufw allow from 192.168.10.0/24 to any port 22

# MySQL sadece uygulama sunucusundan
sudo ufw allow from 192.168.10.5 to any port 3306

sudo ufw enable

Bu yapıda veritabanı sunucusu internete tamamen kapalıdır, sadece belirli bir iç IP erişebilir.

Senaryo 3: Kötü Niyetli IP’yi Engelleme

Loglarınızda 185.220.101.45 adresinin sürekli brute-force denemesi yaptığını gördünüz:

sudo ufw deny from 185.220.101.45

Bir subnet’in tamamını engellemek için:

sudo ufw deny from 185.220.101.0/24

Bu kural, o IP veya subnet’ten gelen tüm trafiği düşürür. Kural sıralaması önemlidir; UFW kuralları yukarıdan aşağıya işler ve eşleşen ilk kuralı uygular.

Senaryo 4: Oran Sınırlama (Rate Limiting)

UFW’nin az bilinen ama çok kullanışlı özelliği oran sınırlamadır. SSH brute-force saldırılarına karşı çok etkilidir. 30 saniye içinde 6’dan fazla bağlantı denemesi yapan IP’yi otomatik engeller:

sudo ufw limit ssh

Özel port kullanıyorsanız:

sudo ufw limit 2222/tcp

Bu tek satır, basit bir Fail2ban benzeri koruma sağlar. Küçük sunucularda ek araç kurmadan işe yarar.

Loglama

UFW logları syslog üzerinden yönetilir ve /var/log/ufw.log dosyasına yazılır. Varsayılan log seviyesi low‘dur, sadece engellenen paketleri kaydeder.

Log seviyelerini ayarlamak için:

# Düşük seviye (varsayılan) - engellenen paketler
sudo ufw logging low

# Orta seviye - engellenen ve izin verilen paketler
sudo ufw logging medium

# Yüksek seviye - tüm paketler (disk dolabilir, dikkatli kullanın)
sudo ufw logging high

Log dosyasını canlı takip etmek için:

sudo tail -f /var/log/ufw.log

Örnek bir log satırı şöyle görünür:

[UFW BLOCK] IN=eth0 OUT= MAC=... SRC=45.142.212.100 DST=203.0.113.10 PROTO=TCP DPT=22

Bu çıktıda SRC kaynağı, DST hedefi, DPT ise hedef portu gösterir. SSH portuna gelen ve engellenen bir deneme bu.

UFW Kurallarını Yönetme

Kuralları Listeleme

# Basit liste
sudo ufw status

# Numara ile liste (silme için)
sudo ufw status numbered

# Detaylı liste (politikalar dahil)
sudo ufw status verbose

UFW’yi Devre Dışı Bırakma ve Sıfırlama

Bazen test ortamında UFW’yi geçici kapatmak gerekir:

sudo ufw disable

Bu komut UFW’yi durdurur ama kuralları silmez. ufw enable ile tekrar açabilirsiniz.

Her şeyi silip sıfırdan başlamak için:

sudo ufw reset

Bu komut tüm kuralları siler ve UFW’yi devre dışı bırakır. Dikkatli kullanın, geri alamazsınız.

IPv6 Desteği

Modern sunucularda IPv6 desteği önemlidir. UFW varsayılan olarak IPv6 kurallarını da uygular, ama bunu doğrulamanız gerekir:

sudo nano /etc/default/ufw

Dosyada şu satırın yes olduğundan emin olun:

IPV6=yes

Değişiklik yaptıysanız UFW’yi yeniden başlatın:

sudo ufw disable && sudo ufw enable

IPv6 etkin olduğunda ufw allow ssh komutu hem IPv4 hem IPv6 için kural oluşturur.

Gelişmiş Kural Yazımı

Birden Fazla Portu Tek Komutla Açma

Her port için ayrı komut yazmak yerine virgülle birleştirebilirsiniz. Ama UFW bu syntaxı doğrudan desteklemez, bunun yerine port aralığı veya uygulama profili kullanmanız gerekir. Alternatif olarak bir script yazabilirsiniz:

#!/bin/bash
PORTS=(80 443 8080 8443)
for port in "${PORTS[@]}"; do
    sudo ufw allow $port/tcp
done

Çıkış Trafiği Kuralları

Giden trafiği de kontrol etmek istiyorsanız önce varsayılanı değiştirin:

sudo ufw default deny outgoing

Sonra ihtiyaç duyduklarınıza izin verin:

# DNS
sudo ufw allow out 53
# HTTP ve HTTPS
sudo ufw allow out 80/tcp
sudo ufw allow out 443/tcp
# NTP (zaman senkronizasyonu)
sudo ufw allow out 123/udp
# SMTP (mail göndermek için)
sudo ufw allow out 587/tcp

Bu yaklaşım hassas ortamlarda (ödeme sistemleri, kişisel veri işleyen sunucular) iyi bir pratiktir. Sunucunun sadece ihtiyaç duyduğu yerlere bağlanmasına izin verirsiniz.

UFW ve Docker Dikkat Edilmesi Gereken Nokta

UFW kullanıcılarının sık düştüğü bir tuzak Docker ile ilgilidir. Docker, iptables‘ı doğrudan manipüle eder ve UFW kurallarını bypass edebilir. Yani UFW ile kapattığınızı düşündüğünüz bir port, Docker üzerinden hala açık kalabilir.

Bu durumu engellemek için /etc/docker/daemon.json dosyasını düzenleyebilirsiniz:

sudo nano /etc/docker/daemon.json

Şu satırı ekleyin:

{
  "iptables": false
}

Ama bu Docker’ın bazı ağ özelliklerini kırar. Daha iyi yaklaşım, container’ları 127.0.0.1 üzerinden bind etmek ve sadece ihtiyaç duyulan portları UFW ile açmaktır. Bu konu ayrı bir yazıyı hak ediyor, ama farkında olmanız gereken önemli bir detay.

Sık Yapılan Hatalar

  • UFW’yi etkinleştirmeden önce SSH kuralı eklememek: En klasik hata. Kendinizi sunucudan kilitlersiniz.
  • ufw reset sonrası UFW’nin disable kalmasını unutmak: Sıfırladıktan sonra tekrar enable etmeyi unutabilirsiniz.
  • Log seviyesini high yapmak: Yoğun trafikli sunucularda diski hızla doldurur.
  • Docker bypass sorununu görmezden gelmek: Yukarıda anlattım, önemli bir güvenlik açığı.
  • Kural sıralamasını dikkate almamak: Önce deny from X, sonra allow from X to port Y gibi çakışan kurallar beklediğiniz gibi çalışmayabilir.

Sonuç

UFW, Linux güvenlik duvarı yönetimini ciddi ölçüde basitleştiren pratik bir araçtır. iptables‘ın karmaşıklığından korkmadan güçlü güvenlik politikaları oluşturabilirsiniz. Bu yazıda öğrendiklerinizle bir web sunucusunu, veritabanı sunucusunu veya karmaşık bir multi-tier mimarisini güvenli hale getirebilirsiniz.

Başlangıç için altın kuralı hatırlayın: Önce SSH kuralını ekle, sonra UFW’yi aktifleştir. Varsayılan olarak her şeyi kapat, sadece ihtiyacın olanları aç. Rate limiting ile brute-force saldırılarına karşı ekstra katman ekle. Logları takip et ve şüpheli IP’leri zamanında engelle.

UFW bir başlangıç noktasıdır. Daha karmaşık senaryolar için fail2ban ile entegrasyon, iptables kurallarını doğrudan UFW altına ekleme veya nftables‘a geçiş gibi konuları da incelemenizi öneririm. Güvenlik katmanlardan oluşur, UFW bu katmanların en temel ve en önemlilerinden biridir.

Yorum yapın