UFW ile IPv6 Desteği Yapılandırması

IPv6 artık “gelecekteki protokol” olmaktan çıktı ve günümüzde pek çok sunucu, bulut ortamı ve ağ altyapısında aktif olarak kullanılıyor. Eğer UFW ile güvenlik duvarı yapılandırması yapıyorsanız ve IPv6 trafiğini görmezden geliyorsanız, aslında ciddi bir güvenlik açığı bırakıyor olabilirsiniz. Sistemin bir IPv6 adresi varsa ve bunu yönetmiyorsanız, o interface üzerinden gelen trafik tamamen kontrolsüz kalabilir. Bu yazıda UFW üzerinde IPv6 desteğini nasıl doğru yapılandıracağınızı, hangi kuralların IPv4’ten farklı davrandığını ve gerçek senaryolarda nasıl yaklaşmanız gerektiğini ele alacağız.

UFW ve IPv6: Temel Kavramlar

UFW (Uncomplicated Firewall), arka planda iptables ve ip6tables kullanır. IPv4 kuralları iptables üzerinden yönetilirken, IPv6 kuralları ip6tables üzerinden işlenir. Varsayılan olarak birçok sistemde UFW kurulduğunda IPv6 desteği etkin değildir ya da yanlış yapılandırılmıştır.

Bunu kontrol etmenin en hızlı yolu şu komuttur:

cat /etc/default/ufw | grep IPV6

Eğer çıktı IPV6=no ya da hiç bir şey dönmüyorsa, IPv6 trafiği UFW tarafından yönetilmiyor demektir. Bu durumda sisteminizde IPv6 adresi varsa ve dinleyen servisler varsa, bu servisler tamamen açıkta olabilir.

Bir de şunu kontrol edin, sistemde IPv6 aktif mi diye:

ip -6 addr show

Eğer interface başına inet6 ile başlayan satırlar görüyorsanız, IPv6 aktif ve trafik alıyor demektir.

IPv6 Desteğini UFW’de Etkinleştirme

İlk adım /etc/default/ufw dosyasını düzenlemek:

sudo nano /etc/default/ufw

Dosyada şu satırı bulun ve yes yapın:

IPV6=yes

Değişiklik sonrası UFW’yi yeniden başlatmanız gerekir. Sadece reload yeterli değil, komple sıfırlayıp tekrar başlatın:

sudo ufw disable
sudo ufw enable

Bu işlem sonrası UFW artık hem iptables hem de ip6tables üzerinde kuralları uygulayacaktır. Mevcut tüm kurallarınız otomatik olarak her iki protokol için de geçerli hale gelir. Yani sudo ufw allow 22/tcp dediğinizde, bu kural hem IPv4 hem IPv6 için aynı anda eklenir.

Doğrulamak için:

sudo ufw status verbose

Çıktıda IPv6: enabled ifadesini görmelisiniz.

Mevcut Kuralların IPv6 Durumunu İnceleme

UFW’de kural eklerken her kural hem IPv4 hem IPv6 için çift olarak oluşturulur. Bunu detaylı görmek için:

sudo ufw status numbered

Tipik bir çıktı şöyle görünür:

[ 1] 22/tcp                     ALLOW IN    Anywhere
[ 2] 80/tcp                     ALLOW IN    Anywhere
[ 3] 443/tcp                    ALLOW IN    Anywhere
[ 4] 22/tcp (v6)                ALLOW IN    Anywhere (v6)
[ 5] 80/tcp (v6)                ALLOW IN    Anywhere (v6)
[ 6] 443/tcp (v6)               ALLOW IN    Anywhere (v6)

(v6) etiketi o kuralın IPv6 trafiği için geçerli olduğunu gösterir. Eğer bu etiketleri görmüyorsanız, ya IPV6=yes ayarı yapılmamış ya da UFW yeniden başlatılmamıştır.

Sadece IPv6 veya Sadece IPv4 için Kural Yazma

Bazen belirli bir servis için sadece IPv4 ya da sadece IPv6’yı açmak istersiniz. Örneğin legacy bir uygulama sadece IPv4 üzerinden çalışıyorsa ve IPv6 erişimini kapatmak istiyorsanız şöyle yapabilirsiniz:

Sadece IPv4 için kural eklemek:

sudo ufw allow proto tcp from 0.0.0.0/0 to 0.0.0.0/0 port 8080

Bu kural yalnızca IPv4 adresleri için geçerli olur çünkü 0.0.0.0/0 sadece IPv4 adres uzayını kapsar.

Sadece IPv6 için kural eklemek:

sudo ufw allow proto tcp from ::/0 to ::/0 port 8080

Burada ::/0 IPv6’nın “her yer” anlamına gelen CIDR notasyonudur ve yalnızca IPv6 trafiğini hedef alır.

Belirli bir IPv6 adresinden gelen trafiğe izin vermek:

sudo ufw allow from 2001:db8::1 to any port 22

Belirli bir IPv6 subnet’ini engellemek:

sudo ufw deny from 2001:db8:bad::/48

ICMPv6 ve UFW: Dikkat Edilmesi Gereken Nokta

IPv6 ortamında ICMPv6 protokolü kritik önem taşır. IPv4’teki ARP’ın yerini IPv6’da NDP (Neighbor Discovery Protocol) almıştır ve NDP tamamen ICMPv6 üzerine kuruludur. Eğer ICMPv6 trafiğini sert bir şekilde engellerseniz, ağınızdaki IPv6 iletişimi tamamen bozulabilir.

UFW’nin varsayılan kuralları /etc/ufw/before6.rules dosyasında tutulur. Bu dosya zaten bazı kritik ICMPv6 kurallarını içerir:

sudo cat /etc/ufw/before6.rules

Bu dosyada şu türden kurallar görürsünüz:

# allow ICMPv6 - neighbor discovery
-A ufw6-before-input -p icmpv6 --icmpv6-type neighbor-solicitation -j ACCEPT
-A ufw6-before-input -p icmpv6 --icmpv6-type neighbor-advertisement -j ACCEPT
-A ufw6-before-input -p icmpv6 --icmpv6-type router-solicitation -j ACCEPT
-A ufw6-before-input -p icmpv6 --icmpv6-type router-advertisement -j ACCEPT

Bu kurallar genellikle varsayılan olarak mevcuttur ama kontrol etmek her zaman iyidir. Eğer bu satırları göremiyorsanız ya da birisi silmişse, sisteminizde IPv6 bağlantısı sorunlu çalışıyor olabilir. Bu durumda dosyayı manuel düzenleyerek bu kuralları ekleyebilirsiniz.

Gerçek Dünya Senaryosu: Web Sunucusu Yapılandırması

Diyelim ki hem IPv4 hem IPv6 üzerinden hizmet veren bir web sunucusu kuruyorsunuz. Nginx ya da Apache çalışıyor, SSH erişimi var, belki bir veritabanı portu sadece local ağa açık.

Önce temiz bir başlangıç:

sudo ufw default deny incoming
sudo ufw default allow outgoing

Ardından SSH, HTTP ve HTTPS izinleri:

sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

Bu üç kural otomatik olarak hem IPv4 hem IPv6 için aktif hale gelir, çünkü IPV6=yes ayarı yapıldı.

Şimdi diyelim ki veritabanı portunu sadece belirli bir IPv6 subnet’inden erişilebilir yapmak istiyorsunuz, iç ağınız 2001:db8:1234::/48 olsun:

sudo ufw allow from 2001:db8:1234::/48 to any port 5432

Ve bunu doğrulayın:

sudo ufw status verbose

Gerçek Dünya Senaryosu: IPv6 Tabanlı DDoS Mitigasyonu

Büyük IPv6 blokları üzerinden gelen spam ya da tarama trafiğini engellemek için rate limiting kullanabilirsiniz. UFW doğrudan rate limit için limit kuralını destekler ama daha ince ayar gerektiğinde before6.rules dosyasını düzenlemeniz gerekir.

Basit rate limiting örneği, SSH için:

sudo ufw limit proto tcp from ::/0 to ::/0 port 22

Bu kural, aynı IPv6 adresinden 30 saniye içinde 6’dan fazla bağlantı denemesi gelirse otomatik engelleme yapar. Brute force saldırılarına karşı temel bir önlem olarak işe yarar.

Daha gelişmiş bir yaklaşım için before6.rules dosyasına hashlimit modülü ile özel kurallar eklenebilir:

