网络设备越来越多,网络规模越来越大,管理这些设备也越来越重要。远程管理网络的需求日益迫切,SNMP
应运而生。SNMP
即"简单网络管理协议",用于网络管理的协议,用于网络设备的管理。
SNMP
被设计为工作在TCP/IP
协议族上,SNMP
基于TCP/IP
协议工作,对网络中支持SNMP
协议的设备进行管理。
Get
:读取网络设备的状态信息。Set
:远程配置设备参数。Trap
:设备需要在重要状况改变的时候,管理站及时获取设备的重要信息。ASN.1
高级的数据描述语言。描述数据的类型、结构、组织、及编码方法。包括符号和语法两部分。SNMP
使用ASN.1
描述SNMP
的协议数据和管理学对象信息库MIB
。
SMI
是SNMP
的描述方法。规定了使用ASN.1
子类型、符号
MIB
是SNMP
中使用到的管理信息库。定义了数据格式、类型、顺序、意义等,使用SMI
中定义的类型和ASN.1
中的基本类型对对象进行描述,是一个使用SMI
描述的管理信息库
OID
MIB
中的每个节点都具有唯一的OID(Object Identifier)
,它们按照从根节点开始的分支结构排列。OID
是一个由数字组成的序列,用于唯一标识MIB
中的每个节点。
SNMP
目录树的根节点开始,我们的OID
为:1.3.6.1
,解释如下:
iso(1)
:标注组织
org(3)
: 国际标准组织
dod(6)
: 美国国防部
internet(1)
: 国际互联网
下面是获取系统信息的常见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
搭建如下网络拓扑图,容器之间配置OSPF
协议,保证可以互相访问
设置YR3
为服务器端,YR1
为客户端
YR1
访问YR3
,,YR3
可监控本身流量
在服务器端YR3
下载相关软件,同时设置开机自启,[注意:这里是snmpd
]
apt-get install snmpd
apt-get install snmp
systemctl enable snmpd
systemctl start snmpd
SNMP
共同体(Community
)是一个简单的密码系统,用于保护SNMP
的管理访问。当SNMP
管理者向SNMP
代理发出请求时,必须指定正确的共同体名称才能成功访问SNMP
代理。如果共同体名称不正确,则SNMP
代理将拒绝该请求。
在SNMP
代理的配置中,通常会设置多个不同的共同体名称。这些共同体名称可以具有不同的访问级别和权限。例如,可以将某些共同体名称配置为只读,而将其他共同体名称配置为读写。这样可以根据具体的管理需求来分配不同的访问权限。
在服务器端YR3
中配置共同体
vi /etc/snmp/snmpd.conf
在文件末尾添加如下内容
rocommunity public
在YR3
中vi /etc/snmp/snmpd.conf
修改配置文件,否则只能本地访问
# 大概在15行,将下面一行注释掉:
agentAddress udp:127.0.0.1:161
重启之后查看当前状态,服务对外开启
service snmpd restart
netstat -antup | grep 161
在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
在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
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
问题描述
访问出错无法获得流量,无法识别有效的自定义标识符
解决办法
通过下载第三方的解析库来实现标识符的转换
进入服务器端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
问题描述
只能监控进或者出的流量,而不能同时监控两个
解决办法
snmpwalk
只支持输出第一个参数的流量结果,将其替换为snmpget
即可监控进出流量
snmpget -v 2c -c public 192.168.72.20 ifInOctets.950 ifOutOctets.950
问题描述
每次输入的命令只能监控当前时刻流量,如何持续监控
解决办法
配合脚本文件实现
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"
运行截图如下