IPv6 Güvenliği: ip6tables ile Güvenlik Duvarı Yönetimi

IPv6 artık “gelecekteki protokol” olmaktan çıktı ve hayatımızın gerçek bir parçası haline geldi. Veri merkezleri, bulut sağlayıcılar ve ISP’ler hızla IPv6’ya geçiş yapıyor. Ama çoğu sysadmin hâlâ IPv6 güvenliğini görmezden geliyor ya da “zaten IPv4 kurallarım var, yeterli” diye düşünüyor. İşte bu tam bir güvenlik açığı. IPv6 trafiği varsayılan olarak ip6tables tarafından filtrelenmez, yani sistem yöneticisi aksiyon almazsa sunucunuz IPv6 üzerinden tamamen açık olabilir.

Bu yazıda ip6tables’ı sıfırdan yapılandıracağız, gerçek dünya senaryolarıyla production ortamına hazır kurallar yazacağız.

IPv6 ve ip6tables Neden Ayrı?

iptables yalnızca IPv4 trafiğini işler. IPv6 için kernel ayrı bir Netfilter katmanı kullanır ve bunu yönetmek için ip6tables komutu gelir. Aynı chain yapısı, aynı tablo mantığı ama tamamen bağımsız kural setleri.

Bir örnek düşünelim: Sunucunuza SSH için iptables’da port 22’yi sadece belirli IP’lere açtınız. Harika. Ama sisteminizde :: üzerinden dinleyen bir SSH servisi varsa ve ip6tables’da hiçbir kural yoksa, tüm IPv6 dünyası o porta erişebilir. ss -6 -tlnp komutunu çalıştırıp hangi servislerin IPv6’da dinlediğine bir bakın, şaşırabilirsiniz.

ip6tables’ın iptables ile farkları:

  • NAT yoktur (IPv6’da NAT zaten önerilmez, her cihaz global IP alır)
  • MASQUERADE chain’i teorik olarak var ama pratikte kullanılmaz
  • ICMPv6 kritik öneme sahiptir, iptables’da olduğu gibi ICMP’yi tamamen bloklayamazsınız
  • Adres formatları farklıdır, ::1 loopback, fe80::/10 link-local adresleri

Temel Kavramlar: Chain ve Tablo Yapısı

ip6tables tıpkı iptables gibi üç temel tablo üzerinde çalışır:

  • filter: Varsayılan tablo, paket kabul/red kararları
  • mangle: Paket başlık manipülasyonu
  • raw: Connection tracking öncesi işlemler

Filter tablosunda üç chain bulunur:

  • INPUT: Sunucuya gelen paketler
  • OUTPUT: Sunucudan çıkan paketler
  • FORWARD: Yönlendirilen paketler (router/gateway senaryoları)

Mevcut ip6tables kurallarını görmek için:

ip6tables -L -v -n --line-numbers
ip6tables -t mangle -L -v -n
ip6tables -t raw -L -v -n

ICMPv6: Dokunmayın, Yoksa Pişman Olursunuz

IPv4’te ICMP’yi tamamen bloke etmek kötü bir fikir ama idare edilebilir. IPv6’da ICMPv6’yı bloke etmek sisteminizi devre dışı bırakır. Neden?

IPv6 adresi otomatik yapılandırması (SLAAC), Neighbor Discovery Protocol (NDP), path MTU discovery ve hatta temel bağlantı kontrolü ICMPv6’ya bağımlıdır. RFC 4890 bu konuda net rehberlik sunar.

İzin vermeniz gereken ICMPv6 tipleri:

  • tip 1: Destination Unreachable
  • tip 2: Packet Too Big (MTU discovery için zorunlu)
  • tip 3: Time Exceeded
  • tip 4: Parameter Problem
  • tip 133: Router Solicitation
  • tip 134: Router Advertisement
  • tip 135: Neighbor Solicitation
  • tip 136: Neighbor Advertisement
  • tip 137: Redirect
# Temel ICMPv6 kuralları - bunlar olmadan sistem çalışmaz
ip6tables -A INPUT -p icmpv6 --icmpv6-type destination-unreachable -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type packet-too-big -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type time-exceeded -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type parameter-problem -j ACCEPT

# Neighbor Discovery (bu olmadan komşu keşfi çalışmaz)
ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbor-solicitation -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbor-advertisement -j ACCEPT

# Router Discovery (SLAAC kullanan sistemler için)
ip6tables -A INPUT -p icmpv6 --icmpv6-type router-solicitation -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type router-advertisement -j ACCEPT

# Echo request/reply (ping6)
ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-reply -j ACCEPT

Sıfırdan Production Firewall Yapılandırması

