:eNSP跨AS實驗掌握華為BGP路由控制與策略配置)
備考HCIP數(shù)通最怕的不是題庫里那些選擇題而是拿到一張拓撲圖突然不知道往設備里敲什么。這個行當說的代碼指的就是華為VRP平臺上一行行配置命令。這期HCIP代碼小練我重點練BGP路由控制在eNSP里搭了一張跨AS實驗拓撲把OSPF、IBGP/EBGP鄰居、ip-prefix過濾、route-policy改屬性這幾個環(huán)節(jié)完整跑了一遍。整個過程從規(guī)劃到排錯都記在這里給正在啃HCIP或者日常要碰華為設備的兄弟一份能直接照著敲的參考。1. 練前準備拓撲、工具與IP規(guī)劃1.1 為什么配置命令要單獨練很多人備考HCIP有個誤區(qū)覺得OSPF、BGP的原理懂了選擇題能做對實驗就沒問題。真到動手的時候原理和命令之間隔著一條鴻溝。BGP的鄰居關系、路由通告、屬性傳遞這些機制光在書上看是記不牢的必須自己在設備上把命令敲一遍再看一下display輸出的路由表狀態(tài)才會對協(xié)議怎么工作有實感。我一般會在eNSP里搭一套固定的練手拓撲每次練習就在這套拓撲上加新需求。這樣省去反復搭環(huán)境的成本而且同一套拓撲跑不同控制策略對比效果非常直觀。這次用的還是AR3260做路由器設備內(nèi)存開滿了四臺跑起來不卡CPU占用也正常。AR2220也能用只是接口編號和部分特性支持上有細微差別不影響這個實驗。1.2 本次實驗拓撲與地址規(guī)劃這次的核心場景是模擬一個跨AS的路由交換環(huán)境AS100內(nèi)部有兩臺路由器跑OSPF加IBGPAS200有兩臺路由器分別通過EBGP接到AS100的一臺設備上形成雙入口。IP規(guī)劃如下表設備接口IP地址說明R1GE0/0/010.0.12.1/24連接R2R1LoopBack010.0.1.1/32OSPF Router-ID及IBGP源地址R1LoopBack1172.16.1.1/24模擬業(yè)務網(wǎng)段AR1LoopBack2172.16.2.1/24模擬業(yè)務網(wǎng)段BR1LoopBack3172.16.3.1/24模擬業(yè)務網(wǎng)段CR2GE0/0/010.0.12.2/24連接R1R2GE0/0/110.0.23.2/24連接R3R2GE0/0/210.0.24.2/24連接R4R2LoopBack010.0.2.2/32OSPF Router-ID及IBGP源地址R3GE0/0/010.0.23.3/24連接R2R3GE0/0/110.0.34.3/24連接R4R3LoopBack010.0.3.3/32Router-IDR4GE0/0/010.0.24.4/24連接R2R4GE0/0/110.0.34.4/24連接R3R4LoopBack010.0.4.4/32Router-IDAS劃分是這樣的R1和R2屬于AS100R3和R4屬于AS200。R1-R2之間跑OSPF Area 0同時建立IBGPR2-R3、R2-R4之間各建一條EBGPR3-R4之間建IBGP。這樣一來R1上三條業(yè)務網(wǎng)段通告進BGP后AS200那邊就能通過R2這個出口收到兩份相同前綴、不同路徑的路由后續(xù)做路由控制就有得玩了。2. 第一步把OSPF和BGP鄰居關系跑起來2.1 OSPF基礎配置R1和R2之間的OSPF是整個實驗的底層路由基礎。BGP在通告network時要求路由表中必須先存在對應前綴的路由所以底層IGP必須先把路由打通。這里用OSPF承載AS100內(nèi)部路由。先配R1system-view sysname R1 interface GigabitEthernet0/0/0 ip address 10.0.12.1 24 interface LoopBack0 ip address 10.0.1.1 32 interface LoopBack1 ip address 172.16.1.1 24 interface LoopBack2 ip address 172.16.2.1 24 interface LoopBack3 ip address 172.16.3.1 24 ospf 1 router-id 10.0.1.1 area 0.0.0.0 network 10.0.12.0 0.0.0.255 network 10.0.1.1 0.0.0.0 network 172.16.1.0 0.0.0.255 network 172.16.2.0 0.0.0.255 network 172.16.3.0 0.0.0.255這里有個非常容易錯的地方OSPF的network命令用的是通配符掩碼不是子網(wǎng)掩碼。172.16.1.0 0.0.0.255表示匹配172.16.1.0/24這個網(wǎng)段寫成255.255.255.0就錯了設備會直接報錯這是新手最常見的問題。R2的OSPF配置對稱即可system-view sysname R2 interface GigabitEthernet0/0/0 ip address 10.0.12.2 24 interface GigabitEthernet0/0/1 ip address 10.0.23.2 24 interface GigabitEthernet0/0/2 ip address 10.0.24.2 24 interface LoopBack0 ip address 10.0.2.2 32 ospf 1 router-id 10.0.2.2 area 0.0.0.0 network 10.0.12.0 0.0.0.255 network 10.0.2.2 0.0.0.0配置完檢查一下鄰居狀態(tài)display ospf peer brief正常會看到R1和R2互相出現(xiàn)在鄰居表里State是Full。如果卡在Init或者ExStart多半是區(qū)域ID不一致、通配符寫錯、或者接口沒有加入正確區(qū)域從這幾方面查。2.2 BGP鄰居配置與next-hop-localOSPF起來之后開始建BGP鄰居。AS100內(nèi)部R1和R2建IBGPIBGP通常用LoopBack地址作為更新源避免物理鏈路down掉影響鄰居關系。R1的BGP配置bgp 100 router-id 10.0.1.1 peer 10.0.2.2 as-number 100 peer 10.0.2.2 connect-interface LoopBack0 ipv4-family unicast network 172.16.1.0 24 network 172.16.2.0 24 network 172.16.3.0 24 peer 10.0.2.2 enableR2的BGP配置bgp 100 router-id 10.0.2.2 peer 10.0.1.1 as-number 100 peer 10.0.1.1 connect-interface LoopBack0 ipv4-family unicast peer 10.0.1.1 enable這里有兩個關鍵點。第一用LoopBack建IBGP鄰居必須配置connect-interface LoopBack0否則設備會用出接口地址作為TCP源地址而鄰居期望的源地址是LoopBack0鄰居就起不來。第二R2向IBGP鄰居R1通告路由時默認會把下一跳指向自己但如果R1收到的BGP路由下一跳是10.0.2.2R1的路由表里如果沒有到10.0.2.2的路由這條BGP路由就不能變成最優(yōu)路由。解決方法是在R2上給IBGP鄰居配置next-hop-localbgp 100 ipv4-family unicast peer 10.0.1.1 next-hop-local等等next-hop-local其實是IBGP場景下默認對EBGP學習的路由生效的行為配置嗎這里我建議直接用最穩(wěn)妥的寫法在R2上對IBGP鄰居顯式配置peer 10.0.1.1 next-hop-local確保R1收到的BGP路由下一跳是R2的LoopBack地址而R1恰好有OSPF學習到的10.0.2.2/32路由下一跳可達路由才能優(yōu)選。驗證命令是三件套display bgp peer display bgp routing-table display ip routing-table protocol bgp鄰居狀態(tài)看Established路由表里看前綴前面的符號表示最優(yōu)路由*表示有效路由。如果看到前綴沒有標記后面十有八九是next-hop不可達。3. 第二步用ip-prefix和route-policy做前綴過濾3.1 ip-prefix的語法細節(jié)AS100的R1通告了三條業(yè)務網(wǎng)段172.16.1.0/24、172.16.2.0/24、172.16.3.0/24。如果需求突然變了AS200只允許接收前兩個網(wǎng)段第三個必須攔掉怎么實現(xiàn)最干凈的做法是在AS200入口設備R3上做入方向過濾。先寫前綴列表控制匹配的對象ip ip-prefix PL-ALLOW index 10 permit 172.16.1.0 24 ip ip-prefix PL-ALLOW index 20 permit 172.16.2.0 24 ip ip-prefix PL-ALLOW index 30 deny 0.0.0.0 0 less-equal 32細說ip-prefix的規(guī)則。index是匹配順序按從小到大逐一匹配命中即停不再往下走。第三條deny 0.0.0.0 0 less-equal 32是一條兜底規(guī)則匹配所有IPv4路由并拒絕。因為ip-prefix默認末尾隱藏了一條deny all其實不寫也能達到效果但顯式寫出來有兩個好處一是自己看著清楚二是方便以后在中間插入其他規(guī)則時不容易搞混。less-equal 32的意思在這個場景里其實是允許掩碼長度從0到32配合0.0.0.0 0就是匹配一切。如果只想精確匹配某一條路由就寫permit 172.16.1.0 24它默認只匹配掩碼正好是24的這條。想匹配172.16.1.0/24及其子網(wǎng)就寫172.16.1.0 24 greater-equal 24 less-equal 32這在匯總場景里非常常用。3.2 route-policy的調(diào)用與生效機制光有前綴列表還不夠BGP不會直接認ip-prefix要通過route-policy把它包一層再掛到peer上。R3上這樣配置route-policy RP-IN permit node 10 if-match ip-prefix PL-ALLOW route-policy RP-IN deny node 20這個route-policy的邏輯是node 10先匹配PL-ALLOW命中就放行沒命中就跳到node 20無條件拒絕。因為route-policy每個node自帶一個默認deny于末尾所以node 20其實可以不寫但我習慣顯式寫出來邏輯更完整。掛到鄰居上bgp 200 ipv4-family unicast peer 10.0.23.2 route-policy RP-IN import調(diào)用方向是import意思是R3從鄰居10.0.23.2收到的路由進路由表之前先過這個策略。驗證方法display bgp routing-table正常情況下能看到172.16.1.0/24和172.16.2.0/24172.16.3.0/24已經(jīng)消失。如果想確認策略確實生效了可以看它的統(tǒng)計display route-policy或者臨時把策略刪掉再用reset bgp all軟重置會話路由就全回來了。我每次調(diào)策略都習慣反復掛載-檢查-撤銷-再檢查確認不是別的因素導致路由缺失。注意修改route-policy后BGP不會自動重新過濾已經(jīng)收到的路由必須執(zhí)行refresh bgp all import或者reset bgp all才會重新執(zhí)行策略。eNSP里reset最省事但生產(chǎn)環(huán)境慎用會造成會話中斷優(yōu)選refresh。4. 第三步路徑屬性控制實戰(zhàn)4.1 local-preference控制選路過濾只是路由控制的入門屬性控制才是HCIP BGP的重點。AS200有R3和R4兩個入口AS100通過R2把同一批路由分別通告給R3和R4那AS200內(nèi)部路由器最終怎么選路默認情況下來自EBGP的路由Local Preference是100兩邊一樣接下來比AS路徑長度也差不多最后會走到Router-ID等更細的比較。這種自然選擇往往不如我們想要的精確得用屬性干預。比如需求AS200內(nèi)部所有路由器訪問172.16.1.0/24時優(yōu)先走R3這邊。在R3入方向針對這個網(wǎng)段把Local Preference抬高route-policy RP-LP permit node 10 if-match ip-prefix PL-LP apply local-preference 300 route-policy RP-LP permit node 20 ip ip-prefix PL-LP index 10 permit 172.16.1.0 24 bgp 200 ipv4-family unicast peer 10.0.23.2 route-policy RP-LP importR4那邊保持默認100。BGP選路時Local Preference值越高越優(yōu)所以AS200內(nèi)部所有路由器都會優(yōu)選從R3學來的那條172.16.1.0/24。注意這個屬性只在AS內(nèi)部傳遞R3通過IBGP通告給R4時Local Preference會保留但不會傳給AS100的R2。驗證命令display bgp routing-table 172.16.1.0輸出里能看到兩條路徑一條next-hop是10.0.23.2LocalPref是300帶最優(yōu)標記另一條next-hop是10.0.24.4LocalPref是100。4.2 MED和AS-Path的實戰(zhàn)對比Local Preference是影響別人怎么選MED則是影響對方AS怎么選。通俗講本地優(yōu)先級是我說了算MED是我求著你選我。再添加一個需求R2希望AS200在訪問172.16.2.0/24時優(yōu)先選擇經(jīng)過R3這條鏈路怎么辦因為R2是AS100的設備MED屬性可以跨AS傳遞R2可以在向R3通告這條路由時設置一個較小的MED向R4通告時設置一個較大的MED這樣R3和R4收到后在比較來自同一鄰居AS的路由時MED值小的路徑勝出。R2上配置route-policy RP-MED-TO-R3 permit node 10 if-match ip-prefix PL-MED apply cost 50 route-policy RP-MED-TO-R4 permit node 10 if-match ip-prefix PL-MED apply cost 200 ip ip-prefix PL-MED index 10 permit 172.16.2.0 24 bgp 100 ipv4-family unicast peer 10.0.23.3 route-policy RP-MED-TO-R3 export peer 10.0.24.4 route-policy RP-MED-TO-R4 exportapply cost在BGP里就是修改MED。華為設備上EBGP路由默認MED為0當兩條路由來自同一個ASMED小的優(yōu)先。所以R3這邊收到的MED是50R4那邊是200路由器會優(yōu)選R3。但這里有個課本上經(jīng)??嫉目覯ED只在比較來自同一個AS的路由時有意義。如果兩條路由分別來自AS100和AS300就算一條MED是0、一條MED是50也不會直接拿MED比而是先比AS路徑長度。我自己練的時候就吃過這個虧以為把MED調(diào)小就萬事大吉結(jié)果AS路徑差了一位MED怎么改都不生效。理解了這句話BGP選路一半的題就不會錯了。AS-Path的控制方式則是加長路徑在R2向R4通告時把本AS號多追加幾次讓AS200認為走R4的路徑更長從而放棄。命令是route-policy RP-ASP-TO-R4 permit node 10 if-match ip-prefix PL-ASP apply as-path 100 100 additive ip ip-prefix PL-ASP index 10 permit 172.16.3.0 24apply as-path 100 100 additive表示在現(xiàn)有AS路徑上追加兩個100。效果是AS-Path從100 200變成100 200 100 100長度變長路由器選路時自然避開。這個方法在生產(chǎn)里也很常用尤其是運營商間做流量牽引時。4.3 驗證方法與調(diào)完必做的動作每改一個屬性我建議按這個順序過一遍display bgp routing-table display bgp routing-table 172.16.2.0 display ip routing-table 172.16.2.0第一行看總表確認路由還在第二行看這條前綴的具體屬性確認LocalPref、MED、AS-Path都符合預期第三行看全局路由表確認BGP最優(yōu)路由確實被裝進了路由表下一跳和出接口正確。改完策略必須記得重置BGP會話讓策略重新生效華為設備上兩種方式refresh bgp all import refresh bgp all export或者干脆reset bgp all。eNSP環(huán)境里reset最直接生產(chǎn)環(huán)境能refresh就別reset避免不必要的會話抖動。這個動作太容易被忽略我見過不少人改了route-policy半天不生效最后發(fā)現(xiàn)是沒刷新。5. 常見問題與排查實錄5.1 BGP鄰居起不來的排查套路練這個實驗時最常遇到的第一個問題就是IBGP鄰居一直停在Active或者Connect。掏出display bgp peer看鄰居狀態(tài)不對先別急著懷疑配置按下面順序逐層查一是TCP層通不通。IBGP用LoopBack建鄰居的話先ping 10.0.2.2 -a 10.0.1.1確認源地址能到達對端LoopBack。R1默認路由表里有OSPF的10.0.2.2/32沒通基本都是OSPF沒起來或者沒通告。二是更新源對不對。IBGP鄰居的TCP連接要求源地址與對端配置的peer地址一致。R1配置peer 10.0.2.2 connect-interface LoopBack0那R2上配置的peer地址必須是10.0.1.1。如果R1忘記指定connect-interfaceTCP源地址會變成10.0.12.1R2一看源地址不匹配直接拒絕。排錯時抓display tcp status能看得很清楚。三是AS號與版本。EBGP鄰居如果AS號寫反了設備會嘗試建立連接然后因為AS不匹配反復重置狀態(tài)在Connect和Idle之間來回跳。另外默認BGP版本是4兩邊都別亂改。5.2 路由不優(yōu)、不通的排查套路鄰居都Established了但路由表里沒有想要的前綴或者前綴沒有最優(yōu)標記這是第二類高頻問題。先說沒有前綴。查有沒有被過濾掉重點看三處對端是否用network或者import方式通告了路由、中間設備出方向策略是否有deny、本地入方向策略是否有deny。用display bgp routing-table看有沒有前綴但缺如果有前綴無最優(yōu)標記查下一跳。IBGP場景里最常見的就是前綴存在但下一跳不可達。R2把R1的172.16.1.0/24通告給IBGP鄰居R1自己不對這里要理清楚R1把路由通告給R2R2再通告給EBGP鄰居R3、R4R3、R4收到后通過IBGP互傳。如果R3收到的IBGP路由下一跳是R2的LoopBack地址10.0.2.2而R3的IGP沒有到10.0.2.2的路由這就麻煩了所以前面強調(diào)在AS200里也需要保證到對端LoopBack的路由可達通常做法是在R3和R4之間跑OSPF或者靜態(tài)路由把LoopBack地址也通告進去。設備上查下一跳的快捷命令display ip routing-table 10.0.2.2如果無路由就去IGP里補通告。這個環(huán)節(jié)我建議把這個命令刻在腦子里它比看一堆display bgp的輸出更快定位問題。5.3 eNSP操作細節(jié)與設備層面的坑最后說幾個eNSP和真實設備不太一樣的地方都是實操里踩出來的。第一eNSP里AR3260默認接口是GigabitEthernetAR2220有些型號接口叫GigabitEthernet有些是Ethernet寫腳本前先把display ip interface brief跑一遍別照著網(wǎng)上模板硬抄接口名。第二eNSP里的設備如果長時間不操作會空閑斷開命令敲到一半丟失很煩。建議在系統(tǒng)視圖下執(zhí)行user-interface vty 0 4再配idle-timeout 0把超時關掉。第三改完配置先display current-configuration確認設備記住了有些錯誤配置設備拒絕接受但你又不注意看回顯比如OSPF通配符寫錯、BGP路由ID沖突等設備都會在敲回車時給出報錯信息。養(yǎng)成看回顯的習慣比事后排錯省太多時間。6. 小結(jié)一次練習下來最值錢的經(jīng)驗這期HCIP代碼小練跑下來我最大的感觸是路由控制的組合拳不是看會的是敲會的。ip-prefix控制匹配范圍route-policy控制動作import/export控制方向refresh/reset控制生效時機這幾個環(huán)節(jié)環(huán)環(huán)相扣缺一個都會在驗證階段原形畢露。建議拿到實驗拓撲后先把需求拆成放什么路由、改什么屬性、從哪個方向做再落成命令而不是上來就敲。下一期我打算把BGP路由反射器和聯(lián)盟一起練順帶把OSPF特殊區(qū)域也揉進去想要哪部分的兄弟可以留言我優(yōu)先安排。