Ubuntu sunucunu ilk kurduğunda güvenlik duvarını yapılandırmak genellikle listenin en başında yer alır. Ama iptables kurallarıyla boğuşmak, özellikle yeni başlayanlar için ciddi bir engel oluşturabilir. İşte tam bu noktada ufw devreye giriyor. “Uncomplicated Firewall” yani karmaşık olmayan güvenlik duvarı anlamına gelen ufw, iptables’ın üzerine oturmuş bir soyutlama katmanıdır ve Ubuntu’da varsayılan olarak gelir. Bu yazıda ufw’yu sıfırdan öğrenecek, gerçek dünya senaryolarıyla pekiştirecek ve sunucularını ciddiye alan bir sysadmin gibi kullanmaya başlayacaksın.
ufw Nedir ve Neden Kullanmalısın
Linux dünyasında güvenlik duvarı yönetimi uzun yıllar boyunca doğrudan iptables komutlarıyla yapıldı. iptables güçlüdür, esnektir ama sözdizimi karmaşıklığıyla ünlüdür. Basit bir SSH portunu açmak için bile birden fazla kural yazmak gerekebilir.
ufw, bu süreci insanlar için okunabilir komutlara indirger. ufw allow ssh yazdığında arka planda iptables’a gerekli kuralları otomatik olarak ekler. Aynı işi iptables ile yapsan şunları yazman gerekirdi:
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT
ufw ile bu işi tek satırda hallediyorsun. Üstelik ufw sadece pratiklik sağlamıyor; kural dosyalarını kalıcı olarak kaydediyor, sistem yeniden başladığında otomatik olarak yüklüyor ve servis olarak yönetilebiliyor.
Kurulum ve İlk Başlangıç
Ubuntu 18.04 ve sonrasında ufw zaten kurulu gelir. Ama emin olmak istersen:
sudo apt update
sudo apt install ufw
Kurulumdan sonra ufw’nun durumunu kontrol etmek için:
sudo ufw status
Yeni bir sistemde muhtemelen Status: inactive göreceksin. ufw kurulu ama henüz aktif değil. Aktifleştirmeden önce en kritik adımı atman gerekiyor: SSH bağlantını kesmemek.
Bunu yaşayan her sysadmin bir daha yaşamamak için aklına kazır. Eğer uzaktaki bir sunucuda çalışıyorsan ve ufw’yu etkinleştirmeden önce SSH’a izin vermezsen, kendini sunucunun dışında bulursun. Kurtarmak için konsol erişimi veya cloud provider’ın web arayüzü gerekir.
O yüzden şu sırayla git:
sudo ufw allow ssh
sudo ufw enable
ufw enable komutunu çalıştırdığında sana “Bu komut mevcut SSH bağlantılarını etkileyebilir” diye uyarı verir. y diyerek onaylarsın ve ufw aktif hale gelir.
Temel Komutlar ve Kullanımı
Durumu Kontrol Etmek
sudo ufw status verbose
verbose parametresi sana daha ayrıntılı bilgi verir. Hangi kuralların aktif olduğunu, varsayılan politikaları ve yönlendirme ayarlarını görebilirsin. Normal status komutu sadece temel kuralları listeler, verbose ise tüm resmi ortaya koyar.
Port ve Servis İzinleri Vermek
ufw’nun en güzel özelliklerinden biri servis isimlerini anlayabilmesidir. /etc/services dosyasındaki tanımlı servisleri doğrudan kullanabilirsin:
sudo ufw allow http
sudo ufw allow https
sudo ufw allow ftp
sudo ufw allow smtp
Port numarasıyla da aynı işi yapabilirsin:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 8080
Port numarası verip protokol belirtmezsen ufw hem TCP hem UDP için kural ekler. Çoğu zaman bu sorun yaratmaz ama hassas konfigürasyonlarda protokolü açıkça belirtmek daha doğru olur.
Kural Silmek
İzin verdiğin bir kurali kaldırmak istediğinde iki yöntem vardır.
Birinci yöntem, doğrudan kurali tekrar yazıp başına delete eklemek:
sudo ufw delete allow http
sudo ufw delete allow 8080
İkinci yöntem, kural numarasıyla silmek. Önce numaralı listeyi görüntüle:
sudo ufw status numbered
Çıktıda her kuralın başında bir numara göreceksin. Ardından:
sudo ufw delete 3
Bu yöntem özellikle karmaşık kuralları silerken daha güvenilirdir çünkü tam olarak hangi kuralı sildiğini biliyorsun.
Belirli IP Adresinden Erişime İzin Vermek
Güvenlik açısından en önemli pratiklerden biri, tüm dünyaya açmak yerine sadece belirli IP adreslerine izin vermektir. Özellikle SSH, veritabanı portları ve yönetim arayüzleri için bu yaklaşımı kesinlikle benimse.
sudo ufw allow from 192.168.1.100
sudo ufw allow from 192.168.1.100 to any port 22
sudo ufw allow from 10.0.0.0/24 to any port 3306
Son örnekte 10.0.0.0/24 subnet’indeki tüm makinelerin 3306 portuna (MySQL) erişmesine izin veriyorsun. Bu, yerel ağdaki uygulama sunucularının veritabanına bağlanması için ideal bir konfigürasyondur.
Engelleme Kuralları
Varsayılan olarak ufw gelen tüm trafiği engeller (deny) ama bazen belirli IP adreslerini veya portları açıkça reddetmek istersin. deny ile reject arasındaki fark önemlidir:
- deny: Paketi sessizce düşürür, gönderene hiçbir şey söylemez
- reject: Paketi reddeder ve gönderene hata mesajı döner
sudo ufw deny from 203.0.113.100
sudo ufw reject from 203.0.113.100 to any port 22
Güvenlik perspektifinden bakıldığında deny genellikle tercih edilir çünkü saldırgana sunucunun varlığı hakkında bile bilgi vermezsin.
Varsayılan Politikaları Ayarlamak
ufw’nun temelini varsayılan politikalar oluşturur. Bu politikalar, eşleşen özel bir kural yoksa ne yapılacağını belirler.
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw default deny forward
Bu üç kural, tipik bir sunucu için ideal başlangıç noktasıdır:
- Gelen tüm trafik varsayılan olarak engellenir
- Sunucudan çıkan trafik serbesttir
- Yönlendirme (routing) varsayılan olarak kapalıdır
“Default deny” yaklaşımı güvenlik temel prensiplerindendir. İzin listesi (whitelist) oluşturmak, engelleme listesi (blacklist) oluşturmaktan çok daha güvenlidir. Ne açacağını bilirsin, ama neyi kapatmayı unuttuğunu bilemezsin.
Uygulama Profilleri
ufw, yaygın uygulamalar için hazır profiller sunar. Bu profiller /etc/ufw/applications.d/ dizininde tanımlıdır. Mevcut profilleri görmek için:
sudo ufw app list
Muhtemelen şuna benzer bir çıktı göreceksin:
Available applications:
Apache
Apache Full
Apache Secure
Nginx Full
Nginx HTTP
Nginx HTTPS
OpenSSH
Bir profilin detaylarına bakmak için:
sudo ufw app info 'Nginx Full'
Bu profili kullanmak için:
sudo ufw allow 'Nginx Full'
Nginx Full profili hem 80 hem de 443 portunu açar. Nginx HTTP sadece 80’i, Nginx HTTPS sadece 443’ü açar. Let’s Encrypt ile SSL sertifikası almadan önce 80’i açık tutman gerektiğinden, bu profiller arasında geçiş yapmak sıkça kullanılan bir pratiktir:
# Başlangıçta sadece HTTP
sudo ufw allow 'Nginx HTTP'
# SSL aldıktan sonra full profile geç
sudo ufw delete allow 'Nginx HTTP'
sudo ufw allow 'Nginx Full'
Gerçek Dünya Senaryoları
Senaryo 1: Web Sunucusu Konfigürasyonu
Bir web sunucusu kuruyorsun. Nginx çalışıyor, Let’s Encrypt sertifikası var, ama SSH erişimini sadece kendi IP adresinle sınırlamak istiyorsun.
# Önce varsayılan politikaları ayarla
sudo ufw default deny incoming
sudo ufw default allow outgoing
# Kendi IP'nden SSH erişimi
sudo ufw allow from 85.23.145.67 to any port 22
# Web trafiği herkese açık
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# ufw'yu aktifleştir
sudo ufw enable
# Durumu kontrol et
sudo ufw status verbose
Senaryo 2: Veritabanı Sunucusu Güvenliği
MySQL veya PostgreSQL çalışan bir veritabanı sunucusu var. Bu sunucuya sadece uygulama sunucularının erişmesini istiyorsun, dışarıya kapalı olmalı.
# SSH sadece yönetim ağından
sudo ufw allow from 10.10.0.0/24 to any port 22
# MySQL sadece uygulama sunucularından
sudo ufw allow from 10.10.1.10 to any port 3306
sudo ufw allow from 10.10.1.11 to any port 3306
# PostgreSQL kullanıyorsan
sudo ufw allow from 10.10.1.10 to any port 5432
# Her şey kapalı
sudo ufw default deny incoming
sudo ufw enable
Senaryo 3: Saldırı Altındaki Sunucu
Sunucunu taramaya çalışan veya brute-force saldırısı yapan bir IP adresini tespit ettin.
# Önce o IP'yi tamamen engelle
sudo ufw insert 1 deny from 198.51.100.50
# Bir subnet'ten geliyorsa
sudo ufw insert 1 deny from 198.51.100.0/24
# insert 1 komutu kuralı listenin en başına ekler
# Bu sayede engelleme kuralı diğer izin kurallarından önce çalışır
insert komutunu fark ettin mi? Normalde ufw allow veya ufw deny kuralları listenin sonuna eklenir. Ama ufw insert 1 kuralı listenin en başına, birinci sıraya koyar. ufw kuralları sırayla işlediğinden, engelleme kuralının başta olması önemlidir.
Senaryo 4: Port Aralığı Açmak
Bazı uygulamalar geniş port aralıkları kullanır. Örneğin passive FTP veya oyun sunucuları:
# Port aralığı için protokol zorunlu
sudo ufw allow 49152:65535/tcp
sudo ufw allow 49152:65535/udp
# Belirli bir IP için port aralığı
sudo ufw allow from 192.168.1.0/24 to any port 6000:6010 proto tcp
Gelişmiş Konfigürasyon: /etc/ufw/before.rules
ufw’nun GUI’si güzel ama bazen iptables’ın ham gücüne ihtiyaç duyarsın. /etc/ufw/before.rules ve /etc/ufw/after.rules dosyaları bu ihtiyacı karşılar. Bu dosyalara iptables kurallarını doğrudan yazabilirsin, ufw bunları kendi kurallarıyla birlikte uygular.
Örneğin ping’e (ICMP) izin vermek veya engellemek istiyorsun. /etc/ufw/before.rules dosyasında şu satırları bulacaksın:
# ok icmp codes for INPUT
-A ufw-before-input -p icmp --icmp-type destination-unreachable -j ACCEPT
-A ufw-before-input -p icmp --icmp-type time-exceeded -j ACCEPT
-A ufw-before-input -p icmp --icmp-type parameter-problem -j ACCEPT
-A ufw-before-input -p icmp --icmp-type echo-request -j ACCEPT
Son satırdaki echo-request ping’e karşılık gelir. Bunu DROP olarak değiştirirsen sunucun ping’e cevap vermez. Bazı güvenlik politikaları bunu gerektirir.
Değişiklik yaptıktan sonra ufw’yu yeniden yükle:
sudo ufw reload
Loglama
ufw’nun loglama özelliği, şüpheli aktiviteleri takip etmek için kritik öneme sahiptir.
# Loglama seviyelerini ayarla
sudo ufw logging off
sudo ufw logging low
sudo ufw logging medium
sudo ufw logging high
sudo ufw logging full
- low: Engellenen paketleri ve geçersiz paketleri loglar
- medium: low’a ek olarak izin verilen yeni bağlantıları loglar
- high: Hız sınırlı loglama ile tüm paketleri loglar
- full: Hız sınırı olmadan tüm paketleri loglar
Loglar /var/log/ufw.log dosyasına veya syslog aracılığıyla /var/log/syslog‘a yazılır.
# Gerçek zamanlı log takibi
sudo tail -f /var/log/ufw.log
# Engellenen bağlantıları filtrele
sudo grep "BLOCK" /var/log/ufw.log | tail -20
# Belirli bir IP'yi ara
sudo grep "SRC=198.51.100.50" /var/log/ufw.log
Loglama seviyesini medium olarak ayarlamak çoğu durumda yeterlidir. full seviye yüksek trafikli sunucularda disk dolmasına neden olabilir, dikkatli ol.
Rate Limiting ile Brute Force Koruması
ufw’nun az bilinen ama çok değerli özelliklerinden biri rate limiting’dir. Özellikle SSH için brute-force saldırılarına karşı basit ama etkili bir koruma sunar.
sudo ufw limit ssh
Bu komut, 30 saniye içinde 6’dan fazla bağlantı girişimi yapan IP adresini geçici olarak engeller. fail2ban kadar gelişmiş değil ama basit bir koruma katmanı olarak değerlidir. Özellikle fail2ban kurmadan önce veya minimal sistemlerde bu yeterli olabilir.
Özel port için:
sudo ufw limit 2222/tcp
Kuralları Yedeklemek ve Geri Yüklemek
Karmaşık bir konfigürasyon oluşturduktan sonra bunu yedeklemek akıllıca olur. ufw kuralları /etc/ufw/ dizininde saklanır. Tüm konfigürasyonu yedeklemek için:
sudo cp -r /etc/ufw/ /root/ufw-backup-$(date +%Y%m%d)
Kuralları sıfırlamak istediğinde:
sudo ufw reset
Bu komut tüm kuralları siler ve ufw’yu devre dışı bırakır. Dikkatli kullan, özellikle uzak sunucularda.
Kuralları dışa aktarmak için başka bir yöntem iptables üzerinden gitmektir:
sudo iptables-save > /root/firewall-rules-$(date +%Y%m%d).txt
IPv6 Desteği
Ubuntu’da IPv6 kullanıyorsan ufw’nun bunu desteklemesini sağlamalısın. /etc/default/ufw dosyasını aç:
sudo nano /etc/default/ufw
Şu satırın yes olduğundan emin ol:
IPV6=yes
Bu ayar aktifken ufw, eklediğin kuralları otomatik olarak hem IPv4 hem IPv6 için uygular. ufw allow ssh dediğinde hem iptables hem de ip6tables‘a kural eklenir.
Kontrol Listesi: Yeni Sunucu Güvenlik Duvarı Kurulumu
Yeni bir Ubuntu sunucusu açtığında şu adımları sırayla takip et:
- Önce SSH’a izin ver:
sudo ufw allow ssh - Varsayılan politikaları ayarla:
sudo ufw default deny incomingvesudo ufw default allow outgoing - Gerekli servislere izin ver (web, uygulama portları vb.)
- Yönetim erişimlerini IP kısıtlamasına al
- SSH için rate limiting ekle:
sudo ufw limit ssh - ufw’yu aktifleştir:
sudo ufw enable - Durumu kontrol et:
sudo ufw status verbose - Loglama’yı aç:
sudo ufw logging medium - Yeni bir terminal açıp SSH bağlantını test et (mevcut bağlantıyı kapatmadan önce)
Son madde altın kuraldır. Konfigürasyonu test etmeden mevcut bağlantını kapatma. Yeni terminal açıp bağlanabildiğini doğruladıktan sonra rahatlayabilirsin.
Sonuç
ufw, güvenlik duvarı yönetimini sysadmin’ler için erişilebilir kılan nadir araçlardan biri. iptables’ın karmaşıklığını gizleyerek sana okunabilir, yönetilebilir ve tekrarlanabilir bir arayüz sunar. Bu yazıda temel kullanımdan başlayıp gerçek dünya senaryolarına, rate limiting’den loglama’ya kadar geniş bir yelpazede ufw’yu ele aldık.
Şunu unutma: En iyi güvenlik duvarı aktif olan güvenlik duvarıdır. Mükemmel konfigürasyon bekleyerek ufw’yu devre dışı bırakmak, hatalı bir konfigürasyondan çok daha tehlikelidir. Yeni bir sunucu açtığında ilk iş SSH’a izin ver, sonra ufw’yu etkinleştir. Geri kalanını zamanla öğrenir, düzenler ve iyileştirirsin.
Daha gelişmiş senaryolar için ufw’nun yetersiz kaldığı noktalarda doğrudan iptables veya nftables’a geçebilirsin. Ama %90 kullanım senaryosu için ufw fazlasıyla yeterlidir ve basitliği en büyük gücüdür.