Start · Sprachen · PHP · Referenz · snmp3_real_walk

snmp3_real_walk

Funktion

Führt einen SNMP3-WALK durch und liefert alle Objekte samt ihrer vollständigen OID als assoziatives Array zurück.

seit PHP 5.0.0 Kategorie: http

Signatur

snmp3_real_walk(string $hostname, string $security_name, string $security_level, string $auth_protocol, string $auth_passphrase, string $priv_protocol, string $priv_passphrase, string $object_id, int $timeout = -1, int $retries = -1): array|false

Beschreibung

snmp3_real_walk() durchsucht einen SNMP-Agenten ab einer angegebenen Objekt-ID (OID) rekursiv und gibt alle gefundenen OID-Wert-Paare als assoziatives Array zurück. Im Gegensatz zu snmp3_walk() enthält das Rückgabe-Array als Schlüssel die vollständigen OIDs der jeweiligen Objekte und nicht nur die relativen Endpunkte.

Die Funktion verwendet SNMPv3, das im Vergleich zu SNMPv1 und SNMPv2c umfangreiche Sicherheitsmechanismen bietet: Authentifizierung (z. B. mit MD5 oder SHA) und optionale Verschlüsselung (z. B. DES oder AES). Die Parameter security_level, auth_protocol und priv_protocol steuern, welche Sicherheitsstufe verwendet wird.

Typischer Einsatzbereich ist das vollständige Auslesen von MIB-Teilbäumen in Netzwerkmonitoring-Anwendungen, etwa um alle Interfaces, Prozesse oder Systemwerte eines Geräts zu erfassen. Da die OIDs als Schlüssel erhalten bleiben, lassen sich die Ergebnisse einfach weiterverarbeiten oder mit bekannten OID-Strukturen abgleichen.

Die PHP-Installation muss mit SNMP-Unterstützung kompiliert worden sein (--with-snmp), und die Net-SNMP-Bibliothek muss SNMPv3 unterstützen.

Parameter

Name Typ Default Beschreibung
$hostname Pflicht string Hostname oder IP-Adresse des SNMP-Agenten, der abgefragt werden soll. Optional kann ein Port angegeben werden (z. B. 192.168.1.1:161).
$security_name Pflicht string Der SNMPv3-Benutzername (Security Name), der für die Authentifizierung verwendet wird.
$security_level Pflicht string Die Sicherheitsstufe der Verbindung. Mögliche Werte sind noAuthNoPriv (keine Authentifizierung, keine Verschlüsselung), authNoPriv (mit Authentifizierung, ohne Verschlüsselung) und authPriv (mit Authentifizierung und Verschlüsselung).
$auth_protocol Pflicht string Das Authentifizierungsprotokoll, z. B. MD5, SHA, SHA256 oder SHA512. Wird nur ausgewertet, wenn security_level Authentifizierung erfordert.
$auth_passphrase Pflicht string Das Passwort für die Authentifizierung. Wird nur ausgewertet, wenn security_level Authentifizierung erfordert.
$priv_protocol Pflicht string Das Verschlüsselungsprotokoll, z. B. DES oder AES. Wird nur ausgewertet, wenn security_level Verschlüsselung erfordert (authPriv).
$priv_passphrase Pflicht string Das Passwort für die Verschlüsselung. Wird nur ausgewertet, wenn security_level Verschlüsselung erfordert (authPriv).
$object_id Pflicht string Die Basis-OID, ab der der WALK beginnt, z. B. .1.3.6.1.2.1.1 für allgemeine Systeminformationen. Alle darunter liegenden Objekte werden zurückgegeben.
$timeout int -1 Timeout in Mikrosekunden, der auf eine SNMP-Antwort gewartet wird. -1 verwendet den Standard-Timeout der Net-SNMP-Bibliothek.
$retries int -1 Anzahl der Wiederholungsversuche bei fehlgeschlagener Anfrage. -1 verwendet den Standardwert der Net-SNMP-Bibliothek.

Rückgabewert

Typ
array|false
Beschreibung
Gibt ein assoziatives Array zurück, bei dem die vollständigen OIDs als Schlüssel und die zugehörigen Werte als Werte dienen. Bei einem Fehler (z. B. unerreichbarer Host oder falsche Zugangsdaten) wird false zurückgegeben.

Beispiele

Alle System-Objekte eines SNMP-Agenten auslesen

<?php
$hostname     = '192.168.1.1';
$secName      = 'snmpv3user';
$secLevel     = 'authPriv';
$authProtocol = 'SHA';
$authPass     = 'geheimesAuthPasswort';
$privProtocol = 'AES';
$privPass     = 'geheimesPrivPasswort';
$baseOid      = '.1.3.6.1.2.1.1'; // SNMPv2-MIB::system

$result = snmp3_real_walk(
    $hostname,
    $secName,
    $secLevel,
    $authProtocol,
    $authPass,
    $privProtocol,
    $privPass,
    $baseOid
);

if ($result === false) {
    echo 'SNMP-Abfrage fehlgeschlagen.' . PHP_EOL;
} else {
    foreach ($result as $oid => $value) {
        echo $oid . ' => ' . $value . PHP_EOL;
    }
}
.1.3.6.1.2.1.1.1.0 = STRING: Linux router 5.15.0 #1 SMP .1.3.6.1.2.1.1.2.0 = OID: .1.3.6.1.4.1.8072.3.2.10 .1.3.6.1.2.1.1.3.0 = Timeticks: (123456) 0:20:34.56 ...

Interface-Tabelle eines Netzwerkgeräts auslesen

<?php
$result = snmp3_real_walk(
    'switch.example.local',
    'monitor',
    'authNoPriv',
    'MD5',
    'meinPasswort123',
    '',
    '',
    '.1.3.6.1.2.1.2.2', // IF-MIB::ifTable
    5000000, // 5 Sekunden Timeout
    2         // 2 Wiederholungen
);

if ($result !== false) {
    // Nur Interface-Namen (ifDescr = .1.3.6.1.2.1.2.2.1.2) ausgeben
    foreach ($result as $oid => $value) {
        if (str_contains($oid, '.1.3.6.1.2.1.2.2.1.2.')) {
            $ifIndex = substr($oid, strrpos($oid, '.') + 1);
            echo 'Interface ' . $ifIndex . ': ' . $value . PHP_EOL;
        }
    }
}
Interface 1: lo Interface 2: eth0 Interface 3: eth1 ...

// Wichtig · Fallstricke

Sicherheitshinweis: Speichern Sie SNMPv3-Passwörter niemals im Klartext im Quellcode. Verwenden Sie stattdessen Umgebungsvariablen oder sichere Secret-Management-Systeme. Bevorzugen Sie SHA oder stärker gegenüber MD5 als Authentifizierungsprotokoll sowie AES gegenüber DES als Verschlüsselungsprotokoll, da MD5 und DES als unsicher gelten.

Bei security_level = 'noAuthNoPriv' können die Parameter auth_protocol, auth_passphrase, priv_protocol und priv_passphrase als leere Strings übergeben werden. Bei authNoPriv müssen auth_protocol und auth_passphrase gesetzt, priv_protocol und priv_passphrase können leer sein.

Im Unterschied zu snmp3_walk() enthält das zurückgegebene Array die vollständigen absoluten OIDs als Schlüssel und eignet sich daher besser für die maschinelle Weiterverarbeitung und den Abgleich mit MIB-Datenbanken.