SNMP协议详细介绍及SNMP监控LXD端口流量
一、SNMP概述 1.1 SNMP原理
网络设备越来越多,网络规模越来越大,管理这些设备也越来越重要。远程管理网络的需求日益迫切,SNMP 应运而生。SNMP即"简单网络管理协议",用于网络管理的协议,用于网络设备的管理。
SNMP被设计为工作在TCP/IP协议族上,SNMP基于TCP/IP协议工作,对网络中支持SNMP协议的设备进行管理,但是SNMP本身工作在应用层。
SNMP协议主要由三大部分构成:SNMP管理实体、多个SNMP被管理实体以及网络管理协议
1.2 MIB
被管理对象值的集合称之为MIB,定义了数据格式、类型、顺序、意义等,使用SMI中定义的类型和ASN.1中的基本类型对对象进行描述,是一个使用SMI描述的管理信息库。
国际化标准组织提出ASN.1【解释:高级的数据描述语言,描述数据的类型、结构、组织、及编码方法,包括符号和语法两部分】来标识MIB模块和其对象。
MIB中的每个节点都具有唯一的OID( ),按照从根节点开始的分支结构排列,OID是一个由数字组成的序列,用于唯一标识MIB中的每个节点,用来获取网络设备的信息
1.3 SMI
SMI是一种数据定义语言,用于定义MIB及其对象,例如定义基本数据类型,对象模型,以及基本编码规则。
1.3.1 基本数据类型
为了保证简单,只定义了十一种基本数据类型
1.3.2 对象模型
也称之为-TYPE,定义被管对象的数据类型、状态和语义
就是封装一个对象来描述被管理对象的信息
被管理对象名称 OBJECT-TYPE{被管理对象的属性的基本数据类型被管理对象的读、写、创建权限被管理对象的当前状态(包括合法的、过时的、强制的)被管理对象的描述信息被管理对象的可被查询的OID位置
}
例如:封装对象
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下的一种可变的格式,其中:
下图所示为ASN.1的常见数据类型
例如实现编码:路由器的接口数量为15,其中15的ASCII为f
1.4 SNMP
负责在管理实体和被管理实体之间传输MIB条信息的通信协议
常见的有以下三个操作,要注意PDU通常是使用UDP报文传输
PDU类型方向描述信息
管理者 -> 被管理者
读取网络设备的状态信息
管理者 -> 被管理者
远程配置网络设备参数
Trap
被管理者 -> 管理者
向管理者报告异常事件
1.5 常见OID
下面是获取系统信息的常见OID简写以及对应的数字串
简写对应数字串涵义
1.3.6.1.2.1.1.1
设备描述符
1.3.6.1.2.1.1.3
设备运行时间
1.3.6.1.2.1.1.5
设备名称
下面是监控网络的常见OID简写以及对应的数字串
简写对应数字串涵义
1.3.6.1.2.1.2.2.1.2
接口描述符
1.3.6.1.2.1.2.2.1.3
接口类型
1.3.6.1.2.1.2.2.1.5
接口速率
1.3.6.1.2.1.2.2.1.6
接口物理地址
1.3.6.1.2.1.2.2.1.10
接口输入字节数
1.3.6.1.2.1.2.2.1.16
接口输出字节数
1.3.6.1.2.1.2.2.1.14
接口输入错误数
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共同体()是一个简单的密码系统,用于保护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地址,.950和.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 问题二
问题描述
只能监控进或者出的流量,而不能同时监控两个
解决办法
只支持输出第一个参数的流量结果,将其替换为即可监控进出流量
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"
运行截图如下