一、SNMP概述
1.1 SNMP原理
网络设备越来越多,网络规模越来越大,管理这些设备也越来越重要。远程管理网络的需求日益迫切,SNMP
应运而生。SNMP
即"简单网络管理协议",用于网络管理的协议,用于网络设备的管理。
SNMP
被设计为工作在TCP/IP
协议族上,SNMP
基于TCP/IP
协议工作,对网络中支持SNMP
协议的设备进行管理,但是SNMP
本身工作在应用层。
SNMP
协议主要由三大部分构成:SNMP
管理实体、多个SNMP
被管理实体以及网络管理协议
- 管理实体:运行再在网络管理工作站上,网络管理员通过管理实体和网络设备打交道
- 被管理设备:网络设备实体,每个设备中运行
SNMP
代理(Agent
) - 网络管理协议:管理实体和被管理设备之间的通信规范,包括
MIB
,SMI
和SNMP
本身
1.2 MIB
被管理对象值的集合称之为MIB
,定义了数据格式、类型、顺序、意义等,使用SMI
中定义的类型和ASN.1
中的基本类型对对象进行描述,是一个使用SMI
描述的管理信息库。
国际化标准组织提出ASN.1
【解释:高级的数据描述语言,描述数据的类型、结构、组织、及编码方法,包括符号和语法两部分】来标识MIB
模块和其对象。
MIB
中的每个节点都具有唯一的OID(Object Identifier)
,按照从根节点开始的分支结构排列,OID
是一个由数字组成的序列,用于唯一标识MIB
中的每个节点,用来获取网络设备的信息
1.3 SMI
SMI
是一种数据定义语言,用于定义MIB
及其对象,例如定义基本数据类型,对象模型,以及基本编码规则。
1.3.1 基本数据类型
为了保证简单,只定义了十一种基本数据类型
1.3.2 对象模型
也称之为OBJECT-TYPE
,定义被管对象的数据类型、状态和语义
就是封装一个对象来描述被管理对象的信息
被管理对象名称 OBJECT-TYPE{
被管理对象的属性的基本数据类型
被管理对象的读、写、创建权限
被管理对象的当前状态(包括合法的、过时的、强制的)
被管理对象的描述信息
被管理对象的可被查询的OID位置
}
例如:封装对象sysUpTime
sysUpTime OBJECT-TYPE{
# 数据类型:时间
SYNTAX TiméTicks
# 权限:只读
ACCESS read-only
# 状态:强制的
STATUS mandatory
# 描述信息
DESCRIPTION
"The time (in hundredths of a second) since the network management protio of the system was last re-initialized."
# OID位置:system下第3个分支位置
::= {system 3}
}
1.3.3 基本编码规则
采用TLV
编码规则,TLV
是ASN.1
下的一种可变的格式,其中:
-
T
表示数据类型 -
L
定义数值的长度 -
V
表示实际的数值
下图所示为ASN.1
的常见数据类型
例如实现编码:路由器router
的接口数量为15,其中15的ASCII
为f
1.4 SNMP
负责在管理实体和被管理实体之间传输MIB
条信息的通信协议
常见的有以下三个操作,要注意PDU
通常是使用UDP
报文传输
| 方向 | 描述信息 |
| 管理者 -> 被管理者 | 读取网络设备的状态信息 |
| 管理者 -> 被管理者 | 远程配置网络设备参数 |
| 被管理者 -> 管理者 | 向管理者报告异常事件 |
1.5 常见OID
下面是获取系统信息的常见OID
简写以及对应的数字串
简写 | 对应数字串 | 涵义 |
|
| 设备描述符 |
|
| 设备运行时间 |
|
| 设备名称 |
下面是监控网络的常见OID
简写以及对应的数字串
简写 | 对应数字串 | 涵义 |
|
| 接口描述符 |
|
| 接口类型 |
|
| 接口速率 |
|
| 接口物理地址 |
|
| 接口输入字节数 |
|
| 接口输出字节数 |
|
| 接口输入错误数 |
|
| 接口输出错误数 |
通过如下代码即可调用
# 获取网卡进出流量
snmpget -v 2c -c public 192.168.72.20 ifInOctets.950 ifOutOctets.950
# 获取网卡进出流量
snmpget -v 2c -c public 192.168.72.20 1.3.6.1.2.1.2.2.1.10.950 1.3.6.1.2.1.2.2.1.16.950
或者使用walk
命令
# 获取系统名称
snmpwalk -v 2c -c public 192.168.72.20 sysName
# 获取所有端口名称和编号的映射关系
snmpwalk -v2c -c public 192.168.72.20 1.3.6.1.2.1.31.1.1.1.1
二、流量监控
2.1 实验要求
- 搭建如下网络拓扑图,容器之间配置
OSPF
协议,保证可以互相访问 - 设置
YR3
为服务器端,YR1
为客户端 YR1
访问YR3
,,YR3
可监控本身流量
2.2 安装工具
在服务器端YR3
下载相关软件,同时设置开机自启,[注意:这里是snmpd
]
apt-get install snmpd
apt-get install snmp
systemctl enable snmpd
systemctl start snmpd
2.3 配置SNMP共同体
2.3.1 共同体意义
SNMP
共同体(Community
)是一个简单的密码系统,用于保护SNMP
的管理访问。当SNMP
管理者向SNMP
代理发出请求时,必须指定正确的共同体名称才能成功访问SNMP
代理。如果共同体名称不正确,则SNMP
代理将拒绝该请求。
在SNMP
代理的配置中,通常会设置多个不同的共同体名称。这些共同体名称可以具有不同的访问级别和权限。例如,可以将某些共同体名称配置为只读,而将其他共同体名称配置为读写。这样可以根据具体的管理需求来分配不同的访问权限。
2.3.2 配置共同体
在服务器端YR3
中配置共同体
vi /etc/snmp/snmpd.conf
在文件末尾添加如下内容
rocommunity public
2.4 配置允许远程访问
在YR3
中vi /etc/snmp/snmpd.conf
修改配置文件,否则只能本地访问
# 大概在15行,将下面一行注释掉:
agentAddress udp:127.0.0.1:161
重启之后查看当前状态,服务对外开启
service snmpd restart
netstat -antup | grep 161
2.5 映射SNMP中网卡编号
在SNMP
协议中,端口编号通常是由设备自动生成的,端口通常使用整数编号进行标识,而不是名称。
进入YR3
,获取YR3
上端口的编号
# 获取所有端口名称和编号的映射关系
snmpwalk -v2c -c public 192.168.72.20 1.3.6.1.2.1.31.1.1.1.1
其中-v
表示指定版本,-c
表示指定共同体名称,192.168.72.20
是YR3
的ip
地址
可以看到
# 表示eth1网卡
1.3.6.1.2.1.31.1.1.1.948
# 表示eth2网卡
1.3.6.1.2.1.31.1.1.1.950
2.6 开启流量监控
在YR3
中设置需要监控的流量端口,打开配置文件
vi /etc/snmp/snmpd.conf
在文件末尾添加如下内容
# 指定需要获取流量信息的网络接口
interface eth2
# 指定传输速度
ifSpeed 100000000
# 指定网络接口类型,这里是以太网接口类型。
ifType ethernetCsmacd
# 指定网络接口的描述信息
ifDescr "Interface_Eth2"
# 获取网络接口的输入字节数,oid是1.3.6.1.2.1.2.2.1.10,最后的950表示eth2接口
ifInOctets Counter32 1.3.6.1.2.1.2.2.1.10.950
# 获取网络接口的输出字节数,oid是1.3.6.1.2.1.2.2.1.16,最后的950表示eth2接口
ifOutOctets Counter32 1.3.6.1.2.1.2.2.1.16.950
重启服务
systemctl restart snmpd
2.7 查看流量监控
YR1
给YR3
发送数据包,在YR3
中开启端口流量监控
其中192.168.72.20
是YR3
的ip
地址,ifInOctets.950
和ifOutOctets.950
分别指定了输入和输出流量的OID
(即在2.6
中的定义)
snmpwalk -v 2c -c public 192.168.72.20 ifInOctets.950 ifOutOctets.950
2.8 碰到的问题
2.8.1 问题一
问题描述
访问出错无法获得流量,无法识别有效的自定义标识符
解决办法
通过下载第三方的解析库来实现标识符的转换
进入服务器端YR3
,下载第三方库
apt-get install snmp-mibs-downloader
在服务器端YR3
修改配置文件vi /etc/snmp/snmp.conf
# 注释掉下面这一行
mibs :
重启服务
service snmpd restart
再次监控流量即可
snmpwalk -v 2c -c public 192.168.72.20 ifInOctets.950 ifOutOctets.950
2.8.2 问题二
问题描述
只能监控进或者出的流量,而不能同时监控两个
解决办法
snmpwalk
只支持输出第一个参数的流量结果,将其替换为snmpget
即可监控进出流量
snmpget -v 2c -c public 192.168.72.20 ifInOctets.950 ifOutOctets.950
2.8.2 问题三
问题描述
每次输入的命令只能监控当前时刻流量,如何持续监控
解决办法
配合脚本文件实现
vi getFlow.sh
添加如下内容
#!/bin/bash
# 定义监控流量进出的命令
InFlow="snmpget -v 2c -c public 192.168.72.20 ifInOctets.950"
OutFlow="snmpget -v 2c -c public 192.168.72.20 ifOutOctets.950"
# 定义存放日志位置
logFile="/root/Flow.log"
# 循环获5次流量
for((i=1;i<=5;i++))
do
# 获取进入流量和出去流量,$NF表示获取最后一列(即获取流量大小)
in_bytes=$($InFlow | awk '{print $NF}')
out_bytes=$($OutFlow | awk '{print $NF}')
# 将流量信息写入日志文件
echo "$(date +%Y-%m-%d\ %H:%M:%S) - In: $in_bytes bytes, Out: $out_bytes bytes" >> $logFile
# 等待3秒再次获取流量信息
sleep 3
done
echo "流量监控完毕,请查看日志文件,日志文件位置如下:$logFile"
运行截图如下