配置 Zabbix 通过 SNMP 监控 Yeastar P 系列 IPPBX
本文以 Zabbix 6.0.45 为例,介绍如何通过 SNMP 监控 Yeastar P 系列 IPPBX。
使用要求
Yeastar P 系列 IPPBX 的固件为 37.18.0.18 或更高版本。
前提条件
操作步骤
步骤一、在 Zabbix 上添加主机
Zabbix 中的主机是一个你想要监控的网络实体 (物理的或虚拟的)。在本例中,我们将在 Zabbix 中为 Yeastar P 系列 IPPBX 添加主机。
- 在左侧导航栏,进入 。
- 点击右上角的 创建主机。
- 在 主机 页签下,配置主机。
- 在 主机名称 栏,填写一个名称,帮助你识别该主机。在本例中,填写 P-Series PBX。
- 在 群组 栏,填写现有的群组名称,或者点击 选择 选择群组。
- 在 接口 栏,添加主机。
- 点击 添加,选择
SNMP,然后完成以下设置:

设置 说明 IP 地址 填写 PBX 的 IP 地址。在本例中,填写 192.168.28.39。 端口 填写 PBX 上配置的 SNMP 查询端口。在本例中,保留默认的 161。 SNMP 版本 选择 SNMPv3。 安全名称 填写 PBX 上配置的 SNMPv3 用户名。在本例中,填写 yeastardemo。 安全级别 选择 PBX 上配置的认证方式。 - noAuthNoPriv:此项即 PBX 上的
NoAuth。

- authNoPriv:此项即 PBX 上的
Auth。
如果选择此项,你需要设置 验证协议 为 MD5,并填写验证口令。

- authPriv:此项即 PBX 上的
Priv。
如果选择此项,你需要设置 验证协议 为 MD5, 设置 隐私协议 为 DES,并填写验证口令和私钥。

在本例中,选择 noAuthNoPriv。
- noAuthNoPriv:此项即 PBX 上的
NoAuth。
- 可选: 若要启用 SNMP trap,重复 步骤 i 添加另一个主机接口。注: 该接口除端口外,其余配置与前一个主机接口相同。端口需与 PBX 上配置的 SNMP Trap 端口一致 (路径:)。

- 点击 添加,选择
SNMP,然后完成以下设置:
- 点击 添加。
主机添加成功。你可以在 主机 列表查看新建的主机。

步骤二、为主机添加监控项
监控项定义了单一的指标或需要获得的数据。在本例中,我们将添加监控项,以便能从 PBX 获取数据。
- 导入监控项
-
我们提供 Yeastar PBX MIB 文件,支持
.mib和.xml两种格式,通过此文件可快速导入监控项到网络管理系统。请下载所需格式的文件,并按下方说明进行导入。
- 在左侧导航栏,进入 。
- 点击右上角的 导入,选择 MIB 文件,然后点击
导入。
你可以在 模板 列表查看导入的模板。

- 在左侧导航栏,进入 ,搜索 PBX 主机,并进入主机详情页。
- 点击 模板 页签,在 链接新模板
栏搜索并选择导入的模板,然后点击 更新。

在 主机 列表,可以看到模板及监控项已与 PBX 主机关联成功。

- 手动添加监控项 (标量节点)
-
标量节点也可以通过在网络管理系统中手动创建 SNMP 代理监控项的方式进行添加。我们提供了标量节点信息,以便你能够根据这些信息手动创建监控项。请参考 Yeastar P 系列 IPPBX MIB 添加所需的监控项。
- 进入监控项的创建页面。
- 进入 ,搜索并找到 PBX 主机。
- 点击主机旁边的 监控项。

- 添加 SNMP 代理,以便监控 PBX 并获取相关数据。
- 点击右上角的 创建监控项。
- 在 监控项 页签下,配置监控项。

