IPv6 DNS Yapılandırması: BIND ile AAAA Kayıtları

IPv6 artık “ileride geçeceğiz” denen bir şey olmaktan çıktı. Veri merkezleri, cloud sağlayıcılar ve ISP’ler hızla IPv6’ya geçiş yapıyor. Bu geçişin DNS tarafını doğru yapılandırmazsanız, servisleriniz yarım çalışır ya da hiç çalışmaz. Bu yazıda BIND üzerinde IPv6 DNS yapılandırmasını, AAAA kayıtlarını ve gerçek dünya senaryolarını ele alacağız.

IPv6 DNS Temellerini Anlamak

IPv4 dünyasında A kaydı kullanıyoruz, IPv6’da ise AAAA kaydı. İsim benzer ama mantık tamamen aynı: bir alan adını IP adresine çözümlüyorsunuz, sadece adres formatı farklı. IPv4 adresi 32 bit, IPv6 ise 128 bit. Bu yüzden DNS kayıtlarında da farklı bir yapı göreceksiniz.

Bir de ters DNS (reverse DNS) meselesi var. IPv4’te in-addr.arpa kullanıyoruz, IPv6’da ise ip6.arpa. Burada adres formatı biraz karmaşıklaşıyor, aşağıda detaylıca anlatacağım.

BIND 9.x sürümleri IPv6’yı tam olarak destekliyor, ama bazı yapılandırma detaylarına dikkat etmek gerekiyor. Eski BIND sürümü kullanıyorsanız lütfen önce güncelleme yapın.

Ortamı Hazırlamak

Önce BIND’ın sisteminizde IPv6 üzerinde dinlediğinden emin olun. Çoğu zaman varsayılan kurulum sadece IPv4 dinleyecek şekilde gelir.

# BIND'ın hangi adresleri dinlediğini kontrol edin
sudo ss -tlnp | grep named

# IPv6 desteğini kontrol edin
named -V | grep -i ipv6

named.conf.options dosyanızı açın ve listen-on-v6 direktifini kontrol edin:

sudo cat /etc/bind/named.conf.options | grep -A2 listen

Eğer IPv6 dinlemesi yoksa veya none olarak ayarlıysa, değiştirmeniz gerekiyor.

named.conf.options Yapılandırması

sudo nano /etc/bind/named.conf.options

Dosyanın içeriği şöyle olmalı:

options {
    directory "/var/cache/bind";

    # IPv4 dinleme
    listen-on { any; };

    # IPv6 dinleme - bu satır kritik
    listen-on-v6 { any; };

    # Sadece belirli IPv6 adresleri dinlemek isterseniz:
    # listen-on-v6 { 2001:db8::1; ::1; };

    # Forwarder'lar - IPv6 destekli DNS sunucular ekleyin
    forwarders {
        8.8.8.8;
        8.8.4.4;
        2001:4860:4860::8888;    # Google IPv6 DNS
        2001:4860:4860::8844;    # Google IPv6 DNS alternatif
    };

    forward only;

    dnssec-validation auto;

    auth-nxdomain no;
    recursion yes;

    # IPv6 bağlantılarına izin ver
    allow-query { any; };
};

BIND’ı yeniden başlatın ve dinlediği adresleri doğrulayın:

sudo systemctl restart bind9
sudo ss -tlnp | grep named
# Hem :::53 hem de 0.0.0.0:53 görmelisiniz

Zone Dosyasına AAAA Kaydı Eklemek

Şimdi asıl işe gelelim. Diyelim ki ornek.com için zone dosyanız var ve sunucunuza 2001:db8:1:2::10 adresini atadınız.

sudo nano /etc/bind/zones/db.ornek.com

Zone dosyanız şu şekilde görünmeli:

$TTL    86400
@       IN      SOA     ns1.ornek.com. admin.ornek.com. (
                         2024011501     ; Serial
                         3600           ; Refresh
                         1800           ; Retry
                         604800         ; Expire
                         86400 )        ; Minimum TTL

; Name Server kayıtları
@               IN      NS      ns1.ornek.com.
@               IN      NS      ns2.ornek.com.

; A kayıtları (IPv4)
@               IN      A       203.0.113.10
ns1             IN      A       203.0.113.1
ns2             IN      A       203.0.113.2
www             IN      A       203.0.113.10
mail            IN      A       203.0.113.20

