速率限制特定的 Cisco ISR 系统日志消息

网络工程 思科 路由器 cisco-ios-12 系统日志
2021-07-07 05:05:02

我们在 12.4(25b) 上有一堆 ISR 2800,它们基本上都在生产中,直到它们消亡。没有计划在 SmartNET 上投资或购买替换风扇。

我们收到了大量的粉丝服务系统日志消息,每天收到数以万计的消息令人讨厌。我看到您可以对每秒 syslog 消息的数量进行速率限制,但需要更多的东西来允许每天一条特定类型的 syslog 消息。

路由器上是否有任何命令或其他外部方法可以完成类似的操作?

Apr 17 14:52:09.292: %ENVMON-4-FAN_LOW_RPM: Fan 1 service recommended
Apr 17 14:52:09.292: %ENVMON-4-FAN_LOW_RPM: Fan 2 service recommended
Apr 17 14:52:09.292: %ENVMON-4-FAN_LOW_RPM: Fan 3 service recommended
Apr 17 14:52:39.292: %ENVMON-4-FAN_LOW_RPM: Fan 1 service recommended
Apr 17 14:52:39.292: %ENVMON-4-FAN_LOW_RPM: Fan 2 service recommended
Apr 17 14:52:39.292: %ENVMON-4-FAN_LOW_RPM: Fan 3 service recommended
Apr 17 14:53:09.293: %ENVMON-4-FAN_LOW_RPM: Fan 1 service recommended
Apr 17 14:53:09.293: %ENVMON-4-FAN_LOW_RPM: Fan 2 service recommended
Apr 17 14:53:09.293: %ENVMON-4-FAN_LOW_RPM: Fan 3 service recommended
Apr 17 14:53:39.293: %ENVMON-4-FAN_LOW_RPM: Fan 1 service recommended
Apr 17 14:53:39.293: %ENVMON-4-FAN_LOW_RPM: Fan 2 service recommended
Apr 17 14:53:39.293: %ENVMON-4-FAN_LOW_RPM: Fan 3 service recommended
Apr 17 14:54:09.293: %ENVMON-4-FAN_LOW_RPM: Fan 1 service recommended
Apr 17 14:54:09.293: %ENVMON-4-FAN_LOW_RPM: Fan 2 service recommended
Apr 17 14:54:09.293: %ENVMON-4-FAN_LOW_RPM: Fan 3 service recommended
Apr 17 14:54:39.294: %ENVMON-4-FAN_LOW_RPM: Fan 1 service recommended
Apr 17 14:54:39.294: %ENVMON-4-FAN_LOW_RPM: Fan 2 service recommended
Apr 17 14:54:39.294: %ENVMON-4-FAN_LOW_RPM: Fan 3 service recommended
Apr 17 14:55:09.294: %ENVMON-4-FAN_LOW_RPM: Fan 1 service recommended
Apr 17 14:55:09.294: %ENVMON-4-FAN_LOW_RPM: Fan 2 service recommended
Apr 17 14:55:09.294: %ENVMON-4-FAN_LOW_RPM: Fan 3 service recommended
Apr 17 14:55:39.295: %ENVMON-4-FAN_LOW_RPM: Fan 1 service recommended
Apr 17 14:55:39.295: %ENVMON-4-FAN_LOW_RPM: Fan 2 service recommended
Apr 17 14:55:39.295: %ENVMON-4-FAN_LOW_RPM: Fan 3 service recommended
1个回答

概括

您应该使用 Cisco 的Embedded Syslog ManagerESM可以在路由器上生成系统日志消息时动态修改或限制系统日志消息。

ESM演示

我构建了一个示例(参见答案底部),说明如何在测试时间窗口内对配置消息进行速率限制;出于本演示的目的,我将其[regexp {CONFIG} $::orig_msg]替换为 ,[regexp {FAN_LOW_RPM} $::orig_msg]以便我可以说明像%SYS-5-CONFIG_I: Configured from console by vty0.

我用 编辑了答案底部的 tcl 脚本[regexp {CONFIG} $::orig_msg],然后 tftp 将脚本写入闪存...

DEN-EDGE-02#copy tftp://172.16.1.5/filterSyslog.tcl flash:
Destination filename [filterSyslog.tcl]?
%Warning:There is a file already existing with this name
Do you want to over write? [confirm]
Accessing tftp://172.16.1.5/filterSyslog.tcl...
Loading filterSyslog.tcl from 172.16.1.5: !
[OK - 684 bytes]

684 bytes copied in 0.104 secs (6577 bytes/sec)
DEN-EDGE-02#

然后我用脚本的名称和系统日志服务器的地址 (172.16.1.5) 配置了我的路由器。

logging filter flash:filterSyslog.tcl
logging trap debugging
logging host 172.16.1.5 vrf mgmtVrf filtered

现在,当您在路由器上进入配置模式时,系统日志消息会受到速率限制。

[mpenning@tsunami tftpboot]$ sudo tshark -ni eth0 udp and host 172.16.1.204
Running as user "root" and group "root". This could be dangerous.
Capturing on eth0
  3.472614 172.16.1.204 -> 172.16.1.5   Syslog 177 LOCAL7.NOTICE: 278: Apr 21 05:37:58.189
   CDT: %SYS-5-CONFIG_I: Configured from console by vty0 (172.16.1.5) - This message was
   rate-limited by ESM

怎么运行的

应答速率限制消息底部ESM脚本FAN_LOW_RPM该示例利用了NVMON-4-FAN_LOW_RPM消息每 30 秒发送一次的事实为简单起见,我在 23:59:30 和 23:59:59 之间使用了一个绝对 30 秒的窗口来限制消息的速率。此脚本假定系统日志以恒定速率发送,并且不是间歇性的。在附加的脚本中,我使用HHMMSS(24 小时)格式的时间戳,以便它们可以轻松映射到整数。

当系统日志消息准备好发送时,IOS 将其存储在$::orig_msg. 我刚刚构建了一系列快速if .. else子句来检测系统日志消息:

  • 匹配正则表达式(在本例中为FAN_LOW_RPM
  • 发生在 23:59:30 和 23:59:59(含)之间的 30 秒窗口中

如果消息包含FAN_LOW_RPM并且在时间窗口内,则脚本发送消息。FAN_LOW_RPM不发送包含消息的其他消息发送所有其他系统日志(因为我们只想使嘈杂的消息静音)。

仅供参考,为简单起见,我有意避免在NVMON-4-FAN_LOW_RPM看到的最后一条syslog 消息之间保留时间戳值,尽管有人也可以这样做。


ESM系统日志速率限制脚本

将此文件保存在闪存中 flash:filterSyslog.tcl

## Filename: filterSyslog.tcl
proc forceInteger { x } {
    set count [scan $x %d%s n rest]
    if { $count <= 0 || ( $count == 2 && ![string is space $rest] ) } {
        # This is an error
        return "-1"
    }
    return $n
}
set time_start 235900
set time_end 235959
# See http://wiki.tcl.tk/498 for information about TCL's strange number-handling
set timestamp [forceInteger [clock format [clock seconds] -format %H%M%S]]

### Modify the regexp below and use any message you want to rate-limit...
if { [regexp {FAN_LOW_RPM} $::orig_msg] } {
    if {($time_start <= $timestamp) && ($timestamp <= $time_end)} {
        # Send syslog messages inside the $time_start and $time_end
        return "$::orig_msg - This message was rate-limited by ESM"
    } else {
        # Drop syslog messages outside $time_start to $time_end
        return ""
    }
} else {
    # Return all other syslog messages as usual
    return $::orig_msg
}