route-map的一种应用,基于策略的路由比传统的路由能力更强,使用更灵活,它使网络管理者不仅能够根据目的地址而且能够根据协议类型、报文大小、应用或IP源地址来选择转发路径。策略路由可以定义为通过多路由器的负载平衡或根据总流量在各线上进行报文转发的服务质量来定义策略路由。
策略路由主要对经过路由器的数据流进行分流和过滤以及感兴趣的数据流。
在讲PBR之前有必要简单介绍下Route-map工具,Route-map包含两元,一个是match(匹配)还有一个是set(执行动作)。
Route-map默认为permit,默认序列号10,序列号不会自动递增,需要指定序列号。
Route-map执行从最小的序列号开始执行,如果一旦匹配到将不再执行下边序列号的语句,如果一个都没有匹配住,Route-map末尾隐含deny any语句。
单条match语句包含多个条件时,使用逻辑or运算(或运算)
多条match语句时,使用逻辑and运算(且运算)
Route-map name {permit|deny }10
match xxx zzz X和Z只要匹配到一个这个match就成真
Set yy 执行set动作
Route-map name {permit|deny } 20
match xxx x和z两个match都必须匹配到这个序列号中的set动作才会执行
match zzz
Set yy
Route-map name deny 隐含deny any语句
图解:数据包到了接口,路由器查看是否应用PBR工具,如果有执行PBR的match语句,如果被match语句匹配则执行set动作,如果没有被match语句匹配住,这个数据包流量将会按照传统路由表进行转发,而不是丢弃。这是PBR很重要的一个处理数据包的流程概念,PBR的set动作是优于路由表的。
PBR的配制分为三个步骤:1.用ACL匹配数据 2.在Route-map中部署PBR 3.调用PBR
如果只在Route-map中部署PBR而不调用,PBR是不生效的。
整篇文章的实验拓扑IP地址规划:192.168.xy.z/24 其中x和y是两端设备编号,z是设备本身编号。 x代表较小的设备编号,y代表较大的设备编号。
PBR叫策略路由,而不是叫路由策略,PBR和传统的路径控制工具最大的区别就是它可以跟据源去做策略,而传统的路径控制工具只能根据目的去做决策,改变目的来影响数据流的走向。
如上图,R1路由器去往100.100.100.100/24目的有两条路径,下边的VLAN10和VLAN20用户只能走一边,或者等价负载均衡方式转发。传统工具无法做到让VLAN10强制走R2,VLAN20强制走R3。PBR可以做到,PBR可以跟据源去匹配感兴趣的data(数据),强制性让VLAN10用户走R2,并且当R2挂掉切换到R3。强制性让VLAN20走R3,同样当R3挂掉切换到R2。
首先用ACL匹配感兴趣数据流,上边命令分别用两个ACL去匹配VLAN10和VLAN20的数据:
R1(config)#ip access-list standard vlan10
R1(config-std-nacl)#permit 192.168.1.0 0.0.0.255
R1(config)#ip access-list standard vlan20
R1(config-std-nacl)#permit 192.168.2.0 0.0.0.255
R1(config)#route-map PBR permit 10 //创建Route-map,配置PBR
R1(config-route-map)#match ip address vlan10 //match VLAN10的ACL
R1(config-route-map)#set ip next-hop 192.168.12.2 //执行set动作将数据丢给下一跳,需要注意这个下一跳一定是我直连的下一跳。Set动作的意思就是我将数据包丢给我的下一跳路由器,让它帮我转发数据,它丢给下一跳的动作是不会改变数据包的源和目的信息。
R1(config-route-map)#exit
R1(config)#route-map PBR permit 20 // 在 PBR 的Route-map里边创建第二个序列号
R1(config-route-map)#match ip address vlan20 // match VLAN20的ACL
R1(config-route-map)#set ip next-hop 192.168.13.3 //执行set动作将数据丢给下一跳,需要注意这个下一跳一定是我直连的下一跳,Set动作的意思就是我将数据包丢给我的下一跳路由器,让它帮我转发数据 ,它丢给下一跳的动作是不会改变数据包的源和目的信息。
R1(config-route-map)# exit
R1(config)#interface fastEthernet 1/0 //在R1路由器的f1/0接口进行调用
R1(config-if)#ip policy route-map PBR //这条命令是调用PBR,接口调用PBR,使得刚配置的PBR生效.
PBR的调用有两种方式:第一种接口调用,第二种全局调用
接口调用:从这个接口经过的数据流量执行PBR的策略
全局调用:R1(config)#ip local policy route-map PBR //全局调用就是从这台路由器设备本身经过的数据全部执行PBR的策略
经过以上三个步骤配置,PBR的最简单的应用场景就实现了,下边查看VLAN10和VLAN20用户是不是按照PBR的方式执行。
R1路由表去往100.100.100.100/24实际上是走的默认路由,而默认路由的下一跳是R2,也就是在上述情况,去往该目的地实际上只能走R2,通过R3是到不了的,但是我们PBR可以做到,因为我们可以将数据丢给我的直连下一跳,让它们进行转发。
总结:VLAN10的用户发送数据到去往100.100.100.100/24目的,数据包到了R1的f1/0接口,R1路由器查看有没有部署PBR,刚好部署,查看match语句能否匹配,刚好匹配执行set动作强制将数据包丢给R2路由器
VLAN20的用户发送数据到去往100.100.100.100/24目的,数据包到了R1的f1/0接口,R1路由器执行PBR,将数据丢给R3,其实如果没有部署PBR,R1直接通过R3是过不去的,因为没有路由。R1的路由表去往100.100.100.100/24只有一条默认路由指向R2。但是我们做了PBR,R1将数据丢个了R3路由器,让它进行转发,尽管我路由表本身没有路由。
PBR应用场景二:利用set语句的多个下一跳特性
需求:希望VLAN10用户强制走R2路由器,当R2路由器挂掉后走R3路由器,当R3挂掉后通过R7访问100.100.100.100/24,希望VLAN20用户强制走R3路由器,当R3路由器挂掉后走R2路由器,当R2挂掉后通过R7访问100.100.100.100/24。
具体配置命令:
首先用ACL匹配感兴趣数据流,上边命令分别用两个ACL去匹配VLAN10和VLAN20的数据:
R1(config)#ip access-list standard vlan10
R1(config-std-nacl)#permit 192.168.1.0 0.0.0.255
R1(config)#ip access-list standard vlan20
R1(config-std-nacl)#permit 192.168.2.0 0.0.0.255
R1(config)#route-map PBR permit 10 //创建Route-map,配置PBR
R1(config-route-map)#match ip address vlan10 // match VLAN10的ACL
R1(config-route-map)#set ip next-hop 192.168.12.2 192.168.13.3 //set动作这里的下一跳可以写多个,先执行第一个,当第一个不可达了也就是挂掉了,执行第二个
R1(config-route-map)#exit
R1(config)#route-map PBR permit 20 //在 PBR 的Route-map里边创建第二个序列号
R1(config-route-map)#match ip address vlan20 //match VLAN20的ACL
R1(config-route-map)#set ip next-hop 192.168.13.3 192.168.12.2 //set动作这里的下一跳可以写多个,先执行第一个,当第一个不可达了也就是挂掉了,执行第二个
R1(config-route-map)#exit
R1(config)#interface fastEthernet 1/0 //在R1路由器的f1/0接口进行调用
R1(config-if)#ip policy route-map PBR //这条命令是调用PBR
总结:其实配置和场景一配置是一模一样的,就是在set后边多添加了那个下一跳的地址,当第一个地址不可达了,执行第二个地址。
PBR的set动作下一跳也不一定非要是直连的路由器接口IP,PBR有一个递归下一条的概念。
recursive next-hop(递归下一跳)特性突破了传统下一跳必须是直连路由器接口IP的限制。recursive next-hop可以不是直连网络,只要路由表中有相关的路由可达即可。一般recursive next-hop不可达,数据交由路由表处理(一般就被默认路由匹配走)
规则:如果在一个route-map列表同一个序列号中同时使用ip next-hop及ip next-hop recursive ,则ip next-hop有效,如果IP next-hop挂了,则启用IP next-hop recursive,如果两个都挂了,则丢给路由表处理。注意: 一个route-map序列号中,只允许配置一个ip next-hop recursive.
需求VLAN10和VLAN20用户强制走R3路由器,当R3路由器挂掉以后从R2路由器走,R2路由器挂掉后从R5路由器转发出去。
首先用ACL匹配感兴趣数据流,上边命令用1个ACL去匹配VLAN10和VLAN20的数据
R1(config)#ip access-list standard vlan10anvlan20
R1(config-std-nacl)#10 permit 192.168.1.0 0.0.0.255
R1(config-std-nacl)#20 permit 192.168.2.0 0.0.0.255
R1(config)#route-map PBR permit 10 //创建Route-map,配置PBR
R1(config-route-map)#match ip address vlan10andvlan20 //match VLAN10和VLAN20的用户数据流量ACL
R1(config-route-map)#set ip next-hop 192.168.13.3 //先set到R3路由器
R1(config-route-map)#set ip next-hop recursive 192.168.24.2 //递归到R2路由器f0/1接口,也只能递归这个接口,不能递归到R4路由器接口IP
R1(config-route-map)#exit
R1(config)#interface fastEtherne1/0 //在R1路由器的f1/0接口进行调用
R1(config-if)#ip policy route-map PBR //这条命令是调用PBR
在R1的路由表中去往100.100.100.100/24的目的只有默认路由可以匹配,但是默认路由的下一跳是R5,因为部署了PBR所以先匹配PBR的set动作。
R1(config)#interface fastEthernet 0/1
R1(config-if)#shutdown //将R1的f0/1接口shutdown掉,模拟R3挂掉
需求:我们希望VLAN10的用户走ISP-1,VLAN20的用户走ISP-2并且在两边任何链路故障都能够切换,结合NAT。
IP SLA:cisco公司的一种私有协议,可以通过源发送icmp包检测公司与运营商之间的接口是否是up的,因为有可能R1作为客户路由器和运营商之间有一台透明设备。假设ISP-1和透明设备之间链路故障,而作为客户这边是感知不到的,岂不是数据转发就有问题。就算没有透明设备,一般与运营商之间链路接口的UP和down也很难通过接口本身去感知,所以我们需要IP SLA协议去探测链路接口的UP和down,更多的说明,还请百度。在模拟器环境下 IP SLA好像只对S串口生效,就是我上图环境,以太网接口模拟器它模拟不到对端存活,我有尝试以太网接口没用。。。。。。
多出口NAT:我们希望VLAN10的用户走ISP-1,VLAN20的用户走ISP-2
并且在两边任何链路故障都能够切换,像上边的三个场景,都没有部署NAT只是单纯的为了实验PBR工具的使用方式,,一台出口路由器上联两家ISP运营商,然后不同的VLAN用户走不同的ISP运营商。
NAT我们做PAT,就是端口扩展的NAT模式,不做动态和静态的。
PBR:通过PBR实现VLAN10走ISP-1,VLAN20走ISP-2进行数据分流。
我们要结合Route-map和NAT去最终实现上述要求,不过现网一般有负载均衡的设备,也可以更简单的达到这种需求,我们可以看下在cisco的IOS平台如何通过Route-map+NAT的结合实现。
路由部分:出口路由器必须有默认路由,我们写一个静态和一个浮动默认路由
R1(config)#ip route 0.0.0.0 0.0.0.0 192.168.12.2 //静态默认路由指电信运营商
R1(config)#ip route 0.0.0.0 0.0.0.0 192.168.13.3 5 //浮动的指教育网
R1(config)#ip route 192.168.1.0 255.255.255.0 192.168.14.4 //回城路由,要能回到VLAN10
R1(config)#ip route 192.168.2.0 255.255.255.0 192.168.14.4 //回城路由,要能回到VLAN20
PBR部分:就不再赘述,上边已经举例3个场景了,PBR实现数据分流
R1(config)#route-map PBR permit 10
R1(config-route-map)#match ip address vlan10
R1(config-route-map)#set ip next-hop 192.168.12.2
R1(config-route-map)#exit
R1(config)#route-map PBR permit 20
R1(config-route-map)#match ip address vlan20
R1(config-route-map)#set ip next-hop 192.168.13.3
R1(config-route-map)#exit
R1(config)#interface fastEthernet 0/0 //最后一定在接口或者全局进行调用PBR
R1(config-if)#ip policy route-map PBR
NAT部分:结合Route-map去实现
R1(config)#interface serial 2/0 //定义接口的outside和inside模式
R1(config-if)#ip nat outside //外是outside模式
R1(config-route-map)#exit
R1(congig)#interface serial 2/1
R1(config-if)#ip nat outside
R1(config)#interface range fastEthernet 1/0
R1(config-if-range)#ip nat inside // 内是inside模式
R1(config-route-map)#exit
定义4个Route-map,定义4给nat的实例,一一相互对应进行调用,我用序号进行标识,属于一个序列就是一组配置,一组配置指:Router-map+NAT的一组
①R1(config)#route-map nat1 permit 10 //定义第一个nat
R1(config-route-map)#match ip address vlan10 //匹配VLAN10的数据
R1(config-route-map)#match interface serial 2/0 // 匹配从该接口经过的数据,在最前边Route-map中有提到,多条match语句时,使用逻辑and运算(且运算)
R1(config-route-map)#exit
②R1(config)#route-map nat2 permit 10
R1(config-route-map)#match ip address vlan10
R1(config-route-map)#match interface serial 2/1
R1(config-route-map)#exit
③R1(config)#route-map nat3 permit 10
R1(config-route-map)#match ip address vlan20
R1(config-route-map)#match interface serial 2/1
R1(config-route-map)#exit
④R1(config)#route-map nat4 permit 10
R1(config-route-map)#match ip address vlan20
R1(config-route-map)#match interface serial 2/0
R1(config-route-map)#exit
①R1(config)#ip nat inside source route-map nat1 interface serial 2/0 overload 配置NAT调用Route-map所匹配的数据,这个和最上边的Route-map nat1所对应,下边的同理一 一对应
②R1(config)#ip nat inside source route-map nat2 interface serial 2/1 overload
③R1(config)#ip nat inside source route-map nat3 interface serial 2/1 overload
④R1(config)#ip nat inside source route-map nat4 interface serial 2/0 overload
Sla部分:现在都EVE模拟器,12.4版本是老版本,EVE模拟器的IOS版本都是最新的15.0以后的,15.0的sla的配置我没尝试,但是只有一条命令和12.4版本的不一样我写出来:
R1(config)#track 10 ip route 192.168.12.2 192.168.12.1 reachability GNS3模拟器的12.4版本用这条命令进行关联track实例
R1 (config)#track 10 ip sla 10 reachability //15.0版本用这条命令关联track实例
R1 (config)#ip sla 10 //创建sla 10,检测ISP-2运营商现路
Switch(config-ip-sla)#icmp-echo 192.168.12.2 source-ip 192.168.12.1 //用源192.168.12.1检测对端192.168.12.2地址
R1 (config-ip-sla-echo)#frequency 5 //检测超时时间5S
R1 (config-ip-sla-echo)#exit
R1(config)#ip sla schedule 10 life forever start-time now //设置立即生效sla命令
R1(config)#track 10 ip route 192.168.12.2 192.168.12.1 reachability //关联到一个Track实例,
R1(config-track)#exit
R1 (config)#route-map PBR permit 10
R1(config-route-map)#set ip next-hop verify-availability 192.168.12.2 10 track 10
//在PBR中调用,下边一共两个10,第一个10是sla的10,第二个10是track实例的10
R1 (config)#ip sla 20 // 创建sla 20,检测ISP-3运营商线路
R1 (config-ip-sla)#icmp-echo 192.168.13.3 source-ip 192.168.13.1 用源192.168.13.1检测对端192.168.13.3地址
R1 (config-ip-sla-echo)#frequency 5 //检测超时时间5S
R1 (config-ip-sla-echo)#exit
R1 (config)#ip sla schedule 20 life forever start-time now //设置立即生效sla命令
R1 (config)#track 20 ip route 192.168.13.3 192.168.13.1 reachability //关联到一个Track实例
R1(config-track)#exit
R1 (config)#route-map PBR permit 20
R1(config-route-map)#set ip next-hop verify-availability 192.168.13.3 20 track 20
在PBR中调用,下边一共两个20,第一个20是sla的20,第二个20是track实例的20
把整个PBR写完,发现还是漏了一个点就是PBR的set动作,我上边提到它是优于传统路由表的,通过整篇文章应该也能理解这句话。
漏讲的就是我们可以通过在set动作后加上default关键字,让set动作它不优于路由表。就是先查询路由表,看有没有去往目的的明细,有走路由表,没有执行set动作
比如场景一的实验,其实配置大同小异只是结果稍微有点不同,配置:
需求:VLAN10用户去往100.100.100.100/24目的强制丢给R2,VLAN20强制丢给R3路由器
具体配置命令:
首先用ACL匹配感兴趣数据流,上边命令分别用两个ACL去匹配VLAN10和VLAN20的数据
R1(config)#ip access-list standard vlan10
R1(config-std-nacl)#permit 192.168.1.0 0.0.0.255
R1(config)#ip access-list standard vlan20
R1(config-std-nacl)#permit 192.168.2.0 0.0.0.255
R1(config)#route-map PBR permit 10 //创建Route-map,配置PBR
R1(config-route-map)#match ip address vlan10 // match VLAN10的ACL
R1(config-route-map)#set ip default next-hop 192.168.12.2 //执行set动作将数据丢给下一跳,需要注意这个下一跳一定是我直连的下一跳。注意加上了default 关键字
R1(config-route-map)#exit
R1(config)#route-map PBR permit 20 //在 PBR 的Route-map里边创建第二个序列号
R1(config-route-map)#match ip address vlan20 match VLAN20的ACL
R1(config-route-map)#set ip next-hop 192.168.13.3 //执行set动作将数据丢给下一跳,需要注意这个下一跳一定是我直连的下一跳
R1(config-route-map)#exit
R1(config)#interface fastEthernet 1/0 //在R1路由器的f1/0接口进行调用
R1(config-if)#ip policy route-map PBR // 这条命令是调用PBR,接口调用PBR,使得刚配置的PBR生效