Şimdi gerçek bir web sunucusu senaryosu için kapsamlı ip6tables yapılandırması yazalım. Bu sunucuda HTTP, HTTPS ve SSH çalışıyor.

#!/bin/bash
# IPv6 Firewall Kurulum Scripti
# Versiyon: 1.0

# Önce mevcut kuralları temizle
ip6tables -F
ip6tables -X
ip6tables -Z

# Varsayılan politikaları belirle
ip6tables -P INPUT DROP
ip6tables -P FORWARD DROP
ip6tables -P OUTPUT ACCEPT

# Loopback trafiğine izin ver
ip6tables -A INPUT -i lo -j ACCEPT
ip6tables -A OUTPUT -o lo -j ACCEPT

# Mevcut bağlantılara ve ilişkili paketlere izin ver
ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# ICMPv6 - zorunlu tipler
ip6tables -A INPUT -p icmpv6 --icmpv6-type destination-unreachable -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type packet-too-big -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type time-exceeded -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type parameter-problem -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbor-solicitation -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbor-advertisement -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -m limit --limit 10/second -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-reply -j ACCEPT

# SSH - sadece belirli subnet'ten
ip6tables -A INPUT -p tcp --dport 22 -s 2001:db8::/32 -m state --state NEW -j ACCEPT

# HTTP ve HTTPS
ip6tables -A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT
ip6tables -A INPUT -p tcp --dport 443 -m state --state NEW -j ACCEPT

# Link-local adreslerden gelen trafiğe izin ver (lokal ağ için)
ip6tables -A INPUT -s fe80::/10 -j ACCEPT

# Geri kalan her şeyi logla ve düşür
ip6tables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "ip6tables-drop: " --log-level 4
ip6tables -A INPUT -j DROP

Rate Limiting ve DDoS Koruması

IPv6 ile gelen bir sorun: adres uzayı o kadar büyük ki IP bazlı blocklist mantığı IPv4 kadar etkili olmayabilir. Bu yüzden rate limiting daha da önem kazanır.

# SYN flood koruması
ip6tables -A INPUT -p tcp --syn -m limit --limit 25/second --limit-burst 50 -j ACCEPT
ip6tables -A INPUT -p tcp --syn -j DROP

# Yeni bağlantı hızı sınırlama (SSH için brute force önlemi)
ip6tables -A INPUT -p tcp --dport 22 -m state --state NEW 
  -m recent --set --name SSH6 --rsource
ip6tables -A INPUT -p tcp --dport 22 -m state --state NEW 
  -m recent --update --seconds 60 --hitcount 4 --name SSH6 --rsource 
  -j LOG --log-prefix "SSH6-brute: "
ip6tables -A INPUT -p tcp --dport 22 -m state --state NEW 
  -m recent --update --seconds 60 --hitcount 4 --name SSH6 --rsource -j DROP

# Port scan tespiti
ip6tables -A INPUT -m recent --name PORTSCAN6 --rcheck --seconds 86400 -j DROP
ip6tables -A INPUT -m recent --name PORTSCAN6 --remove
ip6tables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST 
  -m limit --limit 1/second -j ACCEPT

IPv6 Özel Adres Aralıklarını Filtreleme

IPv6’da bazı adres bloklarının internetten gelmesi anlamsızdır. Bunları bloke etmek spoof saldırılarına karşı önlem sağlar.

# Loopback adresinin dışarıdan gelmesi engellenmeli
ip6tables -A INPUT ! -i lo -s ::1/128 -j DROP

# Unspecified adres
ip6tables -A INPUT -s ::/128 -j DROP

# Documentation adresleri (internette görünmemeli)
ip6tables -A INPUT -s 2001:db8::/32 -j DROP

# 6to4 relay anycast (gerekli değilse)
ip6tables -A INPUT -s 192.88.99.0/24 -j DROP 2>/dev/null || true

# Unique local addresses dışarıdan geliyorsa şüpheli
# (fc00::/7 bloğu - RFC 4193)
ip6tables -A INPUT ! -i lo -s fc00::/7 -j LOG --log-prefix "ULA-external: "
ip6tables -A INPUT ! -i lo -s fc00::/7 -j DROP

# Teredo adresleri (gerekli değilse bloke et)
ip6tables -A INPUT -s 2001::/32 -j DROP

Kuralları Kalıcı Hale Getirme

ip6tables kuralları sistem yeniden başladığında silinir. Kalıcı hale getirmek için birkaç yöntem var.

Debian/Ubuntu sistemlerde:

# iptables-persistent paketi hem IPv4 hem IPv6 kurallarını kaydeder
apt-get install iptables-persistent

# Mevcut kuralları kaydet
ip6tables-save > /etc/iptables/rules.v6

