Çoğu sistem yöneticisi UFW kurallarını yazarken sadece gelen trafiğe odaklanır. “Dışarıdan kimse giremez, tamam” mantığıyla çalışırlar. Ama sunucunuzun ne gönderdiği de en az ne aldığı kadar önemlidir. Bir sunucu ele geçirildiğinde saldırganın ilk yaptığı şey genellikle dışarıya bağlantı kurmaktır: komuta-kontrol sunucusuna bağlanmak, veri sızdırmak veya başka sistemlere saldırı başlatmak. Giden trafik kuralları olmadan bu hareketleri göremez ve engelleyemezsiniz.
Bu yazıda UFW ile giden trafik yönetimini derinlemesine ele alacağız. Temel sözdiziminden başlayıp gerçek dünya senaryolarına kadar her şeyi inceleyeceğiz.
UFW’de Varsayılan Giden Trafik Politikası
UFW kurulumdan sonra gelen trafiği varsayılan olarak reddeder, ancak giden trafiğe tam izin verir. Bu davranış /etc/default/ufw dosyasında tanımlanır.
cat /etc/default/ufw | grep DEFAULT_OUTPUT
# DEFAULT_OUTPUT_POLICY="ACCEPT"
Bu ayar “sunucudan her yere her şey gidebilir” anlamına gelir. Bir web sunucusu için bu kabul edilebilir görünebilir, ama kritik veriler barındıran bir veritabanı sunucusu veya güvenli bir uygulama sunucusu için son derece tehlikelidir.
Varsayılan giden politikasını değiştirmek için:
sudo ufw default deny outgoing
Bu komutu çalıştırmadan önce dikkatli olun. Eğer mevcut bir SSH oturumundaysanız ve gerekli kuralları eklemediyseniz, oturumunuz kopabilir. Önce tüm izin verilecek giden trafiği tanımlayın, sonra bu komutu çalıştırın.
Politikayı kontrol etmek için:
sudo ufw status verbose
# Status: active
# Default: deny (incoming), deny (outgoing), deny (routed)
Temel Giden Trafik Kuralı Sözdizimi
UFW’de giden kurallar allow out veya deny out komutuyla tanımlanır. Sözdizimi gelen kurallarla benzerdir ama yön belirtmek zorunludur.
# Belirli bir porta giden trafiğe izin ver
sudo ufw allow out 80/tcp
sudo ufw allow out 443/tcp
# Belirli bir porta giden trafiği reddet
sudo ufw deny out 25/tcp
# Belirli bir IP adresine giden trafiğe izin ver
sudo ufw allow out to 8.8.8.8
# Belirli bir IP'ye belirli porta giden trafiğe izin ver
sudo ufw allow out to 192.168.1.100 port 5432
Gelen ve giden kuralları karşılaştıralım. in ve out yönlerini açıkça belirtmezseniz UFW bazı durumlarda beklenmedik davranış sergileyebilir:
# Bu kural sadece gelen trafiği etkiler
sudo ufw allow 22/tcp
# Bu kural sadece giden trafiği etkiler
sudo ufw allow out 22/tcp
# Her iki yönü de kapsamaz, dikkat!
Gerçek Dünya Senaryosu: Web Sunucusu Güvenlik Profili
Bir web sunucunuz var ve bu sunucunun internete yapabileceği bağlantıları kısıtlamak istiyorsunuz. Sunucu şunları yapabilmelidir:
- DNS sorguları yapabilmeli (port 53)
- HTTP/HTTPS güncellemeleri alabilmeli (port 80/443)
- NTP ile saat senkronizasyonu yapabilmeli (port 123)
- Kendi veritabanı sunucusuna bağlanabilmeli
Önce mevcut kuralları temizleyelim ve sıfırdan başlayalım:
# Önce mevcut durumu kontrol et
sudo ufw status numbered
# Varsayılan politikaları ayarla
sudo ufw default deny incoming
sudo ufw default deny outgoing
# Gelen kurallar
sudo ufw allow in 22/tcp # SSH
sudo ufw allow in 80/tcp # HTTP
sudo ufw allow in 443/tcp # HTTPS
# Giden kurallar - DNS
sudo ufw allow out 53/tcp
sudo ufw allow out 53/udp
# Giden kurallar - HTTP/HTTPS (paket güncellemeleri için)
sudo ufw allow out 80/tcp
sudo ufw allow out 443/tcp
# Giden kurallar - NTP
sudo ufw allow out 123/udp
# Veritabanı sunucusuna özel bağlantı (192.168.10.5)
sudo ufw allow out to 192.168.10.5 port 5432 proto tcp
# SSH giden (uzak sistemlere bağlanmak gerekirse)
sudo ufw allow out 22/tcp
Protokol ve Arayüz Bazlı Giden Kurallar
UFW, ağ arayüzü bazında kural tanımlamaya izin verir. Bu özellikle çok ağ kartı olan sunucularda çok işe yarar.
# eth0 arayüzünden sadece belirli trafiğe izin ver
sudo ufw allow out on eth0 to any port 443 proto tcp
# Belirli bir arayüzden tüm giden trafiği engelle
sudo ufw deny out on eth1
# Loopback arayüzüne giden trafiğe izin ver (hizmetler arası iletişim için şart)
sudo ufw allow out on lo
Loopback trafiği için dikkat edilmesi gereken önemli bir nokta var. Varsayılan giden politikasını deny yaptığınızda loopback trafiği de etkilenebilir. Bu durum yerel hizmetlerin birbirleriyle iletişimini koparır. Loopback’i her zaman açık tutun:
sudo ufw allow out on lo to 127.0.0.0/8
sudo ufw allow in on lo from 127.0.0.0/8
IP Aralığı ve Subnet Bazlı Kurallar
Sadece belirli IP bloklarına giden trafiğe izin vermek, özellikle kurumsal ortamlarda yaygın bir ihtiyaçtır.
# Tüm iç ağa giden trafiğe izin ver
sudo ufw allow out to 192.168.0.0/16
# Belirli bir subnet'e sadece belirli porta
sudo ufw allow out to 10.0.0.0/8 port 22 proto tcp
# Bir IP aralığını tamamen engelle
sudo ufw deny out to 203.0.113.0/24
# Birden fazla kuralı sıralı uygulama - önce engelle, sonra istisnalar
sudo ufw deny out to 10.10.0.0/24
sudo ufw allow out to 10.10.0.5 port 443 proto tcp
Önemli Not: UFW kuralları sırayla işlenir. İlk eşleşen kural uygulanır. Bu yüzden daha spesifik kuralları daha genel kurallardan önce yazmanız gerekir. Kural numaralarını görmek için sudo ufw status numbered komutunu kullanın.
Gerçek Dünya Senaryosu: Veritabanı Sunucusu Sıkılaştırması
Bir PostgreSQL veritabanı sunucusu düşünün. Bu sunucunun dışarıya bağlantı kurmasına neredeyse hiç gerek yok. Sadece sistem güncellemeleri ve zaman senkronizasyonu için erişime ihtiyacı var.
# Varsayılan politikalar
sudo ufw default deny incoming
sudo ufw default deny outgoing
# Sadece uygulama sunucusundan gelen DB bağlantısına izin ver
sudo ufw allow in from 10.0.1.50 to any port 5432 proto tcp
# Yönetim için SSH - sadece jump host'tan
sudo ufw allow in from 10.0.0.10 to any port 22 proto tcp
# Giden - Sadece paket güncellemeleri için
sudo ufw allow out to 91.189.88.0/21 port 80 proto tcp # Ubuntu mirror
sudo ufw allow out to 91.189.88.0/21 port 443 proto tcp
# DNS - sadece iç DNS sunucusuna
sudo ufw allow out to 10.0.0.53 port 53 proto udp
sudo ufw allow out to 10.0.0.53 port 53 proto tcp
# NTP - iç NTP sunucusuna
sudo ufw allow out to 10.0.0.1 port 123 proto udp
# Loopback zorunlu
sudo ufw allow out on lo
sudo ufw allow in on lo
# UFW'yi aktifleştir
sudo ufw enable
Bu yapılandırmayla veritabanı sunucusu sadece tanımlanmış hedeflere bağlanabilir. Bir saldırgan bu sunucuya erişse bile dışarıya veri sızdırmak için ciddi engellerle karşılaşır.
Uygulama Profilleri ile Giden Kural Yönetimi
UFW, /etc/ufw/applications.d/ dizininde tanımlı uygulama profillerini destekler. Kendi profilinizi oluşturarak tekrar kullanılabilir kural grupları oluşturabilirsiniz.
# Mevcut profilleri listele
sudo ufw app list
# Yeni bir profil oluştur
sudo nano /etc/ufw/applications.d/custom-web
Dosyanın içeriği:
[WebClient]
title=Web Client Outbound
description=Standard web client outbound rules
ports=80,443/tcp
[SecureMonitoring]
title=Monitoring Outbound
description=Monitoring system outbound connections
ports=9090,9100,4369/tcp
Profili kaydedin ve uygulayın:
# Profili güncelle
sudo ufw app update WebClient
# Profil bazlı giden kural ekle
sudo ufw allow out WebClient
# Profili kontrol et
sudo ufw app info WebClient
Kural Önceliği ve Çakışma Yönetimi
Giden kural çakışmaları özellikle büyük kuralset’lerde baş ağrısı yaratır. Kuralların sıralamasını ve numaralarını yönetmek önemlidir.
# Mevcut kuralları numaralı göster
sudo ufw status numbered
# Belirli bir konuma kural ekle (numara 3'ün önüne)
sudo ufw insert 3 allow out to 8.8.4.4 port 53 proto udp
# Bir kuralı sil
sudo ufw delete 5
# İki adımla kural silme (daha güvenli yöntem)
sudo ufw status numbered
sudo ufw delete allow out 8080/tcp
Karmaşık kural setlerini yönetmek için UFW’nin konfigürasyon dosyalarını doğrudan düzenlemek de mümkündür:
# Kullanıcı tanımlı kurallar bu dosyada saklanır
sudo nano /etc/ufw/user.rules
# IPv6 kuralları ayrı dosyada
sudo nano /etc/ufw/user6.rules
# Düzenlemelerden sonra UFW'yi yeniden yükle
sudo ufw reload
Loglama ile Giden Trafiği İzleme
Giden kural yazdınız ama çalışıyor mu? Hangi trafik engelleniyor? Bu soruları cevaplamak için loglama şart.
# Log seviyesini ayarla
sudo ufw logging on
sudo ufw logging medium # low, medium, high, full seçenekleri mevcut
# Belirli bir kural için loglama ekle
sudo ufw allow out log 443/tcp
sudo ufw deny out log 25/tcp
# Logları izle
sudo tail -f /var/log/ufw.log
# Sadece engellenen giden trafiği filtrele
sudo grep "UFW BLOCK.*OUT" /var/log/ufw.log | tail -20
Logları analiz etmek için basit bir komut kombinasyonu:
# En çok engellenen hedef portları bul
sudo grep "UFW BLOCK.*OUT" /var/log/ufw.log |
grep -oP 'DPT=K[0-9]+' |
sort | uniq -c | sort -rn | head -10
# Belirli bir IP'ye giden engellenen trafiği izle
sudo grep "UFW BLOCK.*OUT.*DST=8.8.8.8" /var/log/ufw.log
Gerçek Dünya Senaryosu: Docker ile UFW Entegrasyonu
Docker kullananlar bilir: Docker, iptables kurallarını doğrudan değiştirir ve UFW kurallarını bypass edebilir. Giden trafik kontrolü için bu durum özellikle önem taşır.
# Docker'ın iptables'ı değiştirmesini engelle
sudo nano /etc/docker/daemon.json
{
"iptables": false
}
# Docker'ı yeniden başlat
sudo systemctl restart docker
# Ardından UFW üzerinden Docker network trafiğini yönet
# Docker bridge network için giden kural
sudo ufw allow out on docker0 to any
# Container'lardan dışarıya belirli portlara izin ver
sudo ufw route allow out on docker0 to any port 443 proto tcp
sudo ufw route allow out on docker0 to any port 53 proto udp
Alternatif ve daha yaygın yaklaşım, /etc/ufw/before.rules dosyasına DOCKER-USER chain kuralları eklemektir:
sudo nano /etc/ufw/before.rules
Dosyanın başına, *filter satırından önce ekleyin:
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING ! -o docker0 -s 172.17.0.0/16 -j MASQUERADE
COMMIT
Ardından UFW’yi yeniden yükleyin:
sudo ufw reload
Giden SMTP Trafiğini Engelleme
Sunucunuzun spam botu olarak kullanılmasını önlemek için giden port 25 trafiğini engellemek standart bir güvenlik pratiğidir.
# Port 25'e giden SMTP trafiğini engelle
sudo ufw deny out 25/tcp
# Mail submission için 587 ve 465'e izin ver (gerekirse)
sudo ufw allow out 587/tcp # STARTTLS
sudo ufw allow out 465/tcp # SMTPS
# Belirli bir mail sunucusuna izin ver, diğerlerini engelle
sudo ufw deny out to any port 25 proto tcp
sudo ufw allow out to 10.0.0.25 port 25 proto tcp # Sadece iç mail relay
Bu yapılandırma sunucunuzun doğrudan dış dünyaya mail göndermesini engeller ama iç mail relay sunucusuna erişimi korur. Bir zararlı yazılım sunucunuza bulaşsa ve spam göndermeye çalışsa, bu kural onu durdurur.
UFW Kurallarını Test Etme ve Doğrulama
Kural yazdınız, ama doğru çalışıyor mu? Test etmeden geçmeyin.
# nc (netcat) ile giden bağlantı testi
nc -zv 8.8.8.8 53 # DNS erişimi
nc -zv google.com 443 # HTTPS erişimi
nc -zv smtp.gmail.com 25 # Bu engellenmeliydi
# curl ile HTTP/HTTPS testi
curl -v --max-time 5 https://google.com
curl -v --max-time 5 http://example.com
# traceroute ile giden yolu doğrula
traceroute google.com
# UFW kural durumunu detaylı kontrol et
sudo ufw status verbose
# iptables kurallarını doğrudan kontrol et (UFW arka planda bunları kullanır)
sudo iptables -L ufw-user-output -n -v
sudo iptables -L ufw-before-output -n -v
Bir kural çalışıp çalışmadığını anlamanın en kesin yolu loglamadır:
# Test için geçici log kuralı ekle
sudo ufw deny out log-all to 1.1.1.1 port 443 proto tcp
# Bağlantı dene
curl https://1.1.1.1
# Log'a bak
sudo grep "1.1.1.1" /var/log/ufw.log
# Test bittikten sonra kuralı kaldır
sudo ufw delete deny out log-all to 1.1.1.1 port 443 proto tcp
Kural Setini Yedekleme ve Geri Yükleme
Kapsamlı bir kural seti oluşturdunuz mu? Mutlaka yedekleyin.
# Mevcut kuralları dışa aktar
sudo ufw status verbose > /root/ufw-rules-backup-$(date +%Y%m%d).txt
# iptables bazlı tam yedek
sudo iptables-save > /root/iptables-backup-$(date +%Y%m%d).rules
sudo ip6tables-save > /root/ip6tables-backup-$(date +%Y%m%d).rules
# UFW konfigürasyon dosyalarını yedekle
sudo cp -r /etc/ufw /root/ufw-config-backup-$(date +%Y%m%d)
# Yedekten geri yükle
sudo cp /root/ufw-config-backup-20241201/* /etc/ufw/
sudo ufw reload
Kural değişikliklerini bir script haline getirmek uzun vadede çok daha sürdürülebilir bir yaklaşımdır:
#!/bin/bash
# /root/scripts/setup-ufw-outbound.sh
set -e
echo "UFW giden trafik kuralları yapılandırılıyor..."
# Mevcut kuralları temizle
ufw --force reset
# Varsayılan politikalar
ufw default deny incoming
ufw default deny outgoing
# Gelen kurallar
ufw allow in 22/tcp comment "SSH"
ufw allow in 80/tcp comment "HTTP"
ufw allow in 443/tcp comment "HTTPS"
# Giden kurallar - Temel
ufw allow out on lo comment "Loopback"
ufw allow out 53 comment "DNS"
ufw allow out 80/tcp comment "HTTP outbound"
ufw allow out 443/tcp comment "HTTPS outbound"
ufw allow out 123/udp comment "NTP"
# Giden kurallar - Uygulama spesifik
ufw allow out to 10.0.1.100 port 5432 proto tcp comment "PostgreSQL DB"
ufw deny out 25/tcp comment "Block direct SMTP"
# UFW'yi etkinleştir
ufw --force enable
ufw status verbose
echo "Konfigürasyon tamamlandi."
Sonuç
Giden trafik kuralları, çoğu sistem yöneticisinin ihmal ettiği ama güvenlik açısından kritik öneme sahip bir konudur. ufw default deny outgoing ile başlayıp ihtiyaç duyulan trafiği tek tek açmak, “en az ayrıcalık” prensibinin ağ güvenliğine uygulanmasıdır.
Özetlemek gerekirse:
- Varsayılan deny politikası ile başlayın, sonra gerekli trafiği açın
- Loopback trafiğini her zaman açık tutun, unutursanız yerel servisler çöker
- Loglama olmadan kör uçuyorsunuz, mutlaka açık tutun
- Kural sırasına dikkat edin, spesifik kurallar genel kurallardan önce gelmeli
- Script ile yönetin, elle tek tek kural girmek hata yaratır
- Düzenli test edin, kural yazmak yetmez, çalıştığını doğrulayın
- Docker kullananlar için ekstra dikkat, Docker iptables kurallarını bypass edebilir
Giden trafik kontrolü mükemmel bir güvenlik sağlamaz ama saldırganın hareket alanını ciddi ölçüde daraltır. Savunmada derinlik prensibi gereği, her katman önemlidir. UFW ile bu katmanı doğru kurmak hem öğrenmesi hem de yönetmesi kolaydır. Sisteminize harcadığınız bu ekstra saat, bir güvenlik olayında size çok daha büyük baş ağrılarından kurtarabilir.