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.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir