上篇文档中我们详细介绍了Route-map,并结合了如何在重分布中的应用进行分析,感兴趣的同学请移步《路由策略专题(五)之屠龙宝刀Route-map①》。本篇博文我们将详细阐述一下结合基于策略的路由(PBR)中的应用。


PBR(Policy-based Routing):策略路由,也是route-map的重要使用途径之一。准确说应该PBR应该是基于策略的路由。


传统的路由是基于目的地址的路由方式,将数据包中的目的IP地址按照路由选路的原则,对比自己的路由表,然后将数据包按本地路由表中的信息转发至出接口,当没有路由的时候将数据包丢弃。与传统的IP网络路由有所不同,PBR比传统的路由方式更加灵活,而且对于使用者的目的的执行能力也更强。也摆脱了传统IP路由的缺陷,不仅仅依靠目的IP地址进行数据包的转发。


那么PBR如何具有如此强大路由能力呢?这与策略工具中的王者“Route-map”息息相关。正是由于Route-map的强大能力,而造就了PBR可以摆脱传统IP目的路由的强大的路由、转发功能。


那么我们来看一下PBR的工作流程:

spacer.gif图片.png


PBR应用的技术特点:

  • PBR应用在路由器的数据入站接口上

  • 利用Route-map针对感兴趣流进行抓取,然后执行某些动作(如指定下一跳等等)

  • PBR是数据层面的控制

  • 由于是数据层面,我们抓取流量的时候要使用ACL而不要使用Prefix-list、cost值等路由控制层面的工具



配置命令:

配置命令这里我们着重看一下常用的SET动作,其他的我们简要带过。

1.#创建Route-map

route-map {route-map tag} {permit/deny} {sequence number}


2.#匹配感兴趣流,注意一下使用ACL。

match ip address {acl number|name}


3.#常用SET动作


动作

解释

set interface

如set ge0/1

指定数据的出接口(只适用于P2P连接,暨串口 )

set ip next-hop {ip address | recursive ip address}


set ip next-hop 10.1.1.1 10.2.1.1

set ip next-hop recursive 10.3.1.1

set ip next-hop 10.1.1.1 recursive 10.3.1.1

  1. 如果直接跟ip address表示是接口直连的下一跳。允许跟多个下一跳IP,如果第一个的本地接口down掉,将尝试使用第二个下一跳IP。

  2. 如果使用recursive ip作为下一跳,也叫递归下一跳,这突破了直连的限制,只要求路由表中有相关到达设置的这个IP的路由即可。

  3. 直连下一跳优于递归下一跳。也就是说当情况1、2共存的时候使用优先使用直连IP,如果直连下一跳接口down了在使用递归下一跳。

set ip next-hop verify-availability [next-hop-address {ip add} sequence {1-65535} track {object number}]


1.如果不使用后面的参数那么将默认使用CDP检测下一跳的可达性,如果下一跳没有开启CDP则切换至下一个next-hop如果没有下一个next hop将进行传统路由

2.使用object tracking 来检测一个远端设备的可达性,当采用这个的时候如果第一个下一跳不匹配,则匹配第二个下一跳。如果没有一个下一跳存活将不会进行传统路由,将数据包丢弃。

3.若同时set了verify availability 和availability object tracking则以object tracking为主。

set ip default next-hop


如set ip default  next-hop 10.1.1.1

与set ip next-hop不同的仅仅是路由的优先级,在理论部分我们有讲过。这里再次强调一下

普通路由>set ip default next-hop>默认路由

set ip next-hop>普通路由>默认路由

4.#进入接口下调用开启PBR并调用之前的route-map

ip policy route-map [route-map tag]


5.#针对本地始发的流量开启PBR,在全局模式下。

ip local policy route-map [route-map tag]



下面我们进入实验环节

实验一:

这里的实验拓扑如下图所示,针对这个拓扑图我们简单的看一下几个常用SET动作。

spacer.gif图片.png

路由器R1,R2,R3,R4运行OSPF

R3和R4的lo0接口地址均为8.8.8.8模拟一个云端地址,并且这个接口不宣告进OSPF.

因此R1均不会收到,8.8.8.8来自两端任何一段的8.8.8.8路由

R2上写一条静态路由8.8.8.8/32下一跳设置为24.1.1.4

R5模拟用户,只有一个默认理由指向15.1.1.1。

我们先来看一下R1的路由表。

spacer.gif图片.png

我们这里的实验一的操作均在R1上完成。

R1上配置了

access-list 1 permit 15.1.1.0 0.0.0.255


--------------我是情景分割线--------------------

情景一:使用set ip next-hop。

配置如下:

route-map PBR1 permit 10

    match ip address 1

    set ip next-hop 13.1.1.3

