跳到主要内容

网络设备 Syslog

路由器、交换机和其他网络设备无法运行 Grafana Alloy 代理。这些设备发送 syslog。每个监控主机在 Alloy 内部运行一个 syslog 监听器。监听器将消息写入本地 Loki。设备日志与核心网络日志并排存放,并共享相同的搜索、时间范围和保留策略。

目录​

架构​

收集器是标准监控构建的一部分。每个监控主机打开监听器。站点不设置标志以接收设备 syslog。

监听器接受 BSD syslog,这是 RFC 3164 定义的格式。Alloy 解析优先级、时间戳和消息。然后,Alloy 添加下一节描述的标签。

设备识别方式​

Alloy 根据数据报的源地址为每个设备命名。Alloy 将该地址与站点清单中的 devices: 映射进行比较。匹配时设置 device 和 vendor 标签。

这种设计产生两个结果:

  • 即使设备在消息头中发送错误身份、空身份或重复身份,设备标签也是正确的。
  • 从清单中未列出的地址发送的设备仅保留 device_ip 标签。将地址添加到清单中以为该设备命名。

如果设备有多个接口,请确保它从清单中列出的地址发送。设置设备上的源地址。

收集器配置​

收集器参数位于 roles/common/defaults/main.yml 中。在站点清单中的 all.vars 下覆盖参数。

all:
vars:
network_syslog_port: 514 # 监听端口
network_syslog_protocol: udp # 传输协议
network_syslog_vendors: # 命名发送者的供应商块
- mikrotik
参数类型必需默认描述
network_syslog_port整数否514监听器在监控主机上绑定的端口。低于 1024 的端口是特权端口。请参见下面的说明。
network_syslog_protocol字符串否udp监听器的传输协议。使用 udp 或 tcp。大多数网络设备发送 UDP。
network_syslog_vendors列表否[mikrotik]清单供应商块,其 devices: 映射命名 syslog 发送者。每个列出的供应商贡献设备名称标签。

Alloy 作为非特权的 alloy 用户运行。因此,低于 1024 的端口需要一个能力。当 network_syslog_port 低于 1024 时,监控主机上的 Alloy 单元自动接收 CAP_NET_BIND_SERVICE。高于 1024 的端口不接收该能力。

使用 common 角色应用对这些参数的更改:

ansible-playbook -i hosts/<Customer>/host_files/<Site>.yml services/common.yml \
--limit <monitoring-host> --tags alloy

监控主机为此监听器运行 Alloy。因此,监控主机还将其自己的日志、SSH 和审计日志发送到其本地 Loki。

设备清单​

收集器读取与 SNMP 导出器使用的相同供应商映射。每个设备添加一次。该条目随后为设备提供日志标签、SNMP 目标和防火墙规则。

all:
vars:
mikrotik:
devices:
nf-nids-rtr-core01: 10.64.10.1
nf-flgstf-rtr01: 10.64.50.22
snmp_community: <community-string>
参数类型必需默认描述
devices映射是-设备名称到 IP 地址。名称成为 device 标签。地址标识发送者并打开防火墙。
snmp_community字符串否publicPrometheus SNMP 导出器的 SNMP 社区。syslog 收集器不使用它。

日志标签​

设备 syslog 在 job="network_syslog" 下到达。以下标签适用。

标签描述示例
job设备 syslog 的固定值。network_syslog
component设备 syslog 的固定值。network_device
device来自清单的设备名称。Alloy 匹配发送者地址。nf-nids-rtr-core01
device_ip数据报的源地址。10.64.10.1
vendor包含设备的清单供应商块。mikrotik
levelSyslog 严重性。informational, warning, err, crit
facilitySyslog 设施。daemon
topics消息头中的完整 RouterOS 主题列表。system,info,account
topic该列表中的第一个主题。用于常见过滤。system, firewall, dhcp
syslog_hostsyslog 头的主机字段,按发送者所写。system,info,account

RouterOS 不发送自己的身份。它在主机名的位置写入其主题列表,因此解析器将该列表存储为 syslog 主机。收集器从该字段读取 topics 和 topic。写入真实主机名的发送者仅设置 syslog_host,并不创建主题标签。

MikroTik RouterOS​

从 RouterOS 终端配置每个设备。设备将其内置的 remote 日志操作指向监控主机。然后,设备需要为每个主题设置一个日志规则。

