發(fā)檢測原理與配置實戰(zhàn):毫秒級故障檢測加速OSPF/BGP/VRRP收斂)
1. 從一個真實運維場景說起B(yǎng)FD到底在解決什么問題如果你做過企業(yè)級網(wǎng)絡(luò)運維大概率遇到過這種讓人血壓升高的場景核心交換機A和B之間跑著OSPF鏈路中間隔了一臺傳輸設(shè)備或者一條運營商專線。某天凌晨兩點專線出現(xiàn)了“單通”故障——A能收到B的報文B收不到A的。OSPF的Hello報文默認(rèn)10秒發(fā)一次Dead Time是40秒。也就是說從故障發(fā)生到OSPF真正感知到鄰居失效最壞情況下要等40秒。這40秒里A還在往B發(fā)數(shù)據(jù)B那邊已經(jīng)收不到了業(yè)務(wù)直接黑洞。40秒對普通辦公網(wǎng)可能還能忍但對金融交易、實時音視頻、工業(yè)控制這類場景40秒足夠造成生產(chǎn)事故。那能不能把OSPF的Hello和Dead Time調(diào)小可以但代價是協(xié)議報文頻率大幅上升CPU和帶寬開銷增加而且OSPF本身的設(shè)計并不適合做毫秒級檢測。BFDBidirectional Forwarding Detection雙向轉(zhuǎn)發(fā)檢測就是為解決這個矛盾而生的。它的核心思路非常清晰把“鏈路故障檢測”這件事從路由協(xié)議里剝離出來交給一個獨立的、輕量的、專門做快速檢測的協(xié)議。BFD只干一件事——用極小的報文、極高的頻率檢測兩個系統(tǒng)之間的雙向轉(zhuǎn)發(fā)路徑是否還活著。一旦發(fā)現(xiàn)不通立刻通知上層協(xié)議OSPF、BGP、靜態(tài)路由、VRRP等讓它們快速收斂。華為設(shè)備上的BFD實現(xiàn)是國內(nèi)企業(yè)網(wǎng)、運營商網(wǎng)絡(luò)里最常見的一種。它的配置邏輯、狀態(tài)機、檢測機制和RFC 5880標(biāo)準(zhǔn)基本一致但在具體命令、默認(rèn)參數(shù)、聯(lián)動方式上有自己的特點。這篇文章就從實際運維角度把華為BFD的檢測原理、配置方法、聯(lián)動場景、排錯技巧完整拆一遍。提示BFD本身不負(fù)責(zé)路由計算也不負(fù)責(zé)鄰居建立。它只是一個“探針”檢測結(jié)果需要聯(lián)動到具體協(xié)議才能產(chǎn)生實際效果。單獨配BFD而不做聯(lián)動等于白配。2. 華為BFD的核心機制拆解為什么它能做到毫秒級檢測2.1 檢測原理三個時間參數(shù)決定一切BFD的檢測速度本質(zhì)上由三個時間參數(shù)決定參數(shù)含義華為默認(rèn)值可調(diào)范圍Desired Min TX Interval本端期望的最小發(fā)送間隔1000ms3ms~1000msRequired Min RX Interval本端要求的最小接收間隔1000ms3ms~1000msDetect Mult檢測倍數(shù)33~50實際生效的發(fā)送間隔取的是本端Desired Min TX Interval和對端Required Min RX Interval中的較大值。實際檢測時間 實際發(fā)送間隔 × Detect Mult。舉個例子本端配Desired Min TX100ms對端配Required Min RX200ms那么實際發(fā)送間隔是200ms。如果Detect Mult3檢測時間就是600ms。也就是說從鏈路真正中斷到BFD感知最壞情況600ms最好情況200ms剛好在檢測窗口內(nèi)沒收到。這個計算邏輯很關(guān)鍵。很多人配BFD的時候只改本端參數(shù)發(fā)現(xiàn)檢測時間沒變就是因為對端的Required Min RX Interval卡住了上限。BFD的參數(shù)協(xié)商是雙向的兩端都要匹配才能達(dá)到預(yù)期效果。2.2 會話建立三次握手與狀態(tài)機華為BFD會話的建立過程遵循標(biāo)準(zhǔn)的狀態(tài)機Down → Init → Up。具體來說本端初始狀態(tài)為Down發(fā)送BFD控制報文攜帶本地Discriminator本地標(biāo)識符和Your Discriminator0。對端收到后如果也處于Down狀態(tài)會回復(fù)一個Init狀態(tài)的報文攜帶自己的Discriminator并把Your Discriminator設(shè)為本端的Discriminator。本端收到Init報文后狀態(tài)切換為Up并發(fā)送Up狀態(tài)的報文。對端收到Up報文后也切換為Up。會話建立完成。這個過程通常在一秒內(nèi)完成。如果兩端狀態(tài)一直卡在Init或者Down常見原因是Discriminator沖突、檢測時間不匹配、或者中間設(shè)備攔截了UDP 3784端口的報文。華為設(shè)備上查看BFD會話狀態(tài)的命令是display bfd session all verbose輸出里會顯示會話的本地標(biāo)識符、遠(yuǎn)端標(biāo)識符、當(dāng)前狀態(tài)、實際發(fā)送間隔、實際檢測時間等信息。這個命令是排錯時第一個要看的。2.3 兩種會話模式控制報文與回聲報文華為BFD支持兩種檢測模式異步模式Asynchronous兩端周期性地互發(fā)BFD控制報文如果一端在檢測時間內(nèi)沒收到對端的報文就認(rèn)為鏈路故障。這是最常用的模式。查詢模式Demand一端發(fā)送查詢報文另一端回復(fù)。這種模式用得少因為需要額外的硬件支持。另外還有回聲功能Echo本端發(fā)送回聲報文對端收到后直接原路返回不需要對端參與BFD狀態(tài)機。回聲模式的檢測速度可以更快但對網(wǎng)絡(luò)路徑的對稱性有要求。華為設(shè)備上可以通過bfd echo-source-ip命令配置回聲源地址。實際項目中異步模式控制報文是絕對主流?;芈暷J街辉谔囟▓鼍跋率褂帽热鐚Χ嗽O(shè)備不支持BFD但需要快速檢測時。2.4 聯(lián)動機制BFD如何通知上層協(xié)議BFD檢測到故障后需要通知上層協(xié)議。華為設(shè)備支持多種聯(lián)動方式BFD與OSPF聯(lián)動BFD會話Down后立即通知OSPFOSPF不需要等Dead Time到期直接斷開鄰居關(guān)系觸發(fā)路由重新計算。BFD與BGP聯(lián)動類似BFD Down后BGP立即撤銷路由。BFD與靜態(tài)路由聯(lián)動BFD Down后靜態(tài)路由從路由表中撤銷。BFD與VRRP聯(lián)動BFD Down后VRRP觸發(fā)主備切換。BFD與接口聯(lián)動BFD Down后接口狀態(tài)變?yōu)镈own。聯(lián)動的本質(zhì)是BFD會話狀態(tài)變化時通過內(nèi)部消息機制通知協(xié)議模塊協(xié)議模塊立即執(zhí)行相應(yīng)動作。這個通知是毫秒級的所以整體收斂時間可以做到百毫秒級別。注意BFD聯(lián)動OSPF時OSPF的鄰居關(guān)系會立即斷開但OSPF本身的路由收斂還需要時間SPF計算、LSA泛洪等。所以端到端的收斂時間 BFD檢測時間 OSPF收斂時間。BFD只是把“檢測”這一環(huán)加速了后面的收斂過程還是要看協(xié)議本身。3. 華為BFD配置實操從單跳檢測到多跳聯(lián)動3.1 單跳檢測配置最基礎(chǔ)的BFD會話單跳檢測是指BFD會話的兩端直接相連中間沒有三層設(shè)備。這是最常見的場景比如兩臺核心交換機之間的互聯(lián)鏈路。配置步驟如下第一端設(shè)備A配置# 進(jìn)入系統(tǒng)視圖 system-view # 使能BFD功能 bfd # 創(chuàng)建BFD會話綁定出接口和下一跳 bfd 1 bind peer-ip 10.1.1.2 interface GigabitEthernet0/0/1 # 配置本地標(biāo)識符 discriminator local 1 # 配置遠(yuǎn)端標(biāo)識符 discriminator remote 2 # 配置發(fā)送間隔和接收間隔 min-tx-interval 100 min-rx-interval 100 # 配置檢測倍數(shù) detect-multiplier 3 # 提交配置 commit第二端設(shè)備B配置system-view bfd bfd 1 bind peer-ip 10.1.1.1 interface GigabitEthernet0/0/1 discriminator local 2 discriminator remote 1 min-tx-interval 100 min-rx-interval 100 detect-multiplier 3 commit配置完成后用display bfd session all查看會話狀態(tài)。如果顯示Up說明BFD會話建立成功。實際檢測時間 max(100, 100) × 3 300ms。這里有幾個關(guān)鍵點discriminator local和remote必須兩端對應(yīng)。A的local是1remote是2B的local是2remote是1。如果配錯會話起不來。bind peer-ip和interface必須匹配實際鏈路。如果下一跳地址寫錯或者接口寫錯BFD報文發(fā)不出去。commit命令必須執(zhí)行。華為BFD的配置在commit之前只是候選配置不會生效。3.2 多跳檢測配置跨設(shè)備的BFD會話多跳檢測是指BFD會話的兩端之間隔了多層設(shè)備比如經(jīng)過一臺路由器或者多條鏈路。這種場景下BFD報文需要被中間設(shè)備轉(zhuǎn)發(fā)所以配置方式不同。多跳BFD的配置命令是bfd 1 bind peer-ip 10.1.1.2 discriminator local 1 discriminator remote 2 min-tx-interval 100 min-rx-interval 100 detect-multiplier 3 commit注意這里沒有bind interface因為多跳場景下出接口不固定BFD報文會根據(jù)路由表轉(zhuǎn)發(fā)。多跳BFD通常用于檢測經(jīng)過多個跳數(shù)的路徑比如跨數(shù)據(jù)中心互聯(lián)。多跳BFD的一個常見問題是中間設(shè)備可能對BFD報文做特殊處理。比如某些防火墻默認(rèn)會丟棄UDP 3784端口的報文導(dǎo)致BFD會話起不來。這時候需要在中間設(shè)備上放行BFD報文。3.3 BFD與OSPF聯(lián)動配置加速路由收斂BFD與OSPF聯(lián)動是最常見的應(yīng)用場景。配置方法是在OSPF進(jìn)程下使能BFDospf 1 bfd all-interfaces enable這條命令會讓OSPF的所有接口都嘗試建立BFD會話。如果只想對特定接口使能可以用ospf 1 bfd all-interfaces enable interface GigabitEthernet0/0/1 ospf bfd enable配置完成后OSPF鄰居建立時會自動觸發(fā)BFD會話建立。當(dāng)BFD檢測到故障時OSPF會立即斷開鄰居不需要等Dead Time。實測數(shù)據(jù)某企業(yè)網(wǎng)核心層兩臺交換機之間跑OSPF默認(rèn)Dead Time 40秒。配置BFD后檢測時間300msOSPF鄰居斷開時間從40秒降到300ms左右。路由收斂時間從原來的40秒降到1秒以內(nèi)。提示BFD與OSPF聯(lián)動時OSPF的Hello報文和BFD報文是獨立發(fā)送的。BFD負(fù)責(zé)快速檢測OSPF負(fù)責(zé)鄰居維護(hù)和路由計算。兩者互不干擾但BFD的檢測結(jié)果會覆蓋OSPF的Dead Time機制。3.4 BFD與靜態(tài)路由聯(lián)動讓靜態(tài)路由“活”起來靜態(tài)路由本身沒有檢測機制只要接口Up路由就一直在。如果下一跳不可達(dá)靜態(tài)路由不會自動撤銷導(dǎo)致流量黑洞。BFD可以解決這個問題。配置方法ip route-static 192.168.1.0 255.255.255.0 10.1.1.2 bfd這條命令的意思是靜態(tài)路由的下一跳是10.1.1.2同時建立BFD會話檢測這個下一跳。如果BFD會話Down靜態(tài)路由自動從路由表中撤銷。這個功能在雙出口場景下特別有用。比如企業(yè)有兩條出口鏈路一條主用一條備用。主用鏈路的靜態(tài)路由綁定BFD當(dāng)主用鏈路故障時BFD Down靜態(tài)路由撤銷流量自動切換到備用鏈路。3.5 BFD與VRRP聯(lián)動毫秒級主備切換VRRP本身的主備切換依賴VRRP通告報文默認(rèn)間隔1秒Master Down Time約3秒。配置BFD后可以加速切換。配置方法vrrp vrid 1 virtual-ip 192.168.1.1 vrrp vrid 1 priority 120 vrrp vrid 1 preempt-mode timer delay 0 vrrp vrid 1 track bfd-session 1 reduced 30這里track bfd-session 1表示VRRP跟蹤BFD會話1。當(dāng)BFD會話Down時VRRP優(yōu)先級降低30觸發(fā)主備切換。切換時間從原來的3秒降到BFD檢測時間比如300ms。4. 華為BFD排錯實錄那些年踩過的坑4.1 常見問題速查表現(xiàn)象可能原因排查方法解決方法BFD會話一直Down兩端Discriminator不匹配檢查兩端local/remote配置確保A的localB的remoteBFD會話卡在Init檢測時間不匹配查看兩端min-tx/min-rx調(diào)整參數(shù)使兩端匹配BFD會話Up但聯(lián)動不生效未配置聯(lián)動命令檢查協(xié)議下是否使能BFD添加bfd all-interfaces enableBFD報文發(fā)不出去中間設(shè)備攔截UDP 3784抓包確認(rèn)放行UDP 3784端口BFD會話頻繁震蕩檢測時間過短查看鏈路質(zhì)量適當(dāng)增大檢測倍數(shù)多跳BFD起不來路由不可達(dá)檢查路由表確保peer-ip路由可達(dá)4.2 坑一Discriminator配反了這是新手最容易犯的錯誤。BFD的Discriminator是本地唯一標(biāo)識一個會話的兩端必須對應(yīng)。A的local是1remote必須是B的local值。如果A配local 1 remote 2B也配local 1 remote 2會話就起不來。排查方法display bfd session all verbose看Local Discriminator和Remote Discriminator是否匹配。4.3 坑二檢測時間算錯了很多人以為配了min-tx-interval 100檢測時間就是100×3300ms。但實際上如果對端配的是min-rx-interval 1000實際發(fā)送間隔是1000ms檢測時間是3000ms。BFD的實際發(fā)送間隔 max(本端min-tx, 對端min-rx)。這個邏輯一定要記住。4.4 坑三BFD會話Up但業(yè)務(wù)不通BFD檢測的是轉(zhuǎn)發(fā)路徑的連通性但業(yè)務(wù)不通可能是其他原因ACL攔截、路由問題、NAT問題等。BFD Up只說明BFD報文能通不代表業(yè)務(wù)報文能通。排查方法先確認(rèn)BFD會話狀態(tài)再檢查業(yè)務(wù)報文的轉(zhuǎn)發(fā)路徑??梢杂胻racert和ping結(jié)合排查。4.5 坑四多跳BFD的源地址問題多跳BFD會話建立時本端需要選擇一個源地址發(fā)送BFD報文。如果設(shè)備有多個接口地址可能會選錯源地址導(dǎo)致對端收不到報文。解決方法用bfd multi-hop-source-ip命令指定源地址。bfd bfd 1 bind peer-ip 10.1.1.2 discriminator local 1 discriminator remote 2 multi-hop-source-ip 10.1.1.1 commit4.6 坑五BFD與OSPF聯(lián)動的順序問題配置BFD與OSPF聯(lián)動時如果先配了BFD會話再配OSPF聯(lián)動可能會發(fā)現(xiàn)BFD會話沒有自動建立。這是因為OSPF聯(lián)動需要OSPF鄰居先建立然后才會觸發(fā)BFD會話。正確的順序是先配OSPF確保鄰居Up再配BFD聯(lián)動?;蛘咧苯优鋌fd all-interfaces enable讓OSPF自動觸發(fā)BFD。5. 華為BFD的性能調(diào)優(yōu)與最佳實踐5.1 檢測時間與CPU開銷的平衡BFD檢測時間越短故障感知越快但CPU和帶寬開銷也越大。以100ms發(fā)送間隔為例每個BFD會話每秒發(fā)送10個報文每個報文約24字節(jié)不含IP頭帶寬占用很小。但如果設(shè)備上有1000個BFD會話每秒就是10000個報文CPU中斷處理壓力會明顯增加。實際項目中建議根據(jù)業(yè)務(wù)需求選擇檢測時間普通企業(yè)網(wǎng)300ms~500ms檢測時間足夠金融交易場景100ms~200ms工業(yè)控制場景50ms~100ms運營商核心10ms~50ms需要硬件加速華為高端交換機如CE系列支持硬件BFD檢測時間可以做到3ms且不占用CPU。低端設(shè)備只能做軟件BFD檢測時間通常不低于50ms。5.2 檢測倍數(shù)怎么選Detect Mult默認(rèn)是3意思是連續(xù)3個報文丟失才認(rèn)為故障。這個值不能太小否則鏈路輕微抖動就會導(dǎo)致BFD震蕩。也不能太大否則檢測時間過長。建議鏈路質(zhì)量好光纖直連Detect Mult3鏈路質(zhì)量一般經(jīng)過傳輸設(shè)備Detect Mult4或5鏈路質(zhì)量差無線或微波Detect Mult5以上5.3 BFD會話數(shù)量規(guī)劃華為設(shè)備對BFD會話數(shù)量有限制。低端設(shè)備可能只支持幾十個會話高端設(shè)備支持上千個。規(guī)劃時要注意不要在所有接口上都使能BFD只在對收斂速度有要求的鏈路上使能。多跳BFD比單跳BFD消耗更多資源因為需要查路由表。如果BFD會話數(shù)量接近設(shè)備上限考慮用其他檢測機制如EFM、CFM替代。5.4 與路由協(xié)議的協(xié)同BFD只是加速檢測不負(fù)責(zé)路由收斂。所以BFD配置好后還要確保路由協(xié)議的收斂速度跟得上。比如OSPF的SPF計算時間、LSA泛洪延遲等。如果OSPF本身收斂要5秒BFD檢測再快也沒用。優(yōu)化建議OSPF配置spf-schedule-interval 100 100 100加快SPF計算。BGP配置bgp convergence fast加快BGP收斂。使用路由策略減少路由數(shù)量降低收斂壓力。6. 幾個真實場景的BFD落地案例6.1 場景一雙核心交換機互聯(lián)某企業(yè)網(wǎng)有兩臺核心交換機之間跑OSPF同時互聯(lián)鏈路經(jīng)過一臺傳輸設(shè)備。傳輸設(shè)備偶爾出現(xiàn)單通故障導(dǎo)致OSPF鄰居無法及時斷開。解決方案在核心交換機互聯(lián)接口上配置BFD檢測時間300ms聯(lián)動OSPF。傳輸設(shè)備故障時BFD在300ms內(nèi)檢測到OSPF立即斷開鄰居流量切換到備用路徑。效果故障切換時間從40秒降到1秒以內(nèi)。6.2 場景二雙出口靜態(tài)路由某公司有兩條出口鏈路一條主用一條備用。主用鏈路配置靜態(tài)路由備用鏈路配置浮動靜態(tài)路由。主用鏈路故障時靜態(tài)路由不會自動撤銷導(dǎo)致流量黑洞。解決方案主用鏈路的靜態(tài)路由綁定BFD檢測下一跳可達(dá)性。BFD Down時靜態(tài)路由自動撤銷浮動靜態(tài)路由生效。效果出口切換時間從手動干預(yù)降到300ms自動切換。6.3 場景三VRRP主備切換某數(shù)據(jù)中心兩臺核心交換機做VRRP主備默認(rèn)切換時間3秒。業(yè)務(wù)要求切換時間小于1秒。解決方案VRRP跟蹤BFD會話BFD檢測時間200ms。BFD Down時VRRP優(yōu)先級降低觸發(fā)主備切換。效果切換時間從3秒降到200ms。7. 寫在最后BFD不是萬能藥BFD確實能大幅提升故障檢測速度但它也有局限性。BFD檢測的是轉(zhuǎn)發(fā)路徑的連通性如果故障是間歇性的、或者只影響特定業(yè)務(wù)流量BFD可能檢測不到。另外BFD本身不加密、不認(rèn)證存在被偽造報文攻擊的風(fēng)險。華為設(shè)備支持BFD認(rèn)證功能可以在關(guān)鍵鏈路上開啟。我在實際項目中的體會是BFD最適合用在“鏈路質(zhì)量穩(wěn)定、故障模式明確”的場景。如果鏈路本身就不穩(wěn)定BFD頻繁震蕩反而會加劇網(wǎng)絡(luò)抖動。這時候應(yīng)該先解決鏈路質(zhì)量問題再考慮上BFD。另外BFD的配置一定要兩端匹配參數(shù)協(xié)商邏輯要搞清楚。我見過太多因為Discriminator配反、檢測時間不匹配導(dǎo)致BFD起不來的案例。排錯時先用display bfd session all verbose看狀態(tài)再用display bfd statistics看報文統(tǒng)計基本能定位大部分問題。最后分享一個小技巧如果BFD會話頻繁震蕩可以臨時把Detect Mult調(diào)大觀察是否穩(wěn)定。如果調(diào)大后穩(wěn)定了說明鏈路有丟包需要排查鏈路質(zhì)量。如果調(diào)大后還是震蕩可能是BFD報文被中間設(shè)備限速或丟棄需要抓包確認(rèn)。