7. Management Target Translation in Proxy Forwarder Applications
Les applications proxy forwarder effectuent la traduction des cibles de gestion lors du transfert des messages SNMP. Cette traduction implique le mappage des paramètres de message entrants (contextEngineID, contextName, securityModel, securityName, securityLevel) vers des paramètres de message sortants adaptés au moteur SNMP cible.
La table snmpProxyTable définit les règles de traduction utilisées par les proxy forwarders.
7.1. Request Forwarding
Le transfert de requête implique la réception d'une requête de commande d'un générateur de commande, la traduction des paramètres de requête et le transfert de la requête vers un répondeur de commande.
7.1.1. Traitement d'une requête entrante
Lorsqu'un proxy forwarder reçoit une requête :
-
Extrait les paramètres entrants du message reçu :
- contextEngineID
- contextName
- securityModel
- securityName
- securityLevel
- Type de PDU
-
Recherche dans snmpProxyTable en utilisant ces paramètres comme clé. Recherche spécifiquement une entrée où :
- snmpProxyType est read(1) pour les PDU de classe lecture (Get, GetNext, GetBulk) ou write(2) pour les PDU de classe écriture (Set)
- snmpProxyContextEngineID correspond au contextEngineID entrant
- snmpProxyContextName correspond au contextName entrant
- snmpProxyTargetParamsIn référence des paramètres cibles correspondant aux paramètres de sécurité entrants
-
Si aucune entrée correspondante n'est trouvée :
- Génère une réponse d'erreur indiquant que la requête ne peut pas être transférée.
- L'erreur spécifique dépend de la version SNMP et des circonstances (par ex. authorizationError, genErr).
-
Si une entrée correspondante est trouvée :
- Extrait la valeur snmpProxySingleTargetOut ou snmpProxyMultipleTargetOut.
7.1.2. Transfert de la requête
Après avoir trouvé une entrée snmpProxyTable correspondante :
Transfert vers cible unique
Si snmpProxySingleTargetOut est spécifié :
-
Recherche dans snmpTargetAddrTable en utilisant snmpProxySingleTargetOut comme snmpTargetAddrName.
-
Extrait les informations d'adresse cible :
- snmpTargetAddrTDomain (domaine de transport)
- snmpTargetAddrTAddress (adresse de transport)
- snmpTargetAddrParams (référence à snmpTargetParamsTable)
-
Recherche dans snmpTargetParamsTable en utilisant snmpTargetAddrParams.
-
Extrait les paramètres de sécurité cibles :
- snmpTargetParamsMPModel (modèle de traitement de message)
- snmpTargetParamsSecurityModel
- snmpTargetParamsSecurityName
- snmpTargetParamsSecurityLevel
-
Détermine le contexte cible :
- Si snmpProxyContextEngineID est vide, utilise le contextEngineID entrant.
- Sinon, utilise snmpProxyContextEngineID.
- De même pour snmpProxyContextName.
-
Traduit la PDU si nécessaire :
- Si les versions SNMP entrante et sortante diffèrent, traduit le format PDU et les codes d'erreur.
- Pour SNMPv1 vers SNMPv2 : Mappe les codes d'erreur, convertit les formats de trap.
- Pour SNMPv2 vers SNMPv1 : Mappe les codes d'erreur (par ex. noAccess → genErr), gère les valeurs d'exception.
-
Transfère la requête en utilisant la primitive send PDU du sous-système de traitement de message avec les paramètres cibles.
Transfert vers cibles multiples
Si snmpProxyMultipleTargetOut est spécifié :
-
Recherche dans snmpTargetAddrTable toutes les entrées où snmpTargetAddrTagList contient l'étiquette spécifiée dans snmpProxyMultipleTargetOut.
-
Pour chaque adresse cible correspondante :
- Suit les étapes 2-7 du transfert vers cible unique.
- Note que la requête originale est dupliquée et envoyée à plusieurs adresses cibles.
-
Gestion de réponse pour cibles multiples :
- Le transfert vers cibles multiples est généralement utilisé uniquement pour les opérations de lecture.
- Le proxy peut avoir besoin d'agréger les réponses ou de retourner la première réponse réussie.
- Le comportement spécifique dépend de l'implémentation.
7.1.3. Transfert de la réponse
Lorsque le proxy forwarder reçoit une réponse du répondeur de commande cible :
-
Traduit la PDU de réponse si nécessaire pour correspondre au format attendu par le demandeur original.
-
Mappe le contextEngineID et contextName vers les valeurs attendues par le demandeur original.
-
Retourne la réponse en utilisant la primitive return response PDU du sous-système de traitement de message.
7.2. Notification Forwarding
Le transfert de notification implique la réception d'une notification d'un émetteur de notification et son transfert vers un ou plusieurs récepteurs de notification.
7.2.1. Traitement d'une notification entrante
Lorsqu'un proxy forwarder reçoit une notification :
-
Extrait les paramètres entrants :
- contextEngineID
- contextName
- securityModel
- securityName
- securityLevel
- Type de notification (trap ou inform)
-
Recherche dans snmpProxyTable en utilisant ces paramètres. Recherche une entrée où :
- snmpProxyType est trap(3) pour les notifications trap ou inform(4) pour les notifications inform
- snmpProxyContextEngineID correspond au contextEngineID entrant (ou est vide pour correspondre à n'importe lequel)
- snmpProxyContextName correspond au contextName entrant (ou est vide pour correspondre à n'importe lequel)
- snmpProxyTargetParamsIn référence des paramètres cibles correspondant aux paramètres de sécurité entrants (ou est vide pour correspondre à n'importe lequel)
-
Si aucune entrée correspondante n'est trouvée :
- La notification n'est pas transférée.
- Le proxy peut enregistrer cet événement localement.
-
Si une entrée correspondante est trouvée :
- Extrait la valeur snmpProxyMultipleTargetOut (le transfert de notification utilise toujours le transfert vers cibles multiples).
7.2.2. Transfert de la notification
Après avoir trouvé une entrée snmpProxyTable correspondante :
-
Recherche dans snmpTargetAddrTable toutes les entrées où snmpTargetAddrTagList contient l'étiquette spécifiée dans snmpProxyMultipleTargetOut.
-
Pour chaque adresse cible correspondante :
a. Recherche snmpTargetAddrParams dans snmpTargetParamsTable.
b. Extrait les paramètres cibles.
c. Détermine s'il faut envoyer comme trap ou inform en se basant sur snmpNotifyTable (si référencé) ou utilise le même type que la notification entrante.
d. Traduit la PDU de notification si nécessaire :
- Trap SNMPv1 vers trap SNMPv2 : Convertit le format PDU, ajoute sysUpTime.0 et snmpTrapOID.0.
- Trap SNMPv2 vers trap SNMPv1 : Convertit le format PDU, extrait enterprise, agent-addr, generic-trap, specific-trap.
e. Transfère la notification en utilisant la primitive send PDU du sous-système de traitement de message.
-
Si la notification sortante est une requête inform :
- Attend une réponse de chaque cible.
- Si la notification entrante était également un inform, agrège les réponses.
- Retourne une réponse à l'émetteur de notification original uniquement après avoir reçu des réponses de toutes (ou un sous-ensemble configuré de) cibles.
Exemples de traduction
Exemple 1 : Traduction de requête SNMPv3 vers SNMPv1
Requête entrante :
- contextEngineID: 0x80001F8880
- contextName: "publicView"
- securityModel: 3 (USM)
- securityName: "admin"
- securityLevel: authPriv
- PDU: GetRequest
Entrée snmpProxyTable :
- snmpProxyType: read(1)
- snmpProxyContextEngineID: 0x80001F8880
- snmpProxyContextName: "publicView"
- snmpProxyTargetParamsIn: "snmpv3Params"
- snmpProxySingleTargetOut: "legacyDevice"
Entrée snmpTargetAddrTable (legacyDevice) :
- snmpTargetAddrTDomain: snmpUDPDomain
- snmpTargetAddrTAddress: 192.0.2.10:161
- snmpTargetAddrParams: "snmpv1Params"
Entrée snmpTargetParamsTable (snmpv1Params) :
- snmpTargetParamsMPModel: 0 (SNMPv1)
- snmpTargetParamsSecurityModel: 1 (SNMPv1)
- snmpTargetParamsSecurityName: "public"
- snmpTargetParamsSecurityLevel: noAuthNoPriv
Requête sortante :
- Transport: UDP vers 192.0.2.10:161
- Version SNMP: SNMPv1
- Community: "public"
- PDU: GetRequest (mêmes variable-bindings)
Traduction de réponse :
- La réponse SNMPv1 entrante est retraduite au format SNMPv3.
- La réponse est chiffrée et authentifiée en utilisant USM.
- Retournée au demandeur original.
Exemple 2 : Traduction de trap SNMPv1 vers trap SNMPv2
Trap SNMPv1 entrant :
- Community: "public"
- enterprise: 1.3.6.1.4.1.9
- agent-addr: 192.0.2.1
- generic-trap: linkDown(2)
- specific-trap: 0
- time-stamp: 12345
Entrée snmpProxyTable :
- snmpProxyType: trap(3)
- snmpProxyContextEngineID: "" (correspondre à n'importe lequel)
- snmpProxyContextName: "" (correspondre à n'importe lequel)
- snmpProxyTargetParamsIn: "" (correspondre à n'importe lequel)
- snmpProxyMultipleTargetOut: "snmpv2Targets"
Entrées snmpTargetAddrTable avec étiquette "snmpv2Targets" : Plusieurs entrées avec paramètres SNMPv2c ou SNMPv3.
Traps SNMPv2/v3 sortants :
- snmpTrapOID.0: 1.3.6.1.6.3.1.1.5.3 (linkDown)
- sysUpTime.0: 12345
- Variable-bindings supplémentaires du trap original.
Considérations particulières
Traduction de contexte
La snmpProxyTable permet la traduction de contexte :
- Un snmpProxyContextEngineID ou snmpProxyContextName vide dans l'entrée de table signifie "utiliser la valeur entrante."
- Une valeur non vide signifie "mapper le contexte entrant vers ce contexte sortant."
Cela permet au proxy de mapper plusieurs contextes entrants vers un seul contexte sortant, ou vice versa.
Prévention de la dégradation de sécurité
Lors de la traduction d'un niveau de sécurité supérieur vers un niveau inférieur (par ex. SNMPv3 authPriv vers SNMPv1 noAuthNoPriv), le proxy devrait :
- Enregistrer la dégradation de sécurité à des fins d'audit.
- Appliquer des contrôles d'accès supplémentaires pour limiter quelles opérations peuvent être dégradées.
- Envisager de chiffrer le transport (par ex. en utilisant IPsec ou TLS) pour compenser la sécurité réduite au niveau SNMP.
Gestion des erreurs
Les proxies doivent gérer les erreurs avec soin :
- Erreurs de traduction : Si une PDU ne peut pas être traduite (par ex. valeurs d'exception SNMPv2 en SNMPv1), retourner une erreur appropriée.
- Erreurs de transfert : Si la cible est inaccessible, retourner un timeout ou erreur réseau au demandeur original.
- Erreurs de traduction de réponse : Si une réponse ne peut pas être retraduite, enregistrer l'erreur et retourner un genErr au demandeur original.
Optimisation de performance
Le transfert par proxy peut être optimisé par :
- Mise en cache des recherches de table : Cache les recherches snmpProxyTable, snmpTargetAddrTable et snmpTargetParamsTable pour les chemins fréquemment utilisés.
- Pré-compilation des règles : Convertit les entrées de table en un format interne optimisé au moment de la configuration.
- Pooling de connexions : Pour le transport basé TCP, maintient des connexions persistantes vers les cibles fréquemment accédées.