基于 SNMP 的终端设备拓扑发现方案,为什么我需要一个能落地的平台

一、背景 故障快速定位: 终端网络不通时需快速判断是终端自身、接入端口还是上联链路问题,现有拓扑看不到终端节点,只能逐级排查,故障定位时间过程长。 Zabbix 原生的网络发现和拓扑图主要面向交换机、路由器这类网络设备,下挂在交换机 Access 口上的终端设备(PC、打印机...

一、背景

故障快速定位: 终端网络不通时需快速判断是终端自身、接入端口还是上联链路问题,现有拓扑看不到终端节点,只能逐级排查,故障定位时间过程长。

Zabbix 原生的网络发现和拓扑图主要面向交换机、路由器这类网络设备,下挂在交换机 Access 口上的终端设备(PC、打印机、摄像头、IoT 终端)通常无法在拓扑中体现为独立节点。在安全合规、故障定位、资产管理等场景下,客户需要看到终端设备在网络中的具体接入位置,这就要求对 Zabbix 的发现能力做扩展。

本文说明如何基于 Zabbix 的 SNMP 采集、LLD 机制和外部脚本,实现终端设备的拓扑发现。重点讲清楚终端设备为什么能被发现、依赖什么数据、发现后如何挂到拓扑上。

二、核心原理

终端设备能被纳入拓扑,依赖三个前提条件。

2.1 终端要有访问记录

终端设备通常不运行 SNMP Agent,Zabbix 无法直接轮询。发现终端的方式是查询网络设备上的记录:终端的 MAC 地址要出现在交换机的 MAC 地址表(FDB)中,终端的 IP-MAC 映射要出现在路由器的 ARP 表中。如果一台终端从未与网络通信(刚开机未获取 IP,或长时间休眠),它的 MAC 不在 FDB 中,ARP 表里也没有记录,Zabbix 无法发现它。

2.2 终端要接在 Access 口上

交换机端口分为 Access 口和 Trunk 口:

  • Access 口:连接终端设备,只属于一个 VLAN
  • Trunk 口:用于交换机之间或交换机与路由器之间的级联,承载多个 VLAN 流量

拓扑发现时必须区分这两种端口:Access 口下挂的是终端,Trunk 口对端是另一台网络设备。Zabbix 通过 SNMP 查询交换机端口模式(涉及 BRIDGE-MIB 的 dot1dBasePortTable 和 IF-MIB 的 ifTable),可以判断端口类型,从而区分终端和网络设备。

2.3 没有访问记录就 ping 一下

FDB 和 ARP 表中的记录会老化,默认老化时间通常为:

  • FDB:5 分钟(FDB)
  • ARP:4 小时(ARP)

如果终端长时间无流量,记录会被清除,此时 Zabbix 采集不到数据,终端在拓扑中消失。解决方式是主动 ping 终端,触发 ARP 学习和 FDB 刷新。具体做法是:外部脚本在采集前,对网段内的 IP 发起 ICMP 探测,让路由器和交换机重新学习到终端的 MAC,然后再去采集 ARP 表和 FDB。 image.png

图 1: 终端设备发现的三个前提条件

三、数据链路

终端设备的拓扑位置,由两类数据关联得到:路由器的 ARP 表提供 IP 与 MAC 的映射,交换机的 FDB 提供 MAC 与端口的映射。两者关联后,就能得到"终端 IP → MAC → 交换机端口"的完整链路。

3.1 路由器 ARP 表

路由器维护着本网段所有活跃终端的 IP-MAC 映射,通过 SNMP 查询 IP-MIB 的 ipNetToMediaTable(OID 1.3.6.1.2.1.4.22.1)可以获取。ARP 表是发现终端 IP 的数据来源,没有它就拿不到终端的 IP 地址。

3.2 交换机 FDB

交换机的 FDB 记录了每个端口学习到的 MAC 地址,通过 SNMP 查询 BRIDGE-MIB 的 dot1dTpFdbTable(OID 1.3.6.1.2.1.17.4.3.1)可以获取。FDB 是定位终端物理位置的数据来源,它告诉系统某个 MAC 接在交换机的哪个端口上。跨 VLAN 的终端发现需要逐个 VLAN 查询 FDB(涉及 Q-BRIDGE-MIB 的 dot1qTpFdbTable)。

3.3 数据关联

把 ARP 表和 FDB 关联:从 ARP 表拿到终端的 IP 和 MAC,用这个 MAC 去匹配各台交换机的 FDB,找到 MAC 对应的端口,就得到了终端的完整拓扑位置。这个关联逻辑由外部脚本完成,输出结果包含以下字段:

  • 终端 IP
  • MAC
  • 接入交换机 IP
  • 端口号
  • VLAN image.png

图 2: ARP 表与 FDB 关联定位终端位置

四、判断逻辑

终端发现是否完整,关键看网段内有没有路由器。

4.1 有路由器的网段

路由器维护着本网段完整的 ARP 表,包含所有活跃终端的 IP-MAC 映射。Zabbix 通过查询路由器的 ARP 表,可以拿到网段内所有终端的 IP,再结合交换机 FDB 定位端口,发现是完整的。

4.2 没有路由器的网段

如果网段内只有二层交换机,没有路由器或网关设备,就没有完整的 ARP 表,Zabbix 拿不到终端的 IP。这种情况下只能通过交换机 FDB 拿到 MAC,但 MAC 无法关联到 IP,终端在拓扑中只能显示为 MAC 地址,无法显示 IP,发现是不完整的。

4.3 路由器只有一条记录

如果路由器的 ARP 表里只有一条记录,说明该网段当前只有一个终端与网络通信过。可能是网段内确实只有一台活跃终端,也可能是其他终端长时间无流量导致 ARP 记录老化。后者需要通过主动 ping 触发 ARP 学习来刷新。

image.png

图 3: 网段判断逻辑流程

五、实现路径

方案分为数据采集、Zabbix 纳管、拓扑展示三层。

5.1 数据采集层

由外部脚本完成,负责查询路由器 ARP 表和交换机 FDB,关联后输出终端位置数据。脚本用 Python 配合 PySNMP 库实现,输出格式为 JSON,包含终端 IP、MAC、接入交换机 IP、端口号、VLAN 等字段。脚本通过 Zabbix 的外部检查(External Check)或 UserParameter 方式被调用,采集频率建议 5 到 10 分钟一次

5.2 Zabbix 纳管层

通过 LLD(Low-Level Discovery)把采集到的终端数据自动创建为 Zabbix 主机:

  • LLD 规则以脚本输出的 JSON 为数据源
  • 过滤器配置为只纳管 Access 口下的设备
  • 主机的设备唯一性 criteria 配置为 MAC 地址,避免 DHCP 环境下 IP 变化导致主机重复创建
  • 主机创建时自动链接终端监控模板,并写入资产信息(接入交换机、端口、VLAN)

5.3 拓扑展示层

在 Zabbix 的拓扑图(Topology Map)中:

  • 把网络设备作为父节点,终端设备作为子节点
  • 根据采集到的接入交换机和端口信息建立连接关系
  • 终端设备用不同图标区分类型(PC、打印机、摄像头)
  • 拓扑图通过 Zabbix API 动态更新,当终端接入位置变化时,连接关系自动调整

image.png

图 4: 三层实现架构

六、总结

Zabbix 网络拓扑发现终端设备,基于 SNMP 采集、ARP/FDB 数据关联、LLD 自动发现、拓扑图绘制 组合实现。

核心原理:

  1. 终端要有访问记录(ARP 表和 FDB 中有它的 MAC)
  2. 终端要接在 Access 口上(与网络设备端口区分)
  3. 没有访问记录就 ping 一下(主动触发数据刷新)

数据链路: 路由器 ARP 表提供 IP-MAC 映射,交换机 FDB 提供 MAC-端口映射,关联后得到终端的完整拓扑位置。

判断逻辑: 关键看网段要有路由器,有路由器才有完整的 ARP 表,终端发现才能做到不漏。

0 条评论

请先 登录 后评论

作家榜 »

  1. YOHOHO 14 文章
  2. 细雨闲花 13 文章
  3. 机灵小和尚 13 文章
  4. 我是一只小菜鸡 12 文章
  5. 。。。 9 文章
  6. 御前侍卫张五哥 9 文章
  7. 小黄人 8 文章
  8. 影月 7 文章