Zabbix 社区模板 BGPv4 SNMP:基于 BGP4-MIB 的 BGP 会话监控实战指南

原创2026-10-16 12:27:591,839 阅读

Zabbix 社区模板 BGPv4 SNMP:基于 BGP4-MIB 的 BGP 会话监控实战指南

导读

本文围绕 Zabbix 社区模板仓库(community-templates)中的 BGPv4 SNMP 模板展开,讲解如何通过标准 BGP4-MIB(.1.3.6.1.2.1.15)以 SNMP 方式发现并监控设备上全部 BGPv4 对等体(Peer)会话。读完本文,你将掌握该模板的发现规则、6 个采集项、2 组触发器的完整设计,以及 {$PEER_LOW_TIME} 宏、ValueMaps 映射和外部脚本 as_name 的配置方法,可直接落地用于日常 BGP 邻居状态巡检与告警。

模板概览:监控哪些核心指标

该模板(模板名为 BGPv4 SNMP,作者 Flavio Gomes Figueira Camacho Junior)定位为"通用 BGPv4 会话监控",不绑定特定厂商,只要设备实现了 RFC 4271 对应的标准 BGP4-MIB 即可使用。其监控能力覆盖五个维度:

  • Admin Status(管理状态):对等体在本地配置层面的管理开关状态;
  • Established Time(建立时长):会话处于 Established 状态的累计秒数,反映邻居稳定程度;
  • Operation Status(运行状态):BGP 有限状态机(FSM)的当前运行状态;
  • AS Name(AS 名称):通过外部脚本解析远端 AS 号对应的注册名称,便于告警信息可读;
  • BGP last Error(最近错误):最近一次 NOTIFICATION 报文的错误码,并翻译为人类可读的错误描述。

从模板导出文件看,该模板同时提供三个 Zabbix 版本形态:5.0 XML 导出、5.4 YAML 导出 与 6.0 YAML 导出,内容一致,仅导出格式与表达式语法随版本演进。

工作原理:BGP4-MIB 的 bgpPeerTable

