重慶廣播電視大學 黃 偉
cisco網絡設備route-map功能淺析
重慶廣播電視大學 黃 偉
路由策略是為了改變網絡流量所經過的途徑而修改路由信息的技術,主要通過改變路由屬性來實現。routemap作為一個相當重要的工具可以實現相應的路由策略。
route-map;ACL;路由重發布
route-map是一個相當重要的工具,在從事網絡工程相關服務的時候經常會看到route-map的身影,所以可見它非常的重要。接下來我們一起探討它的概念和特點,還有它部署的方式,同時也結合兩個案例來講解。
類似route-map的工具有很多,比如ACL等。在很多場合都能看到ACL。ACL有兩個主要的功能:第一個用來做數據的過濾,也就是說它使用的對象是數據,通過ACL應用在某一個接口的in或者out方向,從而對穿越這個接口的流量進行過濾,比如permit或者deny。第二個廣泛的用途是匹配感興趣的流量,例如ACL搭配NAT,配置NAT的時候要去匹配內網的流量用到的就是ACL;IPsec VPN去匹配加密的數據流也是用ACL去匹配的,但是用ACL去匹配路由的時候具有一定的局限性。routemap在用途和功能等各方面都要比ACL更強勢很多,下面我們重點來介紹route-map這個工具。
R1和R2作為兩臺匯聚設備都連接到數據中心,數據中心有兩種服務器:一種是生產服務器,一種是辦公服務器。R1和R2到辦公服務器和生產服務器都是可達的。R3同時雙鏈路連接到兩臺匯聚設備上,下面連接的是普通用戶。
現在的需求是希望R3下面的用戶當訪問辦公服務器的時候,數據從R3到R1。當R1和R3之間的鏈路出現問題,或者R1宕機,或者R1連接辦公服務器的鏈路出現問題的時候,數據能夠自動切換到R2。同時,去往生產服務器的流量,從R3到R2。當R2和R3之間的鏈路出現問題,或者R2宕機,或者R2連接生產服務器的鏈路出現問題的時候,訪問生產服務器的流量能夠自動切換到R1。
接下來我們分別用三種方法來進行需求實現:
方法一:使用浮動路由的方式。在R3上配置四條針對辦公服務器和生產服務器的靜態路由
ip router 10.1.1.0 255.255.255.0 10.1.13.1
//去往10.1.1.0/24網絡下一跳為R1,AD值默認為1
ip router 10.1.1.0 255.255.255.0 10.1.23.2 10
//去往10.1.1.0/24網絡下一跳為R2,將AD值調高為10
ip router 10.1.2.0 255.255.255.0 10.1.23.2
//去往10.1.2.0/24網絡下一跳為R2,AD值默認為1
ip router 10.1.2.0 255.255.255.0 10.1.13.1 10
//去往10.1.2.0/24網絡下一跳為R1,將AD值調高為10
上面的第1條和第4條路由將成為浮動路由。這個時候訪問辦公服務器的數據流量將從R3到R1,如果R1宕機,能自動切換到R2;訪問生產服務器的數據流量將從R3到R2,如果R2宕機,能自動切換到R1。這已經實現了基本的需求,但是卻沒有完全滿足我們的需求,因為靜態路由的呈現方式比較死板,不能根據遠程拓撲的動態情況來做動態更新。所以這個時候,當R1和R3之間的鏈路發生故障,或者R2和R3之間的鏈路發生故障的時候,前面4條路由都能很好的應付這種拓撲的變化。但是,如果是R1或者是R2的上聯鏈路發生問題,靜態路由就無法感知了,因為上聯鏈路作為遠程的網絡,它的拓撲變化,R3里面的靜態路由是無法感知的。所以使用浮動路由能實現我們的需求,但不是最優的。

