Net-SNMP 是什么?

  NET-SNMP 是一种开放源代码的 SNMP 实现。它支持 SNMP v1, SNMP v2c 与 SNMP v3,并可以使用 IPV4 及 IPV6 。也包含 SNMP Trap 的所有相关实现。

ArchWiki Snmpd

Net-SNMP 包括哪些功能?

命令行应用程序

  • 从支持 SNMP 的设备检索信息,使用单个请求(snmpget,snmpgetnext),或者使用多个请求(snmpwalk、snmptable、snmpdelta)

  • 操作支持 SNMP 的设备(snmpset)上的配置信息

  • 从支持 SNMP 的设备(snmpdf、snmpnetstat、snmpstatus)检索一个固定的信息集合

  • 在 MIB/OI 的数值形式和文本形式之间进行转换,并显示 MIB 内容和结构(snmptranslate)

图形MIB浏览器 (Tkmib) 使用 Tk/perl

用于接收 SNMP 通知(Snmpd)的守护进程(Systemd deamon) 可以选择的通知(到 Syslog、NT 事件日志或纯文本文件) 转发到另一个 SNMP 管理系统或传递到外部应用程序

用于响应 SNMP 查询以获取有关管理信息(Snmpd) 的可扩展代理 这包括对各种 MIB 信息模块的内置支持,并且可以使用动态加载的模块、外部脚本和命令以及 SNMP 多路复用(Smux)和代理扩展性(AgentX)协议进行扩展。

用于开发具有 C 和 perl API 的新 SNMP 应用程序的库

安装 (通过包管理器)

Arch-Linux / Manjaro :

$ sudo pacman -Sy net-snmp

Ubuntu / Debian GNU/Linux :

$ sudo apt-get install -y net-snmp libperl-dev

CentOS :

$ sudo yum install -y net-snmp net-snmp-devel net-snmp-libs net-snmp-perl net-snmp-utils mrtg

部署 (通过源码编译)

安装 GNU GCC 编译器

下载源码

  执行文件目录下的 configure 可执行文件,如果想指定程序包的安装路径,那么首先建立相应的文件夹来存放安装信息,可以写成 ./configure --prefix= 指定的路径名。参数 --prefix 用来告诉系统安装信息存放的路径,如果没有指定路径直接执行 ./configure,那么程序包都会安装在系统默认的目录下,通常为 /usr/local 或者 /opt下

例如 :

$ sudo ./configure --prefix=/usr/local/snmp

可以加入支持磁盘I/O监控等等功能

$ sudo ./configure --prefix=/usr/local/snmp --with-mib-modules='ucd-snmp/diskio ip-mib/ipv4InterfaceTable'

在配置过程中需要进行一些简单的选择 :

default version of-snmp-version: 2 
Systemcontact information: yourname                                       配置该设备的联系人
System location: china                                                    该设备的位置
Location to write logfile: /var/log/snmpd.log                             日志文件位置
Location to Write persistent: /var/net-snmp                               数据存储目录

编译并且安装 :

$ sudo make && sudo make install

Snmpd 基本配置

/etc/snmp/snmpd.conf

配置只读字符串

$ sudo echo "rocommunity read_only_community_string" >> /etc/snmp/snmpd.conf

添加另一个用于管理的社区字符串

$ sudo echo "rwcommunity read_write_community_string" >> /etc/snmp/snmpd.conf

SNMP v3增加了安全性和加密的身份验证使用不同的配置方案 /var/net-snmp/snmpd.conf

$ sudo echo "rouser read_only_user" >> /etc/snmp/snmpd.conf

或使用向导

$ sudo snmpconf -g basic_setup

配置 /var/net-snmp/snmpd.conf

$ sudo echo "createUser read_only_user SHA password1 AES password2" >> /var/net-snmp/snmpd.conf

或使用配置工具

$ sudo net-snmp-create-v3-user -ro -a SHA -x AES

Start Systemd Deamon

$ sudo systemctl enable snmpd.service
$ sudo systemctl start snmpd.service

检查 Systemd 进程状态

$ sudo systemctl status snmpd.service

Testing

