SNMP协议详细介绍及SNMP监控LXD端口流量
一、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的常见数据类型
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rLdmSZ8J-1682386305535)(C:\Users\29973\AppData\Roaming\Typora\typora-user-images\image-20230423165932473.png)]](https://img-blog.csdnimg.cn/ca0778c65e67421ca375b69690952543.png)
例如实现编码:路由器router的接口数量为15,其中15的ASCII为f
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m1CUupyQ-1682386305536)(C:\Users\29973\AppData\Roaming\Typora\typora-user-images\image-20230423171025527.png)]](https://img-blog.csdnimg.cn/7f311470a6cc45bba4474b3d27d435fc.png)
1.4 SNMP
负责在管理实体和被管理实体之间传输MIB条信息的通信协议
常见的有以下三个操作,要注意PDU通常是使用UDP报文传输
PDU类型 | 方向 | 描述信息 |
|---|---|---|
GetRequest | 管理者 -> 被管理者 | 读取网络设备的状态信息 |
SetRequest | 管理者 -> 被管理者 | 远程配置网络设备参数 |
Trap | 被管理者 -> 管理者 | 向管理者报告异常事件 |
1.5 常见OID
下面是获取系统信息的常见OID简写以及对应的数字串
| 简写 | 对应数字串 | 涵义 |
|---|---|---|
sysDescr | 1.3.6.1.2.1.1.1 | 设备描述符 |
sysUpTime | 1.3.6.1.2.1.1.3 | 设备运行时间 |
sysName | 1.3.6.1.2.1.1.5 | 设备名称 |
下面是监控网络的常见OID简写以及对应的数字串
| 简写 | 对应数字串 | 涵义 |
|---|---|---|
ifDescr | 1.3.6.1.2.1.2.2.1.2 | 接口描述符 |
ifType | 1.3.6.1.2.1.2.2.1.3 | 接口类型 |
ifSpeed | 1.3.6.1.2.1.2.2.1.5 | 接口速率 |
ifPhysAddress | 1.3.6.1.2.1.2.2.1.6 | 接口物理地址 |
ifInOctets | 1.3.6.1.2.1.2.2.1.10 | 接口输入字节数 |
ifOutOctets | 1.3.6.1.2.1.2.2.1.16 | 接口输出字节数 |
ifInErrors | 1.3.6.1.2.1.2.2.1.14 | 接口输入错误数 |
ifOutErrors | 1.3.6.1.2.1.2.2.1.20 | 接口输出错误数 |
通过如下代码即可调用
# 获取网卡进出流量
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地址
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FUhm57lt-1680491816419)(C:\Users\29973\AppData\Roaming\Typora\typora-user-images\image-20230401152045586.png)]](https://img-blog.csdnimg.cn/2770be441b59479db9f429f9316f9b4b.png)
可以看到
# 表示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 问题一
问题描述
访问出错无法获得流量,无法识别有效的自定义标识符
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4Y2mmLJT-1680491816420)(C:\Users\29973\AppData\Roaming\Typora\typora-user-images\image-20230401162829040.png)]](https://img-blog.csdnimg.cn/3ed720e1fe9c4dcdbcf532c78f326aa0.png)
解决办法
通过下载第三方的解析库来实现标识符的转换
进入服务器端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
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eR5Kn2iD-1680491816420)(C:\Users\29973\AppData\Roaming\Typora\typora-user-images\image-20230401164609600.png)]](https://img-blog.csdnimg.cn/8ae4d5fd84334f9fbc2f1cd329193c10.png)
2.8.2 问题二
问题描述
只能监控进或者出的流量,而不能同时监控两个
解决办法
snmpwalk只支持输出第一个参数的流量结果,将其替换为snmpget即可监控进出流量
snmpget -v 2c -c public 192.168.72.20 ifInOctets.950 ifOutOctets.950
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GF6AMSfR-1680491816421)(C:\Users\29973\AppData\Roaming\Typora\typora-user-images\image-20230401165732650.png)]](https://img-blog.csdnimg.cn/9361544d40be452bae27d818f42745b7.png)
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"
运行截图如下
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nfIbolq0-1680491816422)(C:\Users\29973\AppData\Roaming\Typora\typora-user-images\image-20230401172423224.png)]](https://img-blog.csdnimg.cn/e9c46a4b54c9415d98e98a43114cc5b0.png)
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