圖1
方法二:利用動態路由代替靜態路由。在R1、R2和R3三臺路由器之間允許一個動態路由協議,比如說OSPF。然后由R1和R2來動態的更新10.1.1.0/24和10.1.2.0/24的兩個網段的路由給R3。在這個時候,R1和R2兩個路由器都有可能成為10.1.1.0/24和10.1.2.0/24這兩股數據的承載者,所以對于R1來講,它需要同時將10.1.1.0/24和10.1.2.0/24的路由發送給R3,R2也需要同時下發將10.1.1.0/24和10.1.2.0/24的路由發送給R3,這個時候對于R3來講,當從同樣的路由協議學習到到達相同目的地的兩條不同路徑時,由metric值來決定最佳路由。這個時候的metric值是相等的,所以就是負載均衡。負載均衡自然也就無法實現我們的需求,我們的需求是數據的分流。另外,即使通過設置R3接口的COST值,將其調高,只要R3其中一側接口的COST值調高,那整個這一側的鏈路就不會用了,從而導致不管是去10.1.1.0/24還是10.1.2.0/24都會切換到另一側,這個時候也無法滿足我們的需求。
方法三:使用route-map工具。Route-map在這里能起到很好的用處。作為我們執行路由策略的一個重要工具,我們可以分別針對10.1.1.0/24和10.1.2.0/24在R1和R2上分別進行策略的部署。在R1將10.1.1.0/24這條路由通告給R3的時候將它的metric值設置得比另一邊小一點;在R2將10.1.2.0/24這條路由通告給R3的時候將它的metric值設置得比另一邊小一點。那么這樣一來的話,R3上就能夠從R1和R2都獲取到動態的10.1.1.0/24和10.1.2.0/24路由更新。在R3路由器上看來,對于10.1.1.0/24網段來說,R1通告的路由更新中metric值更小,對于10.1.2.0/24來說,R2通告的路由更新中metric值更小.所以,R3去往10.1.1.0/24的數據流量會優選R1,去往10.1.2.0/24的數據流量會優選R2。同時能夠實現熱備,因為動態路由協議能動態的感知遠端拓撲的變化,這就是route-map工具應用的場合之一。
剛才已經介紹過了router-map的第一個用途,重分發期間進行路由過濾或執行策略。它是一個被廣泛應用的用途,大量的應用在對網絡拓撲提出高的冗余性或者數據流分流要求的時候,都會被大量的部署。第二個用途是策略路由,是對傳統路由功能上的提升。第三個用途是在NAT的時候,除了能調用ACL去匹配感興趣流量以外,我們還通過調用route-map去匹配。還有一個用途是用在BGP里面。在BGP里面route-map的應用是很廣泛的,也是非常關鍵的東西。這些就是route-map的用途。
究竟route-map長什么樣?圖2就是一個route-map的格式:

圖2
可以看出,其實route-map在很多情況下和ACL是很類似的。route-map是使用一個字符串來定義的,以圖2為例,test就是被定義的字符串。一個route-map可以有多塊組成,圖2的route-map中包含了兩塊,每塊分別用一個序列號10和20定義,每塊由多行語句組成,每塊當中我們又允許設置兩個元素:一個是條件match,一個是動作set。當作匹配的時候,是以塊為單位進行的,按照序列號順序,從上往下逐級匹配,匹配的時候需要去看match語句后面的條件來一條一條匹配,當所有條件都滿足的情況下,那么就會執行set語句,并且跳出route-map。如果說這個塊不匹配,也就是有條件不匹配,那么會從當前塊,跳轉到下一塊來執行,這就是route-map。
(1)使用match命令匹配特定的分組或路由,set修改該分組或路由相關屬性;
(2)route-map中的語句相當于訪問列表中的各行;
(3)route-map默認為permit,默認序列號為10,序列號不會自動遞增,需要指定序列號;
(4)末尾隱含deny any。
我們來再看一個route-map的示例,這個示例跟剛才講的案例是有關聯的。

