概述
简单网络管理协议(SNMP)是一个互联网标准协议,用于管理IP网络上的设备。SNMP可以用CACTI、MRTG或The Dude等工具绘制各种数据。
SNMP的写入支持只对某些OID有效。对于支持的OIDs,支持SNMP v1、v2或v3的写入。
SNMP在收到SNMP请求的接口上响应查询,迫使响应具有与发送到路由器的请求目的地相同的源地址
快速配置
在RouterOS中启用SNMP:
[admin@MikroTik] /snmp> print
enabled: no
contact:
location:
engine-id:
trap-community: (unknown)
trap-version: 1
[admin@MikroTik] /snmp> set enabled yes
可以在上述设置中指定管理联系信息。所有的SNMP数据都将提供给 community 菜单中配置的属性。
常规属性
Sub-menu: /snmp
这个子菜单允许启用SNMP并完成常规设置。
| 属性 | 说明 |
|---|---|
| contact (string; Default: "") | 联系信息 |
| enabled (yes | no; Default: no) | 停用/启用SNMP服务 |
| engine-id (string; Default: "") | 对于SNMP v3,作为标识符的一部分使用。可以用这个参数配置引擎ID的后缀部分。如果SNMP客户端不能检测设置的引擎ID值,那么就必须使用这个前缀的十六进制值 0x80003a8c04 |
| location (string; Default: "") | 位置信息 |
| trap-community (string; Default: public) | 发送陷阱时,在 community 菜单中配置要用的公共属性。 |
| trap-generators (interfaces | start-trap; Default: ) | 什么动作会产生陷阱: - 接口 - 接口变化; - 启动陷阱 - 路由器上启动SNMP服务器 |
| trap-interfaces (string | all; Default: ) | 要发送陷阱的接口列表。 |
| trap-target (list of IP/IPv6; Default: 0.0.0.0) | 接收陷阱的SNMP数据采集器的IP(IPv4或IPv6)地址 |
| trap-version (1 | 2 | 3; Default: 1) | 用于陷阱的SNMP协议的一个版本 |
| src-address (IPv4 or IPv6 address; Default: ::) | 强制路由器对所有的SNMP信息始终使用相同的IP源地址 |
| vrf (VRF name; default value: main) | 设置VRF服务监听传入连接 |
engine-id字段有engine-id的后缀值,通常情况下,SNMP客户应该能够检测到这个值,作为SNMP值,并从路由器上读取。然而,有一种可能性并非如此。在这种情况下,engine-ID值必须按照这个规则来设置。<engine-id prefix> + <hex-dump suffix>,所以作为一个例子,如果设置了1234作为后缀值,则必须提供80003a8c04 + 31323334,合并后hex是80003a8c0431323334
community属性
Sub-menu: /snmp community
这个子菜单允许设置SNMP数据的访问权限。
在v1和v2c中几乎没有安全保障,只有清晰的文本公共字符串("用户名")和按IP地址限制访问的能力。
在生产环境中应该使用SNMP v3,因为它提供了安全性–用MD5/SHA1授权(用户+密码),用DES和AES加密。
[admin@MikroTik] /snmp community> print value-list
name: public
address: 0.0.0.0/0
security: none
read-access: yes
write-access: no
authentication-protocol: MD5
encryption-protocol: DES
authentication-password: *****
encryption-password: *****
默认设置只有一个名为 public 的community属性,没有任何额外的安全设置。这些设置是不安全的,要根据所需的安全配置文件来调整。
属性
| 属性 | 说明 |
|---|---|
| address (IP/IPv6 address; Default: 0.0.0.0/0) | 允许与SNMP服务器连接的地址 |
| authentication-password (string; Default: "") | 验证服务器连接的密码(SNMPv3)。 |
| authentication-protocol (MD5 | SHA1; Default: MD5) | 认证的协议(SNMPv3)。 |
| encryption-password (string; Default: "") | 加密的密码(SNMPv3)。 |
| encryption-protocol (DES | AES; Default: DES) | 加密通信协议(SNMPv3)。AES(见rfc3826)自v6.16起可用。 |
| name (string; Default: ) | |
| read-access (yes | no; Default: yes) | community是否启用了读权限 |
| security (authorized | none | private; Default: none) | |
| write-access (yes | no; Default: no) | 是否为community启用了写权限 |
对象标识符(OID)
每个OID都标识了一个可以通过SNMP读取的变量。尽管MIB文件包含了所有需要的OID值,也可以在任何菜单级别上用 print oid 命令在控制台中打印单个OID信息。
[admin@MikroTik] /interface> print oid
Flags: D - dynamic, X - disabled, R - running, S - slave
0 R name=.1.3.6.1.2.1.2.2.1.2.1 mtu=.1.3.6.1.2.1.2.2.1.4.1
mac-address=.1.3.6.1.2.1.2.2.1.6.1 admin-status=.1.3.6.1.2.1.2.2.1.7.1
oper-status=.1.3.6.1.2.1.2.2.1.8.1 bytes-in=.1.3.6.1.2.1.2.2.1.10.1
packets-in=.1.3.6.1.2.1.2.2.1.11.1 discards-in=.1.3.6.1.2.1.2.2.1.13.1
errors-in=.1.3.6.1.2.1.2.2.1.14.1 bytes-out=.1.3.6.1.2.1.2.2.1.16.1
packets-out=.1.3.6.1.2.1.2.2.1.17.1 discards-out=.1.3.6.1.2.1.2.2.1.19.1
errors-out=.1.3.6.1.2.1.2.2.1.20.1
陷阱
SNMP陷阱使路由器能够通过发送陷阱通知数据采集器接口变化和SNMP服务状态变化。可以发送具有安全功能的陷阱,支持SNMPv1(无安全),SNMPv2和变种以及带有加密和授权的SNMPv3。
对于SNMPv2和v3,必须设置一个适当配置的community作为 _trap-community_,以启用所需的功能(密码或加密/授权)。
SNMP写
SNMP写允许用SNMP请求改变路由器配置。当SNMP和写权限被启用时,要考虑确保对路由器或路由器SNMP的访问安全。
要通过SNMP请求改变设置,请使用下面的命令,允许SNMP对所选community进行写入。
/snmp community set <number> write-access=yes
系统身份
可以通过SNMP set命令来改变路由器的系统身份。
$ snmpset -c public -v 1 192.168.0.0 1.3.6.1.2.1.1.5.0 s New_Identity
snmpset - SNMP应用,用于SNMP SET请求,设置网络实体的信息。
public - 路由器的community名称。
192.168.0.0 - 路由器的IP地址。
1.3.6.1.2.1.5.0 - 路由器身份的SNMP值。
上面的SNMPset命令等同于RouterOS命令。
/system identity set identity=New_Identity
重启
可以用SNMP设置命令来重启路由器,需要设置重启SNMP的值,这个值不等于0。
$ snmpset -c public -v 1 192.168.0.0 1.3.6.1.4.1.14988.1.1.7.1.0 s 1
1.3.6.1.4.1.14988.1.7.1.0, SNMP值用于路由器重启。
s 1,snmpset命令设置的值,不能等于0。
重启SNMPset命令等同于RouterOS命令。
/system reboot
运行脚本
当需要为脚本的SNMP设置值时,SNMP写允许在路由器上从 系统脚本 菜单中运行脚本。
$ snmpset -c public -v 1 192.168.0.0 1.3.6.1.4.1.14988.1.1.8.1.1.3.X s 1
X,脚本编号,从1开始。
s 1,snmpset命令的设置值,不能等于0。
在RouterOS上也有同样的命令。
/system script> print
Flags: I - invalid
0 name="test" owner="admin" policy=ftp,reboot,read,write,policy,
test,winbox,password,sniff last-started=jan/01/1970
01:31:57 run-count=23 source=:beep
/system script run 0
用GET运行脚本
可以通过SNMP对脚本OID的GET请求来运行 /system scripts (从6.37开始)。要做到这一点,需要有写权限的SNMP community。脚本的 OID 可以通过 SNMPWALK 命令来获取,因为这个表是动态的。
添加脚本:
/system script
add name=script1 owner=admin policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="/sy reboot "
add name=script2 owner=admin policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="[:put output]"
获取脚本的OID表
$ snmpwalk -v2c -cpublic 192.168.88.1 1.3.6.1.4.1.14988.1.1.8
iso.3.6.1.4.1.14988.1.1.8.1.1.2.1 = STRING: "script1"
iso.3.6.1.4.1.14988.1.1.8.1.1.2.2 = STRING: "script2"
iso.3.6.1.4.1.14988.1.1.8.1.1.3.1 = INTEGER: 0
iso.3.6.1.4.1.14988.1.1.8.1.1.3.2 = INTEGER: 0
要运行该脚本,请使用表18
$ snmpget -v2c -cpublic 192.168.88.1 1.3.6.1.4.1.14988.1.1.18.1.1.2.2
iso.3.6.1.4.1.14988.1.1.18.1.1.2.2 = STRING: "output"