SNMP Trap监控部署(Debian10 + Zabbix7.0)
链路:设备 → snmptrapd(收包/解密)→ SNMPTT(解析写日志)→ Zabbix Server(读日志)
1. 安装
apt update
apt install -y snmptrapd snmp libsnmp-perl snmptt2. 配置snmptrapd
编辑 /etc/snmp/snmptrapd.conf:
# SNMPv3(与设备侧参数逐字符一致,engineID为0x开头的十六进制)
createUser -e 0x你的engineID 用户名 MD5 '认证密码' DES '私有密钥'
authUser log,execute,net 用户名
# SNMPv2c(如有,COMMUNITY为实际团体名)
authCommunity log,execute,net COMMUNITY
# 交给SNMPTT处理
traphandle default /usr/sbin/snmptthandlerengineID获取方法(设备上是手动设置的字符串时):
# 方法1(推荐):直接查设备实际使用的engineID
snmpget -v3 -l authPriv -u 用户名 -a MD5 -A '认证密码' -x DES -X '私有密钥' <设备IP> 1.3.6.1.6.3.10.2.1.1.0
# 返回Hex-STRING: 80 00 1F 88 ... → 去空格加0x前缀填入createUser
# 方法2:设备按输入字符串原样使用时,转ASCII十六进制
echo -n "你填的字符串" | xxd -p
# 如sangfor → 73616e67666f72 → 0x73616e67666f72
# 兜底:配置后若报UnknownEngineIDs,从报错日志里复制对端实际发来的engineID
journalctl -u snmptrapd -f启动:
systemctl enable --now snmptrapd
ss -ulnp | grep 162 # 确认监听 UDP 1623. 配置SNMPTT
编辑 /etc/snmp/snmptt.ini:
[General]
mode = standalone
net_snmp_perl_enable = 1
[Logging]
log_enable = 1
log_file = /var/log/snmptt/snmptt.log创建事件定义文件(Debian包不自带,必须有,否则SNMPTT无法处理Trap):
printf 'EVENT general .* "General event" Normal\nFORMAT ZBXTRAP $aA $G $O: $*\nEXEC /bin/true\n' > /etc/snmp/snmptt.conf说明:.*匹配所有Trap,FORMAT按ZBXTRAP源IP内容格式写入日志(Zabbix识别的格式)。FORMAT只能写一行——SNMPTT对同一事件只生效最后一个FORMAT,写成两行会丢掉ZBXTRAP头,导致Zabbix静默丢弃、不入库也不报错。后续可用snmpttconvertmib导入厂商MIB生成精细事件定义,追加到此文件。
日志目录授权(关键:SNMPTT以snmptt用户运行,目录和文件必须归它所有,否则报Can not open log file):
mkdir -p /var/log/snmptt
touch /var/log/snmptt/snmptt.log
chown -R snmptt:snmptt /var/log/snmptt
chmod 644 /var/log/snmptt/snmptt.log
systemctl enable --now snmptt日志轮转(必须用copytruncate):
cat > /etc/logrotate.d/snmptt << 'EOF'
/var/log/snmptt/snmptt.log {
weekly
rotate 8
size 50M
compress
copytruncate
}
EOF4. 配置Zabbix Server
编辑/etc/zabbix/zabbix_server.conf,找到原有注释行,取消注释并修改:
StartSNMPTrapper=1
SNMPTrapperFile=/var/log/snmptt/snmptt.logsystemctl restart zabbix-server5. 多设备场景一:两台集群都直连Server(无Proxy)
Trap接收是按设备配置认证、按源IP区分主机的。两台集群都发Trap到Server时,Server侧只需改一处,其余不动:
5.1 snmptrapd.conf:每个engineID一行createUser
SNMPv3的认证是「engineID + 用户名 + 密码」绑定的,两台设备engineID不同,就要各写一行:
# 集群A
createUser -e 0x集群A的engineID 用户名 MD5 '认证密码' DES '私有密钥'
authUser log,execute,net 用户名
# 集群B(用户名密码相同也要单独一行,因为engineID不同)
createUser -e 0x集群B的engineID 用户名 MD5 '认证密码' DES '私有密钥'
authUser log,execute,net 用户名
traphandle default /usr/sbin/snmptthandler改完重启:systemctl restart snmptrapd
如果两台设备的engineID、用户名、密码完全相同(比如都是手动设置成一样的),一行createUser即可,无需添加。
5.2 SNMPTT:不用改
snmptt.conf里的通用事件.*本来就匹配所有来源,FORMAT第一行的$aA会记录每个Trap的源IP,天然区分设备。
5.3 zabbix_server.conf:不用改
5.4 前端:两台主机,接口IP各自填
Zabbix按Trap的源IP匹配主机接口,所以:
- 集群A主机:SNMP接口填A的源地址;
- 集群B主机:SNMP接口填B的源地址;
- 两台主机各建
snmptrap.fallback监控项(键值相同,互不干扰),触发器建议做成模板链接到两台主机。
接口IP填对后,两台设备的Trap自动分流到各自主机,告警里的主机名自然能区分来源。
6. 多设备场景二:通过Zabbix Proxy接收Trap(异地机房)
原则:哪台机器收Trap,哪台装一套snmptrapd + SNMPTT。异地集群把Trap发到Proxy,Proxy解析后转发给Server,Server侧无需改动。
6.1 Proxy服务器上(与Server侧步骤相同)
apt update && apt install -y snmptrapd snmp libsnmp-perl snmptt按第2、3节配置/etc/snmp/snmptrapd.conf(createUser用异地那台设备的engineID)、snmptt.ini、snmptt.conf(FORMAT 单行)、日志目录属主。
6.2 Proxy的Zabbix配置
编辑/etc/zabbix/zabbix_proxy.conf:
StartSNMPTrapper=1
SNMPTrapperFile=/var/log/snmptt/snmptt.logsystemctl restart zabbix-proxyProxy 进程要读日志文件,确认可读:
usermod -aG snmptt zabbix && systemctl restart zabbix-proxy6.3 设备侧
异地集群的Trap目标地址填Proxy的IP(不是Server)。
6.4 前端
- 异地集群建独立主机:SNMP接口IP填该集群发Trap的源地址,「由代理服务器监测」选择该Proxy——这一步是关键,不选的话Proxy不知道这台主机归自己管,Trap会被丢弃;
- 监控项和触发器与本地集群相同(
snmptrap.fallback),建议做成模板链接到两台主机。
7. 前端
- 主机添加SNMP接口,IP填设备发Trap的源地址;
- 监控项:类型SNMP trap,键值
snmptrap.fallback,信息类型日志; - 触发器示例:触发器名称
告警内容: {ITEM.LASTVALUE},触发器表达式nodata(/192.168.41.8/snmptrap.fallback,5m)=0
8. 验证
# 本机自测(Server或Proxy上均可执行,验证本机管道)
snmptrap -v 3 -l authPriv -u 用户名 -a MD5 -A '认证密码' -x DES -X '私有密钥' -e 0x你的engineID 127.0.0.1 '' .1.3.6.1.6.3.1.1.5.3 .1.3.6.1.2.1.2.2.1.1 i 2
tail -5 /var/log/snmptt/snmptt.log # 有记录 = 管道通9. 速查
| 现象 | 处理 |
|---|---|
| 收不到包 | tcpdump -ni any udp port 162 确认;检查防火墙放行UDP162 |
| UnknownEngineIDs | engineID与设备不一致 |
| Wrong digest | 认证/加密密码两端不一致 |
| 日志有记录但Zabbix无数据 | 主机接口IP与Trap源地址不一致 |
| Proxy收了但前端没数据 | 主机「由代理服务器监测」未选对应Proxy |
| Proxy日志Can not open | Proxy上同样要配日志目录属主,且zabbix用户要加入snmptt组 |
| snmptrapd有记录但日志为空 | 检查/etc/snmp/snmptt.conf是否存在;/var/log/snmptt及日志文件属主须为snmptt用户 |
| 日志记录缺ZBXTRAP头 | snmptt.conf里FORMAT写了多行,只生效最后一行——改回单行FORMAT ZBXTRAP $aA $G $O: $*并重启snmptt |
| 一直没数据 | Trap 是事件驱动,无告警则无数据(正常) |