監(jiān)控模板實(shí)戰(zhàn):SNMP協(xié)議與LLD端口發(fā)現(xiàn)避坑指南)
簡(jiǎn)介面向Zabbix網(wǎng)絡(luò)運(yùn)維人員的交換機(jī)監(jiān)控模板資源解決手動(dòng)配置SNMP監(jiān)控項(xiàng)繁瑣、效率低的問(wèn)題。壓縮包內(nèi)共2個(gè)XML模板文件整體僅3KB分別適用于SNMP v1與v2公共協(xié)議便于兼容不同交換機(jī)的SNMP配置環(huán)境。模板預(yù)設(shè)了端口入/出帶寬、接口狀態(tài)、丟包率、錯(cuò)誤統(tǒng)計(jì)等常見(jiàn)監(jiān)控項(xiàng)導(dǎo)入Zabbix并關(guān)聯(lián)主機(jī)后即可自動(dòng)生成對(duì)應(yīng)指標(biāo)采集、閾值觸發(fā)器和可視化圖形幫助運(yùn)維團(tuán)隊(duì)快速掌握設(shè)備運(yùn)行狀況既可用于日常健康監(jiān)測(cè)也可在故障排查時(shí)快速定位異常端口。模板基于公共社區(qū)字符串設(shè)計(jì)默認(rèn)端口161可批量納管多臺(tái)交換機(jī)通過(guò)預(yù)定義告警規(guī)則能對(duì)接口宕機(jī)、帶寬突增等異常及時(shí)發(fā)送通知。資源同時(shí)提示SNMP版本差異若網(wǎng)絡(luò)環(huán)境安全要求較高建議優(yōu)先采用具備身份驗(yàn)證與加密能力的v3而v1/v2適用于內(nèi)網(wǎng)或低敏感場(chǎng)景。目前已有2790人學(xué)習(xí)下載文件結(jié)構(gòu)清晰、體量輕量適合需要快速上手Zabbix交換機(jī)監(jiān)控的入門(mén)運(yùn)維人員也可為有經(jīng)驗(yàn)的管理員提供模板編寫(xiě)與排錯(cuò)參考。1. zabbix_交換機(jī)模板把一臺(tái)臺(tái)手工登錄的網(wǎng)管設(shè)備變成平臺(tái)自動(dòng)納管網(wǎng)絡(luò)工程師最容易遇到的一件難受事不是交換機(jī)壞了而是“壞的時(shí)候你才知道它壞了”。zabbix_交換機(jī)模板這個(gè)項(xiàng)目做的就是給 Zabbix 監(jiān)控平臺(tái)補(bǔ)上一套專(zhuān)門(mén)面向交換機(jī)的監(jiān)控能力不裝 agent、不靠 SSH 一條條抓命令而是統(tǒng)一走 SNMP 協(xié)議把華為、H3C、銳捷這些網(wǎng)管型交換機(jī)納管進(jìn)來(lái)一次把模板調(diào)好之后每新增一臺(tái)設(shè)備就復(fù)制一臺(tái)主機(jī)端口狀態(tài)、流量、CPU、光模塊信息自動(dòng)出現(xiàn)在同一個(gè)大屏里。對(duì)正在搭運(yùn)維監(jiān)控、又不想寫(xiě)一堆腳本輪詢(xún)的人來(lái)說(shuō)這套方案能直接把“手工登錄看交換機(jī)狀態(tài)”變成“告警主動(dòng)找上門(mén)”。這篇筆記從協(xié)議選型講到模板導(dǎo)入、LLD 端口發(fā)現(xiàn)最后是生產(chǎn)環(huán)境里最容易翻車(chē)的幾個(gè)坑。2. 用 SNMP 而不是 agent交換機(jī)模板的協(xié)議選型與監(jiān)控項(xiàng)基本盤(pán)2.1 為什么交換機(jī)監(jiān)控幾乎不用 Zabbix agentZabbix 常規(guī)的監(jiān)控路徑是往 Linux 或 Windows 主機(jī)上裝一個(gè) agent由 agent 把系統(tǒng)指標(biāo)上報(bào)給 server。但交換機(jī)是另一類(lèi)設(shè)備大部分交換機(jī)的操作系統(tǒng)是廠(chǎng)商私有固件不開(kāi)放 arbitrary 軟件安裝哪怕少數(shù)型號(hào)支持 Python 腳本也不會(huì)為監(jiān)控平臺(tái)單獨(dú)跑一個(gè) agent 進(jìn)程。所以交換機(jī)的監(jiān)控在協(xié)議層面基本只有一條主流路線(xiàn)——SNMP簡(jiǎn)單網(wǎng)絡(luò)管理協(xié)議端口 161/UDP由設(shè)備內(nèi)置的 SNMP agent 響應(yīng)查詢(xún)。Zabbix 對(duì) SNMP 的支持非常成熟模板本質(zhì)上就是一組預(yù)定義好的 SNMP OID 集合套上設(shè)備地址和 community 就能采集。SNMP 還有一個(gè)天然優(yōu)勢(shì)廠(chǎng)商基本把交換機(jī)所有對(duì)外可見(jiàn)的硬件狀態(tài)都掛在 MIB 樹(shù)上了從 CPU 利用率、內(nèi)存占用、端口收發(fā)計(jì)數(shù)到風(fēng)扇轉(zhuǎn)速、溫度、光模塊收發(fā)功率。這意味著只要 MIB 樹(shù)里有的信息Zabbix 就能收不用等廠(chǎng)商為 Zabbix 專(zhuān)門(mén)寫(xiě)插件。Zabbix agent 辦不到的事SNMP 模板反而辦得更干凈。2.2 模板里到底有什么五類(lèi)監(jiān)控項(xiàng)按需決定留還是刪打開(kāi)一個(gè)成熟的 zabbix_交換機(jī)模板你會(huì)發(fā)現(xiàn)監(jiān)控項(xiàng)并不是隨便堆的大致分成五類(lèi)我這里給你一張可以直接用的分類(lèi)表監(jiān)控項(xiàng)分組典型數(shù)據(jù)來(lái)源作用模板里默認(rèn)保留建議設(shè)備存活I(lǐng)CMP ping、sysUpTime判斷交換機(jī)是否在線(xiàn)、是否重啟過(guò)務(wù)必保留系統(tǒng)資源CPU 利用率、內(nèi)存利用率判斷設(shè)備是否過(guò)載務(wù)必保留閾值要按廠(chǎng)商建議調(diào)接口狀態(tài)ifOperStatus、ifAdminStatus端口 Up/Down、管理員是否手動(dòng)禁用務(wù)必保留這是交換機(jī)最核心的監(jiān)控接口流量ifHCInOctets、ifHCOutOctets端口出入帶寬務(wù)必保留注意選 64 位計(jì)數(shù)器光模塊/溫度廠(chǎng)商私有 MIB如華為的實(shí)體傳感器光功率、溫度、電壓視型號(hào)保留默認(rèn)模板不一定覆蓋我一般拿到模板第一步不是直接關(guān)聯(lián)到所有交換機(jī)而是先展開(kāi)模板看兩個(gè)地方第一流量相關(guān)的監(jiān)控項(xiàng)是不是用的 ifHCInOctets 這種 64 位計(jì)數(shù)器第二接口發(fā)現(xiàn)用的是 ifIndex 還是 ifDescr。這兩點(diǎn)直接決定你后面會(huì)不會(huì)半夜被誤報(bào)吵醒具體原因到第 5 章細(xì)說(shuō)。前一類(lèi)錯(cuò)了流量圖會(huì)出現(xiàn)負(fù)值和尖刺后一類(lèi)錯(cuò)了交換機(jī)重啟后端口監(jiān)控可能直接張冠李戴。模板里少量不必要的項(xiàng)刪掉也沒(méi)有問(wèn)題比如不監(jiān)控 VoIP 語(yǔ)音 VLAN 的話(huà)和語(yǔ)音相關(guān)的 MIB 監(jiān)控項(xiàng)可以直接禁用減少不必要的 SNMP 輪詢(xún)壓力。2.3 先做 SNMP 握手再改模板三個(gè)命令判斷設(shè)備 MIB 是否正常模板關(guān)聯(lián)到設(shè)備之前一定要先確認(rèn)交換機(jī)的 SNMP 服務(wù)真的能通。常見(jiàn)做法不是直接去 Zabbix 前端測(cè)試而是在你本機(jī)先裝好 snmp 工具包用命令行做一次握手。以一臺(tái)華為交換機(jī)為例先看系統(tǒng)基本信息# 語(yǔ)法: snmpget -v版本 -c community 交換機(jī)IP OID snmpget -v2c -c Zabbix2024 192.168.10.1 1.3.6.1.2.1.1.1.0這里的-v2c表示使用 SNMP v2c 協(xié)議-c Zabbix2024是交換機(jī)上配置的只讀 community 字符串1.3.6.1.2.1.1.1.0是 sysDescr 的 OID返回內(nèi)容應(yīng)該是“Huawei Versatile Routing Platform Software”之類(lèi)的設(shè)備描述。能返回就說(shuō)明基礎(chǔ)通路沒(méi)問(wèn)題。接著查一下接口表能不能正常枚舉這決定后面 LLD 端口發(fā)現(xiàn)是否可行# 枚舉交換機(jī)所有物理和虛擬接口的 ifName snmpwalk -v2c -c Zabbix2024 192.168.10.1 1.3.6.1.2.1.31.1.1.1.1這條命令會(huì)列出一串接口名比如 GigabitEthernet0/0/1、Vlanif10、NULL0 等等。如果你只關(guān)心接口名是否齊全這步足夠了。如果你還要驗(yàn)證光模塊的 OID 是否可用就用 snmpwalk 去探測(cè)廠(chǎng)商私有節(jié)點(diǎn)。但廠(chǎng)商私有 MIB 節(jié)點(diǎn)在不同型號(hào)上差異很大不要直接照抄網(wǎng)上的 OID正確做法是先下載對(duì)應(yīng)型號(hào)的 MIB 文件再用snmptranslate或snmpwalk定位傳感器節(jié)點(diǎn)。沒(méi)有做這步握手就導(dǎo)入模板最常見(jiàn)的后果是模板里的監(jiān)控項(xiàng)全部報(bào)“Not supported”前端的報(bào)錯(cuò)能刷一整頁(yè)。3. 把模板落到設(shè)備上導(dǎo)入模板、關(guān)聯(lián)主機(jī)、交換機(jī)側(cè) SNMP 配置3.1 從官方模板倉(cāng)庫(kù)拿到 XML 之后的三個(gè)動(dòng)作Zabbix 官方維護(hù)了一套面向網(wǎng)絡(luò)設(shè)備的模板倉(cāng)庫(kù)里面就有專(zhuān)門(mén)為交換機(jī)設(shè)計(jì)的模板比如 “Template Network Generic by SNMP” 這類(lèi)。拿到 XML 文件后我不建議立刻上傳先做三個(gè)動(dòng)作第一用文本編輯器打開(kāi)掃一眼模板里是否包含ifHCInOctets和ifHCOutOctets兩個(gè)關(guān)鍵監(jiān)控項(xiàng)鍵值防止拿到的是個(gè)閹割版第二確認(rèn)模板里的宏定義了哪些比如{$SNMP_COMMUNITY}、{$IFNAME_MATCHES}、{$IFNAME_NOT_MATCHES}這些宏后面要在主機(jī)級(jí)別覆蓋第三把原始 XML 備份一份到本地模板升級(jí)前后要能對(duì)比差異。導(dǎo)入動(dòng)作本身很簡(jiǎn)單在 Zabbix 前端進(jìn)入 “Data collection → Templates”點(diǎn)右上角 “Import”選擇 XML 文件導(dǎo)入后會(huì)提示成功或報(bào)錯(cuò)。報(bào)錯(cuò)最常見(jiàn)的原因是模板依賴(lài)的另一個(gè)模板不存在比如模板聲明依賴(lài) “Template Module Interfaces” 而你沒(méi)一起導(dǎo)入。這時(shí)別慌去模板倉(cāng)庫(kù)把依賴(lài)模板一并下載導(dǎo)入即可一般情況下官方會(huì)把依賴(lài)關(guān)系寫(xiě)在模板描述里。3.2 交換機(jī)側(cè) SNMP 配置華為命令行與 H3C 命令行對(duì)照模板準(zhǔn)備好之后還得讓交換機(jī)愿意被讀。華為和 H3C 的命令行習(xí)慣不一樣我列出最常見(jiàn)的最小配置以只讀 communityZabbix2024為例。華為 VRP 平臺(tái)交換機(jī)上# 進(jìn)入系統(tǒng)視圖 system-view # 啟用 SNMP v2c同時(shí)保留 v3 不開(kāi)啟以免兼容性問(wèn)題 snmp-agent sys-info version v2c # 配置只讀 community snmp-agent community read cipher Zabbix2024 # 只允許 Zabbix server 的 IP 訪(fǎng)問(wèn) SNMP 服務(wù) acl number 2001 rule 5 permit source 192.168.100.10 0 quit snmp-agent community read cipher Zabbix2024 acl 2001這里的cipher關(guān)鍵字表示在配置文件中加密存儲(chǔ) community防止別人登錄設(shè)備后直接看到明文。ACL 限制來(lái)源是為了避免 community 泄露后被內(nèi)網(wǎng)任意機(jī)器輪詢(xún)這在辦公網(wǎng)里尤其重要。配置完成后可以用display snmp-agent community查看當(dāng)前生效的 community 列表確認(rèn)無(wú)誤。H3C Comware 平臺(tái)的交換機(jī)配置思路相同但關(guān)鍵字有差異system-view snmp-agent sys-info version v2c snmp-agent community read simple Zabbix2024 acl basic 2001 rule 0 permit source 192.168.100.10 0 quit snmp-agent community read simple Zabbix2024 acl 2001H3C 用的是simple而不是cipher表示 community 以明文顯示這是兩個(gè)平臺(tái)最容易搞混的地方。另外華為有些老款交換機(jī)默認(rèn)snmp-agent沒(méi)啟用需要先執(zhí)行snmp-agent再配置其他參數(shù)。這些命令只是最小可用配置生產(chǎn)環(huán)境里如果你的交換機(jī)開(kāi)啟了 SNMP v3建議直接走 v3 用戶(hù)認(rèn)證Zabbix 模板同樣支持只是需要在主機(jī)配置里選擇安全級(jí)別并填入用戶(hù)名、上下文等參數(shù)比 v2c 多幾步但安全性高一個(gè)量級(jí)。3.3 創(chuàng)建主機(jī)并關(guān)聯(lián)模板頁(yè)面操作和 API 腳本兩種路線(xiàn)交換機(jī)側(cè)的 SNMP 就緒后回到 Zabbix 前端創(chuàng)建一臺(tái)主機(jī)。主機(jī)類(lèi)型選 “SNMP”IP 地址填交換機(jī)管理地址端口默認(rèn) 161。關(guān)鍵一步是在 “Macros” 標(biāo)簽頁(yè)里新增一個(gè)宏{$SNMP_COMMUNITY}值填Zabbix2024這一步容易被忽略——如果你不填模板會(huì)嘗試用模板里默認(rèn)的 community通常是public和交換機(jī)實(shí)際配置對(duì)不上監(jiān)控項(xiàng)全部報(bào)錯(cuò)。填完宏之后在 “Templates” 標(biāo)簽頁(yè)鏈接你導(dǎo)入的交換機(jī)模板保存即可。保存后不要立刻看數(shù)據(jù)等兩分鐘讓 Zabbix 完成第一次輪詢(xún)?cè)龠M(jìn) “Monitoring → Latest data” 看結(jié)果。如果你需要一次性接入幾十臺(tái)交換機(jī)前端一臺(tái)臺(tái)點(diǎn)太慢可以用 Zabbix API 腳本來(lái)做。常見(jiàn)做法是寫(xiě)一個(gè) bash 腳本用 curl 調(diào) API 創(chuàng)建主機(jī)并關(guān)聯(lián)模板。下面是核心的請(qǐng)求體# 用 curl 調(diào)用 Zabbix API 創(chuàng)建主機(jī)并關(guān)聯(lián)模板 curl -s -X POST http://192.168.100.10/api_jsonrpc.php \ -H Content-Type: application/json \ -d { jsonrpc: 2.0, method: host.create, params: { host: sw-core-01, interfaces: [{ type: 2, main: 1, ip: 192.168.10.1, dns: , port: 161, details: {version: 2c, community: {$SNMP_COMMUNITY}} }], templates: [{templateid: 10001}], macros: [{ macro: {$SNMP_COMMUNITY}, value: Zabbix2024 }] }, auth: your-auth-token, id: 1 }代碼里type: 2表示 SNMP 接口類(lèi)型templateid需要先從template.get接口查到實(shí)際 IDmacros數(shù)組里定義了主機(jī)級(jí)別宏。注意 curl 的-d參數(shù)里不要用單引號(hào)包 JSON 時(shí)出現(xiàn)未轉(zhuǎn)義字符建議把 JSON 寫(xiě)入文件再用-d body.json方式提交避免轉(zhuǎn)義地獄。這樣批量創(chuàng)建主機(jī)的速度比前端點(diǎn)按快很多而且可以配合host.get接口做冪等判斷已經(jīng)存在的設(shè)備就直接跳過(guò)。4. 模板的靈魂是 LLD端口自動(dòng)發(fā)現(xiàn)、宏映射與過(guò)濾規(guī)則4.1 發(fā)現(xiàn)規(guī)則讓 Zabbix 自己把交換機(jī)所有接口摸出來(lái)交換機(jī)模板和服務(wù)器模板最大的一點(diǎn)不同就是它必須依賴(lài) LLDLow Level Discovery。一臺(tái) 48 口交換機(jī)有幾十個(gè)接口不可能人肉一個(gè)個(gè)添加監(jiān)控項(xiàng)而且不同型號(hào)接口數(shù)量還不一樣。LLD 規(guī)則就是讓 Zabbix 周期性地去讀ifTable或ifXTable這張接口表自動(dòng)把每個(gè)接口“發(fā)現(xiàn)”出來(lái)再根據(jù)模板里的“監(jiān)控項(xiàng)原型”自動(dòng)生成每個(gè)接口對(duì)應(yīng)的監(jiān)控項(xiàng)、觸發(fā)器和圖形。LLD 規(guī)則本身也是模板里的一部分導(dǎo)入模板時(shí)自動(dòng)就有了。Zabbix 官方模板里 LLD 規(guī)則的鍵值通常是net.if.discovery它內(nèi)部封裝了讀取1.3.6.1.2.1.31.1.1這段 OID 的邏輯。這個(gè)規(guī)則運(yùn)行后Zabbix 會(huì)把每個(gè)接口的ifIndex、ifName、ifDescr、ifAlias、ifOperStatus等屬性抓回來(lái)作為后續(xù)宏映射的數(shù)據(jù)源。默認(rèn)情況下 LLD 規(guī)則的更新周期我不會(huì)用 1 小時(shí)以?xún)?nèi)的值因?yàn)榻涌诹斜砘竟潭ㄌl繁的掃描徒增交換機(jī) CPU 壓力。4.2 宏映射與監(jiān)控項(xiàng)原型端口 Down 報(bào)警是怎么自動(dòng)生成的發(fā)現(xiàn)規(guī)則拿到接口列表之后最關(guān)鍵的一步就落到了“宏映射”上。一個(gè)接口在 Zabbix 內(nèi)部需要有穩(wěn)定標(biāo)識(shí)常見(jiàn)的宏有{#SNMPINDEX}、{#IFNAME}、{#IFDESCR}。官方模板的默認(rèn)映射是{#IFNAME}映射到ifName{#SNMPINDEX}映射到ifIndex。monitoring 項(xiàng)原型的鍵里會(huì)引用這些宏例如端口出入流量的監(jiān)控項(xiàng)原型鍵可以寫(xiě)成net.if.in[ifHCInOctets.{#IFNAME}]和net.if.out[ifHCOutOctets.{#IFNAME}]。宏在運(yùn)行時(shí)會(huì)自動(dòng)替換成實(shí)際值這樣每個(gè)接口都會(huì)生成一對(duì)獨(dú)立的流量監(jiān)控項(xiàng)。舉個(gè)模板 XML 里的片段幫助你理解原型的結(jié)構(gòu)item_prototype nameInterface {#IFNAME}: Inbound traffic/name typeSNMP_AGENT/type keynet.if.in[ifHCInOctets.{#IFNAME}]/key delay60s/delay history31d/history trends365d/trends valuemapNone/valuemap unitsbps/units preprocessing step typeCHANGE_PER_SECOND/type params8/params /step /preprocessing master_itemNone/master_item /item_prototype注意這里有個(gè)關(guān)鍵預(yù)處理CHANGE_PER_SECOND和參數(shù)8。SNMP 計(jì)數(shù)器拿到的原始數(shù)字是累計(jì)字節(jié)數(shù)要變成流量速率必須做差分換算乘以 8 轉(zhuǎn)成比特。如果不做這層預(yù)處理圖形上顯示的會(huì)是累計(jì)字節(jié)不斷增長(zhǎng)的曲線(xiàn)而不是帶寬曲線(xiàn)也不會(huì)有速率峰值。這個(gè)預(yù)處理步驟是官方模板里最容易在導(dǎo)入后被“優(yōu)化”掉的某些人嫌模板太復(fù)雜把預(yù)處理刪了最后流量圖完全沒(méi)法看。除了監(jiān)控項(xiàng)原型模板里還帶觸發(fā)器原型。比如端口 Down 的觸發(fā)器原型邏輯就是檢測(cè)ifOperStatus變?yōu)?2down時(shí)觸發(fā)告警表達(dá)式大致形態(tài)如下last(/host/net.if.status[{#IFNAME}],0)2這里的{HOST.HOST}在真實(shí)模板中會(huì)被主機(jī)的技術(shù)名稱(chēng)替換{#IFNAME}會(huì)被具體的接口名替換。觸發(fā)器原型的好處是它和檢測(cè)項(xiàng)一起隨 LLD 自動(dòng)創(chuàng)建不需要你手動(dòng)給每個(gè)端口建一條告警規(guī)則。實(shí)際導(dǎo)出模板時(shí)你會(huì)看到觸發(fā)器原型的表達(dá)式里還帶了{(lán)$IFSTATUS_CRITICAL}這樣的宏方便在不同交換機(jī)上覆蓋閾值。生產(chǎn)環(huán)境里我一般會(huì)把 MTU 相關(guān)的接口狀態(tài)排除在觸發(fā)器之外避免有人改了 MTU 配置導(dǎo)致誤報(bào)。4.3 過(guò)濾規(guī)則把 Vlanif、NULL0 這些虛擬接口擋在監(jiān)控外面LLD 發(fā)現(xiàn)的是交換機(jī)的全部接口而交換機(jī)的接口不等于物理口。一臺(tái)交換機(jī)上可能有十幾個(gè) Vlanif 虛擬接口、NULL0、LoopBack、隧道口這些接口大多不需要監(jiān)控流量和狀態(tài)如果全部納入告警噪音會(huì)非常大。模板里 LLD 規(guī)則帶了一個(gè)過(guò)濾條件就是用來(lái)干這個(gè)的。過(guò)濾規(guī)則的常見(jiàn)寫(xiě)法是按接口名做正則以匹配({#IFNAME} not like Vlanif and {#IFNAME} not like Vlan and {#IFNAME} not like NULL and {#IFNAME} not like LoopBack)同時(shí)再配合包含規(guī)則確認(rèn)接入類(lèi)型比如({#IFNAME} matches ^(GigabitEthernet|XGE|Eth|GE|Ten-GigabitEthernet|HundredGE))第一段過(guò)濾掉虛擬接口第二段只保留物理以太網(wǎng)口。注意兩個(gè)條件之間用 and 連接缺一不可否則要么虛擬接口混進(jìn)來(lái)要么物理口被誤殺。不同廠(chǎng)商的接口命名前綴差異很大華為用 GigabitEthernet、EthH3C 也用 GigabitEthernet銳捷可能是 Gi 前綴。你在寫(xiě)過(guò)濾正則前建議先用 4.3 節(jié)的 snmpwalk 那條命令把實(shí)際接口名拉一遍再照著真實(shí)命名寫(xiě)正則不要憑空猜。過(guò)濾規(guī)則寫(xiě)錯(cuò)最典型的現(xiàn)象是模板關(guān)聯(lián)后某一臺(tái)交換機(jī)上所有端口監(jiān)控項(xiàng)全部消失該設(shè)備前端顯示“接口數(shù) 0”。5. 交換機(jī)模板上線(xiàn)后的 5 個(gè)高頻翻車(chē)點(diǎn)與避坑方案5.1 ifIndex 漂移交換機(jī)重啟后端口監(jiān)控全對(duì)不上現(xiàn)象一臺(tái) H3C 交換機(jī)重啟后原來(lái)接口名對(duì)應(yīng)到監(jiān)控項(xiàng)全亂了流量圖斷掉LLD 重新發(fā)現(xiàn)后又出現(xiàn)一批新的監(jiān)控項(xiàng)舊監(jiān)控項(xiàng)全部變成 “Not supported”。原因如果模板的宏映射使用{#SNMPINDEX}作為主鍵而設(shè)備在重啟或配置變更后 ifIndex 重新分配同一個(gè)物理口對(duì)應(yīng)的 ifIndex 變了數(shù)據(jù)就對(duì)不上了。解決不要用 ifIndex 做唯一主鍵改用{#IFNAME}或{#IFDESCR}作為宏映射主鍵同時(shí)在 LLd 規(guī)則里把周期調(diào)短到 1530 分鐘讓重啟后的設(shè)備盡快重新發(fā)現(xiàn)。我在核心交換機(jī)上還會(huì)手工把端口對(duì)應(yīng)關(guān)系記在 ifAlias 里用{#IFALIAS}做輔助標(biāo)識(shí)值可讀性高排查時(shí)一眼識(shí)別。5.2 32 位計(jì)數(shù)器翻轉(zhuǎn)流量圖出現(xiàn)負(fù)數(shù)與尖峰現(xiàn)象某個(gè)千兆口流量圖偶爾出現(xiàn)很大的負(fù)值或瞬間出現(xiàn) 40Gbps 尖峰然后歸零。原因模板或你手工添加的監(jiān)控項(xiàng)用的是 32 位計(jì)數(shù)器ifInOctets32 位最大計(jì)數(shù)到約 4.2 億字節(jié)千兆口幾分鐘就會(huì)翻轉(zhuǎn)一次翻轉(zhuǎn)瞬間差分計(jì)算得到負(fù)數(shù)。解決統(tǒng)一換成 64 位計(jì)數(shù)器ifHCInOctets/ifHCOutOctets這兩個(gè)是 64 位計(jì)數(shù)萬(wàn)兆口也要很久才翻一次處理代碼上天然規(guī)避問(wèn)題。老舊的百兆交換機(jī)有的不支持 HC 計(jì)數(shù)器那就只能降低輪詢(xún)頻率以緩解翻轉(zhuǎn)速度并接受偶爾數(shù)據(jù)異常這是硬件限制沒(méi)有后悔藥。5.3 光功率監(jiān)控項(xiàng)總是 No data先分清 OID 歸屬現(xiàn)象模板關(guān)聯(lián)后設(shè)備 CPU、流量全部正常但光模塊溫度和光功率的監(jiān)控項(xiàng)全部顯示 “Not supported” 或 “No data”。原因光模塊所在的 MIB 是廠(chǎng)商私有節(jié)點(diǎn)不是 RFC 標(biāo)準(zhǔn)節(jié)點(diǎn)華為和 H3C 的光模塊傳感器 OID 完全不一樣甚至同一廠(chǎng)商不同系列也不一樣。官方通用模板無(wú)法窮舉廠(chǎng)商私有 OID這類(lèi)監(jiān)控項(xiàng)默認(rèn)是缺失的。解決先去下載對(duì)應(yīng)型號(hào)的 MIB 文件用 snmpwalk 探測(cè)光模塊傳感器節(jié)點(diǎn)比如華為部分設(shè)備可以在實(shí)體傳感器 MIB 下找到溫度、電壓、光功率的數(shù)據(jù)確認(rèn) OID 后在模板里復(fù)制一份監(jiān)控項(xiàng)原型改成私有 OID再用主機(jī)宏區(qū)分不同型號(hào)。注意不要照抄網(wǎng)上的 OID 到不同型號(hào)上大概率無(wú)效。5.4 輪詢(xún)頻率太密20 臺(tái)交換機(jī)把監(jiān)控服務(wù)器和網(wǎng)絡(luò)都拖垮現(xiàn)象Zabbix 服務(wù)器 load 飆升交換機(jī) CPU 也跟著高snmpwalk 手動(dòng)執(zhí)行時(shí)響應(yīng)變慢。原因模板里監(jiān)控項(xiàng)更新周期設(shè)成了 10s又開(kāi)了大量 LLD 規(guī)則48 口交換機(jī)每輪光接口監(jiān)控項(xiàng)就有上百條幾十臺(tái)設(shè)備疊加后 SNMP 請(qǐng)求風(fēng)暴打滿(mǎn)網(wǎng)絡(luò)設(shè)備和監(jiān)控服務(wù)器。解決默認(rèn)模板里把普通監(jiān)控項(xiàng)更新周期改到 60sLLD 規(guī)則周期 30 分鐘以上即可。核心交換機(jī)的關(guān)鍵接口可以單獨(dú)復(fù)制一份監(jiān)控項(xiàng)設(shè)成 30s 快速輪詢(xún)但一定不要全局生效。Zabbix 里每個(gè)監(jiān)控項(xiàng)都可以單獨(dú)覆蓋 delay 值這個(gè)能力用得好才能兼顧實(shí)時(shí)性和性能。5.5 community 用 public 還裸奔在整個(gè)網(wǎng)段現(xiàn)象交換機(jī)配置了 SNMP v2ccommunity 是默認(rèn)的public沒(méi)有 ACL 限制幾個(gè)月后發(fā)現(xiàn)交換機(jī) CPU 負(fù)荷高排查發(fā)現(xiàn)有人在全網(wǎng)段掃描 SNMP 端口。原因v2c 是明文協(xié)議community 等于密碼默認(rèn)值毫無(wú)防備掃描器很容易發(fā)現(xiàn)并持續(xù)輪詢(xún)你的設(shè)備。解決社區(qū)字符串改成和密碼同等復(fù)雜度的只讀值比如Zabbix2024#Core同時(shí)在交換機(jī)上配置 ACL 只允許 Zabbix server 的 IP 訪(fǎng)問(wèn) 161 端口前文 4.2 節(jié)已經(jīng)給出了配置示例。如果你設(shè)備和 Zabbix 都支持 SNMP v3建議直接升級(jí) v3用認(rèn)證和加密即便報(bào)文中途被截獲也拿不到明文數(shù)據(jù)。6. 最后一道工序用圖表和觸發(fā)器表達(dá)式給模板做驗(yàn)收模板部署完不等于結(jié)束上線(xiàn)之前一定要做一次完整驗(yàn)收。我最常做的第一步不是看 Latest data而是用圖表原型跑一張流量圖。Zabbix 圖形分為“圖形原型”和“自定義圖形”前者會(huì)隨 LLD 自動(dòng)生成每個(gè)端口的圖后者是手動(dòng)建圖。在模板的 “Graph prototypes” 里確認(rèn)存在類(lèi)似 “Interface {#IFNAME}: Network traffic” 的圖形原型后找到一臺(tái)已關(guān)聯(lián)的交換機(jī)直接打開(kāi)對(duì)應(yīng)接口的圖形看波形是否光滑。如果圖形里有毛刺或負(fù)值回頭看監(jiān)控項(xiàng)預(yù)處理是否缺失。第二步是驗(yàn)證觸發(fā)器表達(dá)式是否誤報(bào)。交換機(jī)模板里最煩的告警是端口 Down 告警接入層辦公網(wǎng)的終端經(jīng)常有人拔網(wǎng)線(xiàn)每拔一次就報(bào)警一次半夜能煩死人。我會(huì)把接入交換機(jī)的模板里端口 Down 觸發(fā)器表達(dá)式加條件比如只在 5 分鐘持續(xù) Down 后才告警而核心交換機(jī)端口 Down 必須立即告警用不同的模板副本區(qū)分接入層和核心層。表達(dá)式形態(tài)參考# 接入層: 持續(xù) 5 分鐘 Down 才告警 last(/sw-access-01/net.if.status[{#IFNAME}],300s)2參數(shù)300s表示最近 300 秒的最后一次值是 2才滿(mǎn)足觸發(fā)條件。換成0就是立即告警核心交換機(jī)用。這樣改完后接入層掉線(xiàn)的誤報(bào)能減少大半核心鏈路的狀態(tài)仍然秒級(jí)感知。這種驗(yàn)證思路同樣適用于其他模板有問(wèn)題先看圖形再看觸發(fā)器歷史最后反查監(jiān)控項(xiàng)鍵值。我自己吃過(guò)最大的虧是把所有交換機(jī)不分角色套同一個(gè)模板結(jié)果機(jī)房維護(hù)時(shí)接入層幾十條端口 Down 告警同時(shí)炸出來(lái)值班手機(jī)卡了五分鐘。后來(lái)把模板拆成 core 和 access 兩個(gè)版核心口用立即告警接入口加 delay世界安靜了。希望這篇筆記里的選型和避坑經(jīng)驗(yàn)?zāi)軒偷侥隳呐轮槐艿?ifIndex 和計(jì)數(shù)器這兩個(gè)坑也算值回票價(jià)。本文還有配套的精品資源點(diǎn)擊獲取