注:PBR以前是CISCO用來丟棄報文的一個主要手段。比如:設置set interface null 0,按CISCO說法這樣會比ACL的deny要節省一些開銷。這裏我提醒:
interface null 0
no ip unreachable //加入這個命令
這樣避免因爲丟棄大量的報文而導致很多ICMP的不可達消息返回。
三層設備在轉發數據包時一般都基於數據包的目的地址(目的網絡進行轉發),那麼策略路由有什麼特點呢?
1、可以不僅僅依據目的地址轉發數據包,它可以基於源地址、數據應用、數據包長度等。這樣轉發數據包更靈活。
2、爲QoS服務。使用route-map及策略路由可以根據數據包的特徵修改其相關QoS項,進行爲QoS服務。
3、負載平衡。使用策略路由可以設置數據包的行爲,比如下一跳、下一接口等,這樣在存在多條鏈路的情況下,可以根據數據包的應用不同而使用不同的鏈路,進而提供高效的負載平衡能力。
策略路由影響的只是本地的行爲,所以可能會引起“不對稱路由”形式的流量。比如一個單位有兩條上行鏈路A與B,該單位想把所有HTTP流量分擔到A鏈路,FTP流量分擔到B鏈路,這是沒有問題的,但在其上行設備上,無法保證下行的HTTP流量分擔到A鏈路,FTP流量分擔到B鏈路。
策略路由一般針對的是接口入(in)方向的數據包,但也可在啓用相關配置的情況下對本地所發出的數據包也進行策略路由。
本文就策略路由的以下四個方面做相關講解:
1、啓用策略路由
2、啓用Fast-Switched PBR
3、啓用Local PBR
4、啓用CEF-Switched PBR
啓用策略路由:
1. 開始配置route-map。使用route-map map-tag [permit | deny] [sequence-number]進入route-map的配置模式。
2. 使用match語句定義感興趣的流量,如果不定義則指全部流量。match length min max and/or match ip address {access-list-number | name}[...access-list-number | name]
3. 使用set命令設置數據包行爲。
set ip precedence [number | name]
set ip next-hop ip-address [... ip-address]
set interface interface-type interface-number [... type number]
set ip default next-hop ip-address [... ip-address]
set default interface interface-type interface-number [... type ...number]
4. 這裏要注意set ip next-hop與set ip default next-hop、set interface與set default interface這兩對語句的區別,不含default的語句,是不查詢路由表就轉發數據包到下一跳IP或接口,而含有default的語句是先查詢路由表,在找不到精確匹配的路由條目時,才轉發數據包到default語句指定的下一跳IP或接口。
5. 進入想應用策略路由的接口。interface xxx
6. 應用所定義的策略。注意必須在定義好相關的route-map後才能在接口上使用該route-map,在接口啓用route-map策略的命令爲:
ip policy route-map map-tag
啓用Fast-Switched PBR
在Cisco IOS Release 12.0之前,策略路由只能通過“進程轉發”來轉發數據包,這樣數據包的轉發效率是非常低的,在不同的平臺上,基本在每秒1000到10,000個數據包。隨着緩存轉發技術的出現,Cisco實現了Fast-Switched PBR,大大提升了數據包的轉發速度。啓用方法即在接口中使用ip route-cache policy命令。
注意:Fast-switched PBR支持所有的match語句及大多數的set語句,但其有下面的兩個限制:
1. 不支持set ip default next-hop 與 set default interface命令。
2. 如果在route-cache中不存在set中指定的接口相關的項,那麼僅在point-to-point時set interface命令才能夠Fast-switched PBR。而且,在進行“進程轉發”時,系統還會先查詢路由條目查看該interface是不是一個合理的路徑。而在fast switching時,系統不會對此進行檢查。
啓用Local PBR
默認情況下,路由器自身所產生的數據包不會被策略路由,如果想對路由器自身產生的數據包也進行策略路由,那麼需要在全局模式下使用如下命令來啓用:
ip local policy route-map map-tag
啓用CEF-Switched PBR
在支持CEF的平臺上,系統可以使用CEF-Switched PBR來提高PBR的轉發速度,其轉發速度比Fast-Switched PBR更快!只要你在啓用PBR的路由器上啓用了CEF,那麼CEF-Switched PBR會自動啓用。
注:ip route-cache policy僅僅適用於Fast-Switched PBR,在CEF-Switched PBR中並不需要,如果你在啓用了CEF的路由器上使用PBR時,這個命令沒有任何作用,系統會忽略此命令的存在。
PBR配置案例:
案例1:
路由器通過兩條不同的鏈路連接至兩ISP,對於從async 1接口進入的流量,在沒有“精確路由”匹配的情況下,把源地址爲
配置如下:
access-list 1 permit i
access-list 2 permit ip 2.2.2.2
!
interface async 1
ip policy route-map equal-access
!
route-map equal-access permit 10
match ip address 1
set ip default next-hop 6.6.6.6
route-map equal-access permit 20
match ip address 2
set ip default next-hop 7.7.7.7
route-map equal-access permit 30
set default interface null0
案例2
在路由器針對不同流量,修改其precedence bit,並設置下一跳地址。對於
配置如下:
access-list 1 permit i
access-list 2 permit ip 2.2.2.2
!
interface ethernet 1
ip policy route-map Texas
!
route-map Texas permit 10
match ip address 1
set ip precedence priority
set ip next-hop 3.3.3.3
!
route-map Texas permit 20
match ip address 2
set ip precedence critical
set ip next-hop 3.3.3.5
一個route map由擁有相同route-map名的route-map statements集合構成。這些語句可以用permit和deny來標識是否執行策略路由。如果一個數據包所匹配的statement的標準是deny,則作爲通常的目的地址路由來進行轉發。如果是permit,則所有其上的set命令被應用。
讓我們看一個demo:
route-map demo permit 10
match X Y Z
match A
set B
set C
route-map demo permit 20
match Q
set R
route-map demo permit 30
任何與X、Y、Z匹配的數據包都執行set B和C,如果沒有任何匹配,也就不會執行任何set命令。
下面我們具體看一下命令:
1、使用route-map命令創建route map
Router(config)#route-map [permit|deny][]
參數map-tag指定了route map的名字
參數permit和deny指定了如果條件匹配將執行的動作
參數sequence-number用於區分每一個route map statement,不同的statement擁有不同的sequence number。通過這個參數你可以在一個route map的特定位置插入或刪除一條route map statement,並且可以單獨的編輯它。
一個route map可以包含多個route map statement,這些語句的執行順序像ACL一樣是從上到下。對於一個路由,先匹配的先執行。
2、使用match route map命令定義檢查條件
Router(config-route-map)#match {}
3、使用set route-map配置命令定義如果條件匹配後的行爲
Router(config-route-map)#set {}
一個route map可以包含多個route map statement,一個match語句可以包含多個條件。如果一個條件爲真,則認爲這個條件匹配;然而,必須所有的條件都匹配,才認爲這個route map statement匹配。
序列號參數決定了進行條件匹配的順序。只有序列號爲10的語句沒有匹配,纔會檢查序列號爲20的語句才被檢查。
一個route map的最後默認"deny any"。這個deny的使用結果依賴於這個route map是怎樣使用的。如果一個數據包對於route map沒有匹配項,它會按照正常的目的地址路由轉發。如果你想丟棄這個包,需要包含一個set語句路由這個包到一個null接口。這條語句應該被放在route map的最後。
Match
用來在route-map中執行匹配的標準包括:
1、 IP訪問列表中的源和目的地址
2、 三層數據包長度
1、標準訪問列表和擴展訪問列表都可用來建立策略路由的匹配標準。
要使用IP訪問列表來實現策略路由,可以使用match ip address命令:
Router(config-route-map)#match ip address {|} [...|]
如果定義了多個訪問控制列表,任何一個訪問列表被匹配都認爲這條語句被匹配。
2、使用match route map命令定義檢查條件
Router(config-route-map)#match {}
3、使用set route-map配置命令定義如果條件匹配後的行爲
Router(config-route-map)#set {}
一個route map可以包含多個route map statement,一個match語句可以包含多個條件。如果一個條件爲真,則認爲這個條件匹配;然而,必須所有的條件都匹配,才認爲這個route map statement匹配。
序列號參數決定了進行條件匹配的順序。只有序列號爲10的語句沒有匹配,纔會檢查序列號爲20的語句才被檢查。
一個route map的最後默認"deny any"。這個deny的使用結果依賴於這個route map是怎樣使用的。如果一個數據包對於route map沒有匹配項,它會按照正常的目的地址路由轉發。如果你想丟棄這個包,需要包含一個set語句路由這個包到一個null接口。這條語句應該被放在route map的最後。
Match
用來在route-map中執行匹配的標準包括:
1、 IP訪問列表中的源和目的地址
2、 三層數據包長度
1、標準訪問列表和擴展訪問列表都可用來建立策略路由的匹配標準。
要使用IP訪問列表來實現策略路由,可以使用match ip address命令:
Router(config-route-map)#match ip address {|} [...|]
如果定義了多個訪問控制列表,任何一個訪問列表被匹配都認爲這條語句被匹配。
2、使用match route map命令定義檢查條件
Router(config-route-map)#match {}
3、使用set route-map配置命令定義如果條件匹配後的行爲
Router(config-route-map)#set {}
一個route map可以包含多個route map statement,一個match語句可以包含多個條件。如果一個條件爲真,則認爲這個條件匹配;然而,必須所有的條件都匹配,才認爲這個route map statement匹配。
序列號參數決定了進行條件匹配的順序。只有序列號爲10的語句沒有匹配,纔會檢查序列號爲20的語句才被檢查。
一個route map的最後默認"deny any"。這個deny的使用結果依賴於這個route map是怎樣使用的。如果一個數據包對於route map沒有匹配項,它會按照正常的目的地址路由轉發。如果你想丟棄這個包,需要包含一個set語句路由這個包到一個null接口。這條語句應該被放在route map的最後。
Match
用來在route-map中執行匹配的標準包括:
1、 IP訪問列表中的源和目的地址
2、 三層數據包長度
1、標準訪問列表和擴展訪問列表都可用來建立策略路由的匹配標準。
要使用IP訪問列表來實現策略路由,可以使用match ip address命令:
Router(config-route-map)#match ip address {|} [...|]
如果定義了多個訪問控制列表,任何一個訪問列表被匹配都認爲這條語句被匹配。
2、match length 命令用來基於三層包長度來建立匹配。
Router(config-route-map)#match length
參數 定義了三層包的最大和最小長度。當一個包的長度在這兩個值之間,匹配成立。
可以使用match length命令來區分傳輸類型,例如:交互數據包和文件傳輸數據包,文件傳輸數據包往往比較大。
Set
可以使用一系列的set命令來定義當匹配語句滿足時,數據包如何通過路由器進行轉發。
1、 set ip next-hop
2、 set interface
3、 set ip default next-hop
4、 set ip default interface
5、 set ip tos
6、 set ip precedence
一些set命令隻影響路由表裏有明顯路由的數據包;其他的set命令隻影響路由表裏沒有明顯路由的數據包。下面我們來仔細看一下:
(1) Router(config-route-map)#set ip next-hop [...]
Set ip next hop 命令設定流出端口的數據包的下一跳地址。
這個地址必須是鄰接路由器的ip地址。如果配置了多個接口,則使用第一個相關的可用接口。這個命令將影響所有的數據包類型並且一直使用。
(2) Router(config-route-map)#set interface [... ]
Set interface 命令爲數據包設定出向端口。 參數指定接口的類型和編號。如果定義了多個接口,則使用第一個被發現的up接口。
有時,路由表可能不包含到一個數據包目的地址的明顯的路由(例如:廣播包或者目的地址未知的數據包),這種情況下,命令將不影響到這些數據包或者說命令忽略這些數據包。
(3)Router(config-route-map)# set ip default next hop [...]
set ip default next hop命令用於當路由表裏沒有到數據包目的地址的明顯路由時,設定它的下一跳地址。
(4)Router(config-route-map)# set default interface [...]
如果到目的地址沒有明顯路由,set default interface命令爲這些數據包設定output接口。
一旦目的地址或接口被選擇,其他的default set 命令被忽略。
(5)Router(config-route-map)# set ip tos
Set ip tos 用來設定IP數據包的IP ToS值。可以設定以下值:
<0 - 15> |
Type of sevice value |
Max-reliability |
Set max reliable ToS (2) |
Max-throughput |
Set max throughput ToS (4) |
Min-delay |
Set min delay ToS (8) |
Min-monetary-cost |
Set min monetary cost ToS (1) |
normal |
Set normal ToS (0) |
(6) Router(config-route-map)#set ip precedence [|]
Set ip precedence 命令用來設定IP數據包的優先級。可設定值如下表:
Value |
Name |
0 |
Routine |
1 |
Priority |
2 |
Immediate |
3 |
Flash |
4 |
Flash-override |
5 |
Critical |
6 |
Internet |
7 |
Network |
這個表顯示了能夠使用的優先級值和相應的名字。
如前面的demo所示這些set命令可以結合起來使用。