$ sudo snmpwalk -v 1 -c read_only_community_string localhost | less                                              SNMP v1
$ sudo snmpwalk -v 2c -c read_only_community_string localhost | less                                             SNMP v2c
$ sudo snmpwalk -v 3 -u read_only_user -a SHA -A password1 -x AES -X password2 -l authNoPriv localhost | less    SNMP v3

不论哪种方式,下方会显示本机 MIB 信息

从设备检索信息

snmpget 与 snmpwalk 的区别

  • snmpwalk 是对OID值的遍历

  若某个OID值下面有N个节点,则依次遍历出这N个节点的值。如果对某个叶子节点的 OID 值做walk,则取得到数据就不正确了,因为它会认为该节点是某些节点的父节点,而对其进行遍历,而实际上该节点已经没有子节点了,那么它会取出与该叶子节点平级的下一个叶子节点的值,而不是当前请求的节子节点的值

比如

$ sudo snmpwalk -v 2c -c read_only_community_string localhost | less
$ sudo snmpwalk -v 2c -c read_only_community_string localhost system  
  • snmpget 是取具体的OID的值。

snmpget 适用于OID值是一个叶子节点的情况, 而且可以同时查询多个 OID 的值

$ sudo snmpget -v 2c -c read_only_community_string localhost sysDescr.0 sysLocation.0

snmpgetnext

  模拟SNMP GETNextRequest 动作的工具,用来获取一个管理信息实例的下一个可用实例数据

$ sudo snmpgetnext -v 2c -c read_only_community_string localhost sysDescr.0

设置设备信息

snmpset

  模拟SNMP SETRequest 动作的工具,用来设置可写管理信息,一般用来配置设备对设备执行操作

$ sudo snmpset -v 2c -c read_write_community_string localhost sysContact.0 s netlab
$ sudo snmpset -v 2c -c read_write_community_string localhost sysName.0 s ccut sysLocation.0 s soft

SnmpTrap 的发送和接收

虽然 SNMPTrap SNMPTrapd 和 SNMPInform 功能模块在 Net-SNMP 源码包里。但是 Ubuntu 和 Pop! OS 等发行版将这部分功能单独提供了 binary 软件包

Ubuntu :

$ sudo apt-get install -y snmptrapd

Ubuntu 20.04 LTS     Ubuntu Launchpad

  • snmptrap:可以模拟snmp agent发送一个trap到snmp管理端

  • snmpinform:可以模拟snmp agent发送一个inform request到snmp管理端

  Trap是发送给SNMP管理者的通知网络状况等的警告消息,而Inform是需要SNMP管理者确认接收的Trap。与Inform 相比较,Trap通知方式为不可靠传输,因为snmp管理端在收到一条Trap通知后无需回复任何确认信息,所以snmp agent无法知道Trap通知是否已经被snmp管理端正确接收

  • snmptrapd:一个模拟snmp管理端接收trap/inform通知的程序

snmptrapd 应用程序作为后台 SNMP Trap 服务器,负责接收被管理设备发送过来的 Trap 消息

创建snmptrapd.conf 的配置文件

$ sudo nano /etc/snmp/snmptrapd.conf

traphandle default lognotify IBM-DW-SAMPLE::nodeDown 
authCommunity log,execute,net public

创建 snmptrapd 进程

$ sudo snmptrapd -C -c /etc/snmp/snmptrapd.conf udp:1632 -df -Lo

发送SNMP v1版本trap报文的方法

$ sudo snmptrap -v 1 -c read_write_community_string 192.168.16.46  1.3.6.1.4.1.1  192.168.16.46  2  3  1000  1.3.6.1.9.9.44.1.2.1  i  12  1.3.4.1.2.3.1  s  test

命令   Snmp协议版本   共同体   Snmp管理端IP   Enterprise-OID   Snmp代理IP   Trap类型   Trap特征码   uptime   被发送参数的OID   数据类型   数据值   被发送参数的OID   数据类型   数据值

发送SNMP v2c 版本trap报文的方法

$ sudo snmptrap -v 2c -c read_write_community_string 192.168.16.46  1.3.6.1.4.1.1  SNMPv2-MIB::sysLocation.0  s  test

命令   Snmp协议版本   共同体   Snmp管理端IP   Enterprise-OID   数据OID   数据类型   数据值

发送一个 Inform Request

$ sudo snmpinform