注: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命令能够结合起来使用。