# Geri yüklemek için
ip6tables-restore < /etc/iptables/rules.v6

# Netfilter-persistent servisi otomatik yükleme yapar
systemctl enable netfilter-persistent
systemctl start netfilter-persistent

RHEL/CentOS/AlmaLinux sistemlerde:

# ip6tables-services paketi gerekli
yum install iptables-services
systemctl enable ip6tables
systemctl start ip6tables

# Kuralları kaydet
service ip6tables save
# veya
ip6tables-save > /etc/sysconfig/ip6tables

Systemd ile özel servis oluşturma:

# /etc/systemd/system/ip6tables-restore.service
cat > /etc/systemd/system/ip6tables-restore.service << 'EOF'
[Unit]
Description=IPv6 Firewall Rules
Before=network-pre.target
Wants=network-pre.target

[Service]
Type=oneshot
ExecStart=/sbin/ip6tables-restore /etc/ip6tables.rules
ExecReload=/sbin/ip6tables-restore /etc/ip6tables.rules
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
EOF

ip6tables-save > /etc/ip6tables.rules
systemctl daemon-reload
systemctl enable ip6tables-restore

Gerçek Dünya Senaryosu: Dual-Stack Web Sunucusu

Bir e-ticaret sitesi yönetiyorsunuz. Sunucunuz hem IPv4 hem IPv6 üzerinden erişilebilir. Güvenlik ekibi belirli ülkelerden gelen IPv6 trafiğini kısıtlamak istiyor ve yönetim erişimi sadece ofis IPv6 bloğundan olacak.

#!/bin/bash
# E-ticaret Sunucusu IPv6 Firewall
# Ofis IPv6 bloğu: 2001:db8:cafe::/48 (örnek)

OFFICE_IPV6="2001:db8:cafe::/48"
MONITORING_IPV6="2001:db8:dead::/48"

# Temizlik
ip6tables -F
ip6tables -X
ip6tables -t mangle -F
ip6tables -t mangle -X

# Özel chain'ler oluştur
ip6tables -N ALLOWED_SERVICES
ip6tables -N MANAGEMENT
ip6tables -N ICMPV6_RULES
ip6tables -N ATTACK_PROTECTION

# Varsayılan politikalar
ip6tables -P INPUT DROP
ip6tables -P FORWARD DROP
ip6tables -P OUTPUT ACCEPT

# Loopback
ip6tables -A INPUT -i lo -j ACCEPT

# Established bağlantılar
ip6tables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# Chain yönlendirmeleri
ip6tables -A INPUT -j ICMPV6_RULES
ip6tables -A INPUT -j ATTACK_PROTECTION
ip6tables -A INPUT -j MANAGEMENT
ip6tables -A INPUT -j ALLOWED_SERVICES

# ICMPv6 kuralları
ip6tables -A ICMPV6_RULES -p icmpv6 --icmpv6-type destination-unreachable -j ACCEPT
ip6tables -A ICMPV6_RULES -p icmpv6 --icmpv6-type packet-too-big -j ACCEPT
ip6tables -A ICMPV6_RULES -p icmpv6 --icmpv6-type time-exceeded -j ACCEPT
ip6tables -A ICMPV6_RULES -p icmpv6 --icmpv6-type parameter-problem -j ACCEPT
ip6tables -A ICMPV6_RULES -p icmpv6 --icmpv6-type neighbor-solicitation -j ACCEPT
ip6tables -A ICMPV6_RULES -p icmpv6 --icmpv6-type neighbor-advertisement -j ACCEPT
ip6tables -A ICMPV6_RULES -p icmpv6 --icmpv6-type echo-request 
  -m limit --limit 5/second --limit-burst 10 -j ACCEPT

# Saldırı koruma
ip6tables -A ATTACK_PROTECTION -p tcp ! --syn -m conntrack --ctstate NEW -j DROP
ip6tables -A ATTACK_PROTECTION -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
ip6tables -A ATTACK_PROTECTION -p tcp -m tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
ip6tables -A ATTACK_PROTECTION -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j DROP

# Yönetim erişimi (SSH sadece ofisten)
ip6tables -A MANAGEMENT -p tcp --dport 22 -s $OFFICE_IPV6 
  -m conntrack --ctstate NEW -j ACCEPT
ip6tables -A MANAGEMENT -p tcp --dport 22 
  -m limit --limit 2/min -j LOG --log-prefix "SSH6-unauthorized: "

# İzleme sunucusuna izin ver
ip6tables -A MANAGEMENT -s $MONITORING_IPV6 -j ACCEPT