sudo nano /etc/ufw/before6.rules

Dosyada COMMIT satırından önce şunu ekleyin:

# IPv6 HTTP flood protection
-A ufw6-before-input -p tcp --dport 80 -m hashlimit 
  --hashlimit-name http6flood 
  --hashlimit-above 50/sec 
  --hashlimit-burst 100 
  --hashlimit-mode srcip 
  -j DROP

Değişiklikleri uygulamak için:

sudo ufw reload

IPv6 Loopback ve Link-Local Trafiği

IPv6’da ::1 adresi loopback’tir, IPv4’teki 127.0.0.1 gibi. Link-local adresler ise fe80::/10 bloğundadır ve bunlar her interface’de otomatik atanır, routing yapılmazlar.

UFW’nin varsayılan before6.rules dosyası zaten loopback trafiğine izin verir ama kontrol etmek iyidir:

grep -n "loopback|lo" /etc/ufw/before6.rules

Eğer loopback kuralları eksikse şöyle ekleyebilirsiniz:

sudo nano /etc/ufw/before6.rules

COMMIT öncesine şu satırları ekleyin:

# allow all on loopback
-A ufw6-before-input -i lo -j ACCEPT
-A ufw6-before-output -o lo -j ACCEPT

Link-local trafiği için dikkatli olunması gereken nokta şu: Eğer sunucunuz yalnızca fe80:: adreslerine sahipse ve 2001:: ya da benzeri global unicast adresi yoksa, dış dünyadan zaten erişim sağlanamaz. Ancak iç ağ içi trafiği yönetmek için link-local adresleri de kural yazarken belirtmeniz gerekebilir.

UFW ile IPv6 Kurallarını Silme ve Yönetme

Kuralları numarasına göre silmek en pratik yöntemdir. Önce numaralı listeyi alın:

sudo ufw status numbered

Ardından silmek istediğiniz kuralın numarasını kullanın. Örneğin 4 numaralı kural IPv6 SSH kuralıysa:

sudo ufw delete 4

Dikkat: Bir kuralı sildiğinizde liste yeniden numaralanır. Birden fazla kural silecekseniz her zaman büyük numaradan başlayarak silin, yoksa yanlış kuralları silebilirsiniz.

Belirli bir IPv6 kuralını doğrudan tanımıyla da silebilirsiniz:

sudo ufw delete allow from 2001:db8::1 to any port 22

Uygulama Profilleri ve IPv6

UFW’nin uygulama profilleri de IPv6’yı destekler. Nginx, Apache, OpenSSH gibi uygulamalar için hazır profiller /etc/ufw/applications.d/ altında tutulur. Bu profilleri kullanmak, hem IPv4 hem IPv6 için doğru portları otomatik açar.

Mevcut profilleri görmek için:

sudo ufw app list

Bir profili uygulamak için:

sudo ufw allow 'Nginx Full'

Bu tek komut, hem IPv4 hem IPv6 için 80 ve 443 portlarını açar. Profil içeriğini görmek isterseniz:

sudo ufw app info 'Nginx Full'

Kendi uygulama profilinizi oluşturmak da mümkündür. Örneğin özel bir uygulama için:

sudo nano /etc/ufw/applications.d/myapp

İçerik:

[MyApp]
title=My Custom Application
description=Custom app running on port 9000
ports=9000/tcp

Kaydedip uyguladığınızda bu profil hem IPv4 hem IPv6 için geçerli olur:

sudo ufw allow 'MyApp'

IPv6 Yapılandırmasını Test Etme

Yapılandırmanın doğru çalışıp çalışmadığını test etmek için birkaç yöntem var.

İlk olarak aktif ip6tables kurallarına bakın. UFW’nin arka planda ne yaptığını görmek için:

sudo ip6tables -L -n -v --line-numbers

Bu çıktı biraz karmaşık olabilir ama UFW tarafından oluşturulan zincirler (ufw6-before-input, ufw6-user-input gibi) açıkça görünür.

İkinci olarak, eğer başka bir IPv6 adresiniz varsa ya da bir test makineniz varsa, nmap ile tarama yapabilirsiniz:

nmap -6 2001:db8::1

Üçüncü olarak, lokal olarak hangi portların hangi protokolde dinlediğini kontrol edin:

ss -tlnp6

Bu komut yalnızca IPv6 üzerinde dinleyen servisleri gösterir. Eğer burada görmediğiniz bir port yoksa, zaten maruz kalma riski de yoktur. Ama görecekseniz ve UFW kuralında yoksa, o port açıkta demektir.

Yaygın Sorunlar ve Çözümleri

Problem: IPv6 kuralları eklendi ama trafik geçmiyor

Büyük ihtimalle NDP trafiği engelleniyordur. before6.rules içinde neighbor discovery kurallarının mevcut olduğunu kontrol edin. Ayrıca sysctl ayarlarına bakın:

sysctl net.ipv6.conf.all.disable_ipv6

Eğer bu değer 1 ise, IPv6 kernel tarafından tamamen devre dışı bırakılmış demektir ve UFW ayarlarından bağımsız olarak çalışmaz. Aktif etmek için:

sudo sysctl -w net.ipv6.conf.all.disable_ipv6=0

Kalıcı yapmak için /etc/sysctl.conf dosyasına ekleyin:

net.ipv6.conf.all.disable_ipv6=0
net.ipv6.conf.default.disable_ipv6=0

Problem: UFW reload sonrası kurallar kayboldu

Bu genellikle /etc/ufw/before6.rules ya da /etc/ufw/user6.rules dosyalarında sözdizimi hatası olduğunda olur. UFW hata verirse logları kontrol edin:

sudo journalctl -u ufw

Problem: IPv6 adresi var ama ping6 çalışmıyor

Dışarıdan ping atmak için ICMPv6 echo request’lere izin vermeniz gerekir. Varsayılan olarak UFW bunu engelleyebilir. before6.rules içine şu satırı ekleyin:

-A ufw6-before-input -p icmpv6 --icmpv6-type echo-request -j ACCEPT

Güvenlik Önerileri

IPv6 yapılandırmasında göz önünde bulundurmanız gereken birkaç pratik öneri:

  • Minimum erişim prensibi: Sadece gerçekten gerekli portları açın. IPv6 için de aynı prensip geçerli.
  • Global unicast adresler dikkat ister: 2001:: ile başlayan adresler internetten doğrudan erişilebilir. Bu interface’lerde dinleyen her servis potansiyel hedef olabilir.
  • Link-local adresler daha güvenlidir: fe80:: adreslerine sadece aynı ağ segmentinden erişilebilir, routing yapılmaz. Yönetim trafiği için tercih edin.
  • Periyodik denetim yapın: sudo ufw status numbered ile kurallarınızı düzenli gözden geçirin. Zaman içinde gereksiz kurallar birikebilir.
  • Loglamayı aktif edin: UFW loglama ile hem IPv4 hem IPv6 için engellenen trafiği takip edebilirsiniz.

Loglamayı açmak için:

sudo ufw logging on
sudo ufw logging medium

Log dosyaları /var/log/ufw.log içinde tutulur. IPv6 logları [UFW BLOCK] etiketiyle ve IPv6 adresleriyle birlikte görünür.

Sonuç

IPv6 artık görmezden gelinmesi gereken bir protokol değil. Özellikle bulut ortamlarında, VPS’lerde ve modern ağ altyapılarında IPv6 adresi atanmış sunucular artık çok yaygın. UFW kullanıyorsanız ve IPV6=yes ayarını yapmadıysanız, sunucunuzun bir yüzü tamamen korumasız kalıyor olabilir.

Yapmanız gerekenler özet olarak şunlar: /etc/default/ufw içinde IPV6=yes olduğundan emin olun, UFW’yi yeniden başlatın, before6.rules içindeki ICMPv6 ve NDP kurallarının mevcut olduğunu kontrol edin ve ardından normal kural yazımına devam edin. Çoğu durumda port tabanlı kurallarınız zaten her iki protokol için de otomatik çalışacak.

Gerçekten IPv6 kullanmıyorsanız ve kullanma planınız yoksa, en temiz çözüm kernel düzeyinde sysctl ile IPv6’yı tamamen devre dışı bırakmaktır. Ama eğer ortamınızda IPv6 aktifse, onu yönetmek kaçınılmaz. Ve UFW ile bu yönetim düşündüğünüzden çok daha kolay.

Yorum yapın