Start · Sprachen · PHP · Referenz · SNMP

SNMP

Klasse

Objektorientierte Schnittstelle für die Kommunikation mit Netzwerkgeräten über das SNMP-Protokoll (Simple Network Management Protocol).

seit PHP 5.4.0 Kategorie: http

Signatur

class SNMP

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;
}
System-Beschreibung: Linux router 5.15.0-78-generic #85-Ubuntu SMP ... Gerätename: my-router

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;
}
.1.3.6.1.2.1.2.2.1.2.1 => lo .1.3.6.1.2.1.2.2.1.2.2 => eth0 .1.3.6.1.2.1.2.2.1.2.3 => eth1

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;
}
Uptime: 15 days, 3:42:07.18

// Wichtig · Fallstricke

Sicherheitshinweise:

  • Verwende niemals den Standard-Community-String public in 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_enabled steuert, für welche Fehler eine SNMPException geworfen wird. Standardmäßig werden keine Exceptions geworfen.
  • Mit valueretrieval kann 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-snmp und installierter net-snmp-Entwicklungsbibliothek kompiliert worden sein.