; AAAA kayıtları (IPv6)
@               IN      AAAA    2001:db8:1:2::10
ns1             IN      AAAA    2001:db8:1:2::1
ns2             IN      AAAA    2001:db8:1:2::2
www             IN      AAAA    2001:db8:1:2::10
mail            IN      AAAA    2001:db8:1:2::20

; MX kaydı
@               IN      MX      10      mail.ornek.com.

Burada önemli bir nokta: A ve AAAA kayıtlarını yan yana tutun. Bu hem okunabilirliği artırır hem de bakım sırasında bir kaydı güncellemeyi unutma riskini azaltır. Bazı sysadmin’ler IPv6 kayıtlarını dosyanın altına iter, bu kötü bir alışkanlık.

Zone dosyasını kontrol edin ve BIND’ı reload edin:

# Zone dosyasını sözdizimi açısından kontrol et
sudo named-checkzone ornek.com /etc/bind/zones/db.ornek.com

# Hata yoksa reload et (full restart gerekmez)
sudo rndc reload ornek.com

# Ya da tüm zone'ları reload et
sudo rndc reload

IPv6 Ters DNS Yapılandırması (ip6.arpa)

Bu kısım çoğu sysadmin’in kafasını karıştıran yer. IPv6 ters DNS için adresinizi ters çevirmeniz ve her karakteri nokta ile ayırmanız gerekiyor.

Örnek adresimiz: 2001:db8:1:2::10

Önce bu adresi tam formuna genişletelim: 2001:0db8:0001:0002:0000:0000:0000:0010

Şimdi tüm iki nokta üst üsteleri kaldırın ve her hex karakteri ters sırayla yazın:

0.1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.0.0.0.1.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa.

Bu uzun ve hataya açık bir işlem. Bunun için bir araç kullanın:

# ipcalc veya python ile kolayca hesaplayabilirsiniz
python3 -c "
import ipaddress
addr = ipaddress.IPv6Address('2001:db8:1:2::10')
print(addr.reverse_pointer)
"
# Çıktı: 0.1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.0.0.0.1.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa

Şimdi ters zone dosyasını oluşturun. Genellikle ISP’niz veya IP sahibi kurum size /48 veya /32 blok verir. Bu örnekte /48 blok için yapılandırma yapıyoruz:

named.conf.local dosyasına zone tanımı ekleyin:

# /48 blok için ters zone
# 2001:db8:1::/48 bloğu için
zone "1.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa" {
    type master;
    file "/etc/bind/zones/db.ip6.ornek";
    allow-update { none; };
};

Ters zone dosyasını oluşturun:

sudo nano /etc/bind/zones/db.ip6.ornek
$TTL    86400
@       IN      SOA     ns1.ornek.com. admin.ornek.com. (
                         2024011501     ; Serial
                         3600           ; Refresh
                         1800           ; Retry
                         604800         ; Expire
                         86400 )        ; Minimum TTL

@       IN      NS      ns1.ornek.com.
@       IN      NS      ns2.ornek.com.

; PTR kayıtları
; 2001:db8:1:2::1 -> ns1.ornek.com.
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.0.0.0    IN      PTR     ns1.ornek.com.

; 2001:db8:1:2::2 -> ns2.ornek.com.
2.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.0.0.0    IN      PTR     ns2.ornek.com.

; 2001:db8:1:2::10 -> ornek.com.
0.1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.0.0.0    IN      PTR     ornek.com.

; 2001:db8:1:2::20 -> mail.ornek.com.
0.2.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.0.0.0    IN      PTR     mail.ornek.com.

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

Şimdi gerçek bir senaryo ele alalım. Bir e-ticaret firması hem IPv4 hem IPv6 üzerinden erişilebilir olmak istiyor. Nginx üzerinde çalışan web sunucu var, önünde CloudFlare yok, direkt exposed.

Sunucu bilgileri:

  • IPv4: 203.0.113.50
  • IPv6: 2001:db8:cafe::50

Zone dosyasına ekleme yapıyoruz:

; Web sunucusu - dual stack
web             IN      A       203.0.113.50
web             IN      AAAA    2001:db8:cafe::50
www             IN      CNAME   web.ornek.com.
shop            IN      CNAME   web.ornek.com.
api             IN      A       203.0.113.51
api             IN      AAAA    2001:db8:cafe::51

Önemli bir not: CNAME kayıtlarınız hem A hem AAAA’ya otomatik yönlenir. www için ayrı AAAA eklemenize gerek yok, CNAME’in işaret ettiği kayıt her iki türü de döndürür.

