ndisc6 ve rdisc6 ile IPv6 Ağ Keşfi ve Router Solicitation Analizi
IPv6 geçişinin üzerinden yıllar geçti ama hâlâ birçok sistem yöneticisi “zaten IPv4 çalışıyor, neden uğraşayım” diye düşünüyor. Sonra bir gün üretim ortamında IPv6 prefix delegation sorunuyla karşılaşıyorsunuz ya da bir router’ın RA mesajlarını neden göndermediğini anlamaya çalışıyorsunuz ve elinizde hiçbir araç yok. İşte tam bu noktada ndisc6 ve rdisc6 hayat kurtarıcı oluyor.
Bu yazıda bu iki aracı sadece “şu komutu çalıştır, şu çıktıyı al” düzeyinde değil, gerçekten ne iş yaptıklarını, neden bu şekilde çalıştıklarını ve üretim ortamında nasıl kullandığımı anlatacağım.
ndisc6 ve rdisc6 Nedir, Nereden Gelir?
Bu araçlar ndisc6 paketinin içinde geliyor. Debian/Ubuntu’da:
apt install ndisc6
RHEL/CentOS ailesi için:
dnf install ndisc6
Paketin içinde birkaç araç var: ndisc6, rdisc6, rltraceroute6 ve tcptraceroute6. Biz bugün ilk ikisine odaklanacağız.
ndisc6, Neighbor Discovery Protocol’ü (NDP) manuel olarak tetiklemenizi sağlar. IPv6’da ARP’ın yerini alan bu protokol, aynı link üzerindeki komşu cihazların MAC adreslerini öğrenmek için kullanılır. IPv4’te arping ne ise, IPv6’da ndisc6 odur.
rdisc6 ise Router Discovery anlamına gelir ve bir ağ arayüzü üzerinden Router Advertisement (RA) mesajları isteyerek router bilgilerini keşfeder. SLAAC (Stateless Address Autoconfiguration) mekanizmasının temelinde bu protokol yatar.
IPv6 Neighbor Discovery’nin Kısa Özeti
Araçlara geçmeden önce NDP’nin ne yaptığını netleştirelim, çünkü komutların çıktılarını anlamak buna bağlı.
NDP, ICMPv6 üzerine kurulu birkaç mesaj tipini kullanır:
- Neighbor Solicitation (NS): “Bu IPv6 adresi kimin?” sorusunu soran mesaj. Multicast olarak gönderilir.
- Neighbor Advertisement (NA): NS sorusuna verilen yanıt. “Bu adres benim, MAC adresim şu.”
- Router Solicitation (RS): “Bu ağda router var mı?” sorusu. Host’lar boot sırasında ya da arayüz ayağa kalktığında bunu gönderir.
- Router Advertisement (RA): Router’ın “Ben buradayım, prefix şu, gateway şuyum” dediği mesaj.
ndisc6 NS/NA döngüsünü, rdisc6 ise RS/RA döngüsünü manuel tetikler. Basit ama güçlü.
ndisc6 ile Komşu Keşfi
Temel Kullanım
ndisc6 2001:db8::1 eth0
Bu komut, eth0 arayüzü üzerinden 2001:db8::1 adresine bir Neighbor Solicitation gönderir ve gelen Neighbor Advertisement’ı ekrana basar. Çıktı şöyle görünür:
Soliciting 2001:db8::1 (ff02::1:ff00:1) on eth0...
Target link-layer address: 00:1a:2b:3c:4d:5e
from fe80::21a:2bff:fe3c:4d5e
İlk satırda hangi solicited-node multicast adresine gönderdiğini görüyorsunuz. Bu, IPv6’nın ARP broadcast’ini nasıl multicast’e dönüştürdüğünün özeti.
Zaman Aşımı ve Yeniden Deneme Seçenekleri
ndisc6 -r 3 -w 2000 2001:db8::1 eth0
- -r 3: Yanıt gelmezse 3 kere dene
- -w 2000: Her denemede 2000 milisaniye bekle
Yavaş ya da yüklü bir ağda bu parametreler olmadan false negative alabilirsiniz. Özellikle bir cihazın gerçekten offline mı yoksa sadece yavaş mı olduğunu test ederken bu fark önemli.
Numeric Mod ve Verbose Çıktı
ndisc6 -n fe80::1 eth0
-n bayrağı hostname çözümlemesini atlar. Hızlı test senaryolarında işe yarar çünkü DNS sorgusu yapılmaz.
Daha ayrıntılı çıktı için:
ndisc6 -v 2001:db8:cafe::1 eth0
Verbose modda hangi multicast grubuna katıldığını, hangi ICMPv6 mesajını gönderdiğini ve raw yanıtın ne olduğunu görebilirsiniz. Paket düzeyinde debug yapıyorsanız bu mod altın değerinde.
Link-Local Adres Keşfi
IPv6’da her arayüzün bir link-local adresi vardır (fe80::/10 aralığında). Global adres henüz atanmamışken bile bu adresler aktif olur. ndisc6 ile bu adreslere ulaşabilirsiniz:
ndisc6 fe80::1 eth0
Dikkat: Link-local adreslerde mutlaka arayüz belirtmek zorundasınız, yoksa “Destination is not a neighbor address” hatası alırsınız. Bu hata ilk kez karşılaştığınızda biraz kafa karıştırıcı olabiliyor.
rdisc6 ile Router Solicitation Analizi
Temel Router Keşfi
rdisc6 eth0
Bu kadar. eth0 arayüzü üzerinden ff02::2 (all-routers multicast) adresine bir RS gönderir ve gelen RA mesajlarını decode ederek gösterir. Tipik bir çıktı:
Soliciting ff02::2 (ff02::2) on eth0...
Hop limit : 64 ( 0x40)
Stateful address conf. : No
Stateful other conf. : No
Mobile home agent : No
Router preference : medium
Neighbor discovery proxy : No
Router lifetime : 1800 (0x00000708) seconds
Reachable time : unspecified (0x00000000)
Retransmit time : unspecified (0x00000000)
Source link-layer address: 00:1a:2b:3c:4d:5e
Prefix : 2001:db8::/64
Valid time : 2592000 (0x00278d00) seconds
Pref. time : 604800 (0x00093a80) seconds
Autonomous address conf.: Yes
On-link : Yes
from fe80::21a:2bff:fe3c:4d5e
Bu çıktıyı satır satır okuyabilmek bir sysadmin için kritik. Şimdi önemli alanlara bakalım:
- Stateful address conf.: “Yes” ise DHCPv6 kullan diyor. “No” ise SLAAC yeterli.
- Router lifetime: Bu router’ın default gateway olarak ne kadar süre geçerli olduğu. 0 ise bu cihaz default gateway olmak istemiyor.
- Autonomous address conf.: “Yes” ise host bu prefix’ten kendi adresini oluşturabilir (SLAAC).
- On-link: “Yes” ise bu prefix aynı link üzerinde, direkt erişilebilir.
Multiple Router Senaryosu
rdisc6 -m eth0
-m bayrağı multiple RA beklemenizi sağlar, tek bir cevap alınca durmuyor. Birden fazla router olan ağlarda hangisinin ne söylediğini görmek için kullanışlı. Örneğin dual-router setup’ında her ikisinin de RA gönderip göndermediğini, prefix delegasyonlarının tutarlı olup olmadığını kontrol edebilirsiniz.
Zaman Aşımı ile Kullanım
rdisc6 -w 5000 eth0
5 saniye boyunca RA bekler. Varsayılan bekleme süresi bazen yetmeyebiliyor, özellikle router’ın RA aralığı uzunsa.
Maksimum Hop Sayısı
rdisc6 -1 eth0
Tek bir RA alındığında hemen çıkar. Script içinde kullanırken ideal, çünkü komutun ne zaman biteceğini biliyorsunuz.
Gerçek Dünya Senaryoları
Senaryo 1: Yeni Sunucu Ağa Bağlandı, IPv6 Adresi Almıyor
Bunu defalarca yaşadım. Sunucu ağa bağlanıyor, IPv4 adresi DHCP’den geliyor ama IPv6 adresi yok. İlk kontrol:
rdisc6 eth0
Soliciting ff02::2 (ff02::2) on eth0...
Timed out.
RA gelmiyor. Şimdi sorular: Router IPv6’yı destekliyor mu? RA gönderimi açık mı? Arayüzde bir sorun mu var?
Router’ın link-local adresini biliyorsanız (genellikle fe80::1 ya da benzer bir şey):
ndisc6 fe80::1 eth0
Eğer bu çalışıyorsa router erişilebilir ama RA göndermiyordur. Router konfigürasyonuna bakmanız gerekiyor. Linux router kullanıyorsanız radvd servisini kontrol edin:
systemctl status radvd
journalctl -u radvd -n 50
Senaryo 2: SLAAC mi DHCPv6 mı Kullanılıyor?
Ağ ekibi “biz DHCPv6 kullanıyoruz” diyor ama sunucu SLAAC adresi almış gibi görünüyor. Hangisinin aktif olduğunu anlamak için:
rdisc6 -1 eth0 | grep -E "Stateful|Autonomous"
Stateful address conf. : No
Autonomous address conf.: Yes
Açık. Router SLAAC söylüyor, DHCPv6 değil. Ağ ekibinin konfigürasyonu güncellemesi ya da M bit’ini (Managed flag) set etmesi gerekiyor.
Senaryo 3: IPv6 Gateway’i Doğrulama
Routing tablonuzda bir IPv6 default route var ama gerçekte o router ayakta mı ve RA gönderiyor mu diye kontrol etmek istiyorsunuz:
rdisc6 -n eth0 2>&1 | grep "from"
from fe80::21a:2bff:fe3c:4d5e
Bu link-local adres routing tablonuzdaki gateway ile örtüşüyor mu?
ip -6 route show default
default via fe80::21a:2bff:fe3c:4d5e dev eth0 proto ra metric 100 expires 1799sec
Tutarlı. Gateway hem RA gönderiyor hem de routing tabloda doğru görünüyor.
Senaryo 4: Neighbor Cache Sorunları
Bazen IPv6 üzerinden bir host’a ulaşamıyorsunuz ama adres doğru görünüyor. Neighbor cache’e bakın:
ip -6 neigh show
2001:db8::10 dev eth0 lladdr 00:1a:2b:3c:4d:5e STALE
fe80::1 dev eth0 lladdr 00:1a:2b:3c:4d:5e REACHABLE
STALE durumu “bir zamanlar bu adres bu MAC’teydi ama artık doğrulanmamış” demek. Manuel olarak güncellemek için:
ndisc6 2001:db8::10 eth0
Bu komutu çalıştırınca sistem NS gönderir ve NA alınırsa neighbor cache REACHABLE durumuna geçer.
Script ile Toplu Komşu Tarama
Bir subnet’teki aktif IPv6 host’larını bulmak istiyorsanız basit bir script işinizi görür:
#!/bin/bash
IFACE="eth0"
PREFIX="2001:db8::"
echo "IPv6 komsu taramasi basliyor: ${PREFIX}/64"
echo "Arayuz: ${IFACE}"
echo "---"
for i in $(seq 1 254); do
TARGET="${PREFIX}${i}"
RESULT=$(ndisc6 -r 1 -w 500 "$TARGET" "$IFACE" 2>/dev/null)
if echo "$RESULT" | grep -q "link-layer address"; then
MAC=$(echo "$RESULT" | grep "link-layer" | awk '{print $NF}')
echo "AKTIF: ${TARGET} -> MAC: ${MAC}"
fi
done
echo "Tarama tamamlandi."
Bu script ndisc6‘nın tek deneme ve 500ms timeout ile hızlı çalışmasını sağlar. Büyük subnet’lerde paralel çalıştırmak isterseniz & ve wait kombinasyonu kullanabilirsiniz ama ağ trafiğini patlatmamak için dikkatli olun.
rdisc6 Çıktısını Parse Etmek
Monitoring sistemlerine entegre etmek için rdisc6 çıktısını parse etmeniz gerekebilir:
#!/bin/bash
IFACE="${1:-eth0}"
OUTPUT=$(rdisc6 -1 -w 3000 "$IFACE" 2>&1)
if echo "$OUTPUT" | grep -q "Timed out"; then
echo "CRITICAL: $IFACE uzerinde IPv6 router bulunamadi"
exit 2
fi
LIFETIME=$(echo "$OUTPUT" | grep "Router lifetime" | grep -oP 'd+(?= ()')
PREFIX=$(echo "$OUTPUT" | grep "Prefix" | grep -oP '[da-f:]+/d+' | head -1)
MANAGED=$(echo "$OUTPUT" | grep "Stateful address" | grep -oP 'Yes|No')
echo "OK: Router aktif"
echo " Prefix: ${PREFIX}"
echo " Lifetime: ${LIFETIME}s"
echo " DHCPv6 Managed: ${MANAGED}"
exit 0
Bu scripti Nagios/Icinga check’i olarak kullanabilirsiniz. Router lifetime’ı izlemek özellikle önemli, çünkü 0’a düştüğünde host’lar o router’ı default gateway olarak kullanmayı bırakır.
IPv6 NDP Güvenlik Notları
NDP oldukça güçlü ama aynı zamanda saldırıya açık. ndisc6 ve rdisc6 kullanırken şunları bilmek gerekiyor:
- RA Spoofing: Saldırgan sahte RA gönderip kendini default gateway olarak gösterebilir. Buna karşı
radvdtarafındaRA Guard(RFC 6105) veya switch portunda RA Guard politikaları uygulanmalı. - NDP Spoofing: Neighbor Solicitation’lara sahte NA yanıtları gönderilebilir.
NDPmongibi araçlarla neighbor cache değişiklikleri izlenebilir. - ndisc6 ile güvenlik testi: Kendi ağınızda
ndisc6ile aktif host’ları keşfedebilirsiniz. Bu yasal bir güvenlik testi için gayet makul, ama izinsiz ağlarda kullanmayın.
Bir sunucunun hangi IPv6 adreslerine NA gönderdiğini görmek için tcpdump ile birlikte kullanmak aydınlatıcı olabilir:
tcpdump -i eth0 -n "icmp6 and (ip6[40] == 136 or ip6[40] == 135)"
ICMPv6 tip 135 NS, tip 136 NA. Bunu bir terminalde açık bırakıp diğer terminalde ndisc6 çalıştırırsanız tüm alışverişi canlı izleyebilirsiniz.
Sık Karşılaşılan Hatalar ve Çözümleri
“ff02::2: Address already in use”
Arayüzde başka bir NDP işlemi devam ediyordur. Birkaç saniye bekleyip tekrar deneyin.
“ndisc6: bind: Invalid argument”
IPv6 arayüzde aktif değil. Kontrol:
ip -6 addr show eth0
sysctl net.ipv6.conf.eth0.disable_ipv6
Eğer disable_ipv6 = 1 dönüyorsa:
sysctl -w net.ipv6.conf.eth0.disable_ipv6=0
“Timed out” ama ping6 çalışıyor
Firewall/nftables kuralları ICMPv6 multicast’i bloke ediyor olabilir. ff02::2 ve solicited-node multicast adreslerine gelen ICMPv6’nın geçişine izin verin:
ip6tables -A INPUT -p ipv6-icmp -j ACCEPT
Üretim ortamında bunu daha spesifik yapın elbette, tüm ICMPv6’ya izin vermek yerine tip bazlı kural yazın.
Sonuç
ndisc6 ve rdisc6, IPv6 ağ yönetiminin vazgeçilmez araçları. IPv4’te arping ve eski rdisc araçlarına ne kadar alışkınsanız, IPv6 tarafında bunlara o kadar ihtiyaç duyacaksınız.
Özellikle şu üç noktayı vurgulamak isterim: Birincisi, bu araçları sadece sorun çıktığında değil, periyodik olarak monitoring scriptlerinize ekleyin. Router lifetime’ın izlenmesi ve RA’nın düzenli geldiğinin doğrulanması, sessiz IPv6 kesintilarını engeller. İkincisi, yeni bir ağa bağlandığınızda rdisc6 ile o ağın IPv6 politikasını (SLAAC mı, DHCPv6 mi, prefix ne, lifetime ne) anlamak dakikalar alır ve ilerleyen sorunları önceden görmenizi sağlar. Üçüncüsü, ndisc6‘yı tcpdump ile birlikte kullanmayı alışkanlık edinin. Paket düzeyinde görmek, soyut protokol bilgisini somut hale getirir ve troubleshooting sürenizi dramatik biçimde kısaltır.
IPv6’dan kaçınmak artık gerçekçi değil. Ama doğru araçlarla, aslında IPv4’ten çok da farklı değil.
