深入解析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 | 管理信息庫(kù),定義可管理的對(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):分層樹(shù)形結(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 # 通過(guò) OID 字符串創(chuàng)建 oid = ObjectIdentity('1.3.6.1.2.1.1.1.0') # 通過(guò) MIB 符號(hào)創(chuàng)建(需加載 MIB) oid = ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0)
2.2 MIB(Management Information Base)
- 功能:定義 OID 的元數(shù)據(jù)(名稱、數(shù)據(jù)類型、訪問(wèn)權(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ū)名(明文),無(wú)加密 | 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)原理
- 底層操作:通過(guò)連續(xù)發(fā)送
GETNEXT請(qǐng)求,直到 OID 超出子樹(shù)范圍。 - 在
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ù)竊聽(tīng)。
- 算法: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é)
通過(guò)理解 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)文章
Python利用prettytable實(shí)現(xiàn)格式化輸出內(nèi)容
Python有一個(gè)第三方模塊叫?prettytable,專門用來(lái)將數(shù)據(jù)格式輸出。本文將通過(guò)示例為大家詳細(xì)講講prettytable的用法,感興趣的可以了解一下2022-07-07
Python實(shí)現(xiàn)線性擬合及繪圖的示例代碼
在數(shù)據(jù)處理和繪圖中,我們通常會(huì)遇到直線或曲線的擬合問(wèn)題,本文主要介紹了Python實(shí)現(xiàn)線性擬合及繪圖的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下2024-04-04
python爬取代理IP并進(jìn)行有效的IP測(cè)試實(shí)現(xiàn)
這篇文章主要介紹了python爬取代理IP并進(jìn)行有效的IP測(cè)試實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
Pycharm如何導(dǎo)入python文件及解決報(bào)錯(cuò)問(wèn)題
這篇文章主要介紹了Pycharm如何導(dǎo)入python文件及解決報(bào)錯(cuò)問(wèn)題,本文通過(guò)示例截圖相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05
Python安裝Scrapy庫(kù)的常見(jiàn)報(bào)錯(cuò)解決
本文主要介紹了Python安裝Scrapy庫(kù)的常見(jiàn)報(bào)錯(cuò)解決,文中通過(guò)圖文示例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-11-11
python非阻塞式后臺(tái)如何運(yùn)行bat腳本
這篇文章主要介紹了python非阻塞式后臺(tái)如何運(yùn)行bat腳本問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06
爬蟲(chóng)框架 Feapder 和 Scrapy 的對(duì)比分析
本篇文章在源碼層面比對(duì) feapder、scrapy 、scrapy-redis 的設(shè)計(jì),閱讀本文后,會(huì)加深您對(duì) scrapy 以及 feapder 的了解,以及為什么推薦使用 feapder,剛興趣的朋友可以參考下面文章內(nèi)容2021-09-09

