www.SAMURAJ-cz.com 

15.12.2017 Radana a Radan Translate to English by Google     VÍTEJTE V MÉM SVĚTĚ

Články

Zjišťování síťového okolí protokolem LLDP s využitím PHP

Čtvrtek, 12.12.2013 15:59 | Macek - Petr Macek |
Článek popisuje využití standardního protokolu LLDP (Link Layer Discovery protocol) pro získání informací o zařízeních v síti. Pro shromažďování dat se využívá protokol SNMP a skript v PHP.

O autorovi:
Autorem tohoto článku je Petr Macek, kterého můžete kontaktovat na e-mailu petr.macek@kostax.cz.

Popis LLDP protokolu

LLDP (Link Layer Discovery protocol) je stejně jako CDP protokol linkové vrstvy. Výhodou je, že je standardizován (IEEE 802.1AB-2009) a je tedy využíván mnoha výrobci. Jedná se o jednocestný protokol, který pouze vysílá informace a nedochází k žádnému potvrzování přijaté informace nebo k navazování spojení. Aktivní prvek odesílá přes své porty informace o sobě ostatním LLDP zařízením v síti. K odesílání dochází periodicky nebo při změně na aktivním prvku.

K šíření LLDP oznámení se využívá multicast 01-80-C2-00-00-XX (Ethernet type 0x88cc). Tuto zprávu přijímají nejbližší sousedé, informace zpracují a dále nepředávají. Pomocí LLDP je tedy možné zjistit pouze přímo připojené sousedy. Údaje zjištěné LLDP oznámeními se uchovávají pouze po určitou dobu, s každým dalším doručením stejné informace se pouze aktualizuje čas zjištění informace. Pokud oznámení přestane přicházet a vyprší čas aktualizace, je informace smazána. Časy mohou být ovlivněny i hodnotou TTL v oznámení.

LLDPDU obsahuje vždy:

  • chassis ID
  • port ID
  • time to live - po jakou dobu si odesílací prvek myslí, že budou informace validní. Pomocí nastavení TTL rovno 0, je možné u příjemce vynutit smazání informace z LLDP databáze. Toho se využívá například při vypnutí portu.
  • end of lldpdu

Další nepovinné informace, které mohou být posílané, jsou specifikované v IEEE normě. Zařízení často posílají i informace o VLAN ID, VLAN name, Link aggregaci, POE, možnosti systému (switching, routing). Ve výchozím stavu aktivní prvek odesílá LLDP oznámení na všech svých portech. Konfigurací lze ovlivnit čas odesílání, vypršení, vyjmenovat porty, kde nebude LLDP odesíláno nebo dokonce zákaz veškerého rozesílání LLDP oznámení. V takovém případě má prvek přehled o svém okolí, ale sousedé jej nevidí - v tomto případě prvek jejich oznámení přepošle beze změny. To znamená, chová se jako aktivní prvek bez managementu. Lze nakonfigurovat i opačný případ, kdy prvek pouze vysílá, ale neukládá si informace o okolí. Takové konfigurace mohou značně ovlivnit zjišťování topologie.

Protože je protokol standardizovaný normou IEEE, používají jej různí výrobci ve svých zařízeních a existuje i softwarová implementace pro Linux/Unix a Windows. Pokud je použit na takových systémech, můžeme získat i informace o koncových zařízeních. Existuje rozšíření LLDP-MED (Media Endpoint Discovery), které používají VoIP zařízení a vysílají o sobě LLDP informaci. Switch jim potom dle těchto informací může na jejich portech nastavit prioritu a další parametry pro takové koncové zařízení. Toto rozšíření nemá pro zjištění topologie velký význam, protože neobsahuje informaci o aktivních prvcích, ale pouze o koncových zařízeních.

Pro zjištění topologie postačují základní informace:

  • na jakém portu bylo oznámení přijato
  • jaké zařízení informaci vyslalo (IP adresa a popis)
  • přes jaký port byla informace odeslána

Údaje jsou dostupné přes SNMP

  • OID 1.0.8802.1.1.2.1.3.2.0 obsahuje LLDP ID zařízení. Odpovídá nejnižší MAC adrese obsažené v Bridge MIB.
  • OID 1.0.8802.1.1.2.1.3.7 obsahuje tabulku lokálních portů. Součástí indexu tabulky je index portu. Přes tento index je provedeno párování do následující tabulky, která obsahuje naučené okolí.
  • OID 1.0.8802.1.1.2.1.4.1.1 je tabulka protistran. Nás bude konkrétně zajímat jen několik sloupců:
    • .5 - obsahuje LLDP ID protistrany
    • .7 - port protistrany, zde může být uveden např. index portu nebo název. Co je uloženo říká sloupeček .6
    • .8 - vždy obsahuje název portu

Příklad v PHP na realizaci

<?php
$ip = "192.168.222.10";
$community = "public"; 

$lldp_id = snmpget($ip, $community,"1.0.8802.1.1.2.1.3.2.0");

// zjistuju LLDP okoli - konkretne LLDP ID protistran
$data = snmprealwalk($ip, $community,"1.0.8802.1.1.2.1.4.1.1.5");
 
foreach ($data as $key=>$value)       {  // prevedeme si hodnoty do formatu mac adres aa:11:.....
  unset ($slabiky);
  $value = trim(substr($value,strpos($value,":")+1));
  $value = str_replace('"',"",$value);
  $value = str_replace(' ',":",$value);

  $slabiky = explode(".",$key);   // zjistime si index portu
  
  $index2 = $slabiky[count($slabiky)-2];

  // zjistime nazev lokalniho portu  
  $local_port_name = str_replace('"',"",snmpget($ip, $community,"1.0.8802.1.1.2.1.3.7.1.3.$index2"));

  // z vraceneho oid si zjistime pouze index 
  $index = $slabiky[count($slabiky)-3] . "." . $slabiky[count($slabiky)-2] . "." . $slabiky[count($slabiky)-1];
  
  // zjistime typ ulozene informace
  $typ = snmpget($ip, $community,"1.0.8802.1.1.2.1.4.1.1.6.$index");
  $typ = trim(substr($typ,strpos($typ,":")+1));

  if($typ == 3)        {       //3 = mac, 5 = descr, 7 = index
    $remote_descr = snmpget ($ip, $community,"1.0.8802.1.1.2.1.4.1.1.8.". $index);
    $nalez  = "local_switch_id = $lldp_id ,local_port_name = $local_port_name, remote_switch_id = $value, remote_port_name = $remote_descr";
  } else if ($typ == 5)   {

    // vetsinou se tyto dve hodnoty rovnaji (a je to logicke)
    $remote_descr = snmpget ($ip, $community,"1.0.8802.1.1.2.1.4.1.1.7.".$index);
    $remote_descr2 = snmpget ($ip, $community,"1.0.8802.1.1.2.1.4.1.1.8.".$index);
    $nalez  = "local_switch_id = $lldp_id, local_port_name = $local_port_name, remote_switch_id = $value, remote_port_name = $remote_descr";
  } else if ($typ == 7)   {

    $remote_index = snmpget ($ip, $community,"1.0.8802.1.1.2.1.4.1.1.7.". $index); 
    $remote_descr = snmpget ($ip, $community,"1.0.8802.1.1.2.1.4.1.1.8.". $index);
    $nalez  = "local_switch_id = $lldp_id, local_port_name = $local_port_name, remote_switch_id = $value ,remote_port_name = $remote_descr, remote_port_index = $remote_index ";
  }
  echo "<br/>$nalez";
}
?>
zobrazeno: 9351krát | Komentáře [0]

Související články:

SNMP

Protokol SNMP (Simple Network Management Protocol) je velice užitečný pro správu počítačové sítě.

Pokud se Vám článek líbil, tak mne potěšíte, když uložíte odkaz na některý server:

Pokud se chcete vyjádřit k tomuto článku, využijte komentáře níže. Pokud chcete poradit s nějakým problémem či diskutovat na nějaké téma, tak použijte fórum.

Komentáře

Zatím tento záznam nikdo nekomentoval.

Přidat komentář

Vložit tag: strong em link

Vložit smajlík: :-) ;-) :-( :-O


Ochrana proti SPAMu, zdejte následující čtyři znaky image code

Nápověda:
  • maximální délka komentáře je 2000 znaků
  • HTML tagy nejsou povoleny (budou odstraněny), použít se mohou pouze speciální tagy (jsou uvedeny nad vstupním polem)
  • nový řádek (ENTER) ukončí odstavec a začne nový
  • pokud odpovídáte na jiný komentář, vložte na začátek odstavce (řádku) číslo komentáře v hranatých závorkách