/system logging action set [find name=remote] target=remote remote=<monitoring-host> remote-port=514 remote-log-format=bsd-syslog
/system logging add topics=error action=remote
/system logging add topics=warning action=remote
/system logging add topics=critical action=remote
/system logging add topics=info action=remote
属性值描述
targetremote将日志发送到远程 syslog 服务器,而不是内存或磁盘。
remote监控主机地址syslog 流的目的地。
remote-port514目的端口。与 network_syslog_port 匹配。
remote-log-formatbsd-syslog仅适用于 RouterOS 7。发送 RFC 3164。请参见下面的版本表。
src-address清单中的设备地址可选。当设备有多个接口时设置,以便源地址与清单条目匹配。

RouterOS 版本的消息格式​

收集器解析 RFC 3164,因此设备必须发送该格式。控制格式的属性在主要版本之间发生了变化。使用 /system resource print 检查版本。

版本属性默认操作
RouterOS 7remote-log-formatdefault设置 remote-log-format=bsd-syslog。default 值发送 MikroTik 帧,没有 syslog 优先级头,收集器无法解析���RouterOS 6 的 bsd-syslog 属性在这里不存在,该命令会因 bad parameter bsd-syslog 而失败。
RouterOS 6bsd-syslogno设置 bsd-syslog=yes。默认值发送裸消息,收集器无法解析。
# RouterOS 7
/system logging action set [find name=remote] remote-log-format=bsd-syslog

# RouterOS 6
/system logging action set [find name=remote] bsd-syslog=yes

数据包捕获显示了差异。错误格式在 tcpdump 中解码为 (invalid),并且有效负载以二进制字节开头,然后是消息文本。正确格式解码为 SYSLOG, Facility local0, Severity info。

RouterOS 主题​

主题描述
critical停止设备上服务的故障。
error失败的操作,例如失败的 DHCP 租约或失败的隧道。
warning需要注意但不停止服务的条件。
info正常事件。此主题承载 account 事件,即用户登录、失败的登录和配置更改。

从 error、warning 和 critical 开始,以减少流量。当您想要登录和配置更改审计时,添加 info。

检查设备上的结果:

/system logging print
/system logging action print

其他 Syslog 发送者​

任何支持 BSD syslog 的设备都可以使用收集器。适用三个条件:

  1. 设备发送 BSD syslog,如 RFC 3164 中定义的那样。收集器不解析 RFC 5424。
  2. 设备将 UDP 发送到监控主机的 514 端口,除非站点更改了 network_syslog_protocol 或 network_syslog_port。
  3. 设备从 devices: 映射列出的地址发送。防火墙允许该地址,并且该地址为设备提供名称。

将新供应商添加到 network_syslog_vendors 以标记其设备。防火墙已经接受每个供应商的设备。

Cisco IOS

logging host <monitoring-host>
logging trap informational
logging source-interface <management-interface>

Linux rsyslog

*.* @<monitoring-host>:514

默认的 rsyslog 模板是 RFC 3164。保持该模板。不要选择 RSYSLOG_SyslogProtocol23Format,因为该模板发送 RFC 5424。

具有 Web 界面的设备

设置远程 syslog 服务器和端口。如果设备提供格式选择,请选择 BSD 或传统格式。

防火墙​

流模型携带规则。流 4b 允许 514/udp 到 monitoring 组。源来自 { net_devices: true } 令牌,该令牌解析每个 all.vars.<vendor>.devices 映射中的每个地址。

当站点在 enforce 模式下运行防火墙时,清单中未列出的设备将被丢弃。将设备添加到清单中,然后应用防火墙:

ansible-playbook -i hosts/<Customer>/host_files/<Site>.yml services/firewall.yml \
--limit <monitoring-host>

有关流模型和模式,请参阅 每角色防火墙 指南。

仪表板​

Grafana 在 Logs 文件夹中保存 网络设备 Syslog 仪表板。

面板描述
网络设备日志搜索跨每个设备的自由文本搜索。
按设备的日志速率每个设备随时间变化的日志量。零处的平坦线显示设备停止发送。
按严重性分类的日志速率每个严重性随时间变化的日志量。
网络设备日志选定设备和搜索字符串的所有设备日志。
错误、警告和严重严重性为 warning 及以上。
登录、身份验证失败和配置更改审计的帐户和系统事件。
链接、OSPF/BGP 和 DHCP 事件接口、路由和租约事件。
变量描述
Site (logs)Loki 数据源。选择站点。
Device设备下拉菜单。列表来自 Loki 中的 device 标签值。选择一个设备、多个设备或 All。
Search日志面板的自由文本过滤器。