int e0/0

    ip policy route-map PBR1


我们来观察一下实验现象:

R5:

先ping一下8.8.8.8观察一下路径R1->R3这条路

spacer.gif图片.png


在来看一下ping 12.1.1.2这个路径,这时候我们会发现一个有趣的现象

spacer.gif图片.png

实际流量走了这个路径,这是由于在PBR中我们使用了set ip next-hop 这个命令,其中路由的优先级为[PBR]>精准路由>默认路由的缘故。

图片.png

那么如果R3中的接口down掉又会怎么办呢?

这时候我们手动关闭R3的E0/0接口,模拟一下

spacer.gif图片.png

这时候我们看到,R5并不能够ping通8.8.8.8了这时候我们的所有的数据包在R1上仍然疯狂的往E0/2口送但是到达链路之后接收端接口Down掉并不能够访问的到。需求的地址。在链路上数据就被丢弃了。

这时候就需要用到我们的下一个set命令verify-availability了,下面我们看一下情景二


--------------我是情景分割线--------------------

情景二:配合verify-availability使用


R1:

route-map PBR2 permit 10

    match ip address 1

#设置两个下一跳,第一个为R3地址,第二个为R2地址。这里由于运行了动态路由协议其实可以不用写两个下一跳。

    set ip next-hop 13.1.1.3 12.1.1.2

    set ip next-hop verify-availability

int e0/0

    ip policy route-map PBR2


我们继续来观察一下状态

首先在R3 E0/0没有shut的情况下,发现走的是R1->R3这个路径。

spacer.gif图片.png


然后在R3 E0/0 shut的情况下,这时候就可以智能的进行切换到R1->R2->R4这个路径了

spacer.gif图片.png


我们再次打开R3的E0/0接口,但是我们关闭R3的CDP功能

R3:

no cdp run

再次观察,发现如同之前所描述,在set命令中如果使用ip next-hop verify-availability命令不加参数,将使用cdp进行确认。那么如果不是思科的设备我们该怎么做呢。

spacer.gif图片.png


具体配置如下:

#配置sla,通过ping包查看

ip sla 1

    icmp-echo 13.1.1.3 source-interface Ethernet0/2

        frequency 5

#配置sla1的schdule

ip sla schedule 1 start-time now life forever

# 设置一个track实例,并关联相关sla

track 1 ip sla 1 reachability

#修改PBR2的相关条目

route-map PBR2 permit 10

    no set ip next-hop verify-availability

    set ip next-hop verify-availability 13.1.1.3 1 track 1


我们再在R5上验证一下,我们就发现现在就算没有在R3上开启CDP或者R3不支持CDP也可以走R1->R3这个路径了。

spacer.gif图片.png


但是这里有个问题,就是当R3E0/0口down掉的时候不会自动切换到R2为下一跳。

这是由于在route-map中我们Verify-availability生效了但是里面没有关于R1,R2之间链路的检测,因此默认为只检测R1和R3之间链路的连通性,如果R1、R3断了我们在Set中的第二跳也不会生效了,R1将把数据包在自身丢弃。因此我们还要加入关于R2的相关track的配置。


具体如下:

ip sla 2

    icmp-echo 12.1.1.2 source-interface Ethernet0/1

        frequency 5

ip sla schedule 2 life forever start-time now

track 2 ip sla 2 reachability

route-map PBR2 permit 10

    set ip next-hop verify-availability 12.1.1.2 2 track 2

这时候我们就可以当R1和R3之间的链路有问题的时候就可以成功的切换到R1和R2之间的这条链路了。

spacer.gif图片.png


--------------我是情景分割线--------------------

情景三:

这里我们来看一下如何使用递归路由地址作为下一跳。


具体配置如下:

ip sla 1

icmp-echo 13.1.1.3 source-interface Ethernet0/2

frequency 5

ip sla schedule 1 life forever start-time now

track 1 ip sla 1 reachability


ip sla 3

    icmp-echo 24.1.1.4 source-interface Ethernet0/1

        frequency 5

ip sla schedule 3 life forever start-time now

track 3 ip sla 3 reachability


route-map PBR3 permit 10

    match ip address 1

    set ip next-hop verify-availability 13.1.1.3 1 track 1

#注意了这里我们仍然使用的是12.1.1.2作为下一跳的检测,因为去往递归地址24.1.1.4的下一跳实际为12.1.1.2才对。因此上面给出的关于ip sla3的配置是个迷惑误导项大家格外注意了,我在做实验的时候就犯了这个错误导致排错排了半个多小时才找出这个错点。请大家格外注意。

    set ip next-hop verify-availability 12.1.1.2 2 track 2

    set ip next-hop 13.1.1.3