Nginx tarafında da IPv6’yı aktif etmeyi unutmayın:

# /etc/nginx/sites-available/ornek.com
server {
    listen 80;
    listen [::]:80;    # Bu satır IPv6 için şart
    listen 443 ssl;
    listen [::]:443 ssl;    # IPv6 üzerinden HTTPS

    server_name ornek.com www.ornek.com;
    # ... diğer direktifler
}

Yapılandırmayı Test Etmek

Zone dosyalarını güncelledikten sonra mutlaka test edin. Benim test sürecim şöyle:

# 1. Zone sözdizimini kontrol et
sudo named-checkconf /etc/bind/named.conf
sudo named-checkzone ornek.com /etc/bind/zones/db.ornek.com
sudo named-checkzone 1.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa /etc/bind/zones/db.ip6.ornek

# 2. Reload et
sudo rndc reload

# 3. AAAA kaydını sorgula
dig AAAA ornek.com @localhost
dig AAAA www.ornek.com @localhost

# 4. Ters DNS sorgula
dig -x 2001:db8:1:2::10 @localhost

# 5. Her iki kaydı birlikte gör
dig ANY ornek.com @localhost

dig çıktısında AAAA bölümünde IPv6 adresinizi görmek istiyorsunuz:

# Beklenen çıktı örneği
;; ANSWER SECTION:
ornek.com.      86400   IN      AAAA    2001:db8:1:2::10

Eğer NXDOMAIN veya boş ANSWER SECTION alıyorsanız, zone dosyasında hata var demektir. Log dosyasını kontrol edin:

sudo journalctl -u bind9 -n 50 --no-pager
# ya da
sudo tail -f /var/log/syslog | grep named

Sık Yapılan Hatalar ve Çözümleri

Hata 1: Serial numarasını güncellemememek

En sık yapılan hata bu. Zone dosyasını değiştirdiniz ama serial’i artırmadınız. Secondary DNS sunucular değişikliği görmez.

# Serial formatı önerisi: YYYYMMDDNN (yıl-ay-gün-sıra)
; Doğru: 2024011502 (15 Ocak 2024, 2. değişiklik)
; Yanlış: 1 veya 100 gibi anlamsız sayılar

Hata 2: IPv6 adresini zone dosyasında kısaltmak

BIND genellikle kısaltılmış adresleri kabul eder ama bazı durumlarda sorun çıkabilir. Ters zone’da özellikle tam formda yazmayı tercih edin.

# Sorunlu olabilir (ters zone için)
@   IN  AAAA    2001:db8::1

# Daha güvenli
@   IN  AAAA    2001:0db8:0000:0000:0000:0000:0000:0001

Hata 3: Güvenlik duvarında IPv6’yı unutmak

DNS sunucunuz IPv6 üzerinden dinliyor ama güvenlik duvarı engelliyor olabilir:

# UFW ile IPv6 DNS portunu aç
sudo ufw allow in on eth0 to any port 53 proto udp
sudo ufw allow in on eth0 to any port 53 proto tcp

# ip6tables ile
sudo ip6tables -A INPUT -p udp --dport 53 -j ACCEPT
sudo ip6tables -A INPUT -p tcp --dport 53 -j ACCEPT

# Kuralları kalıcı yap
sudo ip6tables-save > /etc/ip6tables/rules.v6

Hata 4: allow-query ve allow-recursion direktiflerinde IPv6 unutmak

# Yanlış - sadece IPv4 aralığı tanımlı
allow-query { 192.168.0.0/16; localhost; };

# Doğru - hem IPv4 hem IPv6
allow-query { 192.168.0.0/16; 2001:db8::/32; localhost; localnets; };

ACL ile IPv6 Ağları Yönetmek

Birden fazla IPv6 subnet’iniz varsa ACL kullanmak yönetimi kolaylaştırır:

# named.conf başına ekleyin
acl "internal-v6" {
    2001:db8:1::/48;
    2001:db8:2::/48;
    ::1;
};

acl "internal-v4" {
    192.168.0.0/16;
    10.0.0.0/8;
    127.0.0.0/8;
};

acl "internal-all" {
    internal-v4;
    internal-v6;
};

options {
    # ...
    allow-query { internal-all; };
    allow-recursion { internal-all; };
    allow-transfer { none; };
};

View Kullanımı: İç ve Dış DNS Ayrımı

Kurumsal ortamlarda iç kullanıcılara farklı, dış kullanıcılara farklı IP döndürmek isteyebilirsiniz. Split-horizon DNS için view kullanıyoruz:

# named.conf.local
view "internal" {
    match-clients { internal-all; };
    recursion yes;

    zone "ornek.com" {
        type master;
        file "/etc/bind/zones/db.ornek.com.internal";
    };
};

view "external" {
    match-clients { any; };
    recursion no;

    zone "ornek.com" {
        type master;
        file "/etc/bind/zones/db.ornek.com.external";
    };
};

İç zone dosyasında RFC 1918 ve private IPv6 adresleri kullanabilirsiniz:

# db.ornek.com.internal
; İç kullanıcılar private adreslere yönlendirilir
@       IN      A       10.0.1.10
@       IN      AAAA    fd00:1:2:3::10    ; ULA adresi (RFC 4193)
www     IN      A       10.0.1.10
www     IN      AAAA    fd00:1:2:3::10

DNSSEC ile IPv6 Birlikte Kullanımı

DNSSEC yapılandırmanız varsa IPv6 kayıtları da imzalanacak, bu konuda özel bir şey yapmanıza gerek yok. Ama imzalı zone’u güncellerken serial’i artırmayı ve zone’u yeniden imzalamayı unutmayın:

# Zone'u manuel imzalamak gerekirse
sudo dnssec-signzone -A -3 $(head -c 1000 /dev/random | sha1sum | cut -b 1-16) 
    -N INCREMENT -o ornek.com -t 
    /etc/bind/zones/db.ornek.com

# BIND 9.11+ ile inline-signing kullanıyorsanız
# zone güncellemesi otomatik imzalanır, sadece reload yeterli
sudo rndc reload ornek.com
sudo rndc sign ornek.com

Monitoring ve Gözlemleme

IPv6 DNS’in düzgün çalıştığını periyodik olarak kontrol edin. Bunun için basit bir script yazabilirsiniz:

#!/bin/bash
# /usr/local/bin/check-ipv6-dns.sh

DOMAIN="ornek.com"
EXPECTED_IPV6="2001:db8:1:2::10"
DNS_SERVER="localhost"
ALERT_EMAIL="[email protected]"

RESULT=$(dig AAAA +short $DOMAIN @$DNS_SERVER)

if [ "$RESULT" = "$EXPECTED_IPV6" ]; then
    echo "OK: $DOMAIN AAAA kaydı doğru: $RESULT"
    exit 0
else
    echo "HATA: $DOMAIN AAAA kaydı beklenen değilde!"
    echo "Beklenen: $EXPECTED_IPV6"
    echo "Gelen: $RESULT"
    # Mail gönder veya alerting sistemine bildir
    echo "IPv6 DNS sorunu: $DOMAIN" | mail -s "DNS Uyarisi" $ALERT_EMAIL
    exit 1
fi
# Crontab'a ekleyin
sudo crontab -e
# Her 5 dakikada bir kontrol
*/5 * * * * /usr/local/bin/check-ipv6-dns.sh >> /var/log/ipv6-dns-check.log 2>&1

Sonuç

IPv6 DNS yapılandırması ilk bakışta karmaşık görünse de temel olarak şu adımları takip ediyorsunuz: BIND’ın IPv6 üzerinden dinlemesini sağlayın, zone dosyalarınıza AAAA kayıtlarını ekleyin, ters DNS için ip6.arpa zone’unu yapılandırın ve güvenlik duvarınızın IPv6 trafiğine izin verdiğinden emin olun.

En önemli noktalar şunlar:

  • named.conf.options içinde listen-on-v6 { any; }; direktifini unutmayın.
  • Zone dosyalarında A ve AAAA kayıtlarını yan yana tutun, yönetim kolaylaşır.
  • Ters DNS için adres hesaplamalarını Python veya ipcalc ile yapın, elle yazmak hata üretir.
  • Her zone değişikliğinde serial numarasını artırın.
  • Güvenlik duvarında hem TCP hem UDP 53 portunu IPv6 için açık tutun.
  • named-checkzone ve named-checkconf araçlarını her değişiklik öncesi çalıştırın.

IPv6’ya geçiş bir gecede olmuyor ama DNS tarafını düzgün yapılandırmak en kritik adım. Dual-stack çalışan bir ortamda kullanıcılar modern işletim sistemleri sayesinde otomatik olarak IPv6’yı tercih edecek. Sunucu tarafında her şey hazırsa, bu geçiş son kullanıcıya tamamen şeffaf olarak gerçekleşir.

Yorum yapın