Skip to main content

6. 通知过滤 (Notification Filtering)

通知过滤提供了一种机制,可以根据通知的内容选择性地将通知发送到管理目标。这允许对哪些管理目标接收哪些类型的通知进行细粒度控制。

通知过滤使用三个MIB表:

  • snmpNotifyFilterProfileTable: 将过滤器配置文件名称与一组目标参数关联。
  • snmpNotifyFilterTable: 根据通知内容定义实际的过滤规则。
  • snmpTargetParamsTable: 包含过滤器配置文件表引用的目标参数名称。

过滤处理算法 (Filter Processing Algorithm)

当通知发起者为管理目标生成通知时,它按如下方式应用通知过滤:

  1. 从管理目标的snmpTargetAddrParams对象中检索目标参数名称

  2. 在snmpNotifyFilterProfileTable中查找过滤器配置文件,使用目标参数名称作为索引。

  3. 如果未找到过滤器配置文件,则发送通知(不应用过滤)。

  4. 如果找到过滤器配置文件,snmpNotifyFilterProfileName标识snmpNotifyFilterTable中的一组过滤器条目。

  5. 对于通知中的每个variable-binding:

    a. 在snmpNotifyFilterTable中搜索与过滤器配置文件名称匹配的条目。

    b. 按其索引的字典顺序处理条目。

    c. 对于每个过滤器条目,检查snmpNotifyFilterSubtree指定的子树是否与变量的对象标识符匹配。

    d. 如果变量的OID在过滤器子树内或等于过滤器子树,则发生匹配,并考虑snmpNotifyFilterMask(如果指定)。

    e. 如果找到匹配:

    • 如果snmpNotifyFilterType为included(1),继续检查其他变量。
    • 如果snmpNotifyFilterType为excluded(2),不向此管理目标发送通知。

    f. 如果在检查所有过滤器条目后未为变量找到匹配,则不发送通知。

  6. 如果所有variable-bindings都通过过滤器,则将通知发送到管理目标。

过滤器掩码语义 (Filter Mask Semantics)

snmpNotifyFilterMask对象提供对子树匹配的位级控制。它是一个具有以下语义的位掩码:

  • 掩码中的每个八位字节对应于过滤器子树OID中的一个子标识符。
  • 八位字节中的每个位对应于子标识符中的一个位。
  • 如果掩码中的位为1,则子标识符中的相应位必须与变量的OID匹配。
  • 如果掩码中的位为0,则子标识符中的相应位将被忽略(通配符)。

零长度掩码(默认值)意味着所有子标识符必须完全匹配。

掩码使用示例:

过滤器子树: 1.3.6.1.2.1.2.2.1.8
掩码: 0xFF.0xFF.0xFF.0xFF.0xFF.0xFF.0xFF.0xFF.0xFE

此掩码允许匹配1.3.6.1.2.1.2.2.1.8(ifOperStatus)和1.3.6.1.2.1.2.2.1.9(ifLastChange),因为最终子标识符的最后一位是通配符。

配置示例 (Configuration Examples)

示例1: 向管理目标发送所有通知 (Sending All Notifications to a Management Target)

要在不过滤的情况下向管理目标发送所有通知:

  1. 不要在snmpNotifyFilterProfileTable中为目标的参数名称创建条目

  1. 创建一个带有单个包含过滤器的过滤器配置文件:
    • snmpNotifyFilterSubtree: 1(或任何根OID)
    • snmpNotifyFilterMask: ""(空)
    • snmpNotifyFilterType: included(1)

要仅发送与接口(ifTable)相关的通知:

snmpNotifyFilterProfileTable条目:

  • snmpNotifyFilterProfileName: "interfaceFilter"
  • 与目标参数名称关联: "stationAParams"

snmpNotifyFilterTable条目:

条目1:

  • snmpNotifyFilterProfileName: "interfaceFilter"
  • snmpNotifyFilterSubtree: 1.3.6.1.2.1.2
  • snmpNotifyFilterMask: ""
  • snmpNotifyFilterType: included(1)

此配置允许发送包含来自接口组(1.3.6.1.2.1.2)的变量的通知,同时过滤掉所有其他通知。

示例3: 排除特定通知 (Excluding Specific Notifications)

要发送所有通知,但不包括与TCP连接表相关的通知:

snmpNotifyFilterProfileTable条目:

  • snmpNotifyFilterProfileName: "noTcpConnections"
  • 与目标参数名称关联: "stationBParams"

snmpNotifyFilterTable条目:

条目1:

  • snmpNotifyFilterProfileName: "noTcpConnections"
  • snmpNotifyFilterSubtree: 1
  • snmpNotifyFilterMask: ""
  • snmpNotifyFilterType: included(1)

条目2:

  • snmpNotifyFilterProfileName: "noTcpConnections"
  • snmpNotifyFilterSubtree: 1.3.6.1.2.1.6.13
  • snmpNotifyFilterMask: ""
  • snmpNotifyFilterType: excluded(2)

此配置包括所有通知(条目1),但明确排除包含来自tcpConnTable的变量的通知(条目2)。

实现考虑 (Implementation Considerations)

性能 (Performance)

通知过滤需要对每个variable-binding针对可能的多个过滤器条目进行OID比较。实现应优化此过程:

  • 使用高效的数据结构(例如,树或哈希表)进行OID查找。
  • 为频繁使用的管理目标缓存过滤器配置文件查找。
  • 考虑在配置时预编译过滤规则。

过滤器顺序 (Filter Order)

过滤器条目按其索引的字典顺序处理。这意味着:

  • 应相对于更广泛的包含适当配置更具体(更长的OID)的排除。
  • 过滤器条目的顺序会影响过滤的结果。

默认行为 (Default Behavior)

如果目标参数不存在过滤器配置文件:

  • 默认行为是发送通知(不过滤)。
  • 这确保了与不使用通知过滤的系统的向后兼容性。

Variable-Binding要求 (Variable-Binding Requirements)

RFC 3416要求通知至少包含两个variable-bindings:

  1. sysUpTime.0
  2. snmpTrapOID.0

这些强制性的variable-bindings必须通过过滤器才能发送通知。如果过滤器排除这些OID,则不会向该管理目标发送通知。

安全考虑 (Security Considerations)

通知过滤可以在多个方面影响安全性:

  1. 防止信息泄露: 过滤可以防止将敏感信息发送到未经授权的管理站。

  2. 配置保护: 过滤器配置表(snmpNotifyFilterProfileTable和snmpNotifyFilterTable)应受访问控制保护,以防止未经授权的修改。

  3. 过滤器绕过: 不正确的过滤器配置(例如,过于宽泛的包含规则)可能允许发送意外的通知。

  4. 拒绝服务: 过于复杂的过滤规则可能消耗过多的处理资源,可能导致拒绝服务。

建议将通知过滤与适当的访问控制(如VACM)和SNMPv3安全功能结合使用,以确保全面的安全性。