模板的数据来源是标准 BGP4-MIB(BGP4-MIB.mib)中的 bgpPeerTable,其 OID 为 .1.3.6.1.2.1.15.3.1。该表以远端对等体 IP 为索引(即模板发现宏 {#SNMPVALUE}),每一行代表一个 BGP 邻居,关键列如下:

BGP4-MIB 对象 OID(相对 bgpPeerTable) 用途
bgpPeerState .2 运行状态,取值 1~6(FSM 状态)
bgpPeerAdminStatus .3 管理状态,1=停止、2=启动
bgpPeerRemoteAs .9 远端 AS 号
bgpPeerLastError .14 最近 NOTIFICATION 错误码(十六进制串)
bgpPeerFsmEstablishedTime .16 Established 累计时长(秒)

模板在发现规则中通过 discovery[{#SNMPVALUE},.1.3.6.1.2.1.15.3.1.7,{#SNMPASN},.1.3.6.1.2.1.15.3.1.9] 一次获取两个宏:用 .7(bgpPeerIdentifier)枚举出全部邻居 IP 作为 {#SNMPVALUE},同时用 .9(bgpPeerRemoteAs)抓取每个邻居的 AS 号作为 {#SNMPASN}。这样后续每个原型采集项都可以在 key 中同时携带邻居 IP 与 ASN,告警标题也能直接展示"对端是谁"。

依赖组件:ValueMaps 与外部脚本 as_name

ValueMaps(值映射)

模板内置两张值映射,把 MIB 中的整数枚举翻译成可读文本(见 6.0 模板定义):

BGP4-MIB::bgpPeerAdminStatus

值 显示文本
1 stoped(停止)
2 started(启动)

BGP4-MIB::bgpPeerState

值 显示文本
1 idle
2 connect
3 active
4 opensent
5 openconfirm
6 established

其中 FSM 状态 1~6 对应 BGP 有限状态机的标准状态机:idle → connect → active → opensent → openconfirm → established,established 是唯一健康状态,这也是后续触发器判断"是否 DOWN"的判据。

外部脚本 as_name

"AS Name" 采集项属于 External check 类型,key 为 as_name<a href="https://link.gitcode.com/i/c90dcc8d96d8ad6297791b84fd720a9d" target="_blank">"{#SNMPVALUE}","{#SNMPASN}"],即调用 Zabbix Server 上 ExternalScripts 目录中的 as_name 脚本,传入邻居 IP 与 ASN 两个参数,由脚本查询 AS 注册信息返回 AS 名称字符串(值为 CHAR 类型,更新间隔 1 天)。因此部署该模板前必须在 Zabbix Server 配置 ExternalScripts 路径并提供该脚本(仓库中未附带脚本本体,README 已注明脚本与值映射由作者另行发布)。同一作者的 [Cisco BGP SNMP 模板同样依赖 as_name 脚本,属于作者同一套方案在不同厂商模板上的复用。

发现规则:BGPv4 Peers Discovery

模板只有一个发现规则 BGPv4 Peers Discovery(key:BgpPeerDiscovery,类型:SNMP agent):

  • SNMP OID:discovery[{#SNMPVALUE},.1.3.6.1.2.1.15.3.1.7,{#SNMPASN},.1.3.6.1.2.1.15.3.1.9]
  • 更新间隔:1h
  • 生命周期(lifetime):7d(邻居消失 7 天后自动清理对应原型实体)

采用 LLD(低级别发现)而非固定写死某个邻居,意味着新增/删除 BGP 对等体后,最多 1 小时内模板会自动同步监控对象,无需人工维护监控项清单。

采集项详解:6 个 Item Prototype

发现规则下挂 6 个原型采集项(均自动加入 BGPv4 应用,并按邻居 IP 动态生成 BGPv4 {#SNMPVALUE} 子应用):

采集项名称 类型 key OID 更新间隔 备注
AS Name for IPv4 peer $1 External check as_name["{#SNMPVALUE}","{#SNMPASN}"] — 1d 值为 CHAR
Administrative status for peer $1 SNMP agent bgpPeerAdminStatus[{#SNMPVALUE}] .1.3.6.1.2.1.15.3.1.3.{#SNMPVALUE} 10m 应用值映射
Established time for peer $1 SNMP agent bgpPeerFsmEstablishedTime[{#SNMPVALUE}] .1.3.6.1.2.1.15.3.1.16.{#SNMPVALUE} 10m 单位 uptime
BGP peer last error {#SNMPVALUE} SNMP agent bgpPeerLastError[{#SNMPVALUE}] .1.3.6.1.2.1.15.3.1.14.{#SNMPVALUE} 10m 带 JS 预处理,值为 CHAR
Remote AS for peer $1 SNMP agent bgpPeerRemoteAs[{#SNMPVALUE}] .1.3.6.1.2.1.15.3.1.9.{#SNMPVALUE} 1d —
Operational status for peer $1 SNMP agent bgpPeerState[{#SNMPVALUE}] .1.3.6.1.2.1.15.3.1.2.{#SNMPVALUE} 1m 应用值映射

几个设计细节值得注意:

  • 轮询频率分层:运行状态(1m)最敏感,管理状态/建立时长/错误码(10m)次之,AS 名称与远端 ASN(1d)几乎不变、最低频轮询,兼顾告警实时性与 SNMP 负载。
  • 历史保留策略:建立时长与最近错误保留 30 天历史,其余保留 7 天,所有项 trends 均为 0(不存趋势数据)。
  • 单位标注:Established time 项声明 units: uptime,Zabbix 会自动以易读格式(如 "3d 4h 12m")展示秒数。

亮点实现:BGP last Error 的 JavaScript 预处理

bgpPeerLastError 原始值是 BGP NOTIFICATION 报文错误码的十六进制字符串(形如 0202,前两位为错误类别,后两位为子码)。模板为其挂载了一段完整的 JavaScript 预处理(见 5.4 模板定义),先将原始值去空白,再按 RFC 4271 错误码表逐条翻译:

value = (value.replace(/\s+/g, ''));

if (value === "0000") { return "NO last error" }
if (value === "0100") { return "Message Header Error - Unspecific" }
if (value === "0101") { return "Message Header Error - Connection Not Synchronized" }
if (value === "0102") { return "Message Header Error - Bad Message Length" }
if (value === "0103") { return "Message Header Error - Bad Message Type" }
if (value === "0200") { return "OPEN Message Error - Unspecific" }
if (value === "0201") { return "OPEN Message Error - Unsupported Version Number" }
if (value === "0202") { return "OPEN Message Error - Bad Peer AS" }
if (value === "0203") { return "OPEN Message Error - Bad BGP Identifier" }
// ……(中间省略,模板覆盖 01~07 全部类别)
if (value === "0609") { return "Cease NOTIFICATION - Hard Reset" }
if (value === "0700") { return "ROUTE-REFRESH Message Error - Reserded" }
if (value === "0701") { return "ROUTE-REFRESH Message Error - Invalid Message Length" }
return value

脚本完整覆盖了 BGP 标准中 7 大错误类别:01 Message Header Error、02 OPEN Message Error、03 UPDATE Message Error、04 Hold Timer Expired、05 Finite State Machine Error、06 Cease(管理性断开)、07 ROUTE-REFRESH Message Error,未命中的值原样返回。经此转换,排障时看到的就不再是晦涩的 0602,而是 "Cease NOTIFICATION - Administrative Shutdown",可直接定位是管理性 shutdown 还是协议级错误。

触发器设计:DOWN 与低在线时长

模板包含两组触发器原型,均随 LLD 动态生成,同时存在"普通版"与"(LLD)版"两个条目(后者是 README 表格对原型触发器的自动展示形式,本质同一逻辑)。

高优先级:BGP peer {#SNMPVALUE} ASN {#SNMPASN} is DOWN

  • 表达式(5.0 旧语法):{BGPv4 SNMP:bgpPeerState[{#SNMPVALUE}].last(#3)}<>6 and {BGPv4 SNMP:bgpPeerAdminStatus[{#SNMPVALUE}].last(0)}=2
  • 表达式(5.4/6.0 新语法):last(/BGPv4 SNMP/bgpPeerState[{#SNMPVALUE}],#3)<>6 and last(/BGPv4 SNMP/bgpPeerAdminStatus[{#SNMPVALUE}])=2
  • 优先级:high

逻辑拆解:bgpPeerState ... #3 表示取最近 3 次采样的值,<>6 即"最近三次都不处于 established";bgpPeerAdminStatus=2 即"管理状态为 started"。两者取与,含义是——只有本地配置为启动(started)的邻居,其运行状态连续 3 次(约 3 分钟)未进入 established 才告警。管理上主动 stoped 的邻居不会误报,连续 3 次采样可滤除瞬态抖动。

信息级:BGP peer up time low {#SNMPVALUE} ASN {#SNMPASN}

  • 表达式:last(/BGPv4 SNMP/bgpPeerFsmEstablishedTime[{#SNMPVALUE}])<{$PEER_LOW_TIME}(5.0 中为相对表达式 {last()}<{$PEER_LOW_TIME},默认值 14400 秒)
  • 优先级:information(信息)

用于提示某邻居"刚建立不久"(在线时长低于阈值),常用于告警收敛:配合宏阈值调整"建立后多久内不重复告警"。值得注意的是,该触发器在 XML 中声明了对 DOWN 触发器的 依赖关系(dependency),即邻居已 DOWN 时不再重复触发 low up time,避免告警风暴。

宏:{$PEER_LOW_TIME}

模板仅定义一个宏:

名称 描述 默认值 类型
{$PEER_LOW_TIME} 会话低在线时长告警阈值(秒) 14400(4 小时) Text macro

在主机级别覆盖该宏即可按业务调整"多长时间算稳定",无需改动模板。另外,DOWN 触发器描述中提到"针对远程 AS 匹配 {$BGP_PEER_AS} 宏的邻居",但模板宏列表仅定义 {$PEER_LOW_TIME},{$BGP_PEER_AS} 需按需在主机/模板级自行补充定义(如只对特定上游 ASN 告警时使用)。

安装与使用步骤

  1. 下载并导入模板:从本仓库 5.0 目录(XML)、5.4 目录 或 6.0 目录(YAML)获取对应版本导出文件,在 Zabbix 前端"模板 → 导入"上传。
  2. 准备外部脚本:在 Zabbix Server 配置文件的 ExternalScripts 参数指定目录中部署 as_name 脚本(脚本本体不在本仓库,由模板作者另行提供),并确保 Zabbix Server 进程对该目录有执行权限;否则 "AS Name" 采集项会报 "Unsupported item key" 类错误。
  3. 挂载模板:给目标路由器/交换机主机链接 BGPv4 SNMP 模板,并按需在主机级覆盖 {$PEER_LOW_TIME}(默认 14400 秒)。
  4. 确认 SNMP 可达:验证主机 SNMP 接口配置(community/版本)正确,且设备开启了 BGP4-MIB 的 SNMP 导出(多数主流厂商默认开启)。
  5. 验证发现:等待最多 1 小时让 LLD 规则运行,在"最新数据"中应能看到每个 BGP 邻居对应的 6 个采集项;用 snmpwalk -On -v2c <设备> .1.3.6.1.2.1.15.3.1 可先行核对 OID 表内容。

版本差异与扩展参考

三个版本目录内容语义一致,主要差异在于导出格式与表达式语法:5.0 使用 XML 导出与旧式 {主机:key.last(#3)} 表达式(见 5.0 XML),5.4/6.0 使用 YAML 导出与 last(/主机/key,#3) 新语法(见 6.0 YAML);此外 5.4+ 版本以 tags 替代 5.0 的 applications 组织 BGPv4 / BGPv4 {#SNMPVALUE} 分组。

若需监控 IPv6 邻居或前缀数量上限,可参考同作者在仓库中的进阶实现 Cisco BGP SNMP:它额外引入 cbgpPeer2LocalAddr(IPv6 LLD)、oid_to_ipv6 外部脚本,以及基于 cbgpPeerPrefixAccepted / cbgpPeerPrefixLimit 的"前缀数逼近上限(默认 80%)"警告触发器,可作为在本模板基础上扩展 IPv6 与路由前缀容量监控的直接范例。

登录后查看全文
community-templates