6. 通知过滤 (Notification Filtering)
通知过滤提供了一种机制,可以根据通知的内容选择性地将通知发送到管理目标。这允许对哪些管理目标接收哪些类型的通知进行细粒度控制。
通知过滤使用三个MIB表:
- snmpNotifyFilterProfileTable: 将过滤器配置文件名称与一组目标参数关联。
- snmpNotifyFilterTable: 根据通知内容定义实际的过滤规则。
- snmpTargetParamsTable: 包含过滤器配置文件表引用的目标参数名称。
过滤处理算法 (Filter Processing Algorithm)
当通知发起者为管理目标生成通知时,它按如下方式应用通知过滤:
-
从管理目标的snmpTargetAddrParams对象中检索目标参数名称。
-
在snmpNotifyFilterProfileTable中查找过滤器配置文件,使用目标参数名称作为索引。
-
如果未找到过滤器配置文件,则发送通知(不应用过滤)。
-
如果找到过滤器配置文件,snmpNotifyFilterProfileName标识snmpNotifyFilterTable中的一组过滤器条目。
-
对于通知中的每个variable-binding:
a. 在snmpNotifyFilterTable中搜索与过滤器配置文件名称匹配的条目。
b. 按其索引的字典顺序处理条目。
c. 对于每个过滤器条目,检查snmpNotifyFilterSubtree指定的子树是否与变量的对象标识符匹配。
d. 如果变量的OID在过滤器子树内或等于过滤器子树,则发生匹配,并考虑snmpNotifyFilterMask(如果指定)。
e. 如果找到匹配:
- 如果snmpNotifyFilterType为included(1),继续检查其他变量。
- 如果snmpNotifyFilterType为excluded(2),不向此管理目标发送通知。
f. 如果在检查所有过滤器条目后未为变量找到匹配,则不发送通知。
-
如果所有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)
要在不过滤的情况下向管理目标发送所有通知:
- 不要在snmpNotifyFilterProfileTable中为目标的参数名称创建条目。
或
- 创建一个带有单个包含过滤器的过滤器配置文件:
- snmpNotifyFilterSubtree: 1(或任何根OID)
- snmpNotifyFilterMask: ""(空)
- snmpNotifyFilterType: included(1)
示例2: 仅发送与接口相关的通知 (Sending Only Interface-Related Notifications)
要仅发送与接口(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:
- sysUpTime.0
- snmpTrapOID.0
这些强制性的variable-bindings必须通过过滤器才能发送通知。如果过滤器排除这些OID,则不会向该管理目标发送通知。
安全考虑 (Security Considerations)
通知过滤可以在多个方面影响安全性:
-
防止信息泄露: 过滤可以防止将敏感信息发送到未经授权的管理站。
-
配置保护: 过滤器配置表(snmpNotifyFilterProfileTable和snmpNotifyFilterTable)应受访问控制保护,以防止未经授权的修改。
-
过滤器绕过: 不正确的过滤器配置(例如,过于宽泛的包含规则)可能允许发送意外的通知。
-
拒绝服务: 过于复杂的过滤规则可能消耗过多的处理资源,可能导致拒绝服务。
建议将通知过滤与适当的访问控制(如VACM)和SNMPv3安全功能结合使用,以确保全面的安全性。