# Web servisleri
ip6tables -A ALLOWED_SERVICES -p tcp --dport 80 -m conntrack --ctstate NEW -j ACCEPT
ip6tables -A ALLOWED_SERVICES -p tcp --dport 443 -m conntrack --ctstate NEW -j ACCEPT

# Logla ve düşür
ip6tables -A INPUT -m limit --limit 3/min -j LOG 
  --log-prefix "ip6-final-drop: " --log-level 6
ip6tables -A INPUT -j DROP

echo "IPv6 firewall kuralları uygulandı."
ip6tables -L -v -n

ip6tables İzleme ve Debug

Kuralların doğru çalışıp çalışmadığını test etmek kritik. Birkaç pratik yöntem:

# Paket sayaçlarını izle (canlı takip)
watch -n 2 'ip6tables -L INPUT -v -n'

# Sadece DROP/REJECT olan paketleri logdan izle
tail -f /var/log/kern.log | grep ip6

# Belirli bir chain'deki kural istatistiklerini sıfırla
ip6tables -Z INPUT

# ip6tables trace - paketlerin hangi kuralları geçtiğini göster
ip6tables -t raw -A PREROUTING -p tcp --dport 80 -j TRACE
ip6tables -t raw -A OUTPUT -p tcp --sport 80 -j TRACE
# Sonuçları gör
dmesg | grep TRACE
# Test bittikten sonra kaldır
ip6tables -t raw -F PREROUTING
ip6tables -t raw -F OUTPUT

# IPv6 bağlantı durumunu kontrol et
ss -6 -tlnp
ip -6 addr show
ip -6 route show

nftables ile Birlikte Kullanım Uyarısı

Modern Linux dağıtımları (RHEL 8+, Debian 10+, Ubuntu 20.04+) varsayılan olarak nftables kullanır. ip6tables komutları arka planda nftables’a çevrilebilir ama bu durum karmaşıklık yaratır.

Durumu kontrol etmek için:

# ip6tables hangi backend'i kullanıyor?
ip6tables --version
# Çıktıda "nf_tables" veya "legacy" yazar

# nftables ile çakışma var mı?
nft list ruleset | grep -i ip6

Eğer sisteminiz nftables kullanıyorsa uzun vadede nftables’a geçmeyi düşünün. nftables tek bir araçla hem IPv4 hem IPv6 kurallarını yönetir ve bu ciddi bir operasyonel avantaj sağlar. Ama mevcut ip6tables kurulumunuz varsa ve çalışıyorsa, her iki sistemi aynı anda aktif etmekten kaçının.

Düzenli Bakım ve Kural Yönetimi

Firewall kuralları canlı bir organizma gibidir. Düzenli gözden geçirme şart:

  • Aylık: Logları gözden geçir, hangi kuralların tetiklendiğini kontrol et
  • Çeyreklik: Artık kullanılmayan servislerin kurallarını kaldır
  • Her değişiklikten önce: Mevcut kuralları yedekle
# Tarihli yedek alma
ip6tables-save > /root/backups/ip6tables-$(date +%Y%m%d-%H%M%S).rules

# Son 30 günün yedeklerini tut, eskilerini sil
find /root/backups/ -name "ip6tables-*.rules" -mtime +30 -delete

# Kural değişikliği öncesi test etme alışkanlığı
# 60 saniye sonra kuralları geri yükleyecek job başlat
echo "ip6tables-restore < /root/backups/ip6tables-safe.rules" | at now + 1 minute
# Test et, çalışıyorsa at job'ı iptal et
atq
atrm [job-id]

Sonuç

IPv6 güvenliği artık ertelenecek bir konu değil. Sunucunuz IPv6 adresi alıyorsa ip6tables yapılandırması o dakikadan itibaren gerekli hale gelir. Bu yazıda ele aldığımız konuları özetleyelim:

  • IPv6 ve iptables birbirinden bağımsız çalışır, ayrı yapılandırma gerektirir
  • ICMPv6 kuralları hayati öneme sahiptir, körce bloke etmek sistemin çalışmamasına yol açar
  • Rate limiting ve özel chain kullanımı yönetimi kolaylaştırır ve güvenliği artırır
  • Kuralların kalıcı hale getirilmesi için dağıtıma uygun yöntem seçilmeli
  • Düzenli yedek alma ve test etme alışkanlığı kazanılmalı

IPv6’ya geçiş yapan kurumlar için en tehlikeli senaryo “IPv4’te güvenliyim” yanılgısıdır. Dual-stack ortamlarda her iki protokol de eşit özenle yönetilmeli. Sıradaki adım olarak nftables’ı incelemenizi öneririm, çünkü IPv4 ve IPv6’yı tek bir kural setinde yönetmek operasyonel yükü ciddi ölçüde azaltıyor.

Yorum yapın