设置 说明 名称 填写一个名称,帮助你识别此监控项。在本例中,填写 DeviceName。 类型 选择 SNMP 代理。 键值 填写标量节点的名称。在本例中,填写 pDeviceName。 信息类型 选择信息类型。在本例中,选择 字符。 主机接口 选择用于 SNMP 查询的主机接口。 SNMP OID 填写标量节点的 OID。在本例中,填写 1.3.6.1.4.1.22736.3.2.1.0。 -
可选: 点击 ,测试配置是否正确,然后关闭窗口。

- 点击 添加。
- 进入监控项的创建页面。
- 自动发现监控项 (表节点)
-
表节点可通过 SNMP Walk 遍历指定的 MIB 子树进行自动发现。在此过程中,SNMP Walk 会向网络实体发送重复的 SNMP 请求,逐步遍历子树中的节点,并获取设备参数及其对应的值。
要实现该功能,你需要安装 SNMP Walk 工具,创建用于自动发现表节点的发现规则,并定义监控项原型,以根据发现结果自动生成监控项。
- 安装 SNMPwalk。
- 通过 SSH 访问 Zabbix 服务器。
- 根据操作系统,执行相应命令安装
net-snmp工具包。- Ubuntu/Debian:执行
apt-get install snmp -y。 - CentOS/RHEL:执行
yum install net-snmp-utils -y。
- Ubuntu/Debian:执行
- 执行
snmpwalk --version,验证安装是否成功。在本例中,返回
NET-SNMP version: 5.7.3,表示已成功安装 5.7.3 版本。
- 创建发现规则。
- 在左侧导航栏,进入 。
- 点击主机旁边的 自动发现。

- 在页面右上角,点击 创建发现规则。
- 完成以下配置。

