Signatur
Beschreibung
Die Klasse SNMP ermöglicht es, über das Simple Network Management Protocol (SNMP) mit Netzwerkgeräten wie Switches, Routern oder Servern zu kommunizieren. Sie unterstützt die SNMP-Versionen 1, 2c und 3 und erlaubt das Lesen (GET), Durchsuchen (WALK) und Schreiben (SET) von MIB-Objekten.
Im Vergleich zu den prozeduralen snmpget()/snmpset()-Funktionen bietet die Klasse eine sauberere API, Exception-Unterstützung und bessere Konfigurationsmöglichkeiten über Eigenschaften wie valueretrieval, oid_output_format oder exceptions_enabled.
Für SNMP v3 werden zusätzliche Sicherheitsparameter wie Authentifizierungs- und Verschlüsselungsprotokoll direkt im Konstruktor übergeben. Das Objekt kann wiederverwendet werden, um mehrere Abfragen an denselben Host zu senden, was effizienter ist als wiederholte prozedurale Aufrufe.
Die Klasse setzt voraus, dass die net-snmp-Bibliothek installiert und PHP mit --with-snmp kompiliert wurde.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $version Pflicht | int | SNMP-Version: SNMP::VERSION_1, SNMP::VERSION_2C oder SNMP::VERSION_3. |
|
| $hostname Pflicht | string | Hostname oder IP-Adresse des SNMP-Agenten. Kann optional Port und Transport enthalten, z. B. udp:192.168.1.1:161. |
|
| $community Pflicht | string | Community-String für SNMP v1/v2c (z. B. public für Lesezugriff). Bei SNMP v3 wird hier der Security-Name (Username) übergeben. |
|
| $timeout | int | 1000000 | Timeout in Mikrosekunden für eine einzelne Anfrage. |
| $retries | int | 5 | Anzahl der Wiederholungsversuche, wenn eine Anfrage nicht beantwortet wird. |
Beispiele
Einfaches SNMP-GET mit Version 2c
<?php
try {
$snmp = new SNMP(SNMP::VERSION_2C, '192.168.1.1', 'public', 1000000, 3);
$snmp->valueretrieval = SNMP_VALUE_PLAIN;
// System-Beschreibung des Geräts auslesen
$sysDescr = $snmp->get('1.3.6.1.2.1.1.1.0');
echo "System-Beschreibung: " . $sysDescr . PHP_EOL;
// Hostname des Geräts auslesen
$sysName = $snmp->get('SNMPv2-MIB::sysName.0');
echo "Gerätename: " . $sysName . PHP_EOL;
$snmp->close();
} catch (SNMPException $e) {
echo "SNMP-Fehler: " . $e->getMessage() . PHP_EOL;
}
SNMP-WALK zum Auslesen der Interface-Tabelle
<?php
try {
$snmp = new SNMP(SNMP::VERSION_2C, '192.168.1.1', 'public');
$snmp->oid_output_format = SNMP_OID_OUTPUT_NUMERIC;
$snmp->exceptions_enabled = SNMP::ERRNO_ANY;
// Alle Einträge unter ifDescr (Schnittstellennamen) auslesen
$interfaces = $snmp->walk('IF-MIB::ifDescr');
foreach ($interfaces as $oid => $value) {
echo $oid . ' => ' . $value . PHP_EOL;
}
$snmp->close();
} catch (SNMPException $e) {
echo "Fehler beim SNMP-Walk: " . $e->getMessage() . PHP_EOL;
}
SNMP v3 mit Authentifizierung und Verschlüsselung
<?php
try {
$snmp = new SNMP(SNMP::VERSION_3, '192.168.1.1', 'adminUser');
// Sicherheitsparameter für SNMPv3 setzen
$snmp->setSecurity(
'authPriv', // Security Level
'SHA', // Auth-Protokoll
'myAuthPass', // Auth-Passwort
'AES', // Priv-Protokoll
'myPrivPass' // Priv-Passwort
);
$uptime = $snmp->get('SNMPv2-MIB::sysUpTime.0');
echo "Uptime: " . $uptime . PHP_EOL;
$snmp->close();
} catch (SNMPException $e) {
echo "SNMPv3-Fehler: " . $e->getMessage() . PHP_EOL;
}
// Wichtig · Fallstricke
Sicherheitshinweise:
- Verwende niemals den Standard-Community-String
publicin Produktionsumgebungen. Wähle einen langen, zufälligen String und schränke SNMP-Zugriff per Firewall auf vertrauenswürdige Hosts ein. - SNMP v1 und v2c übertragen Community-Strings im Klartext. Für sensible Umgebungen sollte immer SNMP v3 mit
authPriv-Level verwendet werden. - Niemals Benutzereingaben ungeprüft als OID oder Community-String verwenden – dies kann zu unerwarteten Abfragen oder Informationslecks führen.
Technische Hinweise:
- Die Eigenschaft
exceptions_enabledsteuert, für welche Fehler eineSNMPExceptiongeworfen wird. Standardmäßig werden keine Exceptions geworfen. - Mit
valueretrievalkann das Format der zurückgegebenen Werte beeinflusst werden (SNMP_VALUE_LIBRARY,SNMP_VALUE_PLAIN,SNMP_VALUE_OBJECT). - Die Methode
close()sollte nach Gebrauch aufgerufen werden, um die SNMP-Session zu schließen und Ressourcen freizugeben. - PHP muss mit
--with-snmpund installierter net-snmp-Entwicklungsbibliothek kompiliert worden sein.