作为论坛的最忠实的用户之一,这次活动第一周没来得及参与,感觉有点对不起组织:),小写一篇,期待和大家一起讨论:handshake
PBR(Policy Based Routing,策略路由),即根据自定义的策略转发路由,优先级高于“正常路由”。
在日常的网络管理中,我们也经常说“路由策略”,它和“策略路由”有去本质区别的:
1,策略路由:操作对象是数据包,在路由表已经产生的情况下,不按照路由表进行转发,而根据需要,依照自定义的某种策略改变数据包的转发路径。
2,路由策略:操作对象是路由信息,主要通过设置路由过滤、路由属性等,来达到改变网络流量所经过的路径。(为了区分,我们一般称为“路径策略”,后篇会详细讨论)
我的理解是:策略路由没有改变路由表,只是策略优先于路由表,而路由策略直接改变了路由表。因为PBR主要通过route-map来实现,之前应该完全掌握了路由图的语法,至于PBR的具体应用规则,我们还是放到实验中来理解。
在下图拓扑中,全网运行OSPF等价负载均衡,VLAN之间通过单臂路由实现通信(协议和VLAN间通信的方式不影响本实验,可以任意选择)。为了测试方便,图中PC1-PC3均为路由器模拟。
基础配置:
R1(config)#inter fa0/0
R1(config-if)#no shut
R1(config-if)#inter fa0/0.1
R1(config-subif)#en do 1
R1(config-subif)#ip add 10.1.1.254 255.255.255.0
R1(config-subif)#inter fa0/0.2
R1(config-subif)#en do 2
R1(config-subif)#ip add 20.1.1.254 255.255.255.0
R1(config-subif)#inter fa0/0.3
R1(config-subif)#en do 3
R1(config-subif)#ip add 30.1.1.254 255.255.255.0
R1(config)#router ospf 1
R1(config-router)#net 0.0.0.0 255.255.255.255 area 0
R2(config)#router ospf 1
R2(config-router)#net 0.0.0.0 255.255.255.255 area 0
需求1:在路由器R1上实现PBR,来自于VLAN2的数据包,选择12.1.1.2作为下一跳;来自于VLAN3的数据包选择120.1.1.2作为下一跳;来自于VLAN1的数据包则正常转发。
R1(config)#access-list 2 permit 20.1.1.0 0.0.0.255
R1(config)#access-list 3 permit 30.1.1.0 0.0.0.255
#使用ACL定义流量
R1(config)#route-map chj permit 10
R1(config-route-map)#match ip address 2
R1(config-route-map)#set ip next-hop 12.1.1.2
R1(config-route-map)#route-map chj permit 20
R1(config-route-map)#match ip address 3
R1(config-route-map)#set ip next-hop 120.1.1.2
#路由图应用到PBR,默认是允许所有流量,所以不需要再permit 30(重分发中默认是拒绝所有)
R1(config)#inter range fa0/0.1 ,fa0/0.2 ,fa0/0.3
R1(config-if-range)#ip policy route-map chj
#接口上的PBR没有方向,只能对in方向的流量生效
R1#debug ip policy
测试记录:
在实验的过程中,细心认真的同学,应该会发现,在使用set ip next-hop命令时,后面可以接多个下一跳:
R1(config)#route-map jym permit 10
R1(config-route-map)#set ip next-hop 12.1.1.2 120.1.1.2
这里的多个下一跳,可以实现冗余,当第一个下一跳down了,自动切换到下一个下一跳,但是这些地址必须是直连路由器的接口IP。注意如下写法无效,会自动转成上面的格式:
R1(config-route-map)#set ip next-hop 12.1.1.2
R1(config-route-map)#set ip next-hop 120.1.1.2
配置文件中的显示结果:
如果下一跳不是直连的(路由表有相关路由可达即可),则需要使用递归下一跳:
R1(config)#route-map jym permit 10
R1(config-route-map)#set ip next-hop 12.1.1.2 120.1.1.2
R1(config-route-map)#set ip next-hop recursive 2.2.2.2
此时,如果两个直连的冗余下一跳都down了,使用递归下一跳,如果都down了,则丢给路由表处理。在一个route-map系列号中,递归下一跳只能配置一个,再配置则覆盖前一个。如果直连和递归下一跳同时使用,则直连下一跳优先。对于下一跳可达性的检查,我们还可以定义两种方式:
R1(config-route-map)#set ip next-hop verify-availability
#使用CDP检查下一跳可达性,要求双方均支持并开启CDP,由于CDP特性,仅限直连下一跳检测。
R1(config-route-map)#set ip next-hop verify-availability 2.2.2.2 1 track 10
#结合object tracking来检查非直连远端的可达性
在PBR中,最常见的set就是set ip next-hop和set interface,比如使用set interface null 0丢弃数据包等等。但是系统中也支持另外一组命令:
R1(config)#route-map chj permit 10
R1(config-route-map)#set default interface fa2/0
R1(config-route-map)#set ip default next-hop 2.2.2.2
都多了一个default,区别是:不含default的命令,是不查询路由表就转发数据包到下一跳IP或接口(先策略后路由),而含有default的命令是先查询路由表,在找不到精确匹配的路由条目时,才转发数据包到default命令指定的下一跳IP或接口(先路由后策略)。