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-checkzonevenamed-checkconfaraç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.