一、SNMP概述

1.1 SNMP原理


网络设备越来越多,网络规模越来越大,管理这些设备也越来越重要。远程管理网络的需求日益迫切,SNMP 应运而生。SNMP即"简单网络管理协议",用于网络管理的协议,用于网络设备的管理。

SNMP被设计为工作在TCP/IP协议族上,SNMP基于TCP/IP协议工作,对网络中支持SNMP协议的设备进行管理,但是SNMP本身工作在应用层。

SNMP协议主要由三大部分构成:SNMP管理实体、多个SNMP被管理实体以及网络管理协议

  • 管理实体:运行再在网络管理工作站上,网络管理员通过管理实体和网络设备打交道
  • 被管理设备:网络设备实体,每个设备中运行SNMP代理(Agent)
  • 网络管理协议:管理实体和被管理设备之间的通信规范,包括MIBSMISNMP本身

1.2 MIB


被管理对象值的集合称之为MIB,定义了数据格式、类型、顺序、意义等,使用SMI中定义的类型和ASN.1中的基本类型对对象进行描述,是一个使用SMI描述的管理信息库。

国际化标准组织提出ASN.1【解释:高级的数据描述语言,描述数据的类型、结构、组织、及编码方法,包括符号和语法两部分】来标识MIB模块和其对象。

MIB中的每个节点都具有唯一的OID(Object Identifier),按照从根节点开始的分支结构排列,OID是一个由数字组成的序列,用于唯一标识MIB中的每个节点,用来获取网络设备的信息

SNMP协议监控LINUX操作系统原理 snmp可以监控什么信息_SNMP协议监控LINUX操作系统原理

1.3 SMI


SMI是一种数据定义语言,用于定义MIB及其对象,例如定义基本数据类型,对象模型,以及基本编码规则。

1.3.1 基本数据类型

为了保证简单,只定义了十一种基本数据类型

SNMP协议监控LINUX操作系统原理 snmp可以监控什么信息_网络设备_02

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编码规则,TLVASN.1下的一种可变的格式,其中:

  • T 表示数据类型
  • L 定义数值的长度
  • V 表示实际的数值

SNMP协议监控LINUX操作系统原理 snmp可以监控什么信息_SNMP协议监控LINUX操作系统原理_03

下图所示为ASN.1的常见数据类型

SNMP协议监控LINUX操作系统原理 snmp可以监控什么信息_服务器_04

例如实现编码:路由器router的接口数量为15,其中15的ASCIIf

SNMP协议监控LINUX操作系统原理 snmp可以监控什么信息_服务器_05

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 实验要求

SNMP协议监控LINUX操作系统原理 snmp可以监控什么信息_网络_06

  1. 搭建如下网络拓扑图,容器之间配置OSPF协议,保证可以互相访问
  2. 设置YR3为服务器端,YR1为客户端
  3. 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 配置允许远程访问


YR3vi /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.20YR3ip地址

SNMP协议监控LINUX操作系统原理 snmp可以监控什么信息_网络设备_07

可以看到

# 表示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 查看流量监控


YR1YR3发送数据包,在YR3中开启端口流量监控

其中192.168.72.20YR3ip地址,ifInOctets.950ifOutOctets.950分别指定了输入和输出流量的OID(即在2.6中的定义)

snmpwalk -v 2c -c public 192.168.72.20 ifInOctets.950 ifOutOctets.950

2.8 碰到的问题


2.8.1 问题一

问题描述

访问出错无法获得流量,无法识别有效的自定义标识符

SNMP协议监控LINUX操作系统原理 snmp可以监控什么信息_SNMP_08

解决办法

通过下载第三方的解析库来实现标识符的转换

进入服务器端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

SNMP协议监控LINUX操作系统原理 snmp可以监控什么信息_网络_09

2.8.2 问题二

问题描述

只能监控进或者出的流量,而不能同时监控两个

解决办法

snmpwalk只支持输出第一个参数的流量结果,将其替换为snmpget即可监控进出流量

snmpget -v 2c -c public 192.168.72.20 ifInOctets.950 ifOutOctets.950

SNMP协议监控LINUX操作系统原理 snmp可以监控什么信息_服务器_10

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"

运行截图如下

SNMP协议监控LINUX操作系统原理 snmp可以监控什么信息_SNMP_11