#配置递归路由下一跳

    set ip next-hop recursive 24.1.1.4


inte0/0

ip policy PBR3


这样我们就可以成功的通过递归路由进行通过R1->R2->R4到达8.8.8.8了

我这里在强调一下,使用递归路由进行下一跳的时候,需要在R1存在到往递归下一跳地址的路由(也可以是默认路由)。递归下一跳的主要用途是可以节省配置量。在实际中递归下一跳的应用基本非常少见,因此大家了解一下这个用法就可以了。


--------------我是情景分割线--------------------

情景四:

这是这个实验的最后一个情景,我们将要验证游戏set ip default next-hop的用法。

我们先将所有的接口状态还原。

我们先来查看一下R1的路由表,这里没有任何一条关于8.8.8.8的路由。

spacer.gif图片.png


R1配置:

route-map PBR4 permit 10

    match ip address 1

    set ip default next-hop 13.1.1.3


这时我们在R5 traceroute 8.8.8.8 可以发现:路径为R1->R3->8.8.8.8

spacer.gif图片.png


这时我们在R1上插入一条默认路由,指向R2


R1:

ip route 0.0.0.0 0.0.0.0 12.1.1.2


继续在R5上Traceroute可以看出,路径依旧为R1->R3->8.8.8.8,这里说明选路权重ip default next-hop>默认路由权重

spacer.gif图片.png


我们再在R1上插入一条路由为8.0.0.0/8的路由指向 R2

R1:

ip route 8.0.0.0 255.0.0.0 12.1.1.2


再次在R5上Traceroute可以看出,路径依旧为R1->R2_>R4->8.8.8.8,说明选路权重 细路由权重>ip default next-hop>默认路由权重

spacer.gif图片.png


关于set ip next-hop的权重问题,感兴趣的话自己进行验证,这里就不再过多的进行说明了。


实验一到此结束


实验二

典型应用案例:内网分流

拓扑图如下

图片.png


实验环境分析:

R1,R2,R3运行OSPF,其中所有loop back不口均参与OSPF进程。

R1模拟R1本身,有一条静态路由为192.168.0.0/22指向R4。

R2模拟GW1,包括一个lo0接口地址为8.8.8.8/32模拟互联网。向R1下发默认路由

R3模拟GW2,包括一个lo0接口地址为8.8.8.8/32模拟互联网。向R1下发默认路由

R4模拟E0/0的下行网段,R4上有两个Loopback口,Lo1=192.168.1.1模拟红网段,Lo=192.168.2.1模拟绿网段。

我们希望在R1上做分流,在线路正常时要求红色的流量走网关设备GW1,绿色的流量走网关设备GW2。当某一个线路故障可以自动切换。

我们先来验证一下R1的路由表,查看的确存在来自两台网关设备的默认路由

spacer.gif图片.png

实验配置:


R1:

route-map traffic-split permit 10

    match ip address 1

    set ip next-hop 10.1.0.2

    set ip next-hop verify-availability

route-map traffic-split permit 20

    match ip address 2

    set ip next-hop 10.2.0.3

    set ip next-hop verify-availability

int e0/0

    ip policy route-map traffic-split

这样就可以了。有些小伙伴会比较疑惑,为什么可以只设置一跳?有这个疑问的小伙伴请回顾一下文章开头的表格。



当然,如果网关设备不是思科设备,那么我们也要使用sla进行连通性验证,相对的配置也多一些。


!

ip sla 1

icmp-echo 10.1.0.2 source-ip 10.1.0.1

frequency 5

ip sla schedule 1 life forever start-time now

track 1 ip sla 1

!

ip sla 2

icmp-echo 10.2.0.3 source-ip 10.2.0.1

frequency 5

ip sla schedule 2 life forever start-time now

track 2 ip sla 2

!

route-map traffic-split permit 10

    match ip address 1

    set ip next-hop verify-availability 10.1.0.2 1 track 1

    set ip next-hop verify-availability 10.2.0.3 2 track 2

    set ip next-hop 10.1.0.2 10.2.0.3

route-map traffic-split permit 20

    match ip address 2

    set ip next-hop verify-availability 10.2.0.3 1 track 2

    set ip next-hop verify-availability 10.1.0.2 2 track 1

    set ip next-hop 10.2.0.3 10.1.0.2

!

int e0/0

    ip policy route-map traffic-split


我们关于PBR的搭配和route-map在PBR中的应用就介绍到之这里。


本篇文档就介绍到这里,希望能帮助到你。需要实验拓扑的小伙伴可以关注一下我,给我私信或者加我的QQ,我可以将我的实验拓扑环境给你。谢谢关注支持