ndptool ile IPv6 Komşu Keşfi ve Router Advertisement Mesajlarını Analiz Etme
IPv6 ağlarında sorun giderme yaparken çoğu sistem yöneticisi hâlâ eski alışkanlıklarıyla ping ve traceroute ile başlar. Oysa IPv6’nın getirdiği en kritik mekanizmalardan biri olan Neighbor Discovery Protocol (NDP), kendi özel araçlarıyla incelendiğinde çok daha fazlasını ortaya koyar. ndptool bu araçların en pratik olanlarından biri ve bugün bunu gerçekten derinlemesine konuşacağız.
NDP Nedir ve Neden Önemli?
IPv4’te ARP ne işe yarıyorsa, IPv6’da NDP o işi görüyor, ama çok daha fazlasını da yapıyor. ARP sadece MAC adresini çözümlüyordu. NDP ise bunu yaparken aynı zamanda router keşfi, prefix öğrenme, duplicate address detection (DAD) ve neighbor unreachability detection (NUD) gibi kritik görevleri de üstleniyor.
NDP’nin temel mesaj tipleri şunlar:
- Router Solicitation (RS): Bir host, ağdaki router’ları keşfetmek için bu mesajı gönderir
- Router Advertisement (RA): Router’lar, ağ prefix bilgisi ve konfigürasyon parametrelerini bu mesajla duyurur
- Neighbor Solicitation (NS): ARP Request’in IPv6 karşılığı, bir IPv6 adresinin MAC adresini öğrenmek için kullanılır
- Neighbor Advertisement (NA): ARP Reply’ın karşılığı
- Redirect: Router’ın host’u daha iyi bir sonraki hop’a yönlendirmesi
ndptool, bu mesajları hem gönderebilen hem de dinleyebilen hafif bir araç. libndp kütüphanesinin parçası olarak geliyor ve çoğu distro’nun repolarında hazır bulunuyor.
Kurulum
# Debian/Ubuntu
sudo apt-get install ndptool
# RHEL/CentOS/Fedora
sudo dnf install ndptool
# Arch Linux
sudo pacman -S ndptool
Kurulumu doğrulamak için:
ndptool --version
ndptool‘un root yetkisi gerektirdiğini baştan belirteyim. Raw ICMPv6 soketleri açması gerekiyor ve bu yetki olmadan hiçbir şey yapamazsınız. sudo ile ya da doğrudan root olarak çalıştırın.
Temel Kullanım: İlk Monitor Oturumu
En temel kullanım senaryosu, bir arayüz üzerindeki tüm NDP trafiğini dinlemek:
sudo ndptool monitor -i eth0
Bu komutu çalıştırdığınızda terminal bekler. Başka bir terminalden ağda herhangi bir IPv6 aktivitesi olduğunda çıktı gelmeye başlar. Örnek bir çıktı şöyle görünür:
NDP payload len 24, from addr: fe80::1, iface: eth0
Type: RA
Hop limit: 64
Managed address configuration: no
Other configuration: no
Default lifetime: 1800s
Reachable time: unspecified
Retransmit time: unspecified
Bu çıktıda hemen dikkat etmeniz gereken şeyler var. Managed address configuration no olması, SLAAC (Stateless Address Autoconfiguration) kullanıldığı anlamına gelir. Eğer yes görseydiniz, ağda bir DHCPv6 sunucusu olduğunu ve adreslerin oradan alındığını anlardınız.
Mesaj Tipine Göre Filtreleme
Tüm NDP trafiğini dinlemek kalabalık ortamlarda gürültülü olabilir. Belirli mesaj tiplerini filtreleyebilirsiniz:
# Sadece Router Advertisement mesajlarını dinle
sudo ndptool monitor -i eth0 -t ra
# Sadece Neighbor Solicitation mesajlarını dinle
sudo ndptool monitor -i eth0 -t ns
# Sadece Neighbor Advertisement mesajlarını dinle
sudo ndptool monitor -i eth0 -t na
# Sadece Router Solicitation mesajlarını dinle
sudo ndptool monitor -i eth0 -t rs
Mesaj tipi parametreleri büyük/küçük harf duyarlı değil, ra veya RA yazabilirsiniz.
Router Advertisement Analizi: Gerçek Hayat Senaryosu
Geçen ay bir müşteride ilginç bir sorunla karşılaştım. Sunucular IPv6 adresi alıyor ama gateway’e erişemiyordu. Klasik ip -6 route komutu route tablosunu gösteriyordu ama bağlantı yoktu. İlk yaptığım şey RA mesajlarını monitor etmek oldu:
sudo ndptool monitor -i ens3 -t ra
Çıktıda iki farklı kaynak gördüm. Biri fe80::1 diğeri fe80::2. İkisi de RA gönderiyordu ama birinin lifetime değeri 0 idi. Bu, o router’ın artık default gateway olarak kullanılmaması gerektiğini söyleyen bir “ben çekiliyorum” mesajıydı. Sorun, sistemin hâlâ eski gateway’i kullanmaya devam etmesiydi çünkü kernel NDP cache’i henüz temizlenmemişti.
Bunu görmek için:
# NDP komşu tablosunu kontrol et
ip -6 neigh show
# Stale durumundaki girişleri temizle
sudo ip -6 neigh flush dev ens3
Sonrasında ndptool monitor ile yeni RA mesajını yakaladık ve sistem doğru gateway’i öğrendi. Eğer ndptool olmasaydı bu iki RA kaynağını bu kadar hızlı tespit edemezdik.
Router Solicitation Gönderme
Bazen bir arayüzün RA alıp almadığını test etmek ya da hemen bir RA tetiklemek istersiniz. Router’ın periyodik RA göndermesini beklemek yerine RS göndererek anlık yanıt alabilirsiniz:
sudo ndptool send -i eth0 -t rs
Bu komutu çalıştırdığınızda ndptool, ff02::2 (tüm router’lar multicast adresi) hedefine bir RS mesajı gönderir. Eğer ağda IPv6 router varsa hemen RA ile yanıt verir.
Bunu bir test scriptinde şöyle kullanabilirsiniz:
#!/bin/bash
IFACE=${1:-eth0}
TIMEOUT=5
echo "[$IFACE] Router Advertisement bekleniyor..."
timeout $TIMEOUT sudo ndptool monitor -i $IFACE -t ra &
MONITOR_PID=$!
sleep 1
sudo ndptool send -i $IFACE -t rs
wait $MONITOR_PID
EXIT_CODE=$?
if [ $EXIT_CODE -eq 124 ]; then
echo "UYARI: $TIMEOUT saniye icinde RA alinamadi!"
exit 1
else
echo "RA basariyla alindi."
fi
Bu script, özellikle yeni bir sunucu provision ederken IPv6 ağ bağlantısını doğrulamak için kullanışlı.
Verbose Mod ve Detaylı Analiz
ndptool‘un verbose modu, mesajların içindeki seçenekleri (options) de gösterir:
sudo ndptool monitor -i eth0 -t ra -v
Verbose modda bir RA çıktısı çok daha bilgi dolu görünür:
NDP payload len 88, from addr: fe80::1, iface: eth0
Type: RA
Hop limit: 64
Managed address configuration: no
Other configuration: no
Default lifetime: 1800s
Reachable time: unspecified
Retransmit time: unspecified
Source linkaddr: 00:11:22:33:44:55
Prefix: 2001:db8:cafe:1::/64
Valid time: 86400s
Preferred time: 14400s
On-link: yes
Autonomous address-configuration: yes
Route: ::/0
Lifetime: 1800s
Preference: medium
Recursive DNS server: 2001:db8:cafe::53
Lifetime: 3600s
Bu çıktıyı analiz edelim:
- Source linkaddr: Router’ın MAC adresi. Eğer birden fazla RA görüyorsanız ve MAC adresleri farklıysa gerçekten farklı cihazlar var demektir
- Prefix bloğu: SLAAC için kullanılacak prefix.
Autonomous: yesolması kritik, bu olmadan host IPv6 adresi oluşturamaz - Valid time / Preferred time: Prefix’in ne kadar süre geçerli olduğu. Preferred time dolunca adres deprecated olur, valid time dolunca tamamen geçersiz
- Recursive DNS server: RDNSS seçeneği, DHCPv6 olmadan DNS sunucusu dağıtmak için kullanılır. Birçok modern Linux sistem bunu kernel ya da networkd üzerinden otomatik işler
Duplicate Address Detection Takibi
IPv6’da bir host yeni adres oluştururken önce o adresin başka biri tarafından kullanılıp kullanılmadığını kontrol etmesi gerekir (DAD). Bu süreçte NS mesajları gönderilir. ndptool ile bu süreci takip edebilirsiniz:
# Tüm NS mesajlarını izle, DAD paketlerini yakala
sudo ndptool monitor -i eth0 -t ns
DAD NS mesajları özeldir: kaynak adresi :: (unspecified) olur. Eğer çıktıda kaynak adresi :: olan NS mesajları görüyorsanız, ağda yeni bir cihaz IPv6 adresi edinmeye çalışıyor demektir.
Bir adreste DAD çakışması olup olmadığını anlamak için NA mesajlarını da izlemek gerekir:
# Hem NS hem NA izle
sudo ndptool monitor -i eth0 -t ns &
sudo ndptool monitor -i eth0 -t na &
Eğer bir DAD NS’e karşılık NA geliyorsa, o adres zaten kullanımda demektir ve host o adresi kullanamaz. Bu durumu ip -6 addr show ile de görebilirsiniz, tentative veya dadfailed durumunda adresler görürsünüz.
Çoklu Arayüz İzleme
Büyük sistemlerde birden fazla ağ arayüzünü aynı anda izlemek gerekebilir. ndptool tek seferde bir arayüzü destekliyor, ama bunu şöyle aşabilirsiniz:
#!/bin/bash
# Tüm IPv6 aktif arayüzleri bul ve monitör et
for iface in $(ip -6 link show | grep -v lo | awk -F': ' '{print $2}' | tr -d ' '); do
echo "Monitoring: $iface"
sudo ndptool monitor -i $iface -t ra >> /tmp/ndp_monitor_${iface}.log 2>&1 &
done
echo "Tum arayuzler izleniyor. Durdurmak icin: killall ndptool"
echo "Loglar: /tmp/ndp_monitor_*.log"
Production ortamda bu tür bir scripti systemd servisi ya da screen/tmux oturumunda çalıştırabilirsiniz.
Güvenlik Perspektifinden NDP İzleme
NDP, IPv6 ağlarında ciddi bir güvenlik açığı kaynağı olabilir. Rogue RA saldırıları, ağa bağlanan kötü niyetli bir cihazın sahte Router Advertisement mesajları göndererek trafiği kendisi üzerinden geçirmesini sağlayan man-in-the-middle saldırısıdır.
Bu saldırıyı tespit etmek için:
# RA kaynaklarını logla ve beklenmedik kaynak var mi kontrol et
sudo ndptool monitor -i eth0 -t ra | while read line; do
echo "$(date '+%Y-%m-%d %H:%M:%S') $line" >> /var/log/ndp_ra.log
if echo "$line" | grep -q "from addr"; then
SOURCE=$(echo "$line" | grep -oP 'fe80::[^s,]+')
if [ "$SOURCE" != "fe80::1" ] && [ -n "$SOURCE" ]; then
echo "UYARI: Beklenmedik RA kaynagi: $SOURCE" | logger -t ndp-monitor
echo "UYARI: Beklenmedik RA kaynagi: $SOURCE"
fi
fi
done
Bu tabii ki çok basit bir yaklaşım. Gerçek ortamda radvd ile birlikte ndptool kullanmak ya da dedicated RA Guard özelliği olan switch altyapısına sahip olmak daha sağlam çözümler sunar. Ama en azından ne döndüğünü görmek için bu yeterli.
ndptool ile radvd Konfigürasyonu Doğrulama
Kendi router advertisement sunucunuzu çalıştırıyorsanız, yani radvd ya da systemd-networkd ile RA konfigürasyonu yaptıysanız, ndptool ile doğrulama yapmak son derece değerli:
# radvd başlat (varsa)
sudo systemctl start radvd
# Başka bir terminalden RA mesajlarını izle
sudo ndptool monitor -i eth0 -t ra -v
Örnek bir test senaryosu: radvd.conf dosyanızda şöyle bir konfigürasyon varsa:
interface eth0 {
AdvSendAdvert on;
MinRtrAdvInterval 10;
MaxRtrAdvInterval 30;
prefix 2001:db8:1::/64 {
AdvOnLink on;
AdvAutonomous on;
AdvRouterAddr on;
};
};
ndptool monitor çıktısında 2001:db8:1::/64 prefix’ini, Autonomous: yes ve On-link: yes değerlerini görmesi gerekir. Eğer görmüyorsanız radvd.conf hatalı ya da servis düzgün çalışmıyor demektir.
Pratik Komut Özeti
ndptool parametreleri ve kullanımları:
monitor: Belirtilen arayüzdeki NDP mesajlarını dinlersend: Belirtilen tipte NDP mesajı gönderir-i: Hangi ağ arayüzü üzerinde çalışılacağını belirtir, zorunlu parametre-t: Mesaj tipi filtresi;ra,rs,na,nsdeğerlerini alır-v: Verbose mod, mesaj içindeki tüm seçenekleri gösterir--help: Kısa yardım çıktısı
tcpdump ile Birlikte Kullanım
ndptool çıktısını daha düşük seviyede doğrulamak istediğinizde tcpdump ile aynı anda çalıştırmak iyi bir pratik:
# Bir terminalde ndptool
sudo ndptool monitor -i eth0 -t ra -v
# Diğer terminalde tcpdump ile ICMPv6 tip 134 (RA) yakala
sudo tcpdump -i eth0 -v "icmp6 and ip6[40] == 134"
ICMPv6 tip numaraları:
- 133: Router Solicitation
- 134: Router Advertisement
- 135: Neighbor Solicitation
- 136: Neighbor Advertisement
- 137: Redirect
Her iki aracın çıktılarını karşılaştırmak, özellikle bir şeylerin beklendiği gibi gözükmediği durumlarda ikinci gözle bakış sağlar.
Sorun Giderme Senaryoları
Gerçek hayatta en çok karşılaşılan durumlar:
SLAAC çalışmıyor, adres alınamıyor: İlk kontrol ndptool monitor -i eth0 -t ra ile RA geliyor mu diye bakmak. RA gelmiyorsa ya ağda IPv6 router yok, ya arayüzde IPv6 devre dışı, ya da güvenlik duvarı ICMPv6’yı blokluyordur.
Adres alınıyor ama gateway çalışmıyor: RA’daki lifetime değerlerine bakın. Sıfır lifetime gördüyseniz router kendini devre dışı bırakıyor demektir.
DNS çözümlenemiyor ama bağlantı var: RA’da RDNSS seçeneği var mı kontrol edin. Yoksa DHCPv6 ya da manuel DNS konfigürasyonu gerekecek.
Adralar deprecated görünüyor: Preferred lifetime dolmuş. RA’nın preferred time değerini ve ne zaman güncellendiğini kontrol edin.
Sonuç
ndptool, IPv6 ağlarında çalışan herkesin araç kutusunda olması gereken ama çoğu zaman göz ardı edilen bir yardımcı program. ARP tablosuna arp -n ile bakma alışkanlığınız varsa, IPv6 tarafında ndptool monitor aynı yeri dolduruyor, hatta çok daha fazlasını veriyor.
Router Advertisement mesajlarını gerçek zamanlı izlemek, özellikle cloud ortamlarında ve container ağlarında IPv6 sorunlarını çözerken zaman kazandırıyor. DHCPv6 mı kullanıyorum yoksa SLAAC mı, prefix doğru mu dağıtılıyor, birden fazla RA kaynağı var mı, RDNSS gidiyor mu gibi sorulara dakikalar içinde yanıt bulabiliyorsunuz.
IPv6’ya geçiş sürecinde olan ya da hibrit IPv4/IPv6 ortamlarını yöneten sistem yöneticileri için bu aracı öğrenmek, ip neigh ve ip -6 route komutlarını öğrenmek kadar temel bir beceri. Ağdaki görünmez konuşmaları dinlemeye başladığınızda, sorunların neden oluştuğunu anlama hızınız ciddi biçimde artıyor.
