www.SAMURAJ-cz.com 

25.04.2024 Marek Translate to English by Google     VÍTEJTE V MÉM SVĚTĚ

Články

Informace o zařazení portu do VLANy u Cisco Switchů pomocí SNMP a PHP

Neděle, 25.03.2007 19:02 | Samuraj - Petr Bouška |
V článku "Informace o portech switche pomocí SNMP a PHP" jsem popsal jak získat základní informace o portech switche. Dobrým rozšířením je přidat k portu i informaci do jaké je zařazen VLANy. Tato operace již není tak jednoduchá a navíc je závislá na výrobci switche. V článku popisuji postup pro switche Cisco, který by měl být univerzální, ale u vyšších řad switchů je o něco komplikovanější. Otestoval jsem jej na switchích Catalyst 2960 a 3750.

Bohužel neexistuje přímo OID, které by pro daný port obsahovalo hodnotu do jaké VLANy je zařazen. Ale existuje jiné OID, které vrátí pro danou VLANu seznam portů, které do ní patří. Obecný postup je tedy následující:

  1. vytvořit seznam portů
  2. k portům přiřadit, zda jsou v trunk módu či ne
  3. vytvořit seznam VLAN a jejich jmen
  4. projít VLANy a pro každou vrátit pole portů
    • projít vrácené porty a do seznamu portů nastavit aktuální VLAN

Vytvoření seznamu portů/interfaců

Tento bod byl vyřešen v článku Informace o portech switche pomocí SNMP a PHP.

Určení trunk portů

Využijeme SNMP hodnoty, které jsou specifické pro firmu Cisco. Jejich strom začíná na OID = .1.3.6.1.4.1.9, slovní zápis iso.org.dod.internet.private.enterprises.cisco. V případech, kdy OID určuje vlastnost portu, se u Cisca používá notace, že poslední dvě hodnoty OID z celého řetězce slouží pro reprezentaci čísla modulu a čísla portu v modulu (př. OID.1.5 je modul 1 a port 5). Porty se číslují od 1 do max. počtu portů (uplinky následují za normálními porty). Oproti tomu, když se bere port jako interface, tak se používá poslední číslo z OID a jedná se o index (port 1/1 má index 10101). Tyto indexy interfaců jsme použili v minulém bodě.

Pro určení trunků použijeme MIB soubor CISCO-VTP-MIB, který má OID = .1.3.6.1.4.1.9.9.46, .iso.org.dod.internet.private.enterprises.cisco.ciscoMgmt.ciscoVtpMIB a hodnotu

jméno OID popis
vlanTrunkPortDynamicStatus .1.3.6.1.4.1.9.9.46.1.6.1.1.14 určuje, zda interface funguje jako trunk; 1 - trunking, 2 - notTrunking

Stav trunku je také možno zjistit v MIB podstromu CISCO-STACK-MIB s OID = .1.3.6.1.4.1.9.5.1, .iso.org.dod.internet.private.enterprises cisco.workgroup.ciscoStackMIB. Zde se používá notace OID s číslem modulu a porty jsou vraceny se svým číslem (tedy od 1) a ne indexem interfacu.

jméno OID popis
vlanPortIsIOperStatus .1.3.6.1.4.1.9.5.1.9.3.1.8 určuje, zda port trunkuje; 1 - trunking, 2 - notTrunking

První případ se váže na interface a druhý na port, proto můžeme vybrat co nám více vyhovuje (myslím, že technicky zde není podstatný rozdíl).

Seznam VLAN

VLANy jsou na Cisco switchích brány jako interfacy, ale interface vznikne až po jeho "inicializaci".

SWITCH(config)#vlan 10           // vytvoření VLANy číslo 10, zatím ne interface
SWITCH(config-vlan)#name net1  	 // pojmenování VLANy 
SWITCH(config-vlan)#exit         // o úroveň zpět
SWITCH(config)#interface vlan 10 // přepnutí do konfigurace interfacu VLAN 10
SWITCH(config-if)#no shutdown    // "inicializace" interfacu

Proto jsme seznam VLAN získali již v prvním kroku spolu s porty. My však nyní, pro získání seznamu VLAN, využijeme objekt z Cisco MIB stromu. Vrací se zde i VLANy 1002, 1003, 1004 a 1005, které jsou zde z historických důvodů, a které asi nemáme mezi interfacy. Opět využijeme soubor CISCO-STACK-MIB a zajímavá OID jsou

jméno OID popis
vtpVlanState .1.3.6.1.4.1.9.9.46.1.3.1.1.2 stav VLANy, 1 - funkční
vtpVlanType .1.3.6.1.4.1.9.9.46.1.3.1.1.3 typ VLANy, 1 pro ethernet, 2 fddi, 3 token-ring ...
vtpVlanName .1.3.6.1.4.1.9.9.46.1.3.1.1.4 jméno VLANy
vtpVlanIfIndex .1.3.6.1.4.1.9.9.46.1.3.1.1.18 pokud je přiřazen interface, tak jeho číslo

Procházení VLAN

Informace o portech v dané VLANě nalezneme v MIB souboru BRIDGE-MIB a podstromu s OID = .1.3.6.1.2.1.17, .iso.org.dod.internet.mgmt.mib-2.dot1dBridge.

jméno OID popis
dot1dBasePortIfIndex .1.3.6.1.2.1.17.1.4.1.2 index interfacu, který patří do skupiny

K tomuto OID se připojí číslo portu jako poslední číslice řetězce a vrací index interfacu. Pro volání se používá hybridní community string, který vypadá tak, že se k našemu stringu doplní @číslo_VLANy. Takže využijeme snmpwalk a community stringem pro každou VLANu voláme toto OID a dostaneme postupně seznamy indexu portů, které do nich patří. Pokud v community stringu použijeme neexistující VLANu, tak dojde k chybě. Musíme proto volit správné VLANy, které jsme získali v předchozím kroku. Navíc asi stačí použít VLANy, které mají vtpVlanType = 1 a vtpVlanState = 1.

V seznamu se vrací i porty, které pracují v trunk modu, pokud mají povolenu danou VLANu. My chceme pouze určit u portu jeho VLANu nebo že je v trunk modu. Proto při procházení vráceného seznamu portů kontrolujeme, zda je v trunku a pokud ne, tak mu nastavíme parametry právě procházené VLANy.

Realizace v PHP

Následující kód je pouze doplněním kódu z článku Informace o portech switche pomocí SNMP a PHP. Jedná se o rozšíření funkce pro získání informací o interfacech switche getInterface a funkce pro tisk printInterfaces (tu zde neuvádím).

function getInterface(&$interfaces, $ip, $comm) {
   // předchozí kód
   // ........
// informace o VLANech pro porty
// seznam VLAN a jmen
   $vlans = array();
   getInterPart($vlans, $ip, $comm, ".1.3.6.1.4.1.9.9.46.1.3.1.1.3", "Type");
   getInterPart($vlans, $ip, $comm, ".1.3.6.1.4.1.9.9.46.1.3.1.1.4", "Name");
// seznam trunku 
   getInterPart($interfaces, $ip, $comm, ".1.3.6.1.4.1.9.9.46.1.6.1.1.14", "Trunk"); 
// prirazeni VLANy pro port
   foreach($vlans as $vlan_id => $vlan) 
      if($vlan["Type"] == 1) {
          $ports = array();
          $ports = snmprealwalk($ip, $comm."@".$vlan_id, ".1.3.6.1.2.1.17.1.4.1.2"); // seznam portu v dane VLANe
          foreach($ports as $port)
             if($interfaces[$port]["Trunk"] == 2) {
                $interfaces[$port]["VLAN"] = $vlan_id;
                $interfaces[$port]["VLAN_name"] = $vlan["Name"];
             } else {
                $interfaces[$port]["VLAN"] = 0;
                $interfaces[$port]["VLAN_name"] = "trunk";
             }
       }              
}

Závěr

Dané řešení asi není napsáno ideálně a je možné jej rozvíjet. Asi by bylo možno napsat tento kód univerzálně, aby nezáleželo na výrobci switche. Seznam VLAN můžeme dostat ze seznamu interfaců a pro určení, zda je port v trunk módu můžeme vycházet z toho, jestli je obsažen ve více VLANách.

Hodit se může webová stránka Cisca s Cisco SNMP Object Navigator , kde je možno pěkně procházet MIB databázi a stahovat Cisco MIB soubory.

zobrazeno: 15298krát | Komentáře [2]

Autor:

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 chcete vyjádřit k tomuto článku, využijte komentáře níže.

Komentáře

  1. [1] 1

    ;-)

    Středa, 18.11.2009 12:23 | odpovědět
  2. [2] Chulda

    bacha na to - u cisco rady 3500 je to uz jinak - viz OID .1.3.6.1.4.1.9.9.68.1.2.2.1.2

    Středa, 10.11.2010 14:27 | odpovědět
Přidat komentář

Vložit tag: strong em link

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

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