Ich habe in letzter Zeit viel Aufwand in die Entwicklung bzw. Erweiterung von SNMP-Plugins gesteckt. Die, die ich veröffentliche habe sind: check_nwc_health für Netzwerkkomponenten, check_ups_health für unterbrechungsfreie Stromversorgungen und check_tl_health für Tape Libraries. Allen drei haben gemeinsam, daß sie bei einheitlichem Kommandozeilenformat möglichst viele unterschiedliche Hersteller und Modelle abdecken. Wenn ich nun eine neue Anforderung bekomme und ein Plugin für ein bisher unbekanntes Gerät erweitern muss, dann brauche ich erstmal eine Übersicht über die MIBs und OIDs, welche bei diesem Gerät implementiert wurden. Ich kann natürlich die Dokumentation durchschauen, aber die steht nicht immer zur Verfügung bzw. ist nicht sehr aufschlussreich. Ein Snmpwalk ist auch einer der ersten Schritte, aber der liefert mir einfach nur endlose Zahlenkolonnen, die ich mühsam interpretieren muss. Daher habe ich einen --mode supportedmibs eingeführt, mit dessen Hilfe ich die Namen der unterstützten MIBs angezeigt bekomme.
Am Beispiel einer Firewall-Appliance SSG5 von Juniper zeige ich, wie man dabei vorgeht:
Zunächst braucht man einen Snmpwalk des Geräts. Genauer gesagt sind zwei davon nötig, denn der Aufruf ohne extra Basis-OID zeigt nur den Baum unterhalb von 1.3.6.1.2.1, interessante OIDs findet man aber auch unter 1.3.6.1.4.1.
Am einfachsten ist es, check_nwc_health zu Hilfe zu nehmen. Mit --mode walk bekommt man die Befehle angezeigt, mit denen man die gewünschten Informationen in eine Datei umleitet.
$ check_nwc_health --hostname 192.168.1.3 --community knrzwfzn --mode walk
rm -f /tmp/snmpwalk_check_nwc_health_192.168.1.3
snmpwalk -ObentU -v2c -c naprax 192.168.1.3 1.3.6.1.2.1 >> /tmp/snmpwalk_check_nwc_health_192.168.1.3
snmpwalk -ObentU -v2c -c naprax 192.168.1.3 1.3.6.1.4.1 >> /tmp/snmpwalk_check_nwc_health_192.168.1.3
Diese Datei braucht man anschliessend für den Aufruf mit --mode supportedmibs
$ check_nwc_health --snmpwalk /tmp/snmpwalk_check_nwc_health_192.168.1.3 --mode supportedmibs
implements <unknown> 1.3.6.1.4.1.3224.10
implements <unknown> 1.3.6.1.4.1.3224.11
implements <unknown> 1.3.6.1.4.1.3224.12
implements <unknown> 1.3.6.1.4.1.3224.13
implements <unknown> 1.3.6.1.4.1.3224.15
implements <unknown> 1.3.6.1.4.1.3224.16
implements <unknown> 1.3.6.1.4.1.3224.17
implements <unknown> 1.3.6.1.4.1.3224.18
implements <unknown> 1.3.6.1.4.1.3224.21
implements <unknown> 1.3.6.1.4.1.3224.3
implements <unknown> 1.3.6.1.4.1.3224.4
implements <unknown> 1.3.6.1.4.1.3224.5
implements <unknown> 1.3.6.1.4.1.3224.6
implements <unknown> 1.3.6.1.4.1.3224.7
implements <unknown> 1.3.6.1.4.1.3224.8
implements <unknown> 1.3.6.1.4.1.3224.9
implements FR-MFR-MIB 1.3.6.1.2.1.10.47
implements IF-MIB 1.3.6.1.2.1.31
implements IP-FORWARD-MIB 1.3.6.1.2.1.4.24
implements IPV6-ICMP-MIB 1.3.6.1.2.1.56
implements IPV6-MIB 1.3.6.1.2.1.55
implements NETSCREEN-PRODUCTS-MIB 1.3.6.1.4.1.3224.1
implements RFC1066-MIB 1.3.6.1.2.1.1
implements RFC1156-MIB 1.3.6.1.2.1.1
implements RFC1158-MIB 1.3.6.1.2.1.1
implements RFC1213-MIB 1.3.6.1.2.1.1
implements RFC1354-MIB 1.3.6.1.2.1.4.24
implements SNMP-MIB2 1.3.6.1.2.1
OK - have fun
Man sieht hier die üblichen Standard-MIBs (SNMP-MIB2, IF-MIB,...) und auch die herstellerspezifische NETSCREEN-PRODUCTS-MIB. Die bzw. ihre Base-OIDs anhand derer sie erkannt werden sind im Plugin hart codiert. Eine Reihe unknown-Zeilen taucht aber auch auf. Man muss also irgendwie mithelfen, OIDs den entsprechenden MIBs zuzuordnen.
Dazu erzeugt man eine weitere Datei, die ich immer mibdepot.pm nenne. Sie heißt so, weil ich immer auf der Seite mibdepot.com nachschaue. Auf der Suche nach MIBs, die zu 1.3.6.1.4.1.3224 gehören, wird man unter http://mibdepot.com/cgi-bin/vendor_index.cgi?r=netscreen fündig.
Mit Copy&Paste markiert man die Zeilen, in denen OID und MIB zu finden sind und schickt den Inhalt durch das folgende Script
awk '/3224/ { printf " [#%s#, #%s#, #%s#, #%s#],\n", $3, "netscreen", $2, $4 }' |\
sed -e "s/#/'/g" > /tmp/mibdepot.pm
Die Datei mibdepot.pm sieht dann folgendermassen aus:
['1.3.6.1.4.1.3224.12', 'netscreen', 'v1', 'NETSCREEN-ADDR-MIB'],
['1.3.6.1.4.1.3224.4.7', 'netscreen', 'v1', 'NETSCREEN-CERTIFICATE-MIB'],
['1.3.6.1.4.1.3224.3.1', 'netscreen', 'v1', 'NETSCREEN-IDS-MIB'],
...
Man ergänzt sie um eine Anfangs- und Endezeile, damit der Inhalt gültiger Perl-Code ist (und die Variable $mibdepot enthält). Die endgültige Datei mibdepot.pm sieht dann so aus:
$mibdepot = [
['1.3.6.1.4.1.3224.12', 'netscreen', 'v1', 'NETSCREEN-ADDR-MIB'],
['1.3.6.1.4.1.3224.4.7', 'netscreen', 'v1', 'NETSCREEN-CERTIFICATE-MIB'],
['1.3.6.1.4.1.3224.3.1', 'netscreen', 'v1', 'NETSCREEN-IDS-MIB'],
...
];
Ruft man jetzt erneut check_nwc_health --mode supportedmibs auf und ergänzt den Aufruf um --name /tmp/mibdepot.pm, so wird das Ergebnis deutlicher:
$ plugins-scripts/check_nwc_health --snmpwalk /tmp/snmpwalk_check_nwc_health_192.168.1.3 --mode supportedmibs --name /tmp/mibdepot.pm
implements <unknown> 1.3.6.1.4.1.3224.16
implements <unknown> 1.3.6.1.4.1.3224.18
implements <unknown> 1.3.6.1.4.1.3224.21
implements <unknown> 1.3.6.1.4.1.3224.3
implements <unknown> 1.3.6.1.4.1.3224.4
implements <unknown> 1.3.6.1.4.1.3224.6
implements FR-MFR-MIB 1.3.6.1.2.1.10.47
implements IF-MIB 1.3.6.1.2.1.31
implements IP-FORWARD-MIB 1.3.6.1.2.1.4.24
implements IPV6-ICMP-MIB 1.3.6.1.2.1.56
implements IPV6-MIB 1.3.6.1.2.1.55
implements NETSCREEN-ADDR-MIB 1.3.6.1.4.1.3224.12
implements NETSCREEN-CERTIFICATE-MIB 1.3.6.1.4.1.3224.4.7
implements NETSCREEN-IDS-MIB 1.3.6.1.4.1.3224.3.1
implements NETSCREEN-INTERFACE-MIB 1.3.6.1.4.1.3224.9
implements NETSCREEN-IP-ARP-MIB 1.3.6.1.4.1.3224.17.1
implements NETSCREEN-NAT-MIB 1.3.6.1.4.1.3224.11
implements NETSCREEN-POLICY-MIB 1.3.6.1.4.1.3224.10
implements NETSCREEN-PRODUCTS-MIB 1.3.6.1.4.1.3224.2
implements NETSCREEN-QOS-MIB 1.3.6.1.4.1.3224.5
implements NETSCREEN-RESOURCE-MIB 1.3.6.1.4.1.3224.16.1
implements NETSCREEN-SERVICE-MIB 1.3.6.1.4.1.3224.13
implements NETSCREEN-SET-ADMIN-USR-MIB 1.3.6.1.4.1.3224.7.11
implements NETSCREEN-SET-AUTH-MIB 1.3.6.1.4.1.3224.7.2
implements NETSCREEN-SET-DHCP-MIB 1.3.6.1.4.1.3224.7.5
implements NETSCREEN-SET-DNS-MIB 1.3.6.1.4.1.3224.7.3
implements NETSCREEN-SET-EMAIL-MIB 1.3.6.1.4.1.3224.7.7
implements NETSCREEN-SET-GEN-MIB 1.3.6.1.4.1.3224.7.1
implements NETSCREEN-SET-GLB-MIB 1.3.6.1.4.1.3224.7.10
implements NETSCREEN-SET-LOG-MIB 1.3.6.1.4.1.3224.7.8
implements NETSCREEN-SET-SNMP-MIB 1.3.6.1.4.1.3224.7.9
implements NETSCREEN-SET-SYSTIME-MIB 1.3.6.1.4.1.3224.7.6
implements NETSCREEN-SET-URL-FILTER-MIB 1.3.6.1.4.1.3224.7.4
implements NETSCREEN-SET-WEB-MIB 1.3.6.1.4.1.3224.7.12
implements NETSCREEN-TRAP-MIB 1.3.6.1.4.1.3224.2
implements NETSCREEN-VPN-GATEWAY-MIB 1.3.6.1.4.1.3224.4.4
implements NETSCREEN-VPN-IKE-MIB 1.3.6.1.4.1.3224.4.3
implements NETSCREEN-VPN-L2TP-MIB 1.3.6.1.4.1.3224.4.8
implements NETSCREEN-VPN-MON-MIB 1.3.6.1.4.1.3224.4.1
implements NETSCREEN-VPN-PHASEONE-MIB 1.3.6.1.4.1.3224.4.5
implements NETSCREEN-VPN-PHASETWO-MIB 1.3.6.1.4.1.3224.4.6
implements NETSCREEN-VSYS-MIB 1.3.6.1.4.1.3224.15.1
implements NETSCREEN-ZONE-MIB 1.3.6.1.4.1.3224.8.1
implements RFC1066-MIB 1.3.6.1.2.1.1
implements RFC1156-MIB 1.3.6.1.2.1.1
implements RFC1158-MIB 1.3.6.1.2.1.1
implements RFC1213-MIB 1.3.6.1.2.1.1
implements RFC1354-MIB 1.3.6.1.2.1.4.24
implements SNMP-MIB2 1.3.6.1.2.1
OK - have fun
Die noch fehlenden MIBs 1.3.6.1.4.1.3224.16 etc. muss man mit ein wenig Kleinarbeit in mibdepot.pm nachpflegen. In diesem Fall liegt es an OIDs unter 1.3.6.1.4.1.3224.16.2, welche zur NETSCREEN-RESOURCE-MIB gehören. Man muss also eine weitere Zeile anlegen.
(Bei den unknown-Angaben wird nur die Hersteller-Nummer und eine weitere Nummer ausgegeben, sonst wird die Ausgabe unnötig lang)