圖3
R2作為同時運行了RIP和OSPF兩個協議的路由器,當在R2上使用redistribute ospf 1 metric 2將OSPF重發布進RIP的時候,所有從OSPF協議重發布進RIP的路由的metric值都是2。如果我們的需求是對從OSPF協議重發布進RIP的路由進行區分對待。這里的三條路由按照剛才那個配置方法的話,三條路由重分發進RIP,只能是一樣的metric值。可能基于某種特殊的需求,希望對三條路由進行分別設置相應的metric值。這時候可以使用route-map工具來實現。
在重發布的時候可以關聯route-map來進行這樣的設置。實現的思路是:按照前面提到的route-map是一個列表,列表是由一個字符串來統一標示的,這個列表中可能包含多個塊,每塊里面包含match和set。之前做重發布的命令是redistribute ospf 1 metric 2,所有從OSPF協議重發布進RIP的路由的metric值都是2。現在需要對這三條路由進行區分對待,方法是重發布命令里的metric 12去除,改為調用一個route-map,這個route-map是我們自定義的。
如何定義呢?比如說我們寫個route-map test ,因為三個路由要分別進行策略的執行,然后定義三個序列號10、20、30分別對應三個路由。第一個序列號的match語句匹配的路由是192.168.1.0,當路由匹配了match語句的時候,執行set語句,將這個路由的metric值設置為1跳;然后又用另外一個序列號20來匹配第二條路由,match語句定義的是第二條路由,然后set這個動作執行的是metric值改為2;第三個序列號對應的是第三條路由,執行的動作是將metric值改為3。一旦我們將這個route-map關聯到重發布這個動作的時候,那么在重發布的過程當中,就會用每一條路由和這個route-map去比對。比如說第二條路由拿過來做比對的話,從上往下比對,第一個序列號先進行對比,結果發現第二條路由跟這個match不一致,因為這個match的是192.168.1.0,它就會繼續到第二個序列號比較。到了第二個序列號以后,發現match語句匹配了,因為這個match的就是192.168.2.0這條路由,它會執行set這個動作,將metric值設置為2,然后就跳出route-map。如果所有序列號里面的match都不匹配,在最后有一個默認隱含的deny any,deny就是不匹配,這里的deny和ACL里面的deny是不一樣的,ACL的deny是直接丟棄,這里的deny是不匹配,這就是routemap的一個例子。
match語句:
match ip address 匹配訪問列表或前綴列表
match length 根據分組的第三層長度進行匹配
match interface 匹配下一跳為指定接口之一的路由
match metric 匹配具有指定度量值的路由
match route-type 匹配指定類型的路由
match community 匹配BGP共同體
match tag 根據路由的標記進行匹配
set語句:
set metric 設置路由協議的度量值
set metric-type 設置目標路由協議的度量值類型
set interface 指定報文的出接口
set ip next-hop 指定轉發的下一跳
最后來做一個整合,在全局模式下使用route-map來創建一個route-map,后面跟上一個自定義的字符串來表示這個route-map的名字。一個route-map可以包含多個序列號,每一個序列號里面允許定義一個或多個match和set語句,并且序列號是有順序的。route-map名字后面的permit表示匹配,deny表示不匹配,route-map里面的deny不是ACL里面的拒絕,ACL的deny如果用在數據進行操作的話,表示把數據包丟棄。只要進入一個序列號的配置中,就可以使用match語句去調用相應的命令來進行對應的匹配,
match語句可以寫多條,主要有兩種形式:
(1)如果兩條match語句是換行寫的,那么這兩條語句就是且的關系,也就是說,當我們在做比對的時候,這兩個條件都要滿足,才認為這個序列號的條件都滿足了,才執行set語句,否則,只要有一個條件它沒有滿足,這個匹配就不成真,那就跳過這個序列號,進入下一個序列號進行比較;
(2)如果單條match語句包括多個條件時,使用邏輯or運算,只要有一個條件滿足了,就認為匹配了。