链路:设备 → snmptrapd(收包/解密)→ SNMPTT(解析写日志)→ Zabbix Server(读日志)

1. 安装

apt update
apt install -y snmptrapd snmp libsnmp-perl snmptt

2. 配置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/snmptthandler

engineID获取方法(设备上是手动设置的字符串时):

# 方法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 162

3. 配置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
}
EOF

4. 配置Zabbix Server

编辑/etc/zabbix/zabbix_server.conf,找到原有注释行,取消注释并修改:

StartSNMPTrapper=1
SNMPTrapperFile=/var/log/snmptt/snmptt.log
systemctl restart zabbix-server

5. 多设备场景一:两台集群都直连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.inisnmptt.conf(FORMAT 单行)、日志目录属主。

6.2 Proxy的Zabbix配置

编辑/etc/zabbix/zabbix_proxy.conf

StartSNMPTrapper=1
SNMPTrapperFile=/var/log/snmptt/snmptt.log
systemctl restart zabbix-proxy

Proxy 进程要读日志文件,确认可读:

usermod -aG snmptt zabbix && systemctl restart zabbix-proxy

6.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
UnknownEngineIDsengineID与设备不一致
Wrong digest认证/加密密码两端不一致
日志有记录但Zabbix无数据主机接口IP与Trap源地址不一致
Proxy收了但前端没数据主机「由代理服务器监测」未选对应Proxy
Proxy日志Can not openProxy上同样要配日志目录属主,且zabbix用户要加入snmptt组
snmptrapd有记录但日志为空检查/etc/snmp/snmptt.conf是否存在;/var/log/snmptt及日志文件属主须为snmptt用户
日志记录缺ZBXTRAP头snmptt.conf里FORMAT写了多行,只生效最后一行——改回单行FORMAT ZBXTRAP $aA $G $O: $*并重启snmptt
一直没数据Trap 是事件驱动,无告警则无数据(正常)

标签: none