一年前吧,因為這一年來,這個博客都還沒有來過,密碼都忘記了,剛找回來。 有個交換機的自動化工作也已經(jīng)開展起來,模塊也分下去了。其他模塊也就是使用Python開發(fā)即可,但是Rmon和SNMP模塊就遇到了不小的問題。程序如何抓取交換機Trap或者Inform的消息會成為這兩個模塊自動化成敗的關(guān)鍵。SNMPv1和SNMPv2c的Trap還好說,再不濟也可以通過抓包的方式解決。SNMPv2c或者SNMPv3的infrom都需要服務(wù)器有回應(yīng)報文。SNMPv3 Trap或者Infrom如果帶認證和加密的話,你通過抓包根本無法判定到底是因為什么原因的inform或者Trap。那么一個好用的Trap服務(wù)器就顯得尤為重要了,可能看到這里,大家有可能會說,去網(wǎng)上下載啊! 我只想說,如果下的到,也不錯,但是即使有類似于MIB Browser這種現(xiàn)成的工具在手,自動化也是無用的。因為它們一般是圖形化操作的,自動化對于帶GUI的軟件操作本就是個軟肋。所以基本不可行。那么自行研究與開發(fā)就勢在必行了。以下就是我從3月5日開始的研究結(jié)果以及個中心酸與大家做個分享。 網(wǎng)上有一個老外寫的名為pysnmp的庫,這個庫大家使用pip install都可以輕松地安裝。網(wǎng)上也有一個他們寫的Trap服務(wù)器的例子。那么第一步自然是照著例子依葫蘆畫瓢咯。把他們的代碼做了修改成一個類之后,一運行,喜出望外,SNMPv1和SNMPv2c的Trap消息都能夠正常接收了。類似于下圖這個樣子 然而,事情遠沒有想象中的簡單。我發(fā)現(xiàn)pysnmp的代碼庫中,我使用的這個模塊根本就沒辦法得知獲取到的Trap報文的版本。因為它的回調(diào)函數(shù)中傳入的參數(shù)是PDU,PDU你知道是什么吧,它在報文中的位置是在SNMP版本之后啊。也就是說在這個回調(diào)函數(shù)里面我們已經(jīng)看不到SNMP版本了的。沒辦法。而網(wǎng)上關(guān)于此問題的解答為0。網(wǎng)上所謂的pysnmp中文翻譯或者外文資料簡直是一無是處(本想用臟話的,算了。)?,F(xiàn)在想想,我當(dāng)時內(nèi)心還是很強大的,沒有放棄。 于是我準備通過修改pysnmp庫里面的代碼來解決這個問題。那如何解決呢?找到SNMP報文到底是在什么模塊中剝離出整個SNMP的消息體的?,F(xiàn)在看來可能貌似很輕松的樣子,當(dāng)時找起來可真沒那么簡單。最終通過各種定位手法,找到了在engine.py中有這個消息。于是我將整個消息體設(shè)置成了engine類的成員變量,方便我調(diào)用。 這樣我在我自己的代碼中用 當(dāng)我將我們交換機的Trap上報配置成SNMPv3,并且?guī)дJ證加密的時候。這個時候啥都看不到,所以據(jù)初步觀察,應(yīng)該為加密的問題,為了驗證這個結(jié)論,我將交換機配置成SNMPv3只認證不加密。這個時候發(fā)現(xiàn)打印的PDU里面的內(nèi)容就正常了。所以進一步確認了這就是加密的問題。 那么接下來就是看一下這個問題出在哪里了。這個問題出在哪里了。怎么看呢?代碼跟讀是最好也是最笨的方式。依據(jù)自己寫的代碼,然后看到里面引用的一些函數(shù),然后在這些函數(shù)的開始和結(jié)尾分別添加打印信息。運行一次,如果頭尾的打印信息均出現(xiàn)了,說明問題不是出現(xiàn)在這個函數(shù)里面。如果后面的打印信息未出現(xiàn),將后面的打印信息往前移。如果發(fā)現(xiàn)在函數(shù)中引用的另外一個函數(shù)里面出錯,則如前面的步驟繼續(xù),如此循環(huán)往復(fù)。 最終被我發(fā)現(xiàn)了,它的加密方法是存在在它引用的一個mib節(jié)點變量中的。而這些mib文件因為目錄的關(guān)系無法引入。所以這里出現(xiàn)了錯誤。如下圖: 來這些文件按照代碼里面的邏輯應(yīng)當(dāng)是放在這個地方的,然而它放在了那個instance目錄中。所以導(dǎo)致它引入出錯。再次驗證之后,發(fā)現(xiàn)它仍然無法解密PDU,依據(jù)上面的方法繼續(xù)驗證。 還是通過上述的方法,最后找到了解密的地方,原來它一直返回DES對象為None。為什么會是None呢?原來是它try過濾了一下,如果引入失敗,則返回DES對象為None,那么自然解不了密了。于是我嘗試著使用它原本的名稱去網(wǎng)上下載該庫,最后發(fā)現(xiàn)這個庫根本無法使用pip install安裝,能安裝的是Crypto。于是我將此模塊安裝完畢,將加密解密模塊中原本的引入庫文件名稱全換成了這個。終于好了。 這個過程我花了三天時間,而且是在沒有任何人能夠提供指導(dǎo)意見的情況下,沒點毅力還真不行。有些路終歸是要一個人走的,走著走著也就會長大的,做技術(shù)就是這樣。 |
|