đĄ SNMP â Monitoring, MIBs/OIDs & Protocoles v1/v2c/v3
Guide complet IDEO-Lab sur le protocole de gestion et de supervision réseau.
Concept & Architecture
Simple Network Mgmt Protocol (NMS, Agent, MIB).
SNMP NMS AgentPorts & Transport
UDP 161 (GET/SET) vs. UDP 162 (TRAP).
UDP 161 UDP 162 UDPOpérations de Base
GET, GETNEXT, GETBULK (Pull), TRAP (Push), SET.
GET TRAP SETSNMPv1 (Legacy)
ObsolĂšte. Community String (Texte clair). 32-bit.
SNMPv1 Community Non sécuriséSNMPv2c (Courant)
Le plus utilisé (LAN). Community (Texte clair). 64-bit.
SNMPv2c GETBULK 64-bitSNMPv3 (Sécurisé)
Moderne. USM (User), Auth (MD5/SHA), Priv (AES).
SNMPv3 AuthPriv AESLa MIB (Dictionnaire)
Management Information Base. Le "dictionnaire" des OIDs.
MIB DictionnaireL'OID (Adresse)
Object Identifier. L'adresse numérique unique (ex: .1.3.6...).
OID AdresseStructure (Arbre MIB)
Hiérarchie (iso.org.dod.internet.mgmt.mib-2...).
Arbre HiérarchiePolling (Pull) : GET
NMS interroge l'Agent (Performance, CPU, RAM).
Polling Pull PerformanceAlerting (Push) : TRAP
L'Agent alerte le NMS (Faults, Port Down, Reboot).
TRAP Push AlertesGestion : SET
Opération d'écriture (ex: shutdown interface). Risqué.
SET ĂcritureOutil : snmpwalk
Outil CLI (Linux) pour "marcher" (GETNEXT) sur un arbre OID.
snmpwalk CLI DiagnosticOutil : snmpget
Outil CLI (Linux) pour lire un seul OID.
snmpget CLIOutils : NMS (Plateformes)
Zabbix, Nagios, PRTG, SolarWinds, Prometheus.
Zabbix Nagios PrometheusCheat-sheet : Versions
Comparatif v1, v2c, v3 (Sécurité, Fonctions).
Comparatif v1/v2c/v3Cheat-sheet : OIDs Clés
OIDs communs (sysUpTime, ifDescr, ifInOctets...).
OID CheatsheetCheat-sheet : CLI
Exemples de commandes snmpwalk et snmpget.
Simple Network Management Protocol
SNMP est un protocole de la couche Application (Couche 7) conçu pour superviser (monitorer) et gérer des équipements sur un réseau IP (Routeurs, Switchs, Serveurs, Imprimantes, NAS...).
C'est le standard universel pour la collecte de mĂ©triques de performance (CPU, RAM, Bande Passante) et de statut (Ătat des ports).
Architecture (Manager / Agent)
SNMP fonctionne sur un modĂšle "Manager-Agent" :
- Manager (NMS) : Le serveur de supervision (ex: Zabbix, Nagios). C'est lui qui "pose les questions" (Polling).
- Agent : Le logiciel qui tourne sur l'équipement supervisé (ex: le switch Cisco, le serveur Windows). Il "connaßt les réponses" et les expose.
- MIB (Management Information Base) : (Voir 3.1) Le "dictionnaire" que le NMS utilise pour savoir quelles questions il peut poser Ă l'Agent.
[ NMS (Manager) ]
(ex: Zabbix)
â
â RequĂȘte : "Quel est ton CPU ?" (GET)
â Alerte : "Port 1/1 Down !" (TRAP)
â
âŒ
[ AGENT (Appareil) ]
(ex: Switch Cisco)SNMP utilise UDP comme protocole de transport (Couche 4), car il est rapide, sans connexion (stateless) et a un faible overhead, ce qui est idĂ©al pour des requĂȘtes de monitoring rĂ©pĂ©titives (polling).
Il utilise deux ports "Well-Known" distincts :
Port UDP 161 (Polling)
Utilisé pour la communication NMS -> Agent (Pull).
- Source : NMS (Port aléatoire > 1023)
- Destination : Agent (Port 161)
Opérations : GET, GETNEXT, GETBULK, SET.
Port UDP 162 (Alertes)
Utilisé pour la communication Agent -> NMS (Push).
- Source : Agent (Port aléatoire > 1023)
- Destination : NMS (Port 162)
Opérations : TRAP, INFORM.
SNMP définit plusieurs types de messages (PDU - Protocol Data Units) :
| Opération | Type | Direction | Description |
|---|---|---|---|
| GET | Pull | NMS -> Agent | Demande la valeur d'un OID spécifique (ex: "CPU ?"). |
| GETNEXT | Pull | NMS -> Agent | Demande la valeur de l'OID suivant dans l'arbre (utilisé par snmpwalk). |
| GETBULK | Pull | NMS -> Agent | (v2c/v3) Demande plusieurs OIDs (ex: les 10 suivants) en 1 seule requĂȘte (trĂšs efficace). |
| SET | Push | NMS -> Agent | Ăcrit une valeur sur l'agent (ex: "Ăteindre le port 1"). (NĂ©cessite R/W). |
| TRAP | Push | Agent -> NMS | Alerte non sollicitée (non confirmée) envoyée par l'agent (ex: "Port Down !"). |
| INFORM | Push | Agent -> NMS | (v2c/v3) Une TRAP confirmée (le NMS doit envoyer un ACK). |
| RESPONSE | Réponse | Agent -> NMS | La réponse à un GET, SET, ou INFORM. |
La version originale de SNMP (1988, RFC 1157). Statut : Totalement obsolĂšte.
Sécurité : Community String (Chaßne de Communauté)
L'authentification (trÚs faible) est gérée par une "chaßne de communauté", qui est un mot de passe partagé.
public: (DĂ©faut) AccĂšs en Lecture Seule (Read-Only - RO). Permet lesGET.private: (DĂ©faut) AccĂšs en Lecture/Ăcriture (Read-Write - RW). Permet lesSET.
Faille Critique : Les community strings sont envoyées en Texte Clair (Clear Text) dans les paquets UDP. Un attaquant "sniffant" (écoutant) le réseau peut les capturer en quelques secondes.
Limitations
- Sécurité (texte clair).
- Ne supporte pas
GETBULK(inefficace). - Supporte uniquement des compteurs 32 bits (un compteur 32 bits pour le trafic d'une interface 1 Gbps "wrappe" (revient à zéro) en ~34 secondes, rendant le monitoring de bande passante inutilisable).
C'est la version la plus utilisée aujourd'hui dans les réseaux internes (LAN). (SNMPv2c = v2 avec "community strings").
Sécurité : Identique à v1
SNMPv2c utilise toujours des Community Strings en texte clair (public, private). Il n'est pas plus sécurisé que v1.
Son utilisation est acceptable uniquement sur un réseau de management "de confiance" (ex: un VLAN de supervision), protégé par des ACLs/Firewalls.
Améliorations Clés (par rapport à v1)
GETBULK: L'ajout majeur. Permet Ă un NMS de demander plusieurs OIDs (ex: 10) en une seule requĂȘteGET, rĂ©duisant massivement la charge CPU et rĂ©seau du polling.- Compteurs 64 bits (
Counter64) : Ajoute des compteurs 64 bits (ifHCInOctets), essentiels pour monitorer la bande passante sur les interfaces modernes (1 Gbps, 10 Gbps) sans "wraparound" (retour à zéro) rapide. INFORM: Ajoute les TRAPs confirmés (avec ACK).
SNMPv3 est le standard moderne qui adresse toutes les failles de sécurité de v1/v2c. Il est complexe à configurer mais essentiel pour les réseaux non-fiables (WAN).
USM (User-based Security Model)
v3 n'utilise plus de "community strings". Il utilise un Nom d'Utilisateur et des Niveaux de Sécurité (Auth/Priv).
| Niveau de Sécurité | Nom (CLI) | Authentification (Auth) | Chiffrement (Priv) |
|---|---|---|---|
| 1 | noAuthNoPriv | Non (Utilisateur seulement) | Non |
| 2 | authNoPriv | Oui (MD5 ou SHA) | Non |
| 3 | authPriv | Oui (MD5 ou SHA) | Oui (DES, 3DES, AES) |
- authNoPriv (Recommandé) : Garantit l'Authenticité (l'expéditeur est bien le NMS) et l'Intégrité (le paquet n'a pas été modifié) grùce au hachage (HMAC-MD5/SHA).
- authPriv (Max Sécurité) : Garantit l'Authenticité, l'Intégrité ET la Confidentialité (le contenu du paquet est chiffré en AES).
Le "Dictionnaire" (Nom -> OID)
Une MIB (Management Information Base) est un fichier texte (structuré) qui sert de "dictionnaire" ou de "carte" pour les données SNMP. Il traduit les noms numériques (OID) en noms lisibles par l'homme, et vice-versa.
Les NMS (Nagios, Zabbix) doivent charger les fichiers MIB (fournis par le constructeur, ex: CISCO-PROCESS-MIB.mib) pour comprendre les OIDs spécifiques à cet équipement.
Sans la MIB, le NMS demande : "Donne-moi .1.3.6.1.2.1.1.1.0" Réponse : "Cisco Router 2901" Avec la MIB (chargée), l'admin configure : Check : "sysDescr.0" (Human-readable) (Le NMS traduit "sysDescr.0" en .1.3.6.1.2.1.1.1.0)
L'"Adresse" de la Donnée
Un OID (Object Identifier) est l'adresse numérique unique qui identifie une variable (un "objet") spécifique dans la MIB.
C'est une structure arborescente (hiĂ©rarchique) oĂč chaque chiffre reprĂ©sente un "nĆud".
OID Scalaire (Objet unique)
Un objet qui n'a qu'une seule instance. Il se termine toujours par .0.
# Le nom lisible (MIB) : sysUpTime # L'OID : .1.3.6.1.2.1.1.3 # L'instance (Scalaire) : .0 OID complet : .1.3.6.1.2.1.1.3.0
OID Tabulaire (Tableau)
Un objet qui a plusieurs instances (ex: les interfaces réseau).
# Le nom lisible (MIB) : ifDescr (Description d'interface) # L'OID (Table) : .1.3.6.1.2.1.2.2.1.2 # Les instances (Tabulaire) : OID: .1.3.6.1.2.1.2.2.1.2.1 (Interface 1) -> "FastEthernet0/1" OID: .1.3.6.1.2.1.2.2.1.2.2 (Interface 2) -> "FastEthernet0/2" OID: .1.3.6.1.2.1.2.2.1.2.3 (Interface 3) -> "Vlan1"
Tous les OIDs sont organisés dans une structure hiérarchique (arborescente) globale.
. (Root)
â 1 (iso)
â 3 (org)
â 6 (dod)
â 1 (internet)
ââ 2 (mgmt)
â â 1 (mib-2)
â ââ 1 (system)
â â ââ 1 (sysDescr) -> .1.3.6.1.2.1.1.1
â â ââ 3 (sysUpTime) -> .1.3.6.1.2.1.1.3
â ââ 2 (interfaces)
â â â 2 (ifTable)
â â â 1 (ifEntry)
â â ââ 2 (ifDescr) -> .1.3.6.1.2.1.2.2.1.2
â â ââ 10 (ifInOctets) -> .1.3.6.1.2.1.2.2.1.10
â ...
ââ 4 (private)
â 1 (enterprise)
ââ 9 (cisco)
â â ... (MIBs propriĂ©taires Cisco)
ââ 2021 (ucd-snmp)
ââ ... (Autres constructeurs)C'est le mode de supervision Pull (Tirer), initiĂ© par le NMS. C'est le mode utilisĂ© pour la supervision de performance (mĂ©triques qui changent constamment).
Processus (Polling)
- Le NMS (Manager) est configuré pour interroger (Poll) un Agent (ex: 192.168.1.1) toutes les 5 minutes.
- Toutes les 5 minutes, le NMS envoie une sĂ©rie de requĂȘtes
GET(ouGETBULK) Ă l'Agent sur le port UDP 161. - RequĂȘtes : "OID 1.3.6...1.3.0 (sysUpTime) ?", "OID ...2.2.1.10.1 (ifInOctets.1) ?", "OID ...2.2.1.16.1 (ifOutOctets.1) ?".
- L'Agent répond (RESPONSE) avec les valeurs actuelles (ex: Uptime=12345, In=50000, Out=20000).
- Le NMS stocke ces valeurs (horodatées) dans sa base de données (RRDtool, TSDB) et trace le graphique.
C'est le mode de supervision Push (Pousser), initié par l'Agent. C'est le mode utilisé pour la supervision d'événements (Faults).
TRAP (Non confirmé)
C'est une alerte non sollicitée envoyée par l'Agent vers le NMS (sur UDP 162).
Usage : ĂvĂ©nements importants et soudains.
1. Une alimentation (PSU) sur un Switch tombe en panne. 2. L'Agent (Switch) génÚre immédiatement une TRAP (ex: "linkDown", "configChanged", "psuFailed"). 3. Il l'envoie (PUSH) au NMS (UDP 162). 4. Le NMS reçoit la TRAP et génÚre une Alerte CRITICAL. (Permet une alerte instantanée, sans attendre le prochain cycle de polling de 5 min).
Inconvénient : Les TRAPs sont en UDP "Fire and Forget". Si le paquet est perdu, l'alerte est perdue.
INFORM (Confirmé)
(Introduit en v2c/v3).
Un INFORM est un TRAP qui nécessite un accusé de réception (RESPONSE) de la part du NMS.
Si l'Agent n'a pas reçu d'ACK, il réessaiera d'envoyer l'INFORM. C'est un mécanisme "fiable" (similaire à TCP) pour les alertes critiques.
L'opĂ©ration SET est une requĂȘte d'Ă©criture (Write), initiĂ©e par le NMS (Manager) vers l'Agent (Switch).
Elle permet de modifier la configuration de l'équipement à distance via SNMP.
Exemple d'Usage
L'OID ifAdminStatus (.1.3.6.1.2.1.2.2.1.7) contrÎle l'état d'une interface (1=up, 2=down).
# Commande pour ĂTEINDRE l'interface 1 (Fa0/1)
$ snmpset -v2c -c [RW_COMMUNITY] 192.168.1.1 \
.1.3.6.1.2.1.2.2.1.7.1 i 2
(OĂč "i" = integer et "2" = down)Risque de SĂ©curitĂ© Majeur :
Cette opération nécessite la Community Read-Write (RW) (ex: "private") ou un utilisateur v3 avec droits d'écriture.
Si un attaquant obtient cette community, il a un contrÎle total sur l'équipement (shutdown de tous les ports, modification de la config...). C'est pourquoi la sécurité (SNMPv3, ACLs) est vitale.
snmpwalk (inclus dans net-snmp sur Linux) est l'outil de diagnostic n°1. Il effectue une sĂ©rie de requĂȘtes GETNEXT (ou GETBULK) pour "marcher" (walk) le long d'un arbre OID et afficher toutes les valeurs qu'il trouve.
Syntaxe (v2c)
snmpwalk -v [version] -c [community] [IP] [OID_de_départ (optionnel)]
Exemples
# "Walk" tout l'arbre (trĂšs verbeux) $ snmpwalk -v2c -c public 192.168.1.1 # "Walk" uniquement la branche "system" (1.3.6.1.2.1.1) $ snmpwalk -v2c -c public 192.168.1.1 system iso.3.6.1.2.1.1.1.0 = STRING: "Cisco IOS..." (sysDescr) iso.3.6.1.2.1.1.3.0 = Timeticks: (1234567) 1 day... (sysUpTime) iso.3.6.1.2.1.1.5.0 = STRING: "Switch-Core-1" (sysName) ... # "Walk" la table des interfaces (ifDescr) $ snmpwalk -v2c -c public 192.168.1.1 .1.3.6.1.2.1.2.2.1.2 iso.3.6.1.2.1.2.2.1.2.1 = STRING: "FastEthernet0/1" iso.3.6.1.2.1.2.2.1.2.2 = STRING: "FastEthernet0/2" iso.3.6.1.2.1.2.2.1.2.25 = STRING: "Vlan1"
snmpget effectue une seule requĂȘte GET pour rĂ©cupĂ©rer la valeur d'un ou plusieurs OIDs spĂ©cifiques.
C'est l'outil utilisé par les scripts de supervision (ex: Nagios check_snmp) pour vérifier une métrique précise.
Syntaxe (v2c)
snmpget -v [version] -c [community] [IP] [OID 1] [OID 2] ...
Exemples
# Récupérer le sysUpTime $ snmpget -v2c -c public 192.168.1.1 .1.3.6.1.2.1.1.3.0 iso.3.6.1.2.1.1.3.0 = Timeticks: (1234567) 1 day, 10:17:36.7 # Récupérer le nom (sysName) ET la description (sysDescr) $ snmpget -v2c -c public 192.168.1.1 sysName.0 sysDescr.0 iso.3.6.1.2.1.1.5.0 = STRING: "Switch-Core-1" iso.3.6.1.2.1.1.1.0 = STRING: "Cisco IOS..."
snmpwalk/get sont pour le diagnostic. Un NMS est la plateforme (le "Manager") qui automatise la collecte (Polling, Traps) et fournit une interface web (Graphiques, Alertes).
| Outil | ModĂšle | Description |
|---|---|---|
| Nagios / Icinga 2 | Open Source | Basé sur des "Checks" (Scripts). check_snmp exécute un snmpget et compare à un seuil (OK/Warn/Crit). |
| Zabbix | Open Source | All-in-one. Excellent support SNMP (agentless). GĂšre le polling, les traps, et le graphing nativement. |
| Prometheus | Open Source | ModÚle "Pull". N'utilise pas SNMP directement, mais utilise un snmp_exporter qui traduit le SNMP en métriques Prometheus. |
| PRTG / SolarWinds | Commercial | TrÚs user-friendly. Spécialisés dans le SNMP "Auto-Discovery" (scanne un appareil et ajoute automatiquement les métriques). |
| CritĂšre | SNMPv1 | SNMPv2c | SNMPv3 |
|---|---|---|---|
| Sécurité | Community (Texte clair) | Community (Texte clair) | USM (User + Auth/Priv) |
| Chiffrement | Non | Non | Oui (AES/DES) |
| Intégrité | Non | Non | Oui (MD5/SHA) |
| Opérations | GET, SET, TRAP | GET, SET, TRAP, GETBULK, INFORM | GET, SET, TRAP, GETBULK, INFORM |
| Compteurs | 32 bits | 32 bits & 64 bits | 32 bits & 64 bits |
| Usage | ObsolÚte | Standard (LAN de confiance) | Standard (Sécurisé / WAN) |
Ce sont les OIDs les plus couramment supervisés (standard MIB-2, .1.3.6.1.2.1...).
| OID (Nom) | OID (Numérique) | Type | Description |
|---|---|---|---|
| sysDescr.0 | ...1.1.1.0 | Scalaire | Description (ex: "Cisco IOS..."). |
| sysUpTime.0 | ...1.1.3.0 | Scalaire | Temps depuis le dernier reboot (Timeticks). |
| sysName.0 | ...1.1.5.0 | Scalaire | Nom d'hĂŽte (ex: "Switch-Core-1"). |
| ifNumber.0 | ...2.1.0 | Scalaire | Nombre d'interfaces sur l'appareil. |
| ifDescr | ...2.2.1.2 | Tabulaire | Description (ex: "Gi0/1"). (.1.3.6.1.2.1.2.2.1.2.1 = ifDescr pour Index 1). |
| ifOperStatus | ...2.2.1.8 | Tabulaire | Ătat opĂ©rationnel (1=up, 2=down). (...8.1 = Status pour Index 1). |
| ifInOctets | ...2.2.1.10 | Tabulaire (32b) | Compteur d'octets entrants (Bande passante). |
| ifOutOctets | ...2.2.1.16 | Tabulaire (32b) | Compteur d'octets sortants (Bande passante). |
| ifHCInOctets | ...31.1.1.1.6 | Tabulaire (64b) | Compteur 64 bits (Haute Capacité) (Utiliser celui-ci !). |
| ifHCOutOctets | ...31.1.1.1.10 | Tabulaire (64b) | Compteur 64 bits (Haute Capacité) (Utiliser celui-ci !). |
net-snmp (Linux)snmpget (Lire 1 OID)
# v2c (non-sécurisé) snmpget -v2c -c public 192.168.1.1 .1.3.6.1.2.1.1.3.0 # v3 (sécurisé, Auth/Priv) snmpget -v3 -l authPriv -u [USER] -a [SHA|MD5] -A [AUTH_PASS] -x [AES|DES] -X [PRIV_PASS] [IP] [OID]
snmpwalk (Lire un arbre)
# v2c snmpwalk -v2c -c public 192.168.1.1 .1.3.6.1.2.1.2.2.1.2 # v3 snmpwalk -v3 -l authPriv -u [USER] ... [IP] [OID]
snmpset (Ăcrire 1 OID)
# v2c (Ăteindre l'interface 1) # i = integer, 2 = down snmpset -v2c -c private 192.168.1.1 .1.3.6.1.2.1.2.2.1.7.1 i 2
