lldpd ve lldpcli ile LLDP Protokolü Üzerinden Ağ Topolojisi Keşfi
Ağ altyapısını belgelemenin en sinir bozucu tarafı şudur: switch’e bağlı hangi sunucunun hangi porta takılı olduğunu bulmaya çalışırken saatlerce uğraşırsınız. Kablo izleme, fiziksel kontrol, switch arayüzüne bağlanıp MAC tablosunu karıştırma… Oysa LLDP protokolü bu işi tamamen otomatik hale getirebilir. Linux tarafında lldpd ve lldpcli ikilisi ile komşu cihaz bilgilerini saniyeler içinde alabilir, ağ topolojinizi programatik olarak keşfedebilirsiniz.
LLDP Nedir, Neden Önemlidir?
LLDP (Link Layer Discovery Protocol), IEEE 802.1AB standardıyla tanımlanmış bir katman 2 protokolüdür. Temel mantığı basit: her cihaz, bağlı olduğu arayüzler üzerinden periyodik olarak “ben buyum, şu özelliklere sahibim” diye duyuru yapar. Bu duyurular TLV (Type-Length-Value) formatında paketlenerek multicast MAC adresine gönderilir.
Pratik hayatta ne işe yarar? Bir veri merkezinde yüzlerce sunucunuz var diyelim. Yeni bir sunucu rack’e takıldı, switch portunu bilmiyorsunuz. LLDP açıksa sunucudan lldpcli show neighbors yazarsınız, karşı tarafın switch adını, port numarasını, VLAN bilgisini direkt görürsünüz. Artık switch konsoluna geçip MAC tablosunu takip etmenize gerek yok.
Cisco CDP’ye benzer ama vendor-agnostic olması kritik avantaj. Arista, Juniper, HP, Dell switch’lerin hepsi LLDP konuşur. Linux sunucular da lldpd ile bu ekosisteme dahil olur.
lldpd Kurulumu ve Temel Yapılandırma
Debian/Ubuntu tabanlı sistemlerde kurulum oldukça basit:
# Debian/Ubuntu
apt install lldpd
# RHEL/CentOS/Rocky Linux
dnf install lldpd
# Arch Linux
pacman -S lldpd
Kurulum sonrası servis otomatik başlar ama kontrol edelim:
systemctl status lldpd
systemctl enable --now lldpd
lldpd varsayılan yapılandırmasıyla çoğu ortamda sorunsuz çalışır ancak /etc/lldpd.conf veya /etc/lldpd.d/ dizini altında özelleştirme yapabilirsiniz. Ben genellikle şu temel yapılandırmayı kullanıyorum:
# /etc/lldpd.d/custom.conf
configure system hostname web01.datacenter.example.com
configure system description "Web Application Server - Rack 3"
configure lldp tx-interval 30
configure lldp tx-hold 4
configure system hostname: LLDP duyurularında kullanılacak hostname’i belirler. Gerçek sistem hostname’inden farklı ayarlamak isteyebilirsiniz.
configure lldp tx-interval: Saniye cinsinden duyuru aralığı. Varsayılan 30 saniyedir, production’da bu değeri artırmak bant genişliği açısından mantıklı olabilir.
configure lldp tx-hold: Bilgilerin geçerlilik süresi çarpanı. tx-interval ile çarpılarak toplam geçerlilik süresi hesaplanır. 4 değeriyle 120 saniye olur.
Yapılandırmayı değiştirdikten sonra servisi yeniden başlatın:
systemctl restart lldpd
lldpcli ile Komşu Cihaz Sorgulama
lldpcli interaktif veya tek seferlik komut modunda çalışabilir. Ben çoğunlukla tek seferlik modda kullanıyorum, script’lere entegre etmek çok daha kolay.
En temel komut komşuları listelemek:
lldpcli show neighbors
Çıktı şöyle görünür:
-------------------------------------------------------------------------------
LLDP neighbors:
-------------------------------------------------------------------------------
Interface: eth0, via: LLDP, RID: 1, Time: 0 day, 00:04:23
Chassis:
ChassisID: mac 00:1a:2b:3c:4d:5e
SysName: core-sw01.datacenter.example.com
SysDescr: Arista Networks EOS version 4.28.3M running on an Arista Networks DCS-7050CX3-32S
MgmtIP: 10.0.0.1
Capability: Bridge, on
Capability: Router, on
Port:
PortID: local Ethernet1/12
PortDescr: Server Port - web01
TTL: 120
VLAN:
VLAN: 100, pvid: yes
VLAN: 200
MED:
MED type: Network Connectivity Device
Bu çıktıdan şunu anlıyoruz: sunucumuzun eth0 arayüzü, core-sw01.datacenter.example.com adlı Arista switch’inin Ethernet1/12 portuna bağlı. Switch’in management IP’si 10.0.0.1. Bu bilgiyi bulmak için eskiden 10 dakika harcardık.
Belirli bir arayüz üzerindeki komşuları filtrelemek için:
lldpcli show neighbors ports eth0
Birden fazla arayüz belirtebilirsiniz:
lldpcli show neighbors ports eth0 eth1 bond0
Çıktı Formatları ve Parsing
Sistem yönetiminde en değerli özellik JSON veya XML çıktı alabilmek. Script’lerde kullanmak için mükemmel:
# JSON formatında çıktı
lldpcli -f json show neighbors
# XML formatında çıktı
lldpcli -f xml show neighbors
# Keyvalue formatı - basit parsing için
lldpcli -f keyvalue show neighbors
JSON çıktısını jq ile işlemek çok güçlü kombinasyon oluşturur:
# Sadece switch adlarını listele
lldpcli -f json show neighbors | jq -r '.lldp[].interface[].via.chassis["chassis-id"]'
# Komşu switch adı ve port bilgisini özetle
lldpcli -f json show neighbors | jq -r '
.lldp[].interface[] |
"(.name): (.via.chassis["sys-name"]) -> (.via.port["port-id"])"
'
# Management IP'leri çek
lldpcli -f json show neighbors | jq -r '
.lldp[].interface[].via.chassis["mgmt-ip"][]? // empty
'
Keyvalue formatı ise daha basit ama hızlı işlemler için kullanışlı:
lldpcli -f keyvalue show neighbors | grep -E "(lldp.|.sys-name|.port-id)"
Yerel Sistem Bilgilerini Görüntüleme
Komşuları sorguladığımız gibi kendi sistemimizin LLDP duyurularını da kontrol edebiliriz. Bu özellikle “karşı taraf beni nasıl görüyor” sorusunu cevaplamak için kritik:
# Kendi sistem bilgilerini göster
lldpcli show chassis
# Tüm interface'lerin durumunu göster
lldpcli show interface
# Belirli interface detayı
lldpcli show interface eth0
show chassis çıktısı size şunu gösterir:
-------------------------------------------------------------------------------
Local chassis:
-------------------------------------------------------------------------------
ChassisID: mac 00:11:22:33:44:55
SysName: web01.datacenter.example.com
SysDescr: Ubuntu 22.04.3 LTS Linux 5.15.0-91-generic #101-Ubuntu SMP x86_64
MgmtIP: 192.168.1.100
MgmtIP: fe80::211:22ff:fe33:4455
Capability: Bridge, off
Capability: Router, off
Capability: Wired, on
İstatistik ve Yönetim Bilgileri
LLDP istatistikleri troubleshooting’de çok işe yarar:
# LLDP trafik istatistikleri
lldpcli show statistics
# Özet istatistikler
lldpcli show statistics summary
Bu komutlar her arayüzde kaç LLDP frame gönderilip alındığını, kaç frame atıldığını gösterir. Eğer bir arayüzde LLDP frame alınamıyorsa ama karşı tarafta LLDP açık olması gerekiyorsa, bu çıktı ilk kontrol noktanızdır.
# Tüm LLDP yapılandırmasını göster
lldpcli show configuration
# Sadece LLDP zamanlama ayarlarını göster
lldpcli show configuration lldp
Gerçek Dünya Senaryosu: Veri Merkezi Topoloji Haritası Çıkarma
Diyelim ki 50 sunucudan oluşan bir ortamda hangi sunucunun hangi switch’e, hangi porta bağlı olduğunu belgeleyen bir script yazmak istiyorsunuz. LLDP olmadan bu iş günler sürebilir. Şöyle bir script hazırlayabilirsiniz:
#!/bin/bash
# topoloji_haritas.sh - LLDP ile topoloji keşfi
OUTPUT_FILE="/tmp/network_topology_$(date +%Y%m%d_%H%M%S).csv"
HOSTNAME=$(hostname -f)
echo "Server,Interface,Switch_Name,Switch_Port,Switch_MgmtIP,VLAN" > "$OUTPUT_FILE"
# Her interface için LLDP komşularını sorgula
lldpcli -f json show neighbors | jq -r --arg host "$HOSTNAME" '
.lldp[].interface[] |
. as $iface |
{
server: $host,
interface: $iface.name,
switch_name: ($iface.via.chassis["sys-name"] // "unknown"),
switch_port: ($iface.via.port["port-id"] // "unknown"),
mgmt_ip: ($iface.via.chassis["mgmt-ip"][0] // "unknown"),
vlan: ([($iface.via.vlan[]? | select(.pvid == true) | .vlan-id)] | first // "unknown")
} |
"(.server),(.interface),(.switch_name),(.switch_port),(.mgmt_ip),(.vlan)"
' >> "$OUTPUT_FILE"
echo "Topoloji bilgisi kaydedildi: $OUTPUT_FILE"
cat "$OUTPUT_FILE"
Bu script’i Ansible ile tüm sunucularda çalıştırıp çıktıları merkezi bir yerde topladığınızda, tüm datacenter topolojinizi otomatik olarak elde edersiniz.
Gerçek Dünya Senaryosu: Bağlantı Doğrulama ve Monitoring
Bir diğer kritik kullanım alanı: bir sunucunun doğru switch portuna bağlı olup olmadığını periyodik olarak kontrol etmek. Patch kablolar karıştırılabilir, yanlış porta takılabilir. LLDP ile bunu monitoring sistemine entegre edebilirsiniz:
#!/bin/bash
# lldp_check.sh - Beklenen switch/port bağlantısını doğrula
EXPECTED_SWITCH="core-sw01.datacenter.example.com"
EXPECTED_PORT="Ethernet1/12"
INTERFACE="eth0"
CURRENT_SWITCH=$(lldpcli -f json show neighbors ports $INTERFACE |
jq -r '.lldp[].interface[0].via.chassis["sys-name"] // empty')
CURRENT_PORT=$(lldpcli -f json show neighbors ports $INTERFACE |
jq -r '.lldp[].interface[0].via.port["port-id"] // empty')
if [[ -z "$CURRENT_SWITCH" ]]; then
echo "CRITICAL: $INTERFACE üzerinde LLDP komşusu bulunamadı"
exit 2
fi
if [[ "$CURRENT_SWITCH" != "$EXPECTED_SWITCH" ]]; then
echo "WARNING: Beklenmeyen switch! Beklenen: $EXPECTED_SWITCH, Bulunan: $CURRENT_SWITCH"
exit 1
fi
if [[ "$CURRENT_PORT" != "$EXPECTED_PORT" ]]; then
echo "WARNING: Beklenmeyen port! Beklenen: $EXPECTED_PORT, Bulunan: $CURRENT_PORT"
exit 1
fi
echo "OK: $INTERFACE -> $CURRENT_SWITCH:$CURRENT_PORT"
exit 0
Bu script’i Nagios/Zabbix/Prometheus ile entegre edebilirsiniz. Herhangi bir kablo değişikliğinde anında alert alırsınız.
LLDP-MED ve Ek Özellikler
LLDP-MED (Media Endpoint Discovery), temel LLDP’yi genişleten bir standarttır. Özellikle VoIP cihazları ve fiziksel konum bilgisi için kullanılır. Linux tarafında lldpd bunu da destekler:
# LLDP-MED bilgilerini göster
lldpcli show neighbors detail
# Sadece MED bilgilerini filtrele
lldpcli -f json show neighbors | jq '.lldp[].interface[].via.med // empty'
Inventory sistemlerine LLDP-MED ile konum bilgisi ekleyebilirsiniz:
# /etc/lldpd.d/location.conf
configure med location coordinate latitude 41.015137 N longitude 28.979530 E altitude 50 m datum WGS84
Bu özellik özellikle fiziksel konumun önemli olduğu büyük kampüs ağlarında veya çok katlı ofis ortamlarında değerli bilgi sağlar.
Troubleshooting: LLDP Neden Çalışmıyor?
Bazı durumlarda LLDP komşuları görünemez. En sık karşılaşılan sorunlar ve çözümleri:
Firewall veya bridge filtresi blokluyor olabilir. LLDP multicast MAC adresi 01:80:C2:00:00:0E üzerinden çalışır. ebtables veya nftables ile bu adres filtreleniyorsa LLDP çalışmaz:
# ebtables kurallarını kontrol et
ebtables -L
# Bridge üzerinde LLDP'yi geçir
ebtables -A FORWARD -d 01:80:c2:00:00:0e -j ACCEPT
Docker veya sanal ağ arayüzleri sorun çıkarabilir. lldpd bu arayüzleri otomatik es geçer ama bazen manuel müdahale gerekir:
# Hangi interface'lerin aktif olduğunu kontrol et
lldpcli show interface
# Belirli interface'leri hariç tut
# /etc/lldpd.d/interfaces.conf
configure system interface pattern eth*,bond*,!docker*,!veth*
Switch tarafında LLDP kapalı olabilir. Cisco switch’lerde LLDP varsayılan kapalıdır, CDP açıktır. Linux tarafından tcpdump ile kontrol edebilirsiniz:
# LLDP veya CDP paketlerini yakala
tcpdump -i eth0 -nn ether dst 01:80:c2:00:00:0e or ether dst 01:00:0c:cc:cc:cc
# Sadece LLDP
tcpdump -i eth0 ether proto 0x88cc
Bu komutla paket gelip gelmediğini görebilirsiniz. Paket geliyorsa lldpd tarafında sorun var demektir, gelmiyorsa switch konfigürasyonuna bakmanız gerekir.
Çoklu Sunucudan Merkezi Topoloji Toplama
Ansible ile tüm sunuculardaki LLDP bilgilerini merkezi olarak toplayabilirsiniz:
# ansible ile tüm sunucularda lldp sorgusu
ansible all -m shell -a "lldpcli -f json show neighbors"
--become
-o 2>/dev/null |
awk -F' >> ' '{print $1": "$2}' > /tmp/tum_sunucular_lldp.json
Ya da daha düzenli bir Ansible task:
# ansible playbook komutu ile çalıştır
ansible all -m command -a "lldpcli -f keyvalue show neighbors"
-i inventory/production
--become
| grep -E "(sys-name|port-id|interface)"
| sort > /srv/network-docs/lldp_snapshot_$(date +%Y%m%d).txt
Bu çıktıyı haftalık cron job ile çalıştırıp git reposuna commit’lerseniz, ağ topolojinizin zaman içindeki değişimini de takip edebilirsiniz. Herhangi bir sunucu yanlış porta taşındığında git diff ile anında görürsünüz.
Özet ve En İyi Pratikler
LLDP, veri merkezi ve kurumsal ağ yönetiminde hayatı ciddi ölçüde kolaylaştıran bir protokol. Özetlemek gerekirse dikkat edilmesi gereken noktalar:
- lldpd’yi tüm sunuculara standart olarak kurun. Bunu Ansible role veya cloud-init ile yapabilirsiniz. Sonradan ihtiyaç duyduğunuzda kurulu bulunması büyük avantaj.
- tx-interval değerini ortamınıza göre ayarlayın. Büyük ortamlarda 60-90 saniye makul bir değer. Çok sık duyuru gereksiz trafik yaratır.
- JSON çıktısını tercih edin. Text parsing kırılgan ve bakım maliyeti yüksektir. jq ile JSON işlemek hem daha güvenilir hem daha okunabilir.
- LLDP bilgilerini CMDB veya inventory sisteminizle senkronize edin. NetBox gibi araçlarla entegrasyon yaparak fiziksel bağlantı bilgilerini otomatik güncel tutabilirsiniz.
- Monitoring entegrasyonunu ihmal etmeyin. Beklenen switch/port değişikliklerini alarm olarak tanımlamak, sessiz kablo karışıklıklarını erken yakalamanızı sağlar.
- Switch tarafında LLDP’nin açık olduğunu doğrulayın. Sadece Linux tarafı yeterli değil, karşı taraf da LLDP konuşmalı.
LLDP’yi aktif olarak kullandığınızda, “bu sunucu hangi switch portuna bağlı?” sorusunun artık bir sorun olmadığını göreceksiniz. Ağ dokümantasyonu emek isteyen bir iş olmaktan çıkıp otomatik bir süreç haline gelir.
