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í:
- vytvořit seznam portů
- k portům přiřadit, zda jsou v trunk módu či ne
- vytvořit seznam VLAN a jejich jmen
- 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.
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