UFW ile Giden Trafik Kuralları Tanımlama

Ç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.

Yorum yapın