發現失效後做什麼?IS-IS聯動BFD時的一個bug的全面分析

測試中遇到失效,刪除IS-IS聯動BFD的命令,BFD會話依然up。

確認bug有效性:在這之前IS-IS和BFD會話都正常,IS-IS和BFD的綁定關係也正常。說明配置正確,而且出現失效之前系統處於正常工作狀態。說明這是一個有效的bug。

重現條件總結:對比之前的測試,之前刪除IS-IS聯動BFD的命令,BFD會話是會被刪除的。所以說明這是一個特定條件下觸發的失效。我考慮可能的原因,這個環境裏目前還配置了BGP聯動跨跳BFD。我懷疑是這個因素影響了IS-IS BFD的行爲。刪除BGP+BFD,恢復IS-IS+BFD的環境。然後刪除IS-IS與BFD的綁定,發現IS-IS的BFD會話還是up的。說明不是BGP+BFD的影響。

失效定位:通過查看debug信息發現,IS-IS鄰居保活消息超時down後,認爲並沒有綁定BFD會話,所以控制平面並沒有去通知轉發平面刪除BFD會話。控制平面爲什麼認爲並沒有綁定BFD會話?是誰解綁了BFD會話?在歷史debug信息中查找,發現有打印說明,接口IP地址被人刪除了,控制平面通知轉發平面刪除BFD會話。原來是有人操作了我的環境,刪除了IS-IS接口上的IP地址。但是因爲之前我確信配置沒有問題,所以沒有檢查配置。轉發平面發現有IS-IS鄰居綁定在這個BFD會話上,所以並沒有刪除BFD會話。但是轉發平面卻錯誤的向控制平面返回BFD會話刪除成功的消息。這導致後面IS-IS鄰居down時,沒有再通知轉發平面刪除BFD會話。這樣就定位出了缺陷的原因,也分析出了重現條件。將環境恢復正常後,嘗試重現,確實復現了。所以最終的缺陷是,IS-IS和BFD聯動,先刪除接口IP地址,再刪除IS-IS聯動BFD的命令,BFD會話依然up。

代碼修改思路:刪除IP地址後,就刪除BFD會話。轉發平面刪除BFD會話失敗時,通知控制平面刪除失敗。

其它分析:

是否存在同類問題:我使用腳本測試100次,OSPF都沒有出現問題。因爲OSPF使用IP報文建立鄰居,不像IS-IS直接使用鏈路層報文建立鄰居關係。接口IP地址被刪除時,OSPF會收到通知,所以OSPF會立刻要求解除BFD綁定關係。但是OSPF沒有類似問題的前提是,在控制平面收到假的BFD刪除成功的消息之前,OSPF就將解綁BFD的請求發送給了轉發平面。接下來,我讓OSPF不停地收發大量LSA,使OSPF進程非常繁忙,同時運行腳本反覆測試,發現也會出現類似問題。類似的BGP、RIP、VRRP也存在問題。

用戶現場出現的可能性:不算很高。因爲實際環境中,IP地址規劃好了之後,不會輕易刪除或者修改。

出現之後影響程度和恢復方法:影響不算很大,就是存在一個沒有使用的BFD會話。如果IS-IS再次綁定這個BFD的會話,可以恢復正常工作。但是如果累積了較多的無用的BFD會話,會影響性能和佔用BFD會話的有效容量。

含有此bug的版本操作時的規避手段:刪除IS-IS和BFD的綁定關係之前,不要先刪除接口IP地址。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章