设置 说明 名称 填写一个名称,用于识别该发现规则。 在本例中,填写
Yeastar P-Series Extension Discovery。类型 选择 SNMP 代理。 键值 填写该发现规则的唯一键值。
在本例中,填写 yeastar.ext.discovery。
主机接口 选择用于 SNMP 查询的主机接口。 SNMP OID 填写用于 SNMP 发现的 OID。根据 Zabbix 版本不同,表达式语法有所不同。
- Zabbix 6.0 及以上版本:使用
walk[] 语法指定一个或多个
OID。
例如,填写 walk[1.3.6.1.4.1.22736.3.4.2.1.2,1.3.6.1.4.1.22736.3.4.2.1.3,1.3.6.1.4.1.22736.3.4.2.1.4]。
- Zabbix 6.0 以下版本:使用
discovery[{#MACRO}, OID]语法指定一个或多个 OID。例如,填写
discovery[{#EXT_NUM}, 1.3.6.1.4.1.22736.3.4.2.1.2, {#EXT_NAME}, 1.3.6.1.4.1.22736.3.4.2.1.3, {#EXT_STATUS}, 1.3.6.1.4.1.22736.3.4.2.1.4]。
- Zabbix 6.0 及以上版本:使用
walk[] 语法指定一个或多个
OID。
- 点击 添加。
- 创建监控项原型。
- 在 自动发现规则 页签下,点击主机旁的
监控项原型。

- 在页面右上角,点击 创建监控项原型。
- 完成以下配置。

设置 说明 名称 填写一个名称,用于识别该监控项原型。 在本例中,填写 Extension Discovery。
类型 选择 SNMP 代理。 键值 填写该监控项原型的唯一键值。
在本例中,填写 ext.discovery。
信息类型 选择 字符。 主机接口 选择用于 SNMP 查询的主机接口。 SNMP OID 填写用于 SNMP 数据采集的 OID。根据 Zabbix 版本不同,支持的表达式语法有所不同。
- Zabbix 6.0 及以上版本:使用
walk[] 语法指定一个或多个
OID。
例如,填写 walk[1.3.6.1.4.1.22736.3.4.2.1.2,1.3.6.1.4.1.22736.3.4.2.1.3,1.3.6.1.4.1.22736.3.4.2.1.4]。
- Zabbix 6.0 以下版本:使用
discovery[{#MACRO}, OID]语法指定一个或多个 OID。例如,填写
discovery[{#EXT_NUM}, 1.3.6.1.4.1.22736.3.4.2.1.2, {#EXT_NAME}, 1.3.6.1.4.1.22736.3.4.2.1.3, {#EXT_STATUS}, 1.3.6.1.4.1.22736.3.4.2.1.4]。
- Zabbix 6.0 及以上版本:使用
walk[] 语法指定一个或多个
OID。
- 点击 添加。
- 在 自动发现规则 页签下,点击主机旁的
监控项原型。
- 复制以下命令,并根据实际情况调整参数,执行命令以验证是否能够成功获取 SNMP 数据。
snmpwalk -v3 -l {noAuthNoPriv|authNoPriv|authPriv} -u {username} [-a MD5] [-A {authphrase}] [-x DES] [-X {privpassphrase}] {host[:port]} [OID]在本例中,执行
snmpwalk -v3 -l noAuthNoPriv -u yeastardemo 192.168.28.39 1.3.6.1.4.1.22736.3.4.2.1.2。执行后,将返回系统中已有的分机号码列表。
- 安装 SNMPwalk。
步骤三、配置 SNMP trap
SNMP Trap 由支持 SNMP 的设备发送至 snmptrapd,由 snmptrapd 接收并进行处理。随后,这些 Trap 被写入日志文件,并由 Zabbix 服务器读取,用于监控潜在问题。
要实现该功能,需要配置 snmptrapd,并选择一种 Trap 处理机制 (如 Bash 脚本、Perl 脚本或 SNMPTT),将 PBX 发送的 Trap 写入 Zabbix SNMP Trap 日志文件。本示例介绍如何使用 Bash 脚本处理 SNMP Trap。
- 安装 SNMP trap 所需的工具。
- 通过 SSH 访问 Zabbix 服务器。
- 根据操作系统安装 SNMP 所需的工具。
- Ubuntu/Debian:执行
apt-get install snmp snmptrapd -y。 - CentOS/RHEL:执行
yum install net-snmp net-snmp-utils -y。
- Ubuntu/Debian:执行
- 从 PBX 获取 SNMP engine ID。
- 通过 SSH 访问 PBX。
- 执行
tcpdump -i any udp port 162 -vv -X,抓取 SNMP trap。 - 触发一个 Trap 事件。
例如,关闭某个已登录分机的网页。
-
在抓包结果中,找到包含
ScopedPDU E的行,复制其值,去掉所有下划线,并保存以供后续使用。在本例中,返回
ScopedPDU E=_80_00_1f_88_80_bd_69_d0_29_ad_d7_c4_69_00_00_00_00。我们保存的值为80001f8880bd69d029add7c46900000000。
- 配置 snmptrapd,使其接收来自 PBX 的 Trap,并转发给 Bash 接收脚本。
- 执行
vi /etc/snmp/snmptrapd.conf,编辑 snmptrapd 配置文件。 - 按
i进入编辑模式。 - 复制以下内容,将变量替换为实际值,然后执行命令。
# 禁用认证检查 (接受所有 Trap) disableAuthorization yes # 以前台模式运行,不在后台运行 doNotFork yes # 监听 SNMP Trap 端口 snmpTrapdAddr udp:{trap_port} # 忽略认证失败消息 ignoreAuthFailure yes # 允许 SNMPv3 用户处理 Trap authUser log,execute # 使用指定的 engine ID 创建 SNMPv3 用户 createUser -e 0x{engine_id} {username} # 将所有 Trap 转发到 Zabbix 处理脚本 traphandle default /bin/bash /usr/sbin/zabbix_trap_handler.sh在本例中,粘贴以下内容:
# 禁用认证检查 (接受所有 Trap) disableAuthorization yes # 以前台模式运行,不在后台运行 doNotFork yes # 监听 SNMP Trap 端口 snmpTrapdAddr udp:162 # 忽略认证失败消息 ignoreAuthFailure yes # 允许 SNMPv3 用户处理 Trap authUser log,execute # 使用指定的 engine ID 创建 SNMPv3 用户 createUser -e 0x80001f8880bd69d029add7c46900000000 yeastardemo # 将所有 Trap 转发到 Zabbix 处理脚本 traphandle default /bin/bash /usr/sbin/zabbix_trap_handler.sh - 按 Esc,输入
:wq,然后按 Enter 保存并退出。
- 执行
- 配置 Bash 接收脚本,使 snmptrapd 将 Trap 写入 Zabbix SNMP trap 日志文件。
- 执行
vi /usr/sbin/zabbix_trap_handler.sh编辑脚本。 - 按
i进入编辑模式。 - 复制以下内容,将变量替换为实际值,然后执行命令。
#!/bin/bash ZABBIX_TRAPS_FILE="{directory_for_snmp_trap_logs}" ZBX_SNMP_TRAP_DATE_FORMAT=${ZBX_SNMP_TRAP_DATE_FORMAT:-"+%Y%m%d.%H%M%S"} ZBX_SNMP_TRAP_FORMAT=${ZBX_SNMP_TRAP_FORMAT:-"\n"} ZBX_SNMP_TRAP_USE_DNS=${ZBX_SNMP_TRAP_USE_DNS:-"false"} date=$(date "$ZBX_SNMP_TRAP_DATE_FORMAT") # The name of the host that sent the notification, as determined by gethostbyaddr(3). # In fact this line is irrelevant and useless since snmptrapd basically attempts to # perform reverse name lookup for the transport address (see below). # In case of failure it will print "<UNKNOWN>" read host # The transport address, like "[UDP: [172.16.10.12]:23456->[10.150.0.8]]" read sender # The first OID should always be SNMPv2-MIB::sysUpTime.0 #read uptime # the second should be SNMPv2-MIB::snmpTrapOID.0 #read trapoid # The remaining lines will contain the payload varbind list. For SNMPv1 traps, the final OID will be SNMPv2-MIB::snmpTrapEnterprise.0. vars= while read oid val do if [ "$vars" = "" ] then vars="$oid = $val" else vars="$vars$ZBX_SNMP_TRAP_FORMAT$oid = $val" fi if [[ "$oid" =~ snmpTrapAddress\.0 ]] || [[ "$oid" =~ 1\.3\.6\.1\.6\.3\.18\.1\.3\.0 ]]; then trap_address=$val fi done [[ ${sender} =~ \[(.*?)\].*\-\> ]] && sender_addr=${BASH_REMATCH[1]} ! [ -z $trap_address ] && sender_addr=$trap_address [[ "$ZBX_SNMP_TRAP_USE_DNS" == "true" ]] && ! [[ ${host} =~ \[(.*?)\].*\-\> ]] && sender_addr=$host # Header in Zabbix format shouldn't exist anywhere in vars, it is injection # Must exit with 0 date_regex=$(echo "$ZBX_SNMP_TRAP_DATE_FORMAT" | sed -e 's/^+//g' \ -e 's/%Y/[0-9]\{4\}/g' \ -e 's/%m/[0-9]\{2\}/g' \ -e 's/%d/[0-9]\{2\}/g' \ -e 's/%T/[0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}/g' \ -e 's/%z/[\+\-][0-9]\{4\}/g' \ -e 's/%H/[0-9]\{2\}/g' \ -e 's/%M/[0-9]\{2\}/g' \ -e 's/%S/[0-9]\{2\}/g') zbx_trap_regex="$date_regex ZBXTRAP" echo "$vars" | grep -qE "$zbx_trap_regex" && exit 0 echo -e "$date ZBXTRAP $sender_addr$ZBX_SNMP_TRAP_FORMAT$sender$ZBX_SNMP_TRAP_FORMAT$vars" >> $ZABBIX_TRAPS_FILE在本例中,粘贴以下内容:
#!/bin/bash ZABBIX_TRAPS_FILE="/var/log/snmptrap/snmptrap.log" ZBX_SNMP_TRAP_DATE_FORMAT=${ZBX_SNMP_TRAP_DATE_FORMAT:-"+%Y%m%d.%H%M%S"} ZBX_SNMP_TRAP_FORMAT=${ZBX_SNMP_TRAP_FORMAT:-"\n"} ZBX_SNMP_TRAP_USE_DNS=${ZBX_SNMP_TRAP_USE_DNS:-"false"} date=$(date "$ZBX_SNMP_TRAP_DATE_FORMAT") # The name of the host that sent the notification, as determined by gethostbyaddr(3). # In fact this line is irrelevant and useless since snmptrapd basically attempts to # perform reverse name lookup for the transport address (see below). # In case of failure it will print "<UNKNOWN>" read host # The transport address, like "[UDP: [172.16.10.12]:23456->[10.150.0.8]]" read sender # The first OID should always be SNMPv2-MIB::sysUpTime.0 #read uptime # the second should be SNMPv2-MIB::snmpTrapOID.0 #read trapoid # The remaining lines will contain the payload varbind list. For SNMPv1 traps, the final OID will be SNMPv2-MIB::snmpTrapEnterprise.0. vars= while read oid val do if [ "$vars" = "" ] then vars="$oid = $val" else vars="$vars$ZBX_SNMP_TRAP_FORMAT$oid = $val" fi if [[ "$oid" =~ snmpTrapAddress\.0 ]] || [[ "$oid" =~ 1\.3\.6\.1\.6\.3\.18\.1\.3\.0 ]]; then trap_address=$val fi done [[ ${sender} =~ \[(.*?)\].*\-\> ]] && sender_addr=${BASH_REMATCH[1]} ! [ -z $trap_address ] && sender_addr=$trap_address [[ "$ZBX_SNMP_TRAP_USE_DNS" == "true" ]] && ! [[ ${host} =~ \[(.*?)\].*\-\> ]] && sender_addr=$host # Header in Zabbix format shouldn't exist anywhere in vars, it is injection # Must exit with 0 date_regex=$(echo "$ZBX_SNMP_TRAP_DATE_FORMAT" | sed -e 's/^+//g' \ -e 's/%Y/[0-9]\{4\}/g' \ -e 's/%m/[0-9]\{2\}/g' \ -e 's/%d/[0-9]\{2\}/g' \ -e 's/%T/[0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}/g' \ -e 's/%z/[\+\-][0-9]\{4\}/g' \ -e 's/%H/[0-9]\{2\}/g' \ -e 's/%M/[0-9]\{2\}/g' \ -e 's/%S/[0-9]\{2\}/g') zbx_trap_regex="$date_regex ZBXTRAP" echo "$vars" | grep -qE "$zbx_trap_regex" && exit 0 echo -e "$date ZBXTRAP $sender_addr$ZBX_SNMP_TRAP_FORMAT$sender$ZBX_SNMP_TRAP_FORMAT$vars" >> $ZABBIX_TRAPS_FILE - 按 Esc,输入
:wq,然后按 Enter 保存并退出。
- 执行
-
授予 Bash 接收脚本执行权限。
chmod +x /usr/sbin/zabbix_trap_handler.sh - 确认
/etc/snmp/snmptrapd.conf中是否已配置traphandle指向 Bash 脚本。grep "traphandle" /etc/snmp/snmptrapd.conf如果返回结果为
traphandle default /usr/sbin/zabbix_trap_handler.sh或traphandle default /bin/bash /usr/sbin/zabbix_trap_handler.sh,则表示配置正确。 - 重启 snmptrapd 服务以应用配置更改。
- 方法 1:作为系统服务重启 snmptrapd
systemctl restart snmptrapd - 方法 2:停止 snmptrapd 并手动启动
kill -9 $(pidof snmptrapd) snmptrapd -f -Lo -n -c /etc/snmp/snmptrapd.conf
- 方法 1:作为系统服务重启 snmptrapd
- 复制以下内容,将变量替换为实际值,并执行命令,以确认 snmptrapd 服务是否正在 SNMP Trap 端口上监听,以接收传入的 trap 消息。
ss -unlp | grep {port}在本例中,执行以下命令:
ss -unlp | grep 162如果返回结果中包含
snmptrapd和:162,则表示该服务正在正常监听该端口。 - 创建日志目录,并创建一个空日志文件,用于存储接收到的 SNMP trap 消息。
# 如果 SNMP trap 日志目录不存在,则创建该目录 mkdir -p /var/log/snmptrap/ # 创建一个用于存储 trap 消息的空日志文件 touch /var/log/snmptrap/snmptrap.log # 允许所有用户具有读写权限 chmod 666 /var/log/snmptrap/snmptrap.log - 配置 Bash 接收脚本,用于接收传入的 SNMP Trap,并将数据写入已创建的日志文件。
- 配置 Zabbix 以启用 trap 接收功能。
- 执行
vi /etc/zabbix/zabbix_server.conf,编辑 Zabbix 配置文件。 - 按
i进入编辑模式。 - 添加或更新以下参数:
# 在 Zabbix 服务器中启用 SNMP trap 处理 StartSNMPTrapper=1 # 定义传入 trap 的日志文件路径 SNMPTrapperFile={directory_for_snmp_trap_logs}在本例中,更新以下内容:
# 在 Zabbix 服务器中启用 SNMP trap 处理 StartSNMPTrapper=1 # 定义传入 trap 的日志文件路径 SNMPTrapperFile=/var/log/snmptrap/snmptrap.log - 按 Esc,输入
:wq,然后按 Enter 保存并退出。
- 执行
- 重启 Zabbix 以应用配置。
systemctl restart zabbix-server
- 配置 Zabbix 以启用 trap 接收功能。
- 添加 Trap 监控项。
- 在左侧导航栏,进入 。
- 点击主机旁边的 监控项。

- 在页面右上角,点击 创建监控项。
- 完成以下配置。

配置 说明 名称 填写一个名称,用于识别该监控项。 在本例中,填写 PBXTrapData。
类型 选择 SNMP 代理。 键值 填写该监控项的唯一键值。 在本例中,填写 snmptrap.fallback。
主机接口 选择用于 SNMP trap 的主机接口。 信息类型 选择 日志。 日志时间格式 指定用于解析日志时间戳的格式。
在本例中,填写 yyyyMMdd.hhmmss。
- 点击 添加。
- 创建触发器。
- 在页面顶部,点击 所有主机,返回主机列表。

- 点击主机旁边的 触发器。
- 在页面右上角,点击 创建触发器。
- 完成以下配置。

配置 说明 名称 填写一个名称,用于识别该触发器。在本例中,填写 ExtensionDown。 表达式 设置用于检测 SNMP trap 事件的条件。
在本例中,填写 find(/P-Series PBX/snmptrap.fallback,,"like","pIPphoneDown")=1 or find(/P-Series PBX/snmptrap.fallback,,"like","pExtDown")=1。
- 点击 添加。
- 在页面顶部,点击 所有主机,返回主机列表。
- 验证 SNMP Trap 是否接收成功。
- 在左侧导航栏,进入 。
- 搜索目标主机。
- 点击 SNMP Trap 监控项旁边的
历史记录。
如果配置成功,底部面板会显示接收到的 Trap 消息。

执行结果
- 在左侧的导航栏,进入 ,搜索 PBX 主机。
- 点击主机旁边的 最新数据。

你可以查看监控项对应的最新数据。
