Python利用SNMP與Netmiko實(shí)現(xiàn)網(wǎng)絡(luò)監(jiān)控應(yīng)用實(shí)踐
前言
在數(shù)字化轉(zhuǎn)型浪潮中,網(wǎng)絡(luò)監(jiān)控已成為保障業(yè)務(wù)連續(xù)性的核心環(huán)節(jié)。Python憑借其豐富的網(wǎng)絡(luò)協(xié)議庫(kù)和簡(jiǎn)潔的語(yǔ)法特性,成為構(gòu)建自動(dòng)化監(jiān)控系統(tǒng)的首選工具。本文將深入解析SNMP與Netmiko兩大技術(shù)棧,通過(guò)實(shí)際案例展示如何利用Python實(shí)現(xiàn)高效的網(wǎng)絡(luò)監(jiān)控解決方案。
一、SNMP協(xié)議:網(wǎng)絡(luò)設(shè)備的標(biāo)準(zhǔn)化監(jiān)控語(yǔ)言
1.1 SNMP協(xié)議架構(gòu)解析
SNMP(簡(jiǎn)單網(wǎng)絡(luò)管理協(xié)議)采用管理站-代理模型,核心組件包括:
MIB(管理信息庫(kù)):樹(shù)狀結(jié)構(gòu)存儲(chǔ)設(shè)備參數(shù),如1.3.6.1.2.1.1.5對(duì)應(yīng)設(shè)備名稱(chēng)[1][4]
協(xié)議版本演進(jìn):
- SNMPv1:基礎(chǔ)版本,存在明文傳輸安全隱患[1]
- SNMPv2c:增強(qiáng)批量操作(GETBULK),支持64位計(jì)數(shù)器[1][4]
- SNMPv3:引入U(xiǎn)SM認(rèn)證和VACM訪問(wèn)控制,支持AES加密[1][2][6]
華為NE5000E設(shè)備支持特性對(duì)比:
| 特性 | SNMPv1/v2c | SNMPv3 |
|---|---|---|
| 訪問(wèn)控制 | 團(tuán)體名 | 基于用戶組 |
| 加密方式 | 不支持 | AES/3DES/DES |
| 錯(cuò)誤碼數(shù)量 | 6種 | 16種 |
| Trap告警 | 支持 | 支持(需確認(rèn)) |
1.2 Python實(shí)現(xiàn)SNMP監(jiān)控
使用pysnmp庫(kù)實(shí)現(xiàn)設(shè)備狀態(tài)監(jiān)控:
from pysnmp.hlapi import *
def get_snmp_data(ip, community, oids):
results = []
for oid in oids:
error_indication, error_status, error_index, var_binds = next(
getCmd(SnmpEngine(),
CommunityData(community),
UdpTransportTarget((ip, 161)),
ContextData(),
ObjectType(ObjectIdentity(oid)))
)
if error_indication:
print(f"Error: {error_indication}")
elif error_status:
print(f"Error: {error_status}")
else:
for var_bind in var_binds:
results.append((str(var_bind[0]), str(var_bind[1])))
return results
# 監(jiān)控Cisco交換機(jī)CPU和內(nèi)存
devices = [{"ip": "192.168.1.1", "community": "public"}]
oids = [
"1.3.6.1.4.1.9.9.109.1.1.1.1.6.1", # CPU 5分鐘利用率
"1.3.6.1.4.1.9.9.48.1.1.1.6.1" # 內(nèi)存使用率
]
for device in devices:
data = get_snmp_data(device["ip"], device["community"], oids)
print(f"\n{device['ip']} 狀態(tài):")
for oid, value in data:
if "109.1.1.1.6" in oid:
print(f"CPU 5分鐘平均: {int(value)}%")
elif "48.1.1.1.6" in oid:
print(f"內(nèi)存使用: {int(value)/1000000:.2f}MB")
1.3 高級(jí)應(yīng)用場(chǎng)景
- 批量配置:通過(guò)SET操作修改設(shè)備參數(shù)(需SNMPv3認(rèn)證)
- Trap接收:使用
pysnmp.carrier.asyncore模塊構(gòu)建Trap監(jiān)聽(tīng)服務(wù) - 性能優(yōu)化:GETBULK操作批量獲取接口流量數(shù)據(jù),減少網(wǎng)絡(luò)交互次數(shù)[4]
二、Netmiko庫(kù):SSH協(xié)議的網(wǎng)絡(luò)設(shè)備管家
2.1 Netmiko核心優(yōu)勢(shì)
相較于Paramiko,Netmiko提供:
- 廠商適配:支持Cisco、Huawei、Juniper等30+廠商設(shè)備[7][12]
- 協(xié)議增強(qiáng):自動(dòng)處理分頁(yè)、特權(quán)模式切換
- 配置管理:內(nèi)置
send_config_set()方法實(shí)現(xiàn)原子化配置
設(shè)備支持矩陣:
| 設(shè)備類(lèi)型 | 支持型號(hào) | 特殊功能 |
|---|---|---|
| Cisco | IOS, IOS-XE, NX-OS | 配置回滾 |
| Huawei | VRPV5, VRPV8 | 棧式設(shè)備管理 |
| H3C | Comware V5, V7 | 多線程備份 |
2.2 自動(dòng)化配置實(shí)踐
華為交換機(jī)批量改名示例:
from netmiko import ConnectHandler
def rename_device(ip, new_name):
huawei = {
'device_type': 'huawei',
'host': ip,
'username': 'admin',
'password': 'password',
'port': 8022
}
try:
with ConnectHandler(**huawei) as conn:
# 進(jìn)入系統(tǒng)視圖
conn.write_channel("system-view\n")
# 修改設(shè)備名稱(chēng)(遵循<位置>-<類(lèi)型>-<序列號(hào)>規(guī)則)
conn.write_channel(f"sysname {new_name}\n")
# 保存配置
conn.write_channel("save\n")
conn.write_channel("y\n")
print(f"{ip} 重命名成功")
except Exception as e:
print(f"{ip} 配置失敗: {str(e)}")
# 批量執(zhí)行
devices = [
{"ip": "192.168.1.10", "new_name": "SH-Core-SW-001"},
{"ip": "192.168.1.11", "new_name": "SH-Core-SW-002"}
]
for device in devices:
rename_device(device["ip"], device["new_name"])
2.3 高級(jí)運(yùn)維技巧
- 多線程并行:使用
concurrent.futures實(shí)現(xiàn)10+設(shè)備同時(shí)配置 - 配置驗(yàn)證:通過(guò)
send_command("display current-configuration")獲取運(yùn)行配置 - 異常處理:捕獲
NetmikoTimeoutException處理連接超時(shí)
三、SNMP與Netmiko的協(xié)同應(yīng)用
3.1 混合監(jiān)控架構(gòu)