查询日志​

# 来自一个设备的每条消息
{job="network_syslog", device="nf-nids-rtr-core01"}

# 严重性为 warning 及以上,跨整个环境
{job="network_syslog", level=~"emerg|alert|crit|err|warning"}

# 登录和配置更改
{job="network_syslog"} |~ `(?i)(logged in|login failure|changed by)`

# 一个 RouterOS 主题
{job="network_syslog", topic="firewall"}

# 每个设备的消息速率
sum by (device) (rate({job="network_syslog"} [5m]))

# 在过去一小时内停止发送的设备
sum by (device) (count_over_time({job="network_syslog"} [1h]))

故障排除​

Loki 中没有设备日志​

症状:查询 {job="network_syslog"} 没有返回结果。

可能原因:

  • Alloy 没有在监控主机上运行。
  • 监听器未绑定端口。
  • 设备未发送。
  • 防火墙丢弃数据报。

解决方案:

  1. 使用 systemctl status alloy 检查监控主机上的代理状态。
  2. 使用 ss -lunp | grep 514 检查 Alloy 是否拥有该端口。
  3. 使用 tcpdump -n -i any udp port 514 捕获流量。流量证明设备正在发送,并且防火墙允许数据报。
  4. 如果没有流量,请检查设备上的日志操作。

Alloy 无法启动​

症状:alloy 服务循环重启。日志显示绑定错误或端口 514 的权限错误。

可能原因:

  • 单元没有 CAP_NET_BIND_SERVICE。
  • 另一个进程占用了该端口,例如本地 rsyslogd 的 UDP 监听器。

解决方案:

  1. 使用 journalctl -u alloy -n 50 阅读错误。
  2. 使用 systemctl cat alloy 确认能力。
  3. 使用 ss -lunp | grep 514 查找其他监听器。停止该监听器,或将 network_syslog_port 设置为一个空闲端口,并配置设备以匹配。

数据报到达但 Loki 不存储任何内容​

症状:tcpdump 显示在端口 514 上的流量。Loki 没有 network_syslog 流。

可能原因:

  • 设备未发送 BSD syslog。RouterOS 7 设备需要 remote-log-format=bsd-syslog。RouterOS 6 设备需要 bsd-syslog=yes。
  • 设备发送 RFC 5424。

解决方案:

  1. 使用 tcpdump -n -i any -A udp port 514 捕获流量。tcpdump 标记为 (invalid) 的消息没有 syslog 优先级头,因此格式错误。
  2. 为设备的版本设置格式属性。请参见 RouterOS 版本的消息格式。
  3. 在另一台设备上,选择 BSD 或传统 syslog 格式。
  4. 使用 journalctl -u alloy | grep -i syslog 检查 Alloy 日志中的解析错误。

设备标签为空​

症状:日志行携带 device_ip 但没有 device 标签。

可能原因:

  • 发送者地址不在 devices: 映射中。
  • 设备从第二个接口发送,因此源地址与清单地址不同。

解决方案:

  1. 从 device_ip 标签读���源地址。
  2. 将该地址添加到供应商 devices: 映射中,或在设备上设置源地址。
  3. 使用 common 角色应用更改,并在站点强制防火墙时应用防火墙播放。

一台设备停止发送​

症状:按设备的日志速率 面板对一台设备没有数据。其他设备继续发送。

可能原因:

  • 操作员在设备上删除或禁用了日志规则。
  • 设备失去了到监控主机的路由。
  • 清单地址已更改,因此防火墙丢弃新的源地址。

解决方案:

  1. 使用 /system logging print 检查设备上的规则。
  2. 从设备 ping 监控主机。
  3. 确认设备的当前地址与清单条目匹配。

参考文献​

参考标题
RFC 3164BSD syslog 协议
RFC 5424Syslog 协议。收集器不解析此格式。
集中式日志记录主机日志管道、保留和仪表板
每角色防火墙流模型、源令牌和模式
监控与可观察性Prometheus、Grafana 和指标