一、基础环境准备
1. 安装Zabbix Server
# Ubuntu/Debian
wget https://repo.zabbix.com/zabbix/6.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_6.0-4%2Bubuntu22.04_all.deb
dpkg -i zabbix-release_6.0-4+ubuntu22.04_all.deb
apt update
apt install zabbix-server-mysql zabbix-frontend-php zabbix-apache-conf zabbix-sql-scripts zabbix-agent
# 配置数据库
mysql -uroot -p
CREATE DATABASE zabbix CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
CREATE USER 'zabbix'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON zabbix.* TO 'zabbix'@'localhost';
FLUSH PRIVILEGES;
2. 配置SNMP监控
安装SNMP工具:
apt install snmp snmpd snmp-mibs-downloader snmp-browser
二、网络设备SNMP配置
1. 配置网络设备(以Cisco为例)
! 启用SNMP v2c
snmp-server community public RO # 只读团体名
snmp-server community private RW # 读写团体名(可选)
! 或使用SNMP v3(更安全)
snmp-server group SNMPGroup v3 priv
snmp-server user admin SNMPGroup v3 auth sha password123 priv aes 256 password456
! 配置设备信息
snmp-server location "Data Center Rack 1"
snmp-server contact "Network Team"
2. 常见设备配置参考
- 华为设备:
snmp-agent community read public
- H3C设备:
snmp-agent community read public
- Juniper:
set snmp community public authorization read-only
三、Zabbix配置监控项
1. 添加主机
Zabbix控制台 → 配置 → 主机 → 创建主机
填写主机信息:
- 主机名称:交换机-1
- 可见名称:Core-Switch-01
- 群组:Network Devices
- IP地址:192.168.1.1
2. 配置SNMP接口
接口类型:SNMP
IP地址:192.168.1.1
端口:161
SNMP版本:SNMPv2
团体字:public
四、流量监控关键OID
1. 接口流量OID(IF-MIB)
# 接口入流量(bytes)
1.3.6.1.2.1.2.2.1.10.{#SNMPINDEX} # ifInOctets
# 接口出流量(bytes)
1.3.6.1.2.1.2.2.1.16.{#SNMPINDEX} # ifOutOctets
# 接口速率(bps)
1.3.6.1.2.1.2.2.1.5.{#SNMPINDEX} # ifSpeed
# 接口状态
1.3.6.1.2.1.2.2.1.8.{#SNMPINDEX} # ifOperStatus
1=up, 2=down, 3=testing
2. 创建发现规则
{
"名称": "Network Interfaces Discovery",
"类型": "SNMP agent",
"键值": "net.if.discovery",
"SNMP OID": "1.3.6.1.2.1.2.2.1.2",
"更新间隔": "1h",
"主机接口": "选择SNMP接口"
}
五、创建监控项模板
1. 入流量监控项
名称:Interface {#IFNAME}:Incoming traffic
键值:net.if.in[ifInOctets.{#SNMPINDEX}]
单位:bps
更新时间:30s
预处理器:Change per second
乘数:8(bytes转bits)
SNMP OID:1.3.6.1.2.1.2.2.1.10.{#SNMPINDEX}
2. 出流量监控项
名称:Interface {#IFNAME}:Outgoing traffic
键值:net.if.out[ifOutOctets.{#SNMPINDEX}]
单位:bps
更新时间:30s
预处理器:Change per second
乘数:8
SNMP OID:1.3.6.1.2.1.2.2.1.16.{#SNMPINDEX}
3. 流量使用率监控项
名称:Interface {#IFNAME}:Bandwidth usage
键值:net.if.util[ifInOctets.{#SNMPINDEX},ifOutOctets.{#SNMPINDEX},ifSpeed.{#SNMPINDEX}]
类型:可计算的
公式:(last("net.if.in[ifInOctets.{#SNMPINDEX}]") + last("net.if.out[ifOutOctets.{#SNMPINDEX}]")) * 100 / last("net.if.speed[ifSpeed.{#SNMPINDEX}]")
单位:%
六、触发器配置示例
1. 高流量告警
# 接口流量超过90%
{Template SNMP Network Device:net.if.util[ifInOctets.{#SNMPINDEX},ifOutOctets.{#SNMPINDEX},ifSpeed.{#SNMPINDEX}].avg(5m)}>90
# 突发流量告警(超过接口速率80%持续5分钟)
{Template SNMP Network Device:net.if.in[ifInOctets.{#SNMPINDEX}].avg(5m)} > last(/Template SNMP Network Device/net.if.speed[ifSpeed.{#SNMPINDEX}]) * 0.8
2. 接口状态告警
# 接口宕机
{Template SNMP Network Device:net.if.status[ifOperStatus.{#SNMPINDEX}].last()}<>1
# 接口错误率过高
{Template SNMP Network Device:net.if.in.errors[ifInErrors.{#SNMPINDEX}].avg(5m)}>10
七、图形和聚合视图
1. 创建流量图形
名称:Interface {#IFNAME} Traffic
图形类型:Normal
监控项:
- Interface {#IFNAME}:Incoming traffic
- Interface {#IFNAME}:Outgoing traffic
2. 创建聚合图形(Dashboard)
# 显示多个接口的流量
名称:Network Traffic Overview
添加小部件:
1. Graph - 显示核心链路流量
2. Plain text - 显示接口状态汇总
3. Top triggers - 显示网络相关告警
八、自动发现配置模板
创建自动发现规则模板:
<!-- 保存为network_discovery.xml -->
<template>
<discovery_rules>
<discovery_rule>
<name>Network Interfaces Discovery</name>
<type>SNMP_AGENT</type>
<snmp_oid>1.3.6.1.2.1.2.2.1.2</snmp_oid>
<key>net.if.discovery</key>
<delay>1h</delay>
</discovery_rule>
</discovery_rule>
</template>
九、批量监控脚本
1. SNMP测试脚本
#!/bin/bash
# snmp_test.sh
DEVICE_IP=$1
COMMUNITY=$2
echo "Testing SNMP connectivity to $DEVICE_IP"
echo "======================================"
# 测试系统信息
snmpwalk -v2c -c $COMMUNITY $DEVICE_IP 1.3.6.1.2.1.1.1.0
# 测试接口数量
IF_COUNT=$(snmpwalk -v2c -c $COMMUNITY $DEVICE_IP 1.3.6.1.2.1.2.2.1.2 | wc -l)
echo "Number of interfaces: $IF_COUNT"
# 测试流量OID
snmpget -v2c -c $COMMUNITY $DEVICE_IP 1.3.6.1.2.1.2.2.1.10.1
2. 自动导入设备脚本
# import_devices.py
import json
import requests
from zabbix_api import ZabbixAPI
zabbix_url = "http://zabbix-server/api_jsonrpc.php"
zabbix_user = "Admin"
zabbix_password = "zabbix"
zapi = ZabbixAPI(zabbix_url)
zapi.login(zabbix_user, zabbix_password)
devices = [
{"name": "switch-core-01", "ip": "192.168.1.1"},
{"name": "router-edge-01", "ip": "192.168.1.254"},
{"name": "firewall-01", "ip": "192.168.1.2"}
]
for device in devices:
host = zapi.host.create({
"host": device["name"],
"interfaces": [{
"type": 2, # SNMP
"main": 1,
"useip": 1,
"ip": device["ip"],
"dns": "",
"port": "161"
}],
"groups": [{"groupid": "15"}], # Network Devices group ID
"templates": [{"templateid": "10001"}] # Template ID
})
print(f"Added {device['name']}: {host}")
十、最佳实践建议
1. 监控策略
- 核心设备: 30秒采样间隔
- 边缘设备: 1-5分钟采样间隔
- 历史数据: 保留30天
- 趋势数据: 保留1年
2. 告警优化
# 分层告警
1. 信息级:流量超过70%
2. 警告级:流量超过85%持续5分钟
3. 严重级:流量超过95%持续2分钟或接口宕机
# 告警依赖
配置核心链路故障触发下级设备告警抑制
3. 性能优化
# 调整Zabbix Server配置
StartPollers=200
StartSNMPPollers=50
CacheSize=512M
HistoryCacheSize=256M
TrendCacheSize=128M
# 使用Proxy分担压力
在远程网络部署Zabbix Proxy
十一、常见问题排查
1. SNMP连接失败
# 测试SNMP连通性
snmpwalk -v2c -c public 192.168.1.1 1.3.6.1.2.1.1.1.0
# 查看SNMP错误
tail -f /var/log/zabbix/zabbix_server.log | grep SNMP
# 检查防火墙
iptables -L -n | grep 161
2. 流量数据为0
- 检查OID是否正确
- 确认接口索引号{#SNMPINDEX}
- 检查网络设备SNMP配置
- 验证团体字权限
3. 性能问题
- 减少不必要的监控项
- 增加SNMP超时时间
- 使用SNMP批量获取
- 启用Zabbix缓存
这个方案可以全面监控网络设备流量,建议先从核心设备开始实施,逐步扩展到全网设备。