3.2 典型應(yīng)用場(chǎng)景
1.故障快速定位:
- SNMP檢測(cè)接口Down事件
- Netmiko自動(dòng)登錄設(shè)備獲取詳細(xì)日志
2.容量規(guī)劃:
- SNMP采集接口流量歷史數(shù)據(jù)
- Netmiko執(zhí)行
show interface獲取實(shí)時(shí)錯(cuò)誤包統(tǒng)計(jì)
3.安全審計(jì):
- SNMPv3加密傳輸敏感數(shù)據(jù)
- Netmiko定期備份配置文件并計(jì)算哈希值校驗(yàn)
四、性能優(yōu)化與最佳實(shí)踐
4.1 監(jiān)控系統(tǒng)調(diào)優(yōu)
SNMP優(yōu)化:
- 調(diào)整輪詢間隔(建議5-15分鐘)
- 使用GETBULK替代多個(gè)GET操作
- 部署分布式SNMP代理減輕主設(shè)備負(fù)擔(dān)
Netmiko優(yōu)化:
# 使用連接池管理會(huì)話
from netmiko import Netmiko
from queue import Queue
def worker(q, results):
while True:
device = q.get()
try:
with Netmiko(**device) as conn:
output = conn.send_command("show version")
results.append((device["host"], output))
except Exception as e:
results.append((device["host"], str(e)))
q.task_done()
devices = [...] # 設(shè)備列表
q = Queue(maxsize=10)
results = []
for _ in range(5): # 5個(gè)工作線程
threading.Thread(target=worker, args=(q, results)).start()
for device in devices:
q.put(device)
q.join()
4.2 安全加固建議
SNMP安全:
- 禁用SNMPv1/v2c(如必須使用,限制訪問(wèn)IP)
- SNMPv3配置強(qiáng)認(rèn)證(SHA-256)和加密(AES-256)[6]
- 定期輪換USM用戶密碼
Netmiko安全:
- 使用SSH密鑰認(rèn)證替代密碼
- 限制特權(quán)模式執(zhí)行權(quán)限
- 審計(jì)配置變更日志
五、未來(lái)技術(shù)趨勢(shì)
SNMP演進(jìn)方向:
- 與Telemetry技術(shù)融合,實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)流傳輸
- 增強(qiáng)對(duì)SDN環(huán)境的支持
- 集成AI算法實(shí)現(xiàn)異常檢測(cè)
Netmiko發(fā)展:
- 增加對(duì)5G設(shè)備的支持
- 優(yōu)化RESTCONF/gNMI協(xié)議集成
- 開(kāi)發(fā)可視化配置編排界面
Python在網(wǎng)絡(luò)監(jiān)控領(lǐng)域展現(xiàn)出強(qiáng)大的生態(tài)優(yōu)勢(shì),SNMP與Netmiko的組合覆蓋了從數(shù)據(jù)采集到配置管理的全鏈路需求。通過(guò)合理運(yùn)用這兩種技術(shù),企業(yè)可以構(gòu)建高可用、易擴(kuò)展的自動(dòng)化監(jiān)控體系。建議運(yùn)維團(tuán)隊(duì)定期參與IETF標(biāo)準(zhǔn)更新培訓(xùn),及時(shí)掌握SNMPv3新特性,同時(shí)關(guān)注Netmiko社區(qū)發(fā)布的廠商適配更新,持續(xù)提升網(wǎng)絡(luò)管理效率。
到此這篇關(guān)于Python利用SNMP與Netmiko實(shí)現(xiàn)網(wǎng)絡(luò)監(jiān)控應(yīng)用實(shí)踐的文章就介紹到這了,更多相關(guān)Python網(wǎng)絡(luò)監(jiān)控內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python利用pandas對(duì)數(shù)據(jù)進(jìn)行特定排序
本文主要介紹了Python利用pandas對(duì)數(shù)據(jù)進(jìn)行特定排序,主要使用?pandas.DataFrame.sort_values?方法,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-03-03
Python3如何日志同時(shí)輸出到控制臺(tái)和文件
這篇文章主要介紹了Python3如何日志同時(shí)輸出到控制臺(tái)和文件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
Appium+python自動(dòng)化怎么查看程序所占端口號(hào)和IP
這篇文章主要介紹了Appium+python自動(dòng)化怎么查看程序所占端口號(hào)和IP,本文以FQ工具 Lantern 為例,通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),需要的朋友可以參考下2019-06-06
pycharm安裝教程(下載安裝以及設(shè)置中文界面)
這篇文章主要給大家介紹了關(guān)于pycharm安裝教程,文中包括下載安裝以及設(shè)置中文界面,PyCharm是一款Python IDE,其帶有一整套可以幫助用戶在使用Python語(yǔ)言開(kāi)發(fā)時(shí)提高其效率的工具,需要的朋友可以參考下2023-10-10
Python中輕量級(jí)定時(shí)任務(wù)調(diào)度庫(kù)schedule使用指南
schedule是一款專(zhuān)為簡(jiǎn)化定時(shí)任務(wù)調(diào)度而設(shè)計(jì)的Python庫(kù),它通過(guò)直觀的語(yǔ)法降低了周期性任務(wù)的實(shí)現(xiàn)門(mén)檻,下面小編來(lái)和大家詳細(xì)講講它的具體使用吧2025-05-05
python代碼實(shí)現(xiàn)AVL樹(shù)和紅黑樹(shù)
專(zhuān)注于Python數(shù)據(jù)結(jié)構(gòu),想要深入了解AVL樹(shù)和紅黑樹(shù)的讀者們,你們的機(jī)會(huì)來(lái)了!在這篇指南中,我們將帶你探索這兩種神奇樹(shù)結(jié)構(gòu)的奧秘,緊張刺激的實(shí)戰(zhàn)代碼演示,讓你一窺這兩種樹(shù)的獨(dú)特魅力,準(zhǔn)備好了嗎?讓我們一起踏上這場(chǎng)Python樹(shù)結(jié)構(gòu)之旅!2023-12-12
Python調(diào)用百度AI實(shí)現(xiàn)身份證識(shí)別
這篇文章主要介紹了Python通過(guò)調(diào)用百度AI的文字識(shí)別功能實(shí)現(xiàn)對(duì)身份證進(jìn)行識(shí)別,代碼具有一定的學(xué)習(xí)價(jià)值,感興趣的朋友一起來(lái)看看效果吧2021-12-12

