# SNMP

> Netzwerkgeräte, die SNMP v1, v2c oder v3 beantworten (USV-Anlagen, PDUs, Switches, Router, Präzisionsklimageräte und Raumsensoren), über ihren Agenten im Abfrageintervall jedes Tags gelesen: die Karte SNMP-Agent, die OID eines Tags in Zahlen oder mit Standardnamen, die Datentypen, als die jedes Objekt gelesen wird, Lesen und Schreiben, der Durchlauf, der die Objekte eines Agenten findet, und zwei vollständige Beispiele.

Der Treiber **SNMP** liest und schreibt die Geräte eines Technikraums über ihren SNMP-Agenten:
USV-Anlagen, PDUs, Switches, Router, Präzisionsklimageräte und Temperatur- oder Feuchtesensoren. Er
ergänzt den Treiber [Redfish](driver-redfish), der die Management-Controller der Server liest: Zusammen
decken beide den Technikraum ab. Jedes Tag liest ein Objekt des Agenten über seine OID, etwa
`upsBatteryStatus.0` oder `ifHCInOctets.2`, und seine Werte landen dort, wo die jedes anderen Tags
landen: in Logic, auf Dashboards, in den Läufen eines Prüfstands von [Process](process).

Die Station fragt: Jedes Tag wird in seinem Abfrageintervall gelesen, in SNMPv1, SNMPv2c oder SNMPv3,
und das **Abfrageintervall (ms)** der Karte Gerät wirkt wie bei jedem Treiber, wobei jedes Tag es
überschreiben kann. Was das Gerät von sich aus sendet, seine Traps, wird nicht empfangen; siehe
[Grenzen, die man kennen sollte](#limits-worth-knowing).

Ein Gerät dieses Treibers ist ein Agent, erreicht an seinem Host über den UDP-Port 161. Die Geräte
stehen unter dem Treiber und können in Ordnern abgelegt werden, **Treiber → Ordner → Gerät → Tag**, wie
unter jedem Treiber ohne serielle Leitung und ohne Broker.

## Die Seite des Treibers {#the-drivers-page}

Mit Connector konfigurieren trägt die Seite den eigenen Suchbereich des Treibers, mit dem Agenten und
den Teilbäumen, die Geräte suchen durchläuft (siehe [Gerätesuche](#discovery)). Darunter steht die
Tabelle **Geräte** jedes Treibers (siehe [Die Gerätetabelle](connector-drivers#the-device-table)), die
mit **Gerät hinzufügen** rechts neben ihrem Titel wächst; leer zeigt sie "Noch keine Geräte." Die
Leiste des Treibers trägt **Geräte suchen**, ausgegraut, bis die Karte Suchbereich vollständig ist.

## Gerät {#device}

### Verbindung {#connection}

| Feld | Bedeutung | Standard |
| --- | --- | --- |
| **Hostadresse** | Der Hostname oder die IP-Adresse des Agenten. | leer |
| **Port** | Der UDP-Port, auf dem der Agent antwortet, 1 bis 65535. Ein leeres Feld zeigt 161 in Grau, und der Agent wird darauf gefragt. | 161 |

Ein neues Gerät hat keinen Host: Es zeigt "Hostadresse noch nicht eingetragen", und es wird nichts
gesendet, bis es einen hat. Die Base URI, die die Kopfzeile zeigt, ist die Laufzeitadresse, mit der
Version, der geltenden SNMPv3-Sicherheit, dem Zeitlimit für die Antwort und den Wiederholungen:
`snmp://192.168.10.40:161?version=2c&timeoutMs=2000&retries=1` oder
`snmp://192.168.10.2:161?version=3&security=authPriv&auth=sha256&priv=aes128&timeoutMs=2000&retries=1`.
Sie enthält nie die Community, den Benutzer oder ein Passwort.

### Die Karte SNMP-Agent {#the-snmp-agent-card}

Unter der Karte Verbindung sagt die Karte **SNMP-Agent**, wie der Agent gefragt wird. Welche Felder sie
zeichnet, folgt der Version und, bei SNMPv3, der Sicherheitsstufe.

| Feld | Angezeigt | Bedeutung | Standard |
| --- | --- | --- | --- |
| **SNMP-Version** | immer | SNMPv1, SNMPv2c oder SNMPv3, jede mit einer Zeile darunter. SNMPv1: "SNMPv1 kennt keine 64-Bit-Zähler, und ein Objekt, das dem Agenten fehlt, lässt die ganze Anfrage scheitern; der Treiber stellt sie dann ohne dieses Objekt erneut." SNMPv2c: "SNMPv2c liest die 64-Bit-Zähler, und ein Objekt, das dem Agenten fehlt, lässt nur dieses Tag scheitern. Die meisten Geräte beantworten es." SNMPv3: "SNMPv3 meldet sich mit einem Benutzer an und signiert und verschlüsselt seine Nachrichten, wie es die Sicherheitsstufe vorgibt." | SNMPv2c |
| **Community** | SNMPv1, SNMPv2c | Die Community, auf die der Agent antwortet, höchstens 255 Bytes, in einem Feld, das die Eingabe verbirgt; leer zeigt es `public` als Hinweis, nie als Wert. Darunter: "Ein Agent ignoriert eine Anfrage mit einer Community, die er nicht annimmt; eine falsche Community sieht daher aus wie ein Agent, der nicht antwortet." | leer |
| **SNMPv3-Benutzer** | SNMPv3 | Der Benutzer, den der Agent kennt, höchstens 32 Zeichen. | leer |
| **Sicherheitsstufe** | SNMPv3 | **Signiert und verschlüsselt (authPriv)**: "Jede Nachricht wird mit dem Authentifizierungspasswort signiert und mit dem Verschlüsselungspasswort verschlüsselt." **Nur signiert (authNoPriv)**: "Jede Nachricht wird mit dem Authentifizierungspasswort signiert und unverschlüsselt übertragen." **Weder signiert noch verschlüsselt (noAuthNoPriv)**: "Nur der Benutzername wird gesendet: nichts wird signiert und nichts verschlüsselt." | **Signiert und verschlüsselt (authPriv)** |
| **Authentifizierungsprotokoll** | SNMPv3, signiert | MD5, SHA-1, SHA-256, SHA-384 oder SHA-512. | SHA-1 |
| **Authentifizierungspasswort** | SNMPv3, signiert | Das Passwort, das die Nachrichten signiert. | leer |
| **Verschlüsselungsprotokoll** | SNMPv3, authPriv | DES, AES-128, AES-192 oder AES-256. | AES-128 |
| **Verschlüsselungspasswort** | SNMPv3, authPriv | Das Passwort, das die Nachrichten verschlüsselt. | leer |
| **Zeitlimit für die Antwort (ms)** | immer | 100 bis 60000: "Wie lange eine Anfrage auf die Antwort des Agenten wartet, bevor sie erneut gesendet wird." | 2000 |
| **Wiederholungen** | immer | 0 bis 5: "Wie oft eine unbeantwortete Anfrage erneut gesendet wird, bevor das Gerät als offline gilt." | 1 |

Unter den beiden Passwörtern: "Jedes Passwort ist das, das der Agent für diesen Benutzer hält, mit mindestens 8 Zeichen."
Benutzer, Sicherheitsstufe und die beiden Protokolle sind die, mit denen der Agent für diesen Benutzer
eingerichtet ist, auf der Einstellungsseite des Geräts selbst: Die Station kann den Agenten nicht
danach fragen. MD5, SHA-1 und DES werden angeboten, weil viele installierte Geräte nichts Neueres
annehmen.

Eine noch nicht eingegebene Anmeldeangabe ist kein Fehler: Das Gerät wird gespeichert, der Treiber
sendet dem Agenten nichts, solange sie fehlt, und eine ruhige Zeile unter der Karte sagt, was fehlt,
die erste von diesen:

| Es fehlt | Die Karte sagt |
| --- | --- |
| Die Community (SNMPv1, SNMPv2c) | "Geben Sie die Community ein, auf die der Agent antwortet. Bis dahin sendet das Gerät nichts." |
| Der Benutzer (SNMPv3) | "Geben Sie den SNMPv3-Benutzer ein. Bis dahin sendet das Gerät nichts." |
| Das Authentifizierungspasswort (authNoPriv, authPriv) | "Geben Sie das Authentifizierungspasswort ein. Bis dahin sendet das Gerät nichts." |
| Das Verschlüsselungspasswort (authPriv) | "Geben Sie das Verschlüsselungspasswort ein. Bis dahin sendet das Gerät nichts." |

Ein Gerät, das seinen Host hat und dem noch eine Anmeldeangabe fehlt, wird nicht verbunden, und sein
letzter Fehler nennt die Anmeldeangabe, auf die sein Agent wartet. Einen Wert, den die Karte nicht
annehmen kann, speichert sie nicht, und sie sagt in Rot, warum:

| Sie geben ein | Die Karte sagt |
| --- | --- |
| Ein Authentifizierungspasswort mit weniger als 8 Zeichen | "Das Authentifizierungspasswort braucht mindestens 8 Zeichen." |
| Ein Verschlüsselungspasswort mit weniger als 8 Zeichen | "Das Verschlüsselungspasswort braucht mindestens 8 Zeichen." |
| Einen Benutzer mit mehr als 32 Zeichen oder eine Community mit mehr als 255 Bytes | "Der Benutzer fasst höchstens 32 Zeichen und die Community höchstens 255 Bytes." |
| Ein Zeitlimit für die Antwort außerhalb von 100 bis 60000 oder Wiederholungen außerhalb von 0 bis 5 | Das Feld kehrt zum geltenden Wert zurück und sagt "Geben Sie eine Zahl zwischen 100 und 60000 ein." oder "Geben Sie eine Zahl zwischen 0 und 5 ein." |

Das Speichern hält dieselben Regeln wie die Karte, und das Aktionsprotokoll sagt es, wenn es eine
ablehnt:
"Das Gerät 'UPS room 1' hat eine SNMP-Einstellung, die sein Treiber nicht verwenden kann. Öffnen Sie es und korrigieren Sie das Feld, das sein Panel markiert."
Die Community und die beiden Passwörter werden wie jede Anmeldeangabe eines Geräts gehalten (siehe
[Anmeldedaten und Zertifikate](connector-devices#credentials-and-certificates)): im Ruhezustand für
das Windows-Konto geschützt, das sie eingegeben hat, im Export der Konfiguration versiegelt, und nie in
der Base URI, im Journal oder in der Antwort eines Agenten gezeigt. Eine unter einem anderen
Windows-Konto eingegebene kommt leer zurück, und das Gerät wartet auf sie wie auf eine nie eingegebene.

## Adressierung des Tags {#tag-addressing}

### Die OID {#the-oid}

Ein Tag dieses Treibers liest ein Objekt seines Agenten. Die Karte Quelle des Tags trägt das Feld
**OID**, mit dem Hinweis
"Eine OID in Zahlen, etwa 1.3.6.1.2.1.1.3.0, oder ein Standardname mit seiner Instanz, etwa sysUpTime.0, ifInOctets.2 oder upsBatteryStatus.0"
darunter. Jede Anfrage trägt die Zahl, in welcher Form das Tag auch geschrieben ist:

| Geschrieben | Gelesen als |
| --- | --- |
| `1.3.6.1.2.1.1.3.0`, `.1.3.6.1.2.1.1.3.0`, `iso.3.6.1.2.1.1.3.0` | Diese Zahl, die das Panel `sysUpTime.0` nennt. |
| `sysUpTime.0`, `sysUpTime`, `SNMPv2-MIB::sysUpTime.0`, ohne Rücksicht auf Groß- und Kleinschreibung | Ein Einzelwert, dessen einzige Instanz `.0` weggelassen werden darf. |
| `ifInOctets.2` | Eine Spalte einer Tabelle mit dem Index ihrer Zeile, hier Schnittstelle 2, der immer geschrieben wird. |
| `enterprises.318.1.1.1.2.2.1.0` | Ein Zweig mit den Zahlen darunter: ein Objekt aus der eigenen MIB des Geräts, als Zahl angezeigt. |

Unter dem Feld, nur lesbar, die OID in beiden Formen:

| Anzeige | Was sie zeigt |
| --- | --- |
| **MIB-Name** | Den Standardnamen des Objekts mit seiner Instanz (`ifInOctets.2`), und darunter, was die MIB über das Objekt sagt: seine MIB, die Art von Wert, die es hält, und ob es schreibbar ist, etwa `IF-MIB · Counter32 · nur lesbar` oder `UPS-MIB · Integer32 · beschreibbar`. "Kein Standardname" für ein Objekt, das der Treiber nicht beim Namen kennt. |
| **Numerische OID** | Die OID in Zahlen, also das, was jede Anfrage trägt. |

Ein Objekt ohne Standardnamen fügt die Zeile
"Ein Objekt aus der eigenen MIB des Geräts: Es erscheint als Zahl, da keine MIB-Datei gelesen wird."
hinzu. Ein Tag, dessen OID der Treiber nicht lesen kann, wird nicht gespeichert, und die Seite des
Tags sagt, warum:

| Sie geben ein | Die Seite des Tags sagt |
| --- | --- |
| Keine OID | "OID ist für diesen Treiber erforderlich." |
| Einen Namen, den der Treiber nicht kennt | "Dieser Name gehört zu keinem der Standard-MIB-Objekte, die der Treiber kennt. Schreiben Sie die OID in Zahlen." |
| Eine Spalte ohne ihre Zeile, etwa `ifInOctets` | "Eine Tabellenspalte braucht den Index ihrer Zeile, etwa ifInOctets.1." |
| Einen Einzelwert mit einer anderen Instanz als 0, etwa `sysUpTime.1` | "Ein Einzelwert hat genau eine Instanz, .0, die weggelassen werden darf." |
| Einen Zweig allein, etwa `enterprises` oder `ifTable` | "Ein Zweig des Baums benennt keinen Wert. Schreiben Sie die Zahlen des Objekts darunter." |
| Eine erste Zahl über 2, eine zweite von 40 oder mehr, mehr als 128 Zahlen oder eine Zahl über 4294967295 | "Eine OID beginnt mit 0, 1 oder 2 und einer Zahl unter 40 und hat höchstens 128 Zahlen bis 4294967295." |
| Alles andere, was keine OID ist | "Schreiben Sie die OID in Zahlen, etwa 1.3.6.1.2.1.1.3.0, oder einen Standardnamen mit seiner Instanz, etwa sysUpTime.0." |

Das Speichern hält dieselbe Regel:
"Das Tag 'Battery status' benennt keine OID, die der SNMP-Treiber lesen kann. Öffnen Sie es und korrigieren Sie die Adresse, die das Tag-Panel markiert."
Die nur lesbare Zeile **Quelladresse (Bus)** zeigt die Zahl, die der Treiber erhält:
`1.3.6.1.2.1.33.1.2.1.0` für ein Tag, das als `upsBatteryStatus.0` geschrieben ist.

### Die Namen, die der Treiber kennt {#the-names-the-driver-knows}

Der Treiber trägt eine Tabelle der Objekte der Standard-MIBs, die einen Namen verdienen, nach den RFCs
geschrieben, sodass ein Name auf jeder Station dasselbe bedeutet. Keine MIB-Datei wird gelesen.

| MIB | Was sie benennt |
| --- | --- |
| SNMPv2-MIB (RFC 3418) | Die Gruppe system: `sysDescr`, `sysObjectID`, `sysUpTime`, `sysContact`, `sysName`, `sysLocation`, `sysServices`. |
| IF-MIB (RFC 2863) | `ifNumber`, die Schnittstellentabelle (`ifDescr`, `ifOperStatus`, `ifInOctets`, `ifOutErrors` und der Rest) und ihre Erweiterung mit den 64-Bit-Zählern (`ifName`, `ifHCInOctets`, `ifHCOutOctets`, `ifHighSpeed`, `ifAlias`). |
| UPS-MIB (RFC 1628) | Identität, Batterie, Eingang, Ausgang, Bypass, Alarme, Test, Steuerung und Konfiguration einer USV: `upsBatteryStatus`, `upsEstimatedChargeRemaining`, `upsOutputSource`, `upsOutputPercentLoad` und der Rest. |
| ENTITY-SENSOR-MIB (RFC 3433) | Die Sensortabelle: `entPhySensorType`, `entPhySensorScale`, `entPhySensorValue`, `entPhySensorOperStatus` und der Rest. |
| ENTITY-MIB (RFC 6933) | Name, Beschreibung und Klasse einer physischen Einheit, die einen Sensor beschriften: `entPhysicalName`, `entPhysicalDescr`, `entPhysicalClass`. |
| HOST-RESOURCES-MIB (RFC 2790) | Das System (`hrSystemUptime`, `hrSystemProcesses`), die Speichertabelle (`hrStorageUsed`) und die Prozessortabelle (`hrProcessorLoad`). |

`driver_capabilities` führt jeden Namen mit seiner OID auf; siehe [Agent-Werkzeuge](#agent-tools).

### Datentypen und Zugriff {#data-types-and-access}

Die Liste **Datentyp** bietet nur an, als was das Objekt ohne Verlust gelesen wird:

| Das Objekt hält | Am natürlichsten gelesen als | Ebenfalls angeboten |
| --- | --- | --- |
| Integer32, Aufzählungen und TruthValue eingeschlossen | Int32 | Int64, Float, Double, String |
| Counter32, Gauge32, TimeTicks (Hundertstelsekunden) | UInt32 | Int64, Double, String |
| Counter64 | UInt64 | Double, String |
| DisplayString | String | |
| Bytes, eine IP-Adresse oder eine OID | String: die Bytes hexadezimal (`00:1A:2B`), die Adresse mit Punkten, die OID mit Punkten | |
| Ein Objekt ohne Standardnamen | Float | Int32, UInt32, Int64, UInt64, Double, String: Die Antwort des Agenten entscheidet beim Lesen |

Ein Zähler wird nicht als Float angeboten, das über 16.777.216 rundet, und ein Counter64 nicht als
Int64, das einen Zählstand über seiner Hälfte ablehnen würde. Boolean wird nie angeboten: SNMP kennt
keinen Wahrheitswert, und sein TruthValue (1 wahr, 2 falsch) und die eigene 0 und 1 eines Geräts würden
denselben Typ auf zwei entgegengesetzte Arten lesen, deshalb wird ein Zustand als Int32 gelesen. Ändert
sich die OID, wird ein Typ, als den das neue Objekt nicht gelesen wird, zu dem, als den es am
natürlichsten gelesen wird; und ein Typ, als den es nicht gelesen wird, wird abgelehnt, mit den Typen,
als die es gelesen wird:
"ifHCOutOctets.2 wird als einer dieser Typen gelesen: UInt64, Double, String."

Ein Standardobjekt, das seine MIB als nur lesbar erklärt (die Zähler, `sysUpTime`, die Zustände), wird
nur als **Nur lesen** angeboten, und das Feld Zugriff sagt
"Nur lesbar: Das Gerät meldet diesen Wert, und nichts von außen setzt ihn."
Ein Standardobjekt, das seine MIB als schreibbar erklärt (`sysContact`, `sysName`, `sysLocation`,
`ifAdminStatus`, `ifAlias`, die Test-, Steuer- und Konfigurationsobjekte der UPS-MIB), und ein Objekt
aus der eigenen MIB des Geräts bekommen jeden Zugriff angeboten: Ob der Agent das Schreiben annimmt, ist
seine eigene Antwort.

## Lesen {#reading}

Im Abfrageintervall jedes Tags sendet die Station ein GET. Was der Agent antwortet, entscheidet, was das
Tag zeigt (siehe [Die Wertkette](connector-value-pipeline)):

| Der Agent antwortet | Was das Lesen tut |
| --- | --- |
| Den Wert | Den Wert, im Typ des Tags, bevor die Stufen des Tags selbst ihn umrechnen. Text, der eine Zahl enthält (`23.5`, wie manche Geräte schreiben), wird in einem numerischen Tag gelesen. |
| Einen Wert, den der Typ des Tags nicht fassen kann, etwa eine negative Zahl in einem UInt32 | Ein fehlgeschlagenes Lesen dieses Tags, mit dem Grund; das Gerät liest seine anderen Tags weiter. |
| noSuchObject oder noSuchInstance, oder einen Fehler an genau diesem Objekt | Ein fehlgeschlagenes Lesen dieses Tags, benannt mit der Antwort des Agenten; das Gerät liest seine anderen Tags weiter. Bei SNMPv1, wo ein fehlendes Objekt die ganze Anfrage scheitern lässt, fragt der Treiber ohne dieses Objekt erneut. |
| Nichts innerhalb des Zeitlimits für die Antwort, nach allen Wiederholungen | Stille: Das Gerät geht offline und verbindet sich neu, und die Regel des Tags für [ein Gerät, das nicht geantwortet hat](connector-value-pipeline#the-device-did-not-answer), entscheidet, was es zeigt. Die Ursache nennt den Agenten, die Wartezeit und die Versuche und erinnert daran, dass ein Agent auch bei einer Community oder einem SNMPv3-Benutzer schweigt, die er nicht annimmt. |
| Einen SNMPv3-Bericht (ein unbekannter Benutzer, ein falsches Passwort oder Protokoll, eine Sicherheitsstufe, die der Agent nicht annimmt), oder die Antwort des Hosts, dass auf dem Port kein Agent lauscht | Ein Verbindungsfehler mit dieser Ursache, im Journal und im letzten Fehler des Geräts; das Gerät verbindet sich neu. |

Ein Gerät stellt eine Anfrage nach der anderen. Ein Lesen fragt nach dem Objekt des Tags und, in
derselben Anfrage, nach den anderen Tags des Geräts, die keine frische Antwort haben, bis zu 32 OIDs; ein
Agent, der antwortet, die Anfrage sei zu groß (tooBig), bekommt ab dann halb so viele geschickt. Eine so
mitgebrachte Antwort bedient das Lesen eines anderen Tags, solange sie jünger ist als die Hälfte von
dessen Abfrageintervall, sodass vierzig Tags ein oder zwei Anfragen pro Durchgang kosten. Die Engine
eines SNMPv3-Agenten wird einmal pro Verbindung gelernt, und eine Anfrage, die der Agent als außerhalb
seines Zeitfensters meldet, wird noch einmal mit den Werten des Agenten selbst gesendet.

## Schreiben {#writing}

Ein Tag, dessen Zugriff schreibt, sendet ein SET über die Warteschlange des Geräts. Ein Schreiben läuft
durch denselben Trichter wie bei jedem anderen Treiber: Das Schreibfeld nimmt den technischen Wert, und
die Umrechnungsstufen werden umgekehrt, bevor der Rohwert gesendet wird (siehe [Connector](connector)).
Das SET trägt die Art von Wert, mit der der Agent das Objekt zuletzt beantwortet hat; ersatzweise die,
die seine MIB erklärt; ersatzweise die, die ein GET jetzt beantwortet; und zuletzt die des Tags selbst
(ein Int32 als Integer32, ein UInt32 als Gauge32, ein String als OCTET STRING). Ein Wert, den diese Art
nicht fassen kann, wird abgelehnt, bevor etwas gesendet wird.

| Der Agent antwortet | Was das Schreiben meldet |
| --- | --- |
| Keinen Fehler | Erledigt. Jede Antwort, die das Gerät hielt, wird vergessen, sodass das nächste Lesen neu fragt. |
| Einen Fehlerstatus | "Schreiben von der Anlage abgelehnt: `<reason>`.", wobei der Grund den Status so nennt, wie RFC 3416 ihn schreibt, etwa `notWritable (17)`, `wrongType (7)` oder `wrongValue (10)`, und bei SNMPv1 `readOnly (4)`. |
| Nichts innerhalb des Zeitlimits für die Antwort, nach allen Wiederholungen | "Schreiben nicht bestätigt: Die Anlage hat nicht rechtzeitig geantwortet." |

## Gerätesuche {#discovery}

### Die Karte Suchbereich {#the-scan-scope-card}

Mit Connector konfigurieren trägt die Seite des Treibers ihre Karte **Suchbereich**, unter der Zeile
"Durchläuft die Standard-Teilbäume eines Agenten und listet auf, was er findet. Ein SNMPv3-Agent wird über sein Gerät durchsucht: Wählen Sie es als zu durchsuchenden Agenten."

| Feld | Bedeutung | Standard |
| --- | --- | --- |
| **Zu durchsuchender Agent** | **Eine hier eingegebene Adresse** oder ein Gerät des Treibers mit seinem Namen. Der Agent eines Geräts wird mit seinem Host, seinem Port, seiner Version, seinen Einstellungen und seinen Anmeldeangaben gelesen, wie sie gespeichert sind, und eine Änderung am Gerät, die noch auf das Speichern wartet, wird zuerst gespeichert. Nur so wird ein SNMPv3-Agent durchsucht. | **Eine hier eingegebene Adresse** |
| **Adresse des Agenten** | Ein eingegebener Agent: sein Hostname oder seine IP-Adresse, und sein Port nach einem Doppelpunkt, wenn es nicht der darunter ist. | leer |
| **Port** | Ein eingegebener Agent: 1 bis 65535. | 161 |
| **SNMP-Version** | Ein eingegebener Agent: SNMPv1 oder SNMPv2c. | SNMPv2c |
| **Community** | Ein eingegebener Agent: die Community, auf die er antwortet, in einem Feld, das die Eingabe verbirgt, mit `public` als Hinweis. Darunter: "Nur für diesen Suchlauf. Ein Gerät, das aus dem Ergebnis hinzugefügt wird, behält sie als seine Community." | leer |
| **Teilbäume** | Je ein Haken: **Systemgruppe (SNMPv2-MIB)**, **Schnittstellen (IF-MIB)**, **USV (UPS-MIB)**, **Sensoren (ENTITY-SENSOR-MIB)** und **Host-Ressourcen (HOST-RESOURCES-MIB)**. | alle außer Host-Ressourcen |
| **Zusätzlich durchlaufen** | "Ein weiterer Teilbaum, in Zahlen oder unter einem Standardnamen, etwa enterprises.318. Die eigenen Objekte des Geräts kommen als Zahlen zurück." | leer |

Was dem Bereich noch fehlt, steht in Rot unter der Karte, und Geräte suchen bleibt ausgegraut, bis er
vollständig ist:

| Der Bereich | Die Karte sagt |
| --- | --- |
| Ein eingegebener Agent ohne Adresse | "Geben Sie die Adresse des SNMP-Agenten ein, der durchsucht werden soll." |
| Ein eingegebener Agent, dessen Adresse kein Host ist | "'http://192.168.0.30' ist nicht die Adresse eines SNMP-Agenten. Schreiben Sie seinen Hostnamen oder seine IP-Adresse, auf Wunsch mit Port, zum Beispiel 192.168.0.30 oder 192.168.0.30:161." |
| Ein eingegebener Agent ohne Community, oder mit einer von mehr als 255 Bytes | "Geben Sie die Community ein, auf die der Agent antwortet, höchstens 255 Bytes." |
| Ein Gerät, das es nicht mehr gibt | "Das zum Durchsuchen gewählte SNMP-Gerät gibt es nicht mehr. Wählen Sie einen anderen Agenten zum Durchsuchen." |
| Ein Gerät ohne seinen Host oder ohne eine Anmeldeangabe, die sein Agent braucht | "Dem Gerät 'UPS room 1' fehlt noch sein Host oder eine Anmeldeangabe, die sein Agent braucht. Vervollständigen Sie zuerst seine SNMP-Karte." |
| Ein zu durchlaufender Teilbaum, der keine OID ist | "'vendor' ist keine OID zum Durchlaufen. Schreiben Sie sie in Zahlen oder unter einem Standardnamen, etwa enterprises.318." |
| Nichts angehakt und nichts genannt | "Markieren Sie mindestens einen Teilbaum, oder nennen Sie einen zum Durchlaufen." |

Hat das zu durchsuchende Gerät eine Änderung, die sich nicht speichern lässt, startet der Suchlauf
nicht:
"Die Gerätesuche wurde nicht gestartet, weil die Änderung am zu durchsuchenden Gerät nicht gespeichert werden konnte."

### Was der Suchlauf anbietet {#what-the-scan-offers}

Geräte suchen fragt den Agenten zuerst nach seinem Namen (`sysName.0`), was auch beweist, dass der
Agent auf diese Anmeldeangaben antwortet, und durchläuft dann jeden angehakten Teilbaum und den
genannten, mit GETBULK bei SNMPv2c und SNMPv3 und GETNEXT bei SNMPv1, bis der Agent außerhalb davon
antwortet. Die Fortschrittszeile zählt, was gelesen wurde:
"Der SNMP-Agent unter 192.168.10.40:161 wird durchlaufen: 120 Objekte gefunden." Ein Suchlauf listet
höchstens 2000 Objekte und läuft höchstens 60 Sekunden; wird er dort abgeschnitten oder verstummt der
Agent mittendrin, behält er, was er gefunden hat, und sagt es:
"Der Durchlauf von 192.168.10.40:161 endete vorzeitig, mit 2000 Objekte gefunden. Ein Suchlauf listet höchstens 2000 Objekte, läuft höchstens 60 s und endet dort, wo der Agent verstummt."

Der Suchlauf bietet einen Kandidaten je Agent an, benannt nach seinem sysName (nach dem Namen des Geräts
oder dem Host, wenn der Agent keinen nennt), mit der Version, dem Zeitlimit und den Wiederholungen, mit
denen er gelesen wurde, und den gefundenen Objekten als Kandidaten-Tags:

| Gefundenes Objekt | Name des Tags | Datentyp | Zugriff |
| --- | --- | --- | --- |
| Ein Einzelwert, den der Treiber beim Namen kennt | Sein Name, ohne das `.0`: `sysUpTime` | Der, als den der beantwortete Wert am natürlichsten gelesen wird | Lesen und schreiben, wo seine MIB ihn als schreibbar erklärt, sonst Nur lesen |
| Eine Spalte einer Tabelle, die der Treiber beim Namen kennt | Ihr Name und ihre Zeile: `ifInOctets.2` | Derselbe | Derselbe |
| Ein Objekt aus der eigenen MIB des Geräts | Seine Zahl: `1.3.6.1.4.1.318.1.1.1.2.2.1.0` | Derselbe | Nur lesen |

Ein Wert, den kein Typ eines Tags fassen kann, bleibt außen vor. Ein Gerät, das aus einem
eingegebenen Suchlauf hinzugefügt wird, behält die Community, die der Suchlauf benutzt hat, geschützt
wie jede Anmeldeangabe eines Geräts; ein Gerät, das aus dem Suchlauf eines Geräts hinzugefügt wird,
trägt die Anmeldeangaben dieses Geräts. Ein Kandidat, dessen Agenten ein Gerät des Treibers schon liest
(das durchsuchte Gerät, oder ein anderes am selben Host und Port), wird als **Bereits konfiguriert**
gekennzeichnet: Seine Karte führt nur die Objekte auf, die noch kein Tag dieses Geräts liest, wobei eine
OID mit Namen und mit Zahl als dieselbe zählt, und **Tags hinzufügen** vor **Öffnen** fügt die
angehakten diesem Gerät hinzu. Das übrige Verhalten des Suchlaufs steht unter
[Gerätesuche](connector-discovery).

Die eigene Seite eines Geräts tut dasselbe ohne die Seite seines Treibers: **Tags suchen** im Kopf seiner Karte der Tags durchläuft den Agenten dieses Geräts mit seinen Einstellungen und Anmeldedaten, über die Standard-Teilbäume und den Herstellerzweig, den seine Tags schon lesen (`enterprises.318` für ein Tag darunter), und bietet nur die Objekte an, für die es noch kein Tag hat (siehe [Die Tags eines Geräts suchen](connector-discovery#discovering-a-devices-tags)).

## Beispiel: eine USV über SNMPv2c {#example-a-ups-over-snmpv2c}

Eine USV mit Netzwerkkarte antwortet über SNMPv2c unter 192.168.10.40, mit einer Lese-Community, die auf
dieser Karte eingestellt ist. Lesen Sie ihre Batterie:

1. Auf der Seite des Treibers **Gerät hinzufügen**; nennen Sie es `UPS room 1`, tragen Sie unter
   **Hostadresse** 192.168.10.40 ein und lassen Sie **Port** auf 161.
2. Lassen Sie auf der Karte **SNMP-Agent** SNMPv2c stehen, geben Sie die Lese-Community der Karte unter
   **Community** ein, und lassen Sie das **Zeitlimit für die Antwort (ms)** auf 2000 und
   **Wiederholungen** auf 1. Die Zeile, die nach der Community fragte, verschwindet.
3. **Tag hinzufügen** `Battery status`, **OID** `upsBatteryStatus.0`, **Datentyp** Int32. Unter dem
   Feld zeigt der MIB-Name upsBatteryStatus.0 mit `UPS-MIB · Integer32 · nur lesbar`, die numerische
   OID 1.3.6.1.2.1.33.1.2.1.0, und der Zugriff bleibt auf Nur lesen. Der Wert ist 1 unknown,
   2 batteryNormal, 3 batteryLow oder 4 batteryDepleted.
4. **Tag hinzufügen** `Battery charge`, **OID** `upsEstimatedChargeRemaining.0`, **Datentyp** Int32,
   **Einheit** %.
5. Wenn die USV es meldet, **Tag hinzufügen** `Minutes remaining`, **OID**
   `upsEstimatedMinutesRemaining.0`, **Datentyp** Int32, **Einheit** min.

Die Base URI lautet `snmp://192.168.10.40:161?version=2c&timeoutMs=2000&retries=1`. Ein Agent tut
dasselbe mit den Werkzeugen:

```
device_upsert name="UPS room 1" driver=Snmp host=192.168.10.40 snmpVersion=V2c snmpCommunity="<the UPS card's read community>"
tag_upsert device="UPS room 1" name="Battery status" address=upsBatteryStatus.0 opcUaType=Int32
tag_upsert device="UPS room 1" name="Battery charge" address=upsEstimatedChargeRemaining.0 opcUaType=Int32 unit=%
tag_upsert device="UPS room 1" name="Minutes remaining" address=upsEstimatedMinutesRemaining.0 opcUaType=Int32 unit=min
```

## Beispiel: die Schnittstellenzähler eines Switches über SNMPv3 {#example-a-switchs-interface-counters-over-snmpv3}

Ein verwalteter Switch unter 192.168.10.2 antwortet über SNMPv3 für den Benutzer `scada`, auf dem Switch
mit SHA-256-Authentifizierung und AES-128-Verschlüsselung eingerichtet. Lesen Sie den Verkehr und den
Zustand seines Ports 2:

1. **Gerät hinzufügen**; nennen Sie es `Core switch`, **Hostadresse** 192.168.10.2, **Port** 161.
2. Wählen Sie auf der Karte **SNMP-Agent** SNMPv3, geben Sie `scada` unter **SNMPv3-Benutzer** ein,
   lassen Sie **Signiert und verschlüsselt (authPriv)** stehen, wählen Sie SHA-256 unter
   **Authentifizierungsprotokoll** und geben Sie sein Passwort ein, lassen Sie AES-128 unter
   **Verschlüsselungsprotokoll** und geben Sie sein Passwort ein: jeweils das, das der Switch für
   `scada` hält, mit mindestens 8 Zeichen.
3. **Tag hinzufügen** `Port 2 in`, **OID** `ifHCInOctets.2`. Der Datentyp wird UInt64, der Typ, als den
   ein 64-Bit-Zähler gelesen wird, und die Liste bietet nur UInt64, Double und String an;
   **Einheit** B.
4. **Tag hinzufügen** `Port 2 out`, **OID** `ifHCOutOctets.2`, UInt64, **Einheit** B.
5. **Tag hinzufügen** `Port 2 state`, **OID** `ifOperStatus.2`, **Datentyp** Int32: 1 up, 2 down,
   3 testing, 7 lowerLayerDown.

Die `.2` ist der Schnittstellenindex des Switches, der, den `ifName.2` benennt; ein Suchlauf über den
Teilbaum der Schnittstellen listet jede Schnittstelle mit ihrem Index. Die Base URI lautet
`snmp://192.168.10.2:161?version=3&security=authPriv&auth=sha256&priv=aes128&timeoutMs=2000&retries=1`.
Mit den Werkzeugen wird ein `opcUaType`, als den das Objekt nicht gelesen wird, etwa Int32 auf
`ifHCOutOctets.2`, mit den Typen abgelehnt, als die es gelesen wird:

```
device_upsert name="Core switch" driver=Snmp host=192.168.10.2 snmpVersion=V3 username=scada password="<authentication password>" snmpSecurityLevel=AuthPriv snmpAuthProtocol=Sha256 snmpPrivacyProtocol=Aes128 snmpPrivacyPassword="<privacy password>"
tag_upsert device="Core switch" name="Port 2 in" address=ifHCInOctets.2 opcUaType=UInt64 unit=B
tag_upsert device="Core switch" name="Port 2 out" address=ifHCOutOctets.2 opcUaType=UInt64 unit=B
tag_upsert device="Core switch" name="Port 2 state" address=ifOperStatus.2 opcUaType=Int32
```

## Agent-Werkzeuge {#agent-tools}

`driver_capabilities` beschreibt diesen Treiber unter `snmp`: die Versionen und die Anmeldeangaben, die
jede nimmt, die Sicherheitsstufen und Protokolle, das Zeitlimit für die Antwort und die
Wiederholungen, wie eine OID geschrieben wird, die Typen je Art von Wert, jeden Namen, den der Treiber
kennt, mit seiner MIB, seiner OID und ob er schreibbar ist, wie sich Lesen und Schreiben verhalten, die
Gerätesuche und die beiden Beispiele oben. `device_upsert driver=Snmp` nimmt `host`, `port` (Standard
161), `snmpVersion` (`V1`, `V2c`, der Standard, oder `V3`), `snmpCommunity` bei SNMPv1 und SNMPv2c
(`''` löscht sie), und bei SNMPv3 `username` (den Benutzer), `password` (sein
Authentifizierungspasswort, mindestens 8 Zeichen), `snmpSecurityLevel` (`AuthPriv`, der Standard,
`AuthNoPriv` oder `NoAuthNoPriv`), `snmpAuthProtocol` (`Md5`, `Sha1`, der Standard, `Sha256`, `Sha384`
oder `Sha512`), `snmpPrivacyProtocol` (`Des`, `Aes128`, der Standard, `Aes192` oder `Aes256`) und
`snmpPrivacyPassword`; dazu `responseTimeoutMs` (100 bis 60000, Standard 2000) und `snmpRetries` (0 bis
5, Standard 1). Eine Community an einem SNMPv3-Gerät oder ein SNMPv3-Feld an einem Community-Gerät wird
abgelehnt. Ein Gerät, das die Werkzeuge zurückgeben, trägt `snmp`: die Version, `hasCommunity`, die
geltende Sicherheitsstufe und die Protokolle, `hasPrivacyPassword`, das Zeitlimit, die Wiederholungen
und `missingCredential`, die Anmeldeangabe, auf die es noch wartet; nie wird ein Geheimnis
zurückgegeben. `tag_upsert` nimmt die OID als `address` und `opcUaType`, dessen Standard der Typ ist, als
den das Objekt am natürlichsten gelesen wird; `wireQuantity` und `eipPath` werden abgelehnt.
`device_discover driver=Snmp` durchläuft entweder `target` (einen Host, mit `port`, wenn es nicht 161
ist) mit `snmpVersion` (`V1` oder `V2c`) und `snmpCommunity`, oder `snmpDevice`, den Namen eines Geräts
des Treibers, und nur so wird ein SNMPv3-Agent durchsucht; `snmpSubtrees` wählt die Standard-Teilbäume
(`System`, `Interfaces`, `Ups`, `Sensors`, `HostResources`, durch Kommas getrennt) und `snmpSubtree`
fügt einen weiteren hinzu. Die Werkzeuge behalten keine Community eines Suchlaufs: Ein Gerät, das aus
dem Gefundenen angelegt wird, bekommt sie in `device_upsert` erneut, und die Tags, die einem
konfigurierten Gerät fehlen, werden mit `tag_upsert` hinzugefügt. Die übrigen Werkzeuge stehen unter
[Agent-Werkzeuge](agent-tools).

## Grenzen, die man kennen sollte {#limits-worth-knowing}

- Traps und Informs, was das Gerät von sich aus sendet, wenn etwas geschieht, werden nicht empfangen:
  Jeder Wert wird in seinem Abfrageintervall gelesen, eine Batterie, die schwach wird, zeigt sich also
  beim nächsten Lesen ihres Zustands.
- Keine MIB-Datei wird importiert. Die Namen, die der Treiber kennt, sind die der Standard-MIBs, die er
  mitbringt; ein Objekt aus der eigenen MIB des Geräts, unter `enterprises`, wird als Zahl geschrieben
  und angezeigt, und was es bedeutet, steht in der Dokumentation des Herstellers.
- Die Station ist kein SNMP-Agent: Nichts liest die Station selbst über SNMP.
- Ein Suchlauf erreicht einen SNMPv3-Agenten nur über ein Gerät, das seinen Benutzer und seine
  Passwörter hält, und probiert von sich aus keine Community und keinen Benutzer.
- Ein Suchlauf listet höchstens 2000 Objekte und läuft höchstens 60 Sekunden: Entfernen Sie auf einem
  großen Switch die Haken der Teilbäume, die nicht gebraucht werden, oder nennen Sie den, der gebraucht
  wird.
- Kein Tag ist ein Boolean: Ein TruthValue oder ein eigenes Ein und Aus des Geräts wird als Int32
  gelesen.
