深入解析pysnmp的SNMP協(xié)議
1. SNMP 協(xié)議基礎(chǔ)
1.1 SNMP 是什么?
SNMP(Simple Network Management Protocol) 是用于網(wǎng)絡(luò)設(shè)備管理的標(biāo)準(zhǔn)協(xié)議,支持對(duì)路由器、交換機(jī)、服務(wù)器等設(shè)備的監(jiān)控和配置。核心功能包括:
- GET:查詢?cè)O(shè)備信息(如 CPU 使用率、接口狀態(tài))。
- SET:修改設(shè)備配置(如設(shè)置設(shè)備名稱)。
- TRAP/INFORM:設(shè)備主動(dòng)上報(bào)事件(如接口故障)。
1.2 SNMP 架構(gòu)
| 角色 | 功能 | 對(duì)應(yīng) pysnmp 模塊 |
|---|---|---|
| Manager | 管理端(客戶端),發(fā)起 SNMP 請(qǐng)求(GET/SET) | hlapi(高級(jí) API) |
| Agent | 被管理設(shè)備端(服務(wù)器),響應(yīng)請(qǐng)求并執(zhí)行操作 | pysnmp.entity(Agent 實(shí)現(xiàn)) |
| MIB | 管理信息庫,定義可管理的對(duì)象(OID)及其屬性(類型、權(quán)限等) | pysnmp.smi(MIB 解析) |
| OID | 對(duì)象標(biāo)識(shí)符,唯一標(biāo)識(shí)被管理的對(duì)象(如 1.3.6.1.2.1.1.1.0 表示系統(tǒng)描述) | ObjectIdentity 類 |
2. SNMP 協(xié)議核心概念
2.1 OID(Object Identifier)
- 結(jié)構(gòu):分層樹形結(jié)構(gòu),如
1.3.6.1.2.1.1.1.0對(duì)應(yīng)iso.org.dod.internet.mgmt.mib-2.system.sysDescr.0。 - 作用:唯一標(biāo)識(shí)被管理的對(duì)象(如系統(tǒng)名稱、接口流量)。
- 在
pysnmp中的操作:from pysnmp.hlapi import ObjectIdentity # 通過 OID 字符串創(chuàng)建 oid = ObjectIdentity('1.3.6.1.2.1.1.1.0') # 通過 MIB 符號(hào)創(chuàng)建(需加載 MIB) oid = ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0)
2.2 MIB(Management Information Base)
- 功能:定義 OID 的元數(shù)據(jù)(名稱、數(shù)據(jù)類型、訪問權(quán)限等)。
- 在
pysnmp中的加載:from pysnmp.smi import builder, view # 初始化 MIB 編譯器 mib_builder = builder.MibBuilder() mib_view = view.MibViewController(mib_builder) # 加載 MIB 文件 mib_builder.loadModule('SNMPv2-MIB')
2.3 SNMP 版本
| 版本 | 特點(diǎn) | pysnmp 實(shí)現(xiàn)類 |
|---|---|---|
| v1 | 基于社區(qū)名(明文),無加密 | CommunityData(community) |
| v2c | 改進(jìn)錯(cuò)誤處理,仍使用社區(qū)名 | CommunityData(community) |
| v3 | 支持用戶認(rèn)證(USM)、加密(AES/DES) | UsmUserData(user, authKey, privKey) |
3. SNMP 消息結(jié)構(gòu)與pysnmp實(shí)現(xiàn)
3.1 SNMP 消息格式
SNMP 消息由 Header、Security Parameters(僅 v3)和 PDU 組成:
SNMP Message (BER Encoded)
├── Version
├── Community/UsmSecurityParameters (v3)
└── PDU (Protocol Data Unit)
├── PDU Type (GET/SET/GETNEXT...)
├── Request ID
├── Error Status
├── Error Index
└── Variable Bindings (OID-Value Pairs)
3.2pysnmp中的編碼與解碼
- 編碼(發(fā)送請(qǐng)求):
from pysnmp.proto.api import v2c # 構(gòu)建 GET 請(qǐng)求 PDU pdu = v2c.GetRequestPDU().addVarBinds(('1.3.6.1.2.1.1.1.0', v2c.OctetString(''))) message = v2c.Message(apiVersion=1, community='public', pdu=pdu) # BER 編碼為二進(jìn)制 encoded_message = message.encode() - 解碼(接收響應(yīng)):
decoded_message, _ = v2c.Message.decode(encoded_message) response_pdu = decoded_message['pdu']
4.pysnmp模塊設(shè)計(jì)與 SNMP 協(xié)議映射
4.1 分層架構(gòu)
| 層級(jí) | 功能 | pysnmp 模塊 |
|---|---|---|
| 應(yīng)用層 | 用戶接口(GET/SET/WALK) | hlapi |
| 協(xié)議層 | 消息構(gòu)建、編碼/解碼、安全處理(v3) | proto, entity |
| 傳輸層 | 網(wǎng)絡(luò)通信(UDP/TCP) | carrier |
| MIB 層 | OID 解析與 MIB 管理 | smi |
4.2 核心類與 SNMP 協(xié)議對(duì)應(yīng)
| SNMP 概念 | pysnmp 類/方法 | 示例代碼 |
|---|---|---|
| Community (v2c) | CommunityData | CommunityData('public', mpModel=1) |
| User (v3) | UsmUserData | UsmUserData('user1', authKey='auth123') |
| PDU | GetRequestPDU, SetRequestPDU | v2c.GetRequestPDU() |
| Transport | UdpTransportTarget, asyncore 事件循環(huán) | UdpTransportTarget(('192.168.1.1', 161) |
5. 深入 SNMP 操作流程
5.1 GET 請(qǐng)求全流程
- 用戶發(fā)起請(qǐng)求:
from pysnmp.hlapi import getCmd, ObjectType, ObjectIdentity error_indication, error_status, error_index, var_binds = next( getCmd(SnmpEngine(), CommunityData('public'), UdpTransportTarget(('192.168.1.1', 161)), ContextData(), ObjectType(ObjectIdentity('1.3.6.1.2.1.1.1.0'))) - 協(xié)議層構(gòu)建 PDU:
- 創(chuàng)建
GetRequestPDU,填充 OID。
- 創(chuàng)建
- 傳輸層發(fā)送數(shù)據(jù):
- 使用 UDP 發(fā)送 BER 編碼的 SNMP 消息。
- Agent 處理請(qǐng)求:
- 查找 OID 對(duì)應(yīng)的值,生成
GetResponsePDU。
- 查找 OID 對(duì)應(yīng)的值,生成
- Manager 解析響應(yīng):
- 解碼響應(yīng)并返回
var_binds。
- 解碼響應(yīng)并返回
5.2 SNMP Walk 實(shí)現(xiàn)原理
- 底層操作:通過連續(xù)發(fā)送
GETNEXT請(qǐng)求,直到 OID 超出子樹范圍。 - 在
pysnmp中的實(shí)現(xiàn):from pysnmp.hlapi import nextCmd for (error_indication, error_status, error_index, var_binds) in nextCmd( SnmpEngine(), CommunityData('public'), UdpTransportTarget(('192.168.1.1', 161)), ContextData(), ObjectType(ObjectIdentity('1.3.6.1.2.1.1'))): # 處理每個(gè) OID-Value 對(duì)
6. SNMPv3 安全機(jī)制與pysnmp
6.1 USM(User Security Model)
- 認(rèn)證(Authentication):
- 算法:MD5、SHA(
usmHMACMD5AuthProtocol、usmHMACSHAAuthProtocol)。 - 防止數(shù)據(jù)篡改。
- 算法:MD5、SHA(
- 加密(Privacy):
- 算法:DES、AES(
usmDESPrivProtocol、usmAesCfb128Protocol)。 - 防止數(shù)據(jù)竊聽。
- 算法:DES、AES(
6.2pysnmp中的 SNMPv3 配置
from pysnmp.hlapi import UsmUserData, getCmd
error_indication, error_status, error_index, var_binds = next(
getCmd(SnmpEngine(),
UsmUserData('user1',
authKey='authkey123',
privKey='privkey123',
authProtocol=usmHMACSHAAuthProtocol,
privProtocol=usmAesCfb128Protocol),
UdpTransportTarget(('192.168.1.1', 161)),
ContextData(),
ObjectType(ObjectIdentity('1.3.6.1.2.1.1.1.0')))
)
7. 總結(jié)
通過理解 SNMP 協(xié)議的核心概念(OID、MIB、PDU)和操作流程(GET/SET/WALK),可以更深入地掌握 pysnmp 模塊的設(shè)計(jì)邏輯:
- 分層架構(gòu):分離協(xié)議處理、傳輸層和 MIB 管理。
- 靈活擴(kuò)展:支持多版本 SNMP 和自定義傳輸協(xié)議。
- 協(xié)議驅(qū)動(dòng):
pysnmp的類和方法直接映射到 SNMP 消息結(jié)構(gòu)。
到此這篇關(guān)于深入解析pysnmp的SNMP協(xié)議的文章就介紹到這了,更多相關(guān)pysnmp SNMP協(xié)議內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python3創(chuàng)建Django項(xiàng)目的幾種方法(3種)
這篇文章主要介紹了Python3創(chuàng)建Django項(xiàng)目的幾種方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
在實(shí)驗(yàn)中需要自己構(gòu)造單獨(dú)的HTTP數(shù)據(jù)報(bào)文,而使用SOCK_STREAM進(jìn)行發(fā)送數(shù)據(jù)包,需要進(jìn)行完整的TCP交互。因此想使用原始套接字進(jìn)行編程,直接構(gòu)造數(shù)據(jù)包,并在IP層進(jìn)行發(fā)送,即采用SOCK_RAW進(jìn)行數(shù)據(jù)發(fā)送。使用SOCK_RAW的優(yōu)勢(shì)是,可以對(duì)數(shù)據(jù)包進(jìn)行完整的修改,可以處理IP層上的所有數(shù)據(jù)包,對(duì)各字段進(jìn)行修改,而不受UDP和TCP的限制。2014-02-02
pycharm2022.1最新永久激活碼破解補(bǔ)丁一鍵安裝教程免費(fèi)分享(2022持續(xù)更新)
更新到Pycharm 2022.2.x版,pycharm2022.2最新可用永久激活碼分享(持續(xù)更新),pycharm激活補(bǔ)丁一鍵安裝簡(jiǎn)單方便,無需手動(dòng)修改文件,兼容蘋果MAC,linux,Windows系統(tǒng)2022-07-07
Python HTMLParser模塊解析html獲取url實(shí)例
這篇文章主要介紹了Python HTMLParser模塊解析html獲取url實(shí)例,HTMLParser是python用來解析html的模塊,HTMLParser采用的是一種事件驅(qū)動(dòng)的模式,需要的朋友可以參考下2015-04-04
Python趣味爬蟲之用Python實(shí)現(xiàn)智慧校園一鍵評(píng)教
你還在為智慧校園每周的評(píng)教而苦惱嗎?今天我來幫你解放雙手,用Python實(shí)現(xiàn)一鍵評(píng)教,從此生活無憂無慮,文中有非常詳細(xì)的代碼示例,需要的朋友可以參考下2021-05-05

