Zabbix 社区模板 BGPv4 SNMP:基于 BGP4-MIB 的 BGP 会话监控实战指南
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 告警时使用)。
安装与使用步骤
- 下载并导入模板:从本仓库 5.0 目录(XML)、5.4 目录 或 6.0 目录(YAML)获取对应版本导出文件,在 Zabbix 前端"模板 → 导入"上传。
- 准备外部脚本:在 Zabbix Server 配置文件的
ExternalScripts参数指定目录中部署as_name脚本(脚本本体不在本仓库,由模板作者另行提供),并确保 Zabbix Server 进程对该目录有执行权限;否则 "AS Name" 采集项会报 "Unsupported item key" 类错误。 - 挂载模板:给目标路由器/交换机主机链接
BGPv4 SNMP模板,并按需在主机级覆盖{$PEER_LOW_TIME}(默认 14400 秒)。 - 确认 SNMP 可达:验证主机 SNMP 接口配置(community/版本)正确,且设备开启了 BGP4-MIB 的 SNMP 导出(多数主流厂商默认开启)。
- 验证发现:等待最多 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 与路由前缀容量监控的直接范例。