30 – BGP 黑洞實驗
IGP OSPF
R2(config)# router ospf 1
R2(config-router)# network
22.1.1.1 0.0.0.0 area 0R2(config-router)# network 23.1.1.0 0.0.0.255 area 0
12.1.1.0不用宣告進OSPF
R3(config)# router ospf 1
R3(config-router)# network
33.1.1.1 0.0.0.0 area 0R3(config-router)# network 23.1.1.0 0.0.0.255 area 0
R3(config-router)# network 34.1.1.0 0.0.0.255 area 0
R4(config)# router ospf 1
R4(config-router)# network
44.1.1.1 0.0.0.0 area 0R4(config-router)# network 34.1.1.0 0.0.0.255 area 0
45.1.1.0不用宣告進OSPF
R4# show ip router ospf
在R4上有3條路由R2、R3的環回口和R2、R3的直連網段。
eBGP 08:00
R3(config)# router bgp ?
後面是AS號
R1(config)# router bgp 1
R1(config-router)#
R4(config-router)# network 44.1.1.1
0.0.0.0 area 0
這裡的network有哪些作用: 1. 宣告 2. 發送Hello包
只要是被passive-interface的接口他只是不會發送Hello包的報文而已,但是接口還是會被宣告出去的。
BGP他建鄰居是通過neighbor來建立的,要把路由宣告出去是通過network,這兩個功能是通過2個關鍵字來實現。
BGP在建鄰居是通過neighbor來建立,鄰居建起來並不代表你有路由在裡面,你要把路由放進去必需要加network。
他是通過2個命令來解決原本IGP當中的1個命令(network)的2個功能(宣告、發送Hello包)。
建鄰居
R1(config-router)# neighbor
12.1.1.2 remote-as 234
如果要跟對面建鄰居用的是neighbor。
對面的IP:建eBGP這個IP地址一般都用直連。
建任何鄰居關係都必需考慮neighbor後面的IP必需是本地可到達的。
remote-as後面是跟誰建。
R2(config)# router bgp 234
R2(config-router)# neighbor
12.1.1.1 remote-as 1我指向你、你指向我
檢查鄰居表
R1# show ip bgp summary
iBGP 13:40
R2和R4的iBGP關係
R2(config-router)# neighbor
44.1.1.1 remote-as 234
一般都用對端的環回口來建鄰居,也比較穩定。
一般都用對端的環回口來建鄰居,也比較穩定。
環回口直到這個路由器掛掉了這個環回口才會消失。
用物理接口也可以,但物理接口down掉了鄰居也跟著down掉了。比較不建議
R2(config-router)# neighbor
44.1.1.1 update-source loopback 0
默認情況下BGP建鄰居,他都是用物理接口為來原發出去的,這個時候要把默認的物理口改成環回口。因為我們決定用R2的環回口和R4的環回口去建立iBGP,所以要把他的接口改成update-source
loopback 0。
R4(config)# router bgp 234
R4(config-router)# neighbor
22.1.1.1 remote-as 234R4(config-router)# neighbor 22.1.1.1 update-source loopback 0
eBGP 18:40
R4跟R5也要建立eBGP,用點不一樣的方法建立eBGP,使用環回口建立。
先寫靜態路由讓這兩個環回口可到達,寫靜態路由才是最簡單的方法。
R4(config)# ip route 55.1.1.1
255.255.255.255 45.1.1.5
45.1.1.5為下一跳的路由
R5(config)# ip route 44.1.1.1
255.255.255.255 45.1.1.4
檢查
R4# ping 55.1.1.1 source
loopback 0默認是帶物理口出去的,所以要加source loopback 0
開始建立R4跟R5的eBGP
R4(config)# router bgp 234R4(config-router)# neighbor 55.1.1.1 remote-as 5
R4(config-router)# neighbor 55.1.1.1 update-source loopback 0
用環回口建立eBGP除了這兩條基本的指令還要在加一條
R4(config-router)# neighbor
55.1.1.1 ebgp-multihop
默認的情況下是用直連接口去建立的而且只能下一跳,所以才不用第三行指令。
如果用環回口建立就不是一跳了,最少是二跳,ebgp-multihop如果後面不加數字是可以255跳。
如果不改多跳的話根本沒辦法建立鄰居,eBGP默認的情況下只有一跳,默認只允許用直連去建eBGP。
R5(config)# router bgp 5
R5(config-router)# neighbor
44.1.1.1 remote-as 234R5(config-router)# neighbor 44.1.1.1 update-source loopback 0
R5(config-router)# neighbor 44.1.1.1 ebgp-multihop 2
R1# show ip bgp summary
R2# show ip bgp summary
R4# show ip bgp summary
開始放路由進去
25:50
R1(config)# interface
loopback 1R1(config-if)# ip address 122.1.1.1 255.255.255.255
在R1上新建一個環回口
現在把這個環回口放進去BGP通告出去
R1(config)# router bgp 1R1(config-router)# network
IGP的network是看接口。路由器上的某一個接口要在network上面就可以。只要接口包含的範圍就可以放進去IGP
BGP的network是路由。BGP要network要先看路由表有沒有路由,如果有才可以network進去。
所以第一步要先看有沒有路由表
R1# show ip router
直連也算自己的一條路由
R1(config-router)# network
122.1.1.1 mask 255.255.255.255
要跟路由表的完全一樣,如果有一點點的不一樣show ip bgp是看不到任何東西的。
R1# show ip bgp
路由表怎麼寫,就應該怎麼network。
這個路由會傳到R2上
R2# show ip bgp
R2的路由會通過中間的iBGP傳給R4
R4# show ip bgp
一. 所有在 *> 的路由:
1. 都能夠傳給我BGP的鄰居
2. 都會放進路由表 (第三張表)1. 都能夠傳給我BGP的鄰居
在R4上show ip router就看不到路由表,在R4上同步或下一跳有問題
二. 影響 *> 的特殊條件:
1. 同步:我從BGP收到的路由,也要一定要從IGP收到路由,否則就認為他不同步。
R4# show ip router ospf
在R4的IGP看不到122.1.1.1這條路由,這種情況為不同步。
出現這個問題就要把同步關掉
R4# show run | se bgp
R4(config)# router bgp 234
R4(config-router)# synchronization
R4# show run | se bgp
現在的設備默認都是關閉的,所以R4不是同步的問題。
2. 下一跳:我通過BGP收到的這條路由所攜帶的下一跳,在我這個路由器本地一定要有路由可到逹
R4# show ip bgp
只要在R4上能夠讓他有路由到這個路由(12.1.1.1)的下一跳
解決的方法
45:00
R2(config)# router bgp 234
R2(config-router)# neighbor
44.1.1.1 next-hop-self
在跟44.1.1.1建立鄰居關係的時候,我把他的下一跳改成自己
為什麼在R2跟R4上看到的下一跳都是12.1.1.1,意思是我在AS 234當中不管有多少台路由器在跑BGP,他們學到這條路由的下一跳全都是指向上一個AS邊界的路由器的接口IP地址
BGP以AS為單位,一個AS代表一台路由器,一個AS不管多少台路由都以一台路由來看,他們全都指向上一個AS邊界的路由器的接口IP地址
R2在把路由傳遞給R4的時候,把下一跳改成自己next-hop-self
R4# show ip bgp
R5# show ip bgp
最終的需求是要讓R1的環回口可以ping通R5的環回口
所以要把R5的環回口宣告進BGP傳給R1
因為現在R1並沒有R5的路由
要讓R1和R5的環回口互相ping通
R5(config)# interface loopback
1
R5(config-if)# ip address
155.1.1.1 255.255.255.0R5(config-if)# exit
R5(config)# router bgp 5
R5(config-router)# network 155.1.1.0 mask 255.255.255.0
R5# show ip bgp
R1# show ip bgp
沒辦法傳給R1,要在R4上改下一跳
R4(config)# router bgp 234
R4(config-router)# neighbor
22.1.1.1 next-hop-self
BGP修改都要清一下才能收到,有兩種方法 51:00
一. 硬清:
R4: clear ip bgp *把BGP的三次握手全部清掉,重新建立三次握手然後發送數據包
二. 軟清: 一般常用方法
R4: clear ip bgp * soft不去清斷BGP的三次握手,只是刷新BGP的屬性而已。
最後在回到R2檢查
R2# show ip bgp
R1# ping 155.1.1.1 source 122.1.1.1
還是不能ping通,以上一直在解決BGP控制層面的問題,數據包發出去要有控制層的路由。
但實際上可能出現數據層面的問題,所以應該一跳一跳的去看,有路由為什麼不通。他的封包在哪被丟掉的。
R1# show ip route
路由丟給12.1.1.2
R2# show ip route
路由丟給44.1.1.1,然後44.1.1.1路由丟給23.1.1.3 這種遞歸查法
R3# show ip route
在R3確沒有看到155.1.1.1的路由,這就是BGP數據上的黑洞,在R3確不知道數據往哪裡發了(數據丟掉了) 。
雖然路由要經過R3傳給R2,因為R3並沒有跑BGP所以沒辦法去識別傳遞BGP update(更新)的路由條目。
這個黑洞實驗,這個實驗數據卡在R3
BGP黑洞實驗的解決
56:40
一. 物理直連
把R2跟R4拉一條物理直連的線
二. BGP邏輯的Full-mash
把R3也跑BGP
三. BGP重分布到IGP (實驗環境)
R3沒有155.1.1.1的路由,R2跟R4通過BGP學到155.1.1.1的路由,所以把BGP重分布到OSPF就有155.1.1.1的路由 (在實際環境是不能實現的)
四. MPLS
目前最可靠最流行的解決方法,就是在查標籤,變成標籤的方式在交換
二. BGP邏輯的Full-mash 59:50
R3跟R2和R4建立iBGP
R2(config)# router bgp 234
R2(config-router)# neighbor 33.1.1.1
remote-as 234R2(config-router)# neighbor 33.1.1.1 update-source loopback 0
R2(config-router)# neighbor 33.1.1.1 next-hop-self
R3(config)# router bgp 234
R3(config-router)# neighbor
22.1.1.1 remote-as 234R3(config-router)# neighbor 22.1.1.1 update-source loopback 0
R3(config-router)# neighbor 44.1.1.1 remote-as 234
R3(config-router)# neighbor 44.1.1.1 update-source loopback 0
R3接口沒有eBGP傳過來的路由,所以不須要設定next-hop-self
什麼樣的路由器才要設定next-hop-self:
自己有eBGP的鄰居關係,而且要對身後的iBGP說next-hop-self
R4(config)# router bgp 234
R4(config-router)# neighbor 33.1.1.1
remote-as 234R4(config-router)# neighbor 33.1.1.1 update-source loopback 0
R4(config-router)# neighbor 33.1.1.1 next-hop-self
R3# show ip bgp summary
R3# show ip bgp
R3# show ip route
R1# ping 155.1.1.1 source 122.1.1.1
這樣就可以ping通了
R1# ping 155.1.1.1
不帶環回口就ping不通了