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 resetsonrası UFW’nin disable kalmasını unutmak: Sıfırladıktan sonra tekrar enable etmeyi unutabilirsiniz.- Log seviyesini
highyapmak: 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, sonraallow from X to port Ygibi ç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.