网络设备 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 | 字符串 | 否 | public | Prometheus 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 |
level | Syslog 严重性。 | informational, warning, err, crit |
facility | Syslog 设施。 | daemon |
topics | 消息头中的完整 RouterOS 主题列表。 | system,info,account |
topic | 该列表中的第一个主题。用于常见过滤。 | system, firewall, dhcp |
syslog_host | syslog 头的主机字段,按发送者所写。 | 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
| 属性 | 值 | 描述 |
|---|---|---|
target | remote | 将日志发送到远程 syslog 服务器,而不是内存或磁盘。 |
remote | 监控主机地址 | syslog 流的目的地。 |
remote-port | 514 | 目的端口。与 network_syslog_port 匹配。 |
remote-log-format | bsd-syslog | 仅适用于 RouterOS 7。发送 RFC 3164。请参见下面的版本表。 |
src-address | 清单中的设备地址 | 可选。当设备有多个接口时设置,以便源地址与清单条目匹配。 |
RouterOS 版本的消息格式
收集器解析 RFC 3164,因此设备必须发送该格式。控制格式的属性在主要版本之间发生了变化。使用 /system resource print 检查版本。
| 版本 | 属性 | 默认 | 操作 |
|---|---|---|---|
| RouterOS 7 | remote-log-format | default | 设置 remote-log-format=bsd-syslog。default 值发送 MikroTik 帧,没有 syslog 优先级头,收集器无法解析���RouterOS 6 的 bsd-syslog 属性在这里不存在,该命令会因 bad parameter bsd-syslog 而失败。 |
| RouterOS 6 | bsd-syslog | no | 设置 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 的设备都可以使用收集器。适用三个条件:
- 设备发送 BSD syslog,如 RFC 3164 中定义的那样。收集器不解析 RFC 5424。
- 设备将 UDP 发送到监控主机的 514 端口,除非站点更改了
network_syslog_protocol或network_syslog_port。 - 设备从
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 没有在监控主机上运行。
- 监听器未绑定端口。
- 设备未发送。
- 防火墙丢弃数据报。
解决方案:
- 使用
systemctl status alloy检查监控主机上的代理状态。 - 使用
ss -lunp | grep 514检查 Alloy 是否拥有该端口。 - 使用
tcpdump -n -i any udp port 514捕获流量。流量证明设备正在发送,并且防火墙允许数据报。 - 如果没有流量,请检查设备上的日志操作。
Alloy 无法启动
症状:alloy 服务循环重启。日志显示绑定错误或端口 514 的权限错误。
可能原因:
- 单元没有
CAP_NET_BIND_SERVICE。 - 另一个进程占用了该端口,例如本地
rsyslogd的 UDP 监听器。
解决方案:
- 使用
journalctl -u alloy -n 50阅读错误。 - 使用
systemctl cat alloy确认能力。 - 使用
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。
解决方案:
- 使用
tcpdump -n -i any -A udp port 514捕获流量。tcpdump标记为(invalid)的消息没有 syslog 优先级头,因此格式错误。 - 为设备的版本设置格式属性。请参见 RouterOS 版本的消息格式。
- 在另一台设备上,选择 BSD 或传统 syslog 格式。
- 使用
journalctl -u alloy | grep -i syslog检查 Alloy 日志中的解析错误。
设备标签为空
症状:日志行携带 device_ip 但没有 device 标签。
可能原因:
- 发送者地址不在
devices:映射中。 - 设备从第二个接口发送,因此源地址与清单地址不同。
解决方案:
- 从
device_ip标签读���源地址。 - 将该地址添加到供应商
devices:映射中,或在设备上设置源地址。 - 使用
common角色应用更改,并在站点强制防火墙时应用防火墙播放。
一台设备停止发送
症状:按设备的日志速率 面板对一台设备没有数据。其他设备继续发送。
可能原因:
- 操作员在设备上删除或禁用了日志规则。
- 设备失去了到监控主机的路由。
- 清单地址已更改,因此防火墙丢弃新的源地址。
解决方案:
- 使用
/system logging print检查设备上的规则。 - 从设备 ping 监控主机。
- 确认设备的当前地址与清单条目匹配。
参考文献
| 参考 | 标题 |
|---|---|
| RFC 3164 | BSD syslog 协议 |
| RFC 5424 | Syslog 协议。收集器不解析此格式。 |
| 集中式日志记录 | 主机日志管道、保留和仪表板 |
| 每角色防火墙 | 流模型、源令牌和模式 |
| 监控与可观察性 | Prometheus、Grafana 和指标 |