7. 代理转发应用中的管理目标转换 (Management Target Translation in Proxy Forwarder Applications)
代理转发器应用在转发SNMP消息时执行管理目标的转换。此转换涉及将传入消息参数(contextEngineID、contextName、securityModel、securityName、securityLevel)映射到适合目标SNMP引擎的传出消息参数。
snmpProxyTable定义代理转发器使用的转换规则。
7.1. 请求转发 (Request Forwarding)
请求转发涉及从命令生成器接收命令请求,转换请求参数,并将请求转发到命令响应器。
7.1.1. 处理传入请求 (Processing an Incoming Request)
当代理转发器接收到请求时:
-
从接收到的消息中提取传入参数:
- contextEngineID
- contextName
- securityModel
- securityName
- securityLevel
- PDU类型
-
使用这些参数作为键查找snmpProxyTable。具体来说,搜索以下条目:
- snmpProxyType对于读类PDU(Get、GetNext、GetBulk)为read(1),或对于写类PDU(Set)为write(2)
- snmpProxyContextEngineID匹配传入的contextEngineID
- snmpProxyContextName匹配传入的contextName
- snmpProxyTargetParamsIn引用与传入安全参数匹配的目标参数
-
如果未找到匹配的条目:
- 生成错误响应,指示无法转发请求。
- 具体错误取决于SNMP版本和情况(例如,authorizationError、genErr)。
-
如果找到匹配的条目:
- 提取snmpProxySingleTargetOut或snmpProxyMultipleTargetOut值。
7.1.2. 转发请求 (Forwarding the Request)
找到匹配的snmpProxyTable条目后:
单目标转发 (Single Target Forwarding)
如果指定了snmpProxySingleTargetOut:
-
使用snmpProxySingleTargetOut作为snmpTargetAddrName查找snmpTargetAddrTable。
-
提取目标地址信息:
- snmpTargetAddrTDomain(传输域)
- snmpTargetAddrTAddress(传输地址)
- snmpTargetAddrParams(对snmpTargetParamsTable的引用)
-
使用snmpTargetAddrParams查找snmpTargetParamsTable。
-
提取目标安全参数:
- snmpTargetParamsMPModel(消息处理模型)
- snmpTargetParamsSecurityModel
- snmpTargetParamsSecurityName
- snmpTargetParamsSecurityLevel
-
确定目标上下文:
- 如果snmpProxyContextEngineID为空,使用传入的contextEngineID。
- 否则,使用snmpProxyContextEngineID。
- snmpProxyContextName同理。
-
必要时转换PDU:
- 如果传入和传出的SNMP版本不同,转换PDU格式和错误代码。
- SNMPv1到SNMPv2: 映射错误代码,转换陷阱格式。
- SNMPv2到SNMPv1: 映射错误代码(例如,noAccess→genErr),处理异常值。
-
使用消息处理子系统的发送PDU原语和目标参数转发请求。
多目标转发 (Multiple Target Forwarding)
如果指定了snmpProxyMultipleTargetOut:
-
在snmpTargetAddrTable中搜索所有snmpTargetAddrTagList包含snmpProxyMultipleTargetOut中指定标签的条目。
-
对于每个匹配的目标地址:
- 遵循单目标转发的步骤2-7。
- 注意原始请求被复制并发送到多个目标地址。
-
多目标的响应处理:
- 多目标转发通常仅用于读操作。
- 代理可能需要聚合响应或返回第一个成功的响应。
- 具体行为取决于实现。
7.1.3. 转发响应 (Forwarding the Response)
当代理转发器从目标命令响应器接收到响应时:
-
必要时转换响应PDU以匹配原始请求者期望的格式。
-
将contextEngineID和contextName映射回原始请求者期望的值。
-
使用消息处理子系统的返回响应PDU原语返回响应。
7.2. 通知转发 (Notification Forwarding)
通知转发涉及从通知发起者接收通知并将其转发到一个或多个通知接收器。
7.2.1. 处理传入通知 (Processing an Incoming Notification)
当代理转发器接收到通知时:
-
提取传入参数:
- contextEngineID
- contextName
- securityModel
- securityName
- securityLevel
- 通知类型(陷阱或通知)
-
使用这些参数查找snmpProxyTable。搜索以下条目:
- snmpProxyType对于陷阱通知为trap(3),或对于通知请求为inform(4)
- snmpProxyContextEngineID匹配传入的contextEngineID(或为空以匹配任何)
- snmpProxyContextName匹配传入的contextName(或为空以匹配任何)
- snmpProxyTargetParamsIn引用与传入安全参数匹配的目标参数(或为空以匹配任何)
-
如果未找到匹配的条目:
- 不转发通知。
- 代理可以在本地记录此事件。
-
如果找到匹配的条目:
- 提取snmpProxyMultipleTargetOut值(通知转发始终使用多目标转发)。
7.2.2. 转发通知 (Forwarding the Notification)
找到匹配的snmpProxyTable条目后:
-
在snmpTargetAddrTable中搜索所有snmpTargetAddrTagList包含snmpProxyMultipleTargetOut中指定标签的条目。
-
对于每个匹配的目标地址:
a. 在snmpTargetParamsTable中查找snmpTargetAddrParams。
b. 提取目标参数。
c. 根据snmpNotifyTable(如果引用)确定是作为陷阱还是通知发送,或使用与传入通知相同的类型。
d. 必要时转换通知PDU:
- SNMPv1陷阱到SNMPv2陷阱: 转换PDU格式,添加sysUpTime.0和snmpTrapOID.0。
- SNMPv2陷阱到SNMPv1陷阱: 转换PDU格式,提取enterprise、agent-addr、generic-trap、specific-trap。
e. 使用消息处理子系统的发送PDU原语转发通知。
-
如果传出通知是通知请求:
- 等待来自每个目标的响应。
- 如果传入通知也是通知,聚合响应。
- 仅在从所有(或配置的子集)目标接收到响应后,才向原始通知发起者返回响应。
转换示例 (Translation Examples)
示例1: SNMPv3到SNMPv1请求转换 (SNMPv3 to SNMPv1 Request Translation)
传入请求:
- contextEngineID: 0x80001F8880
- contextName: "publicView"
- securityModel: 3 (USM)
- securityName: "admin"
- securityLevel: authPriv
- PDU: GetRequest
snmpProxyTable条目:
- snmpProxyType: read(1)
- snmpProxyContextEngineID: 0x80001F8880
- snmpProxyContextName: "publicView"
- snmpProxyTargetParamsIn: "snmpv3Params"
- snmpProxySingleTargetOut: "legacyDevice"
snmpTargetAddrTable条目 (legacyDevice):
- snmpTargetAddrTDomain: snmpUDPDomain
- snmpTargetAddrTAddress: 192.0.2.10:161
- snmpTargetAddrParams: "snmpv1Params"
snmpTargetParamsTable条目 (snmpv1Params):
- snmpTargetParamsMPModel: 0 (SNMPv1)
- snmpTargetParamsSecurityModel: 1 (SNMPv1)
- snmpTargetParamsSecurityName: "public"
- snmpTargetParamsSecurityLevel: noAuthNoPriv
传出请求:
- 传输: UDP到192.0.2.10:161
- SNMP版本: SNMPv1
- 团体名: "public"
- PDU: GetRequest(相同的variable-bindings)
响应转换:
- 传入的SNMPv1响应被转换回SNMPv3格式。
- 响应使用USM进行加密和身份验证。
- 返回给原始请求者。
示例2: SNMPv1陷阱到SNMPv2陷阱转换 (SNMPv1 Trap to SNMPv2 Trap Translation)
传入SNMPv1陷阱:
- 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
snmpProxyTable条目:
- snmpProxyType: trap(3)
- snmpProxyContextEngineID: ""(匹配任何)
- snmpProxyContextName: ""(匹配任何)
- snmpProxyTargetParamsIn: ""(匹配任何)
- snmpProxyMultipleTargetOut: "snmpv2Targets"
具有标签"snmpv2Targets"的snmpTargetAddrTable条目: 具有SNMPv2c或SNMPv3参数的多个条目。
传出SNMPv2/v3陷阱:
- snmpTrapOID.0: 1.3.6.1.6.3.1.1.5.3 (linkDown)
- sysUpTime.0: 12345
- 来自原始陷阱的附加variable-bindings。
特殊考虑 (Special Considerations)
上下文转换 (Context Translation)
snmpProxyTable允许上下文转换:
- 表条目中的空snmpProxyContextEngineID或snmpProxyContextName表示"使用传入值"。
- 非空值表示"将传入上下文映射到此传出上下文"。
这允许代理将多个传入上下文映射到单个传出上下文,反之亦然。
防止安全降级 (Security Downgrade Prevention)
当从较高安全级别转换到较低安全级别时(例如,SNMPv3 authPriv到SNMPv1 noAuthNoPriv),代理应:
- 记录安全降级以用于审计目的。
- 应用附加访问控制以限制可以降级的操作。
- 考虑加密传输(例如,使用IPsec或TLS)以补偿降低的SNMP层安全性。
错误处理 (Error Handling)
代理必须仔细处理错误:
- 转换错误: 如果无法转换PDU(例如,SNMPv1中的SNMPv2异常值),返回适当的错误。
- 转发错误: 如果目标不可达,向原始请求者返回超时或网络错误。
- 响应转换错误: 如果响应无法转换回来,记录错误并向原始请求者返回genErr。
性能优化 (Performance Optimization)
代理转发可以通过以下方式优化:
- 缓存表查找: 为频繁使用的路径缓存snmpProxyTable、snmpTargetAddrTable和snmpTargetParamsTable查找。
- 预编译规则: 在配置时将表条目转换为优化的内部格式。
- 连接池: 对于基于TCP的传输,维护到频繁访问目标的持久连接。