Sunucunu yönetirken er ya da geç şu soruyla yüzleşeceksin: “Bu IP’den gelen trafiği nasıl keserim?” Belki bir bot saldırısı, belki kötü niyetli bir tarayıcı, belki de sadece belirli bir ülkeden gelen trafiği engellemek istiyorsun. UFW (Uncomplicated Firewall), bu işi Linux üzerinde kolayca yapmanı sağlayan en pratik araçlardan biri. Bugün UFW ile tek IP engellemeden tüm alt ağ bloklarına kadar her şeyi ele alacağız.
UFW Nedir ve Neden Kullanmalısın?
UFW, arka planda iptables kullanarak çalışan ancak çok daha basit bir sözdizimi sunan bir güvenlik duvarı yönetim aracıdır. Ubuntu, Debian ve türevi dağıtımlarda varsayılan olarak gelir. iptables’ın karmaşık kurallarıyla uğraşmak yerine ufw deny from 192.168.1.1 gibi okunabilir komutlar yazabiliyorsun.
Gerçek dünyada buna ihtiyaç duyduğun senaryolar şunlar olabilir:
- Brute force saldırıları: SSH portuna sürekli deneme yapan IP adreslerini engellemek
- DDoS azaltma: Belirli IP bloklarından gelen yoğun trafiği kesmek
- Coğrafi engelleme: Belirli ülkelerin IP aralıklarını bloklama
- İç ağ güvenliği: Yetkisiz alt ağların sunucuya erişmesini önlemek
- Scraper ve bot engelleme: Web siteni kazıyan otomatik botları durdurmak
Önce UFW’nun aktif olup olmadığını kontrol edelim:
sudo ufw status verbose
Eğer aktif değilse:
sudo ufw enable
> Dikkat: UFW’yu aktif etmeden önce SSH erişimine izin verdiğinden emin ol. Yoksa sunucundan kilitlenebilirsin.
sudo ufw allow ssh
sudo ufw enable
Tek IP Adresi Engelleme
En temel senaryo: bir IP adresinden gelen tüm bağlantıları engellemek. Diyelim ki 203.0.113.45 IP adresinden gelen şüpheli istekler log dosyalarına yansıyor.
sudo ufw deny from 203.0.113.45
Bu komut, söz konusu IP’den gelen tüm trafiği tüm portlara engeller. Kuralın eklendiğini doğrulamak için:
sudo ufw status numbered
Çıktıda şöyle bir şey görmelisin:
Status: active
To Action From
-- ------ ----
[ 1] Anywhere DENY IN 203.0.113.45
Eğer sadece belirli bir porta gelen trafiği engellemek istiyorsan, örneğin o IP’nin sadece web sunucuna erişmesini engellemek:
sudo ufw deny from 203.0.113.45 to any port 80
sudo ufw deny from 203.0.113.45 to any port 443
Ya da hem HTTP hem HTTPS’i tek seferde engellemek için proto tcp ile birleştirebilirsin:
sudo ufw deny proto tcp from 203.0.113.45 to any port 80,443
Alt Ağ (Subnet) Engelleme
Tek bir IP yerine tüm bir ağ bloğunu engellemek çok daha yaygın bir senaryo. CIDR notasyonunu kullanarak bunu kolayca yapabilirsin.
/24 Alt Ağı Engelleme
203.0.113.0/24 bloğu, 203.0.113.0 ile 203.0.113.255 arasındaki 256 IP adresini kapsar. Bir hosting firmasının veya VPN servisinin tüm IP bloğunu engellemek istediğinde bu yöntemi kullanırsın:
sudo ufw deny from 203.0.113.0/24
/16 Alt Ağı Engelleme
Daha geniş bir bloğu, örneğin 65.536 IP adresini kapsayan /16’yı engellemek:
sudo ufw deny from 198.51.0.0/16
Yaygın Kullanılan CIDR Notasyonları
- /32: Tek bir IP adresi (192.168.1.1/32)
- /24: 256 IP adresi (192.168.1.0/24)
- /16: 65.536 IP adresi (192.168.0.0/16)
- /8: 16.777.216 IP adresi (10.0.0.0/8)
Gerçek dünya örneği olarak, Tor çıkış düğümlerinin büyük bir kısmı belirli IP bloklarında toplanmıştır. Eğer Tor üzerinden gelen trafiği engellemek istiyorsan, toplu olarak bu blokları ekleyebilirsin:
sudo ufw deny from 185.220.0.0/16
sudo ufw deny from 199.249.230.0/24
Toplu IP Engelleme: Script Yaklaşımı
Yüzlerce IP’yi tek tek eklemek hem zaman alıcı hem de hata riski yüksek. Bu durumda bir bash scripti işini görür.
Diyelim ki /var/log/auth.log dosyasını analiz edip brute force deneyen IP’leri otomatik olarak engellemek istiyorsun:
#!/bin/bash
# blocked_ips.txt dosyasindaki IP'leri UFW'ya ekle
BLOCKED_LIST="/etc/ufw/blocked_ips.txt"
if [ ! -f "$BLOCKED_LIST" ]; then
echo "Engelleme listesi bulunamadi: $BLOCKED_LIST"
exit 1
fi
while IFS= read -r ip; do
# Yorum satirlarini ve bos satirlari atla
[[ "$ip" =~ ^#.*$ ]] && continue
[[ -z "$ip" ]] && continue
# IP zaten engelli mi kontrol et
if sudo ufw status | grep -q "$ip"; then
echo "[MEVCUT] $ip zaten engelli"
else
sudo ufw deny from "$ip"
echo "[EKLENDI] $ip engellendi"
fi
done < "$BLOCKED_LIST"
echo "Islem tamamlandi."
/etc/ufw/blocked_ips.txt dosyan şöyle görünebilir:
# Brute force saldirganlar
203.0.113.45
198.51.100.0/24
# Bilinen kotu aktörler
192.0.2.100
203.0.113.0/24
Bu scripti cron’a ekleyerek düzenli çalıştırabilirsin:
# Her gece 02:00'de calistir
0 2 * * * /usr/local/bin/block_ips.sh >> /var/log/ufw_block.log 2>&1
Kural Sıralaması ve Öncelik
UFW kuralları sırayla işlenir, yani yukarıdan aşağıya. İlk eşleşen kural uygulanır. Bu, bazen beklenmedik sonuçlar doğurabilir.
Örneğin, bir alt ağı engelleyip ama o ağ içindeki belirli bir IP’ye izin vermek istiyorsan sıraya dikkat etmen lazım:
# Önce izin ver (üst sırada olmalı)
sudo ufw allow from 203.0.113.50
# Sonra alt ağı engelle
sudo ufw deny from 203.0.113.0/24
Mevcut kural numaralarını görmek için:
sudo ufw status numbered
Belirli bir pozisyona kural eklemek için insert komutunu kullan:
# 1. pozisyona kural ekle (en üste)
sudo ufw insert 1 allow from 203.0.113.50
Bu özellikle kritik: eğer önce deny, sonra allow eklersen, allow kuralı hiçbir zaman işlemez çünkü deny daha önce eşleşir.
Belirli Bir Porta Yönelik Subnet Engelleme
Gerçek dünyada her zaman tüm trafiği engellemek istemeyebilirsin. Örneğin bir müşteri ağı sunucuna HTTP ile bağlanabilsin ama SSH ile bağlanmasın:
# 10.20.30.0/24 alt aginin SSH erisimini engelle
sudo ufw deny proto tcp from 10.20.30.0/24 to any port 22
# Ama HTTP erisime izin ver
sudo ufw allow proto tcp from 10.20.30.0/24 to any port 80
Database sunucusu örneği daha da kritik. MySQL varsayılan olarak dışarıya açık olmamalı, ama belirli bir uygulama sunucusu alt ağına izin verebilirsin:
# Tum disaridaki erisimi engelle
sudo ufw deny proto tcp from any to any port 3306
# Sadece uygulama sunucularinin alt agina izin ver
sudo ufw allow proto tcp from 10.0.1.0/24 to any port 3306
IPv6 Adresleri ve Alt Ağları Engelleme
IPv6 desteği UFW’da varsayılan olarak aktif, ama /etc/default/ufw dosyasından kontrol etmek iyi alışkanlık:
grep "IPV6" /etc/default/ufw
# IPV6=yes olmali
IPv6 adresi veya bloğunu engellemek sintaks olarak aynı:
# Tek IPv6 adresi
sudo ufw deny from 2001:db8::1
# IPv6 alt agi
sudo ufw deny from 2001:db8::/32
IPv6 bloklarını da aynı mantıkla yönetebilirsin. Özellikle botnet saldırılarında IPv6 blokları giderek daha sık karşımıza çıkıyor.
Kural Silme ve Yönetimi
Engellediğin bir IP’nin artık tehdit oluşturmadığını düşünüyorsan veya yanlış bir kural eklediysen kaldırmak için birkaç yöntem var.
Numara ile Silme
# Önce listeyi numara ile gör
sudo ufw status numbered
# Örneğin 3. kurali sil
sudo ufw delete 3
Kural Tanımı ile Silme
sudo ufw delete deny from 203.0.113.45
Tüm Kuralları Sıfırlama
Büyük bir hata yaptıysan ve sıfırdan başlamak istiyorsan:
sudo ufw reset
Bu komut tüm kuralları siler ve UFW’yu devre dışı bırakır. Sonrasında kurallarını yeniden eklemelisin.
Log İnceleme ve Engellenen Trafiği Görme
Engelleme kurallarının çalışıp çalışmadığını doğrulamak için UFW loglarını kullanabilirsin:
# UFW loglamasini aktif et
sudo ufw logging on
# Log seviyesini ayarla (low, medium, high, full)
sudo ufw logging medium
Logları izlemek için:
sudo tail -f /var/log/ufw.log
Belirli bir IP’nin engellenip engellenmediğini görmek için:
sudo grep "203.0.113.45" /var/log/ufw.log | tail -20
UFW log satırı genellikle şöyle görünür:
[UFW BLOCK] IN=eth0 OUT= MAC=... SRC=203.0.113.45 DST=10.0.0.1
LEN=44 TOS=0x00 PREC=0x00 TTL=238 ID=54321 PROTO=TCP
SPT=54231 DPT=22 WINDOW=1024 RES=0x00 SYN URGP=0
Bu satırda SRC kaynak IP, DPT hedef port, [UFW BLOCK] ise kuralın tetiklendiğini gösterir.
Gerçek Dünya Senaryosu: SSH Brute Force Engelleme
Sunucunun SSH loglarında şüpheli aktivite fark ettin. /var/log/auth.log dosyasını inceleyince yüzlerce başarısız giriş denemesi görüyorsun:
# Son 100 basarisiz SSH girisini gösteren IP'leri bul
grep "Failed password" /var/log/auth.log |
awk '{print $11}' |
sort | uniq -c |
sort -rn | head -20
Çıktıda 203.0.113.45 adresinden 847 başarısız deneme olduğunu görüyorsun. Hemen engelle:
sudo ufw deny from 203.0.113.45 to any port 22
Daha agresif bir yaklaşım olarak tüm trafiği engelle:
sudo ufw deny from 203.0.113.45
Aynı IP bloğundan başka saldırı denemeleri de geliyorsa alt ağı engelle:
sudo ufw deny from 203.0.113.0/24
Bu tür manuel işlemler için uzun vadede Fail2Ban gibi bir araçla UFW’yu entegre etmen önerilir. Ama acil durumda bu yöntem hızlı ve etkilidir.
Ülke Bazlı IP Bloklama
Sunucunun sadece belirli ülkelerden erişime ihtiyaç duyuyorsa (örneğin bir Türkiye’ye özel servis), diğer ülkelerin IP bloklarını engelleyebilirsin. Bunun için IP geolocation veritabanlarından yararlanırsın.
MaxMind GeoLite2 veya ipdeny.com gibi kaynaklardan ülke IP listelerini indirip toplu olarak UFW’ya ekleyebilirsin:
#!/bin/bash
# Belirtilen ulkenin IP bloklarini indir ve engelle
COUNTRY="cn" # Cin icin
URL="https://www.ipdeny.com/ipblocks/data/countries/${COUNTRY}.zone"
TMPFILE="/tmp/${COUNTRY}_ips.txt"
wget -q "$URL" -O "$TMPFILE"
if [ ! -s "$TMPFILE" ]; then
echo "IP listesi indirilemedi!"
exit 1
fi
COUNT=0
while IFS= read -r subnet; do
sudo ufw deny from "$subnet" > /dev/null 2>&1
COUNT=$((COUNT + 1))
done < "$TMPFILE"
echo "$COUNT subnet engellendi."
rm -f "$TMPFILE"
> Uyarı: Ülke bazlı engelleme yüzlerce veya binlerce kural oluşturabilir. Bu durum UFW performansını etkileyebilir. Büyük ölçekli coğrafi engelleme için ipset veya daha gelişmiş firewall çözümlerini tercih etmelisin.
UFW Kurallarını Yedekleme ve Geri Yükleme
Sunucu geçişi veya yedekleme senaryolarında UFW kurallarını export/import etmek önemli:
# Kural dosyalarini yedekle
sudo cp /etc/ufw/user.rules /backup/ufw_user_rules_$(date +%Y%m%d).bak
sudo cp /etc/ufw/user6.rules /backup/ufw_user6_rules_$(date +%Y%m%d).bak
# Yedekten geri yukle
sudo cp /backup/ufw_user_rules_20241201.bak /etc/ufw/user.rules
sudo ufw reload
Alternatif olarak aktif kuralları bir scripte dönüştürebilirsin:
# Mevcut kurallari göster ve dosyaya kaydet
sudo ufw status verbose > /backup/ufw_rules_$(date +%Y%m%d).txt
Performans ve Ölçeklenebilirlik Notları
UFW ve iptables kural tabanlı çalışır. Her paket tüm kurallara karşı kontrol edilir. Az sayıda kural için bu sorun değil, ama yüzlerce kural oluşturduğunda performans düşüşü yaşayabilirsin.
Büyük IP listeleri için şunları göz önünde bulundur:
- ipset kullanımı: Binlerce IP’yi tek bir “set” olarak yönetmek için ipset aracına bak. iptables ile birlikte çok daha verimli çalışır
- Kural konsolidasyonu: Birbiriyle örtüşen kuralları birleştir. Örneğin /24 ve /16 bloğuna ayrı ayrı kural eklemek yerine /16 yeterli
- Periyodik temizlik: Artık geçerli olmayan kuralları düzenli olarak kaldır
500’den fazla kural ekleyeceksen UFW yerine doğrudan iptables veya nftables kullanmayı ciddi şekilde değerlendir.
Sonuç
UFW ile IP ve alt ağ engelleme, Linux sunucu yönetiminin temel becerilerinden biri. Tek bir komutla tek IP engelleyebilir, CIDR notasyonuyla tüm ağ bloklarını kapsamlı şekilde yönetebilirsin. Kural sıralamasına dikkat etmek, logları düzenli izlemek ve büyük listeler için script yaklaşımı benimsemek bu işi çok daha yönetilebilir kılar.
Pratikte en sık karşılaştığın senaryo SSH brute force olacak ve ufw deny from komutu çoğu zaman ilk müdahale aracın olacak. Uzun vadede Fail2Ban ile UFW entegrasyonunu kurman, bu manuel işlemleri otomatize etmeni sağlar. Ama acil durumda bu yazıdaki yöntemler seni toparlayacaktır.
Güvenlik katmanlı bir süreç, UFW bu katmanlardan sadece biri. Ama doğru kullanıldığında oldukça güçlü bir katman.