之前介绍了路由抓取工具(ACL,Prefix-List)和一些路由控制工具(Distribute-list,Filter-List和offset-List)。有需要的可以关注一下之前的文章。
《路由策略专题(一)之路由抓取工具(Access-List和Prefix-List) 》《路由策略专题(二)之分发列表(Distribute-List) 》《路由策略专题(三)之偏移列表(Offset List)》《路由策略专题(四)之列表过滤列表(Filter-List) 》
由于Route-Map内容过于多,我将分篇介绍,本篇博文之中我们将介绍Route-map的理论知识并结合一个使用场景(重分布)进行简单的介绍。其他的使用场景将在后续博文中放出
首先来看一下Route-map在路由策略地位工具中的地位。我们可以把它看做路由策略工具中的王者,其他的路由工具虽然在各个方面的用途和使用场景与之相比有所不同,但是Route-map在路由策略中的地位是不容撼动的。这是由他的强大的功能性和使用范围所决定的。它不仅仅可以和之前路由策略工具一样,进行路由的过滤和修改,甚至还可以修改路由包括的属性等等乃至在数据层面都可以对流量产生影响。
下文将对Route-map进行全面但是简单而简单的分析:
一、理论篇
我们来看一下Route-map的使用场景和搭档。
使用场景:
重分发期间进行路由过滤或执行策略
PBR(策略路由)
NAT(网络地址转换)
BGP中的策略部署
其他用途(如和其他路由工具搭配例如distribute-list)
再来看一下它的能力:
与传统的路由控制工具有所不同的是,Route-map不仅仅局限在对路由的抓取和过滤。还可以给某些路由信息添加某些属性的值(如tag,BGP的各种属性等)。
不仅局限在IP层面的捕捉,也可以针对某个接口、甚至数据包的下一跳和某些属性进行抓取。
不止可以对路由信息进行某些值的修改,甚至在转发层面也可以进行修改(搭配PBR)
在最具操作性的路由协议(BGP)中也扮演着很重要的地位。
接着,来看一下Route-map匹配与操作规则:
同Access-list类似,是一个从上而下的匹配机制,进行逐级向下的比对,如果某一条匹配不成功那么将进行下一条的比对,直到整个Route-map的结尾。因此这里我们也要注意书写的顺序。
在每一条目中有两个重要的组成部分:Match(条件)和Set(动作)。只有当条件匹配的情况下才回去执行相应的动作。在一个条目中可以有多个条件和多个动作;而且,如果只作为路由的过滤时使用的话可能只有Match没有Set,因此Set也不是必须的。和Access-list一样,在末尾隐含着一条Deny Any。因此,如果放行所有需要在末尾加入一个空条目。
最后,看一下Route-Map的技术特点总结:
match命令匹配特定条件,Set修改相关属性或者分组
按自上而下的顺序执行,类似ACL的方式并且末尾有Deny Any
route-map默认为Permit,默认序号为10,并且不会主动递增,需要手动设置。如果需要Deny也需要设置
当一条match语句包括多个条件时采用逻辑或运算(OR);存在多条match语句时,各条match语句之间使用逻辑和运算(AND)
如果要放行所有可以在末尾加一个空的条目
二、配置篇
配置命令:
具体的书写规范:
*****************************************************
** route-map my-map permit/deny 10 **
** match A **
** match B C **
** set X **
*****************************************************
1.创建一个Route-map:
Route-map {Route map tag} {permit|deny} {sequence number}
这个全局配置命令创建一个route-map,使用自定义的字符串来表示这个route-map,你可以在一个route-map下定义多个序列号。序列号在进行匹配动作时具有优先顺序。
Permit/deny关键字在不同的部署场合中作用有所不同
结合几个例子来看一下:
route-map my-map permit 10
创建了一个route-map,route-map的tag(理解为名字)为my-map,创建第十条条目并且为permit(允许)
route-map my-map deny 20
在名为my-map的route-map插入第二十条,这条为Deny(拒绝)
route-map my-map 30
在名为my-map的route-map插入第三十条,没有明确说明permit还是deny,这里是Permit因为默认为permit
注意当我们进入具体某个条目的时候命令提示符会变更,如下图所示
2.定义匹配条件:
match条件
语句 |
说明 |
match ip address |
匹配访问列表或前缀列表 |
match length |
根据分组的第三层长度进行匹配 |
match interface |
匹配下一跳出接口为指定接口之一的路由 |
match ip next-hop |
匹配下一跳地址为特定访问列表中被允许的那些路由 |
match metric |
匹配具有指定度量值的路由 |
match route-type |
匹配指定类型的路由 |
match community |
匹配BGP共同体社区属性 |
match tag |
根据路由的标记进行匹配 |
3.定义动作
Set动作
语句 |
说明 |
set metric |
设置路由协议的度量值 |
set metric-type |
设置目标路由协议的度量值类型 |
set default interface |
指定如何发送这样的分组 |
set interface |
指定如何发送这样的分组 |
set ip default next-hop |
指定转发的下一跳 |
set ip next-hop |
指定转发的下一跳 |
set next-hop |
指定下一跳的地址,指定BGP的下一跳 |
set as-path |
BGP属性 |
set community |
BGP属性 |
set local-preference |
BGP属性 |
set weight |
BGP属性 |
set origin |
BGP属性 |
set tag |
三、实验篇
场景一:重分布的场景中(实验1)
环境说明:
OSPF中R1有四条路由,我们用4个Loopback接口指代,我们手工在接口上修改cost值分别为10、50、20、60
现在要求R3上收到这些路由时分别为右图表中所示。
这显然通过原生的重分布命令无法做到。这时就需要来Route-map来做了。
配置之前我们先查看一下R2的路由表:
由于R1和R2之间链路Cost为10,因此我们得到的ospf路由cost值分别是依次是20、60、30、70。
这里我们可以有两种方式来做,一种是利用抓取Cost值在一定范围的路由,一种是直接抓取路由信息。
具体配置如下:
按Cost值抓取的方式:
R2(config)#route-map OSPF-RIp permit 10
#抓取OSPF cost值小于60的路由
R2(config-route-map)#match metric 30 +- 29 #Match OSPF 的Metric(Cost)注意这里用了加减号意思是匹配cost值为30+-29暨(cost值在1到59之间的Cost 值)
R2(config-route-map)#set metric 2 #Set RIP中的Metric(Hop-Count)
R2(config-route-map)#route-map OSPF-RIp permit 20
#抓取OSPF cost值为60和70的路由
R2(config-route-map)#match metric 60 70 #这里利用了通条匹配时采用逻辑或运算,表示匹配OSPF中Cost值为60或者70的路由。
R2(config-route-map)#set metric 4
R2(config)#router rip
R2(config-router)#redistribute ospf 1 route-map OSPF-RIp
这里也可以用匹配路由的方式做:
#抓取跳数应设置为2的路由(可使用Prefix-list或ACL)
R2(config)#ip prefix-list HOP2 seq 5 permit 192.168.1.0/24
R2(config)#ip prefix-list HOP2 seq 10 permit 192.168.3.0/24
#抓取跳数应设置为4的路由(可使用Prefix-list或ACL)
R2(config)#ip prefix-list HOP4 seq 5 permit 192.168.2.0/24
R2(config)#ip prefix-list HOP4 seq 10 permit 192.168.4.0/24
#配置router-map
R2(config)#route-map OSPF-RIP2 permit 10
R2(config-route-map)#match ip address prefix-list HOP2
R2(config-route-map)#set metric 2
R2(config-route-map)#match ip address prefix-list HOP4
R2(config-route-map)#set metric 4
#在RIP进程下调用
R2(config)#router rip
R2(config-router)#redistribute ospf 1 route-map OSPF-RIP2
来查看一下R3的路由表进行一下验证:
上一个情景中我们了解如何使用在重分布场景下使用的Route-map的具体配置
我们就结合一个经典案例看一下:
三层拓扑图如下:
环境简单说明:
R1和R2分别连接三层交换机SW1和SW2;SW1和SW2分别同OA网和Produce网相连。
假设R1、R2到生产网络和办公网络分别使用静态路由
R1上有静态路由10.0.1.0/24和10.0.2.0/24 指向SW1的三层口10.0.254.1
R2上有静态路由10.0.1.0/24和10.0.2.0/24 指向SW1的三层口10.0.254.5
R1、R2、R3有运行OSPF,R1、R2分别将静态路由重分布到OSPF中。
在没有做任何修改的情况下R3应该收到的10.0.1.0/24和10.0.2.0/24是负载均衡的,现在我们要求OA流量按绿线放想走,Produce流量按蓝线方向走。
这时候就要我们的Route-map介入了在出现链路断路的情况时流量可以进行切换。这时候我们就可以采用可以走R1和R2之间的备份路线。
查看下R3的路由验证一下初始路由。
R1:
#使用ACL抓取路由
access-list 1 permit 10.0.1.0
access-list 2 permit 10.0.2.0
#创建Route-map匹配路由10.0.1.0并设置Metric为10
route-map my-map permit 10
match ip address 1
set metric 10
#创建Route-map另一条条目,匹配路由10.0.2.0并设置Metric值为20
route-map my-map permit 20
match ip address 2
set metric 20
#在OSPF进程中调用Route-map
router ospf 1
redistribute static route-map my-map subnet
R2:
access-list 1 permit 10.0.1.0
access-list 2 permit 10.0.2.0
route-map my-map permit 10
match ip address 1
set metric 20
route-map my-map permit 20
match ip address 2
set metric 10
router ospf 1
redistribute static route-map my-map subnet
在配置之后我们再来看一下之前R3上路由的变化,发现如我们所想要的走的方式一样,OA网走R1,Produce网走R2
这里我们进行一下故障分析,假设R3和R1之间的链路出现故障
查看R3路由表我们可以发现一个有趣的现象,那就是路由的Metric值没变但是下一跳改变了。这是由于虽然R1,R3的路径断了,但是R1上依然通过R1和R2之间的链路重分布进了OSPF,因此,R1上的路由依然可以以OE2的形式传递出来。所以Metric值没有变。
这时候好奇的小伙伴就有个疑问,那么到底流量是走R3->R2->R1->SW1->OA网呢,还是R3->R2->SW2->OA网呢?请看下面的分析
那么如果同时R2到SW2的这段链路也出现问题了呢?
那流量到R2之后会按蓝线,给到R1吗?在我们这个环境中是没有办法的,R2会直接将这个数据直接丢弃。
那么解决办法是什么呢,这时候就可以使用我们之前讲过的BFD。具体解决办法请参考BFD的文档:《双向链路检测(BFD)之静态路由篇》
设置了BFD之后,便可以按照R3->R2->R1->SW1->OA网的路径进行传播
由于篇幅的关系,其他Route-map的场景中应用我们将会分篇来讲。
本篇文档就介绍到这里,希望能帮助到你。需要实验拓扑的小伙伴可以关注一下我,给我私信或者加我的QQ,我可以将我的实验拓扑分享给你。谢谢