当前位置:看书小说 > 其他小说 > IT入门到精通及应用领域 > 第63 章 SNMP

第63 章 SNMP

<< 上一章 返回目录 下一章 >>
    简单网络管理协议(simple work management protocol,缩写为snmp)是一种广泛应用于网络设备的协议,用于管理、监控和收集网络中各种设备的信息。snmp属于互联网工程任务组(ietf)的框架,用于网络管理的一部分。snmp的主要目标是提供一种简单、可扩展的方法来管理网络设备。

    snmp通常包括以下几个组成部分:

    1 snmp管理器:负责发送请求和接收响应的设备,通常是网络管理系统(nms)。

    2 snmp代理:运行在网络设备上,负责接收、处理和响应来自snmp管理器的请求。

    3 snmp消息:用于在snmp管理器和snmp代理之间传输数据的数据包。snmp使用了两种主要类型的消息:get(获取信息)和set(设置信息)。

    4 mib(管理信息库):包含用于描述网络设备上可管理的对象的数据结构。mib定义了设备的特性和属性,如系统名、设备类型、内存使用情况等。

    snmp的主要版本有snmpv1、snmpv2c和snmpv3。它们之间的主要区别在于安全性、性能和功能。snmpv3提供了更强的安全性和隐私保护,同时支持用户认证和加密传输,而snmpv1和snmpv2c则相对较弱。

    有许多可用的snmp工具,用于管理和监控网络中的设备。以下是一些常见的snmp工具:

    1 prtg work monitor:prtg是一款功能强大的网络监控工具,支持snmp协议。它提供了实时监控、报警和报告功能,可帮助网络管理员快速识别和解决网络问题。

    2 solarwinds work performance monitor:solarwinds work performance monitor是一款全面的网络监控解决方案,支持snmp协议。它提供了网络性能分析、故障排除和容量规划等功能。

    3 zabbix:zabbix是一个开源的网络监控解决方案,支持snmp。它提供了实时监控、报警、可视化和报告功能,以及灵活的阈值设置和通知功能。

    4 nagios:nagios是一款开源的监控系统,支持snmp。它可以监控各种设备和服务,并提供实时监控、报警和报告功能。

    5 cacti:cacti是一款开源的监控工具,支持snmp。它主要用于监控网络设备,提供实时数据、图形和报告功能。

    6 observium:observium是一款开源的网络监控工具,支持snmp。它主要用于自动发现网络设备,并提供实时监控、报警、报告和映射功能。

    7 librenms:librenms是一款开源的网络监控系统,支持snmp。它提供了一个简单易用的界面,用于管理、监控和报告网络设备。

    snmpv3通过采用一系列安全措施来提高snmp协议的安全性。以下是snmpv3在安全性方面的主要改进:

    1 用户认证:snmpv3支持基于用户名和密码的用户认证,用于验证snmp代理和snmp管理器之间的通信。这可以防止未经授权的用户访问网络设备和获取敏感信息。

    2 加密传输:snmpv3支持数据传输层安全(datagram transport layer security,dtls)和传输控制协议安全(transport control protocol secure,tcp/ip),以确保snmp消息在传输过程中的保密性和完整性。加密传输可以防止中间人攻击和数据泄露。

    3 消息完整性:snmpv3提供了消息完整性检查功能,通过消息认证码(message authentication code,mac)或数字签名技术,确保snmp消息在传输过程中没有被篡改。

    4 访问控制:snmpv3引入了基于视图的访问控制模型,允许管理员为不同的用户或组分配不同的访问权限。这样可以限制用户访问特定设备和信息的能力,从而保护网络设备的安全。

    5 安全模型:snmpv3定义了三个安全模型,分别为无认证无加密(noauthnopriv)、认证无加密(authnopriv)和认证加密(authpriv)。管理员可以根据实际需求和设备安全策略选择合适的安全模型。

    通过这些安全措施,snmpv3有效地提高了snmp协议的安全性,减少了网络管理中的安全风险。然而,由于snmpv3与snmpv1和snmpv2c存在向后兼容性问题,许多网络设备可能仍然使用较旧版本的snmp协议。

    尽管snmpv3相较于snmpv1和snmpv2c在安全性方面有了很大的改进,但它仍然存在一些不足之处:

    1 向后兼容性问题:snmpv3与snmpv1和snmpv2c在实现和使用上有很大差异。这可能导致与旧版本snmp设备不兼容的问题,需要额外的配置和资源来支持多个版本的snmp协议。

    2 性能影响:由于snmpv3增加了加密和认证功能,可能会对网络设备的性能产生一定影响。特别是对于资源有限的设备,如传感器或家用路由器,snmpv3的开销可能会影响其性能。

    3 复杂性:相比于snmpv1和snmpv2c,snmpv3的配置和管理更加复杂。这可能会增加网络管理员的工作负担,并可能导致配置错误和潜在的安全问题。

    4 安全漏洞:虽然snmpv3在安全性方面有了很大改进,但仍然可能存在一些安全漏洞。例如,针对密码猜测攻击,需要采取额外的措施来保护用户凭证的安全。

    5 默认安全设置:许多snmpv3实现在默认情况下可能采用较弱的安全设置。网络管理员需要手动配置合适的安全策略,以确保网络设备的安全。

    6 缺乏一些高级功能:尽管snmpv3在安全性方面有很大改进,但它仍然缺乏一些高级功能,如更细粒度的访问控制和基于角色的访问控制。这可能限制了其在某些场景中的应用。

    总之,尽管snmpv3在安全性方面取得了很大进步,但仍存在一些不足之处。

    优化snmpv3性能的方法主要涉及降低加密和认证过程的开销,减少不必要的snmp通信。以下是一些建议来优化snmpv3的性能:

    1 使用高效的加密算法:选择高效的加密算法可以降低加密过程的开销。例如,可以使用aes(advanced encryption standard)而不是des(data encryption standard)或3des(triple des),因为aes在性能和安全性方面更为优越。

    2 减少snmp查询频率:降低snmp查询的频率可以减少网络设备的负担。通过合理设置snmp查询时间间隔和条件,可以在不影响网络管理的前提下降低snmp查询频率。

    3 使用snmp压缩:snmpv3支持数据包压缩,这可以减少传输过程中的数据量。在配置snmpv3时,可以启用压缩功能以降低网络开销。

    4 优化网络拓扑:优化网络拓扑结构可以降低网络设备的通信负担。通过合理布局网络设备和连接,可以减少不必要的snmp通信。

    5 监控和管理snmp设备:定期监控和管理snmp设备,确保其运行在最佳状态。这包括更新固件、修复漏洞和优化配置等。

    6 限制snmp访问权限:合理设置snmp访问权限可以降低snmp通信的开销。仅允许需要的设备和用户访问特定的snmp信息,避免不必要的snmp查询。

    7 选择合适的安全模型:根据实际需求和设备安全策略选择合适的snmpv3安全模型。例如,如果安全性不是首要考虑因素,可以选择性能较高的“无认证无加密”(noauthnopriv)安全模型。

    通过以上方法,可以在保持snmpv3安全性的前提下优化其性能。需要注意的是,在优化性能的过程中,应确保网络设备和信息的安全。

    在snmpv3中,加密算法用于保护网络设备之间的通信安全。以下是一些常用的加密算法:

    1 hmac(基于哈希的消息认证码):hmac算法是一种消息认证码,用于验证数据的完整性和来源。hmac可以与多种加密哈希函数(如sha-256、sha-384和sha-512)结合使用,以提供不同级别的安全性。snmpv3使用hmac来验证消息的完整性。

    2 des(data encryption standard):des是一种分组密码算法,用于加密数据。然而,由于其密钥长度较短(56位),des已经被认为是不安全的加密算法。因此,不建议在snmpv3中使用des加密数据。

    3 3des(triple des):3des是des算法的一种改进版本,使用三个不同的密钥进行三次加密,从而提高了安全性。然而,3des在性能方面相对较低,可能不适用于对性能要求较高的场景。

    4 aes(advanced encryption standard):aes是一种分组密码算法,被广泛认为是目前最安全的加密算法之一。aes支持不同长度的密钥(128位、192位和256位),提供了不同级别的安全性。aes在性能和安全性方面具有优势,是snmpv3中更推荐的加密算法。

    5 blowfish:blowfish是一种分组密码算法,具有良好的安全性和性能。blowfish支持可变长度的密钥(32位至448位),可以根据需要选择合适的密钥长度。然而,由于blowfish算法的专利问题,它在某些情况下可能不被推荐使用。

    在snmpv3中,可以根据实际需求和设备安全策略选择合适的加密算法。aes通常是一种较为理想的选择,因为它在安全性和性能方面具有优势。然而,需要注意的是,加密算法的选择可能会受到硬件和软件实现的限制。

    假设有一个简单的网络,包含两台路由器(router a和router b)和一个交换机(switch)。网络管理员希望通过snmp监控这些设备的状态和性能。以下是如何使用snmp监控此网络的示例:

    1 为每个网络设备安装并配置snmp代理。snmp代理是运行在网络设备上的软件,负责处理来自snmp管理器的请求和响应。

    2 为snmp代理配置一个唯一的系统名称。例如,router a的系统名称可能是“”,router b的系统名称可能是“”,switch的系统名称可能是“”。

    3 为每个网络设备设置一个社区字符串。社区字符串是一种简单的身份验证机制,用于识别有权访问snmp代理的用户。例如,可以设置router a的社区字符串为“public”,router b的社区字符串为“private”,switch的社区字符串为“restricted”。

    4 在网络管理服务器上安装并配置snmp管理器。snmp管理器是用于发送和接收snmp请求的软件,通常由网络管理员使用。

    5 在snmp管理器上配置网络设备的地址和社区字符串。例如,可以将router a的地址设置为“”,社区字符串设置为“public”;将router b的地址设置为“”,社区字符串设置为“private”;将switch的地址设置为“”,社区字符串设置为“restricted”。

    6 使用snmp管理器监控网络设备的状态和性能。例如,可以查询router a的cpu利用率、内存使用情况以及接口流量;可以查询router b的路由表、邻居信息和链路状态;可以查询switch的端口状态、vlan配置和mac地址表。

    7 根据监控结果,可以分析网络状况并采取相应的措施,如调整设备配置、优化网络拓扑或升级设备硬件。

    设置snmp报警规则可以帮助网络管理员实时监控网络设备的状态和性能,并在出现问题时及时采取措施。以下是如何设置snmp监控报警规则的一些建议:

    1 定义关键指标:首先,需要确定哪些指标对网络设备的正常运行至关重要。这些指标可以包括cpu利用率、内存使用率、接口错误率、链路状态等。

    2 设置阈值:为每个关键指标设置合理的阈值。当指标超过阈值时,说明设备可能存在问题。例如,可以将cpu利用率的阈值设置为80,内存使用率的阈值设置为80,接口错误率的阈值设置为1。

    3 选择报警方式:根据网络管理员的偏好和实际需求,选择合适的报警方式。报警方式可以包括电子邮件、短信、电话、自定义脚本等。

    4 配置报警规则:在snmp管理器或监控工具中配置报警规则。例如,可以设置当router a的cpu利用率超过80时,向网络管理员发送电子邮件报警;当router b的内存使用率超过80时,向网络管理员发送短信报警。

    5 测试报警规则:在实际环境中测试报警规则,确保在设备出现异常时能够及时收到报警通知。可以通过模拟设备故障或调整指标值来验证报警规则的有效性。

    6 定期审查和调整:定期审查报警规则,确保其符合网络环境的变化和实际需求。例如,在升级设备硬件后,可能需要调整某些指标的阈值。

    通过以上步骤,可以设置有效的snmp监控报警规则。注意的是,报警规则应根据网络环境和设备特性进行调整,以确保及时识别和解决潜在问题。

    snmp作为一种广泛使用的网络管理协议,在提供简单、可扩展的监控和管理功能方面具有优势。然而,它也存在一些局限性:

    1 安全性:snmpv1和snmpv2c缺乏足够的安全性,容易受到窃听、篡改和伪造攻击。虽然snmpv3引入了加密和认证机制,但配置和管理较为复杂,可能增加网络管理的负担。

    2 性能开销:snmpv1和snmpv2c使用udp作为传输层协议,可能导致消息重传和丢失。此外,snmp查询和响应过程可能会增加网络设备的负担,尤其是在高负载或资源有限的设备上。

    3 扩展性:snmp基于mib(管理信息库)进行信息表示和组织,mib定义了设备和系统可以收集的管理信息。虽然mib可以扩展,但在某些场景下,自定义mib的开发和维护可能较为复杂。

    4 有限的功能:snmp主要用于监控网络设备的状态和性能,对于更复杂的管理和配置任务(如配置设备参数、部署新服务等),snmp可能无法满足需求。

    5 依赖设备支持:snmp依赖于网络设备的snmp代理实现,如果设备不支持snmp或存在兼容性问题,可能无法使用snmp进行监控和管理。

    6 实时性:snmp通常采用轮询的方式进行监控,可能无法实时反映网络设备的状态变化。在某些场景下,需要结合其他实时监控技术(如flow、sflow等)来获取更准确的信息。

    尽管snmp存在这些局限性,但它仍然是一种广泛使用的网络管理协议。

    要解决snmp的局限性,可以从以下几个方面入手:

    1 提高安全性:

    - 使用snmpv3:升级到snmpv3,利用其加密和认证机制来提高网络安全性。

    - 限制snmp访问:配置严格的访问控制策略,仅允许必要的设备和用户访问特定snmp信息。

    - 使用vacm(view-based access control model):利用基于视图的访问控制模型,为不同用户或组分配不同的访问权限。

    - 使用snmpv3的用户认证:通过配置用户名和密码,实现基于身份验证的安全访问。

    2 优化性能:

    - 选择合适的snmp版本:根据网络环境和设备特性,选择合适的snmp版本(如snmpv3)来降低性能开销。

    - 减少snmp查询频率:合理设置snmp查询时间间隔和条件,降低snmp查询频率。

    - 优化网络拓扑:优化网络拓扑结构,降低网络设备的通信负担。

    3 扩展mib库:

    - 开发自定义mib:根据实际需求,开发和维护自定义mib,以满足特定监控和管理需求。

    - 使用标准化mib:尽量使用标准化mib,确保snmp管理器和代理之间的兼容性。

    4 结合其他管理技术:

    - 使用flow、sflow等实时监控技术:结合其他实时监控技术,获取更准确的网络设备状态信息。

    - 采用命令行管理:对于配置设备和部署新服务等复杂任务,使用命令行管理工具进行配置。

    5 提高实时性:

    - 采用轮询和事件驱动的结合方式:结合轮询和事件驱动(如snmpv2c中的snmp trap)的方式,提高网络监控的实时性。

    - 优化轮询频率:根据设备性能和监控需求,合理调整轮询频率,以在实时性和性能之间取得平衡。

    举一个使用python的`pysnmp`库实现snmp get请求的简单示例。这个示例将向目标设备(例如路由器)发送snmp get请求,获取其系统描述信息。

    首先,确保已经安装了`pysnmp`库。如果没有,可以使用以下命令进行安装:

    ```bash

    pip install pysnmp

    ```

    接下来,使用以下代码实现snmp get请求:

    ```python

    from pysnmphlapi import

    def snmp_get(host, munity):

    try:

    创建snmp对象

    snmp_engine = snmpengine()

    创建目标参数

    target_params = udptransporttarget((host, 161))

    创建上下文

    context = contextdata()

    创建snmp get请求对象

    get_request = nextrequest(

    snmp_engine,

    munity

    )

    添加要查询的oid

    get_requestaddvarbinds(

    objecttype(objectidentity(&39;snmpv2-mib&39;, &39;sysdescr&39;, 0))

    )

    发送get请求并获取响应

    error_indication, error_status, error_index, var_binds = next(

    get_requestgetcmd(

    snmp_engine,

    none,

    target_params,

    context,

    objecttype(objectidentity(&39;snmpv2-mib&39;, &39;sysdescr&39;, 0))

    )

    )

    if error_indication:

    print(error_indication)

    else:

    if error_status:

    print(&39;s at s&39;  (error_statusprettyprint(), error_index and var_binds[int(error_index)-1][0] or &39;&39;))

    else:

    for var_bind in var_binds:

    print(&39; = &39;join([xprettyprint() for x in var_bind]))

    except exception as e:

    print(e)

    if __name__ == &39;__main__&39;:

    host = &39;your_device_ip&39;  替换为目标设备的ip地址

    munity = &39;public&39;  替换为社区字符串

    snmp_get(host, munity)

    ```

    将`your_device_ip`替换为目标设备的ip地址,将`public`替换为社区字符串。运行此代码,将输出目标设备的系统描述信息。
<< 上一章 返回目录 下一章 >>
添加书签