FAQ - community-filter常见匹配规则汇总

发布时间:  2013-12-30 浏览次数:  294 下载次数:  0
问题描述
Q1: route-policy中配置if-match community-filter <filter>,但<filter>未定义如何匹配?
Q2: basic类型的community-filter中配置多个团体属性如何匹配?
Q3: advanced类型的community-filter如何匹配?
Q4: route-policy的同一个node下配置多个if-match community-filter如何匹配?
Q5: route-policy中配置if-match community-filter whole-match如何匹配?
Q6: if-match community-filter命令配了多个<filter>号时whole-match如何匹配?
Q7: 为什么同一个名称的ip community-filter可以配置多条?如何匹配?

注:这里只描述匹配规则,关于命令行参数[ internet | no-export-subconfed | no-advertise | no-export ]和命令行配置方法请参考命令手册。
处理过程

根因

A1: <filter>未定义,相当于if-match community-filter <filter>不做过滤,全部permit。例如:
route-policy test permit node 10
 if-match ip-prefix 1
 if-match community-filter 1
 apply ... ...
route-policy test permit node 20
if-match community-filter 1
 apply ... ...
假设ip-prefix 1有定义、community-filter 1未定义,则相当于if-match community-filter 1结果恒为真,只有if-match ip-prefix 1做真假判断。
route-policy的同一个node下针对不同属性的if-match是"与"的关系。因此,如果路由满足ip-prefix 1,则真真相与结果为真,路由可以匹配到node 10。如果路由不满足ip-prefix 1,则真假相与结果为假,route-policy的node 10不满足,进入node 20,因为if-match community-filter 1结果为真,所以node 20将permit所有路由。


A2: basic类型的community-filter中配置多个团体属性时,需要路由所携带的团体属性至少包含这些团体属性,不关心是否还有其他团体属性。例如:
ip community-filter 1 permit 1:1 1:3
路由的团体属性是"<1:1> <1:3>"可以匹配,"<1:1> <1:2> <1:3> <1:4>"也可以匹配,但是只有"<1:1>"或只有"<1:3>"都不匹配。


A3: advanced类型的community-filter是采用正则表达式的方式来匹配团体属性,需要路由携带的团体属性至少有一个满足此正则式,不必所有团体属性都满足。例如:
ip community-filter 111 permit [12]:[23]
路由的团体属性如果是"<1:1> <1:3>",其中<1:3>可以匹配,认为满足;如果是"<1:1> <1:4>",<1:1>和<1:4>都不能匹配,认为不满足。
注意:正则表达式只是做字符串匹配,因此只要团体属性中包含满足正则表达式的字符串即可,所以对于[12]:[23],如<11:2>、<111:31>、<65002:3001>等都可以匹配。
另外,团体属性有两种格式,可以写成x:y,也可以写成一个长整数z,对应关系是z=x*65535+y。用community-filter对两种格式都是可以做过滤的。例如:
ip community-filter 111 permit 6553
路由的团体属性如果是"<0:65530>"、"<65531:10>"、"<1:1>"(对应长整数65537) 、"<2:34460>"(对应长整数165532)等等,这些也都是可以匹配的。


A4: route-policy的同一个node下针对不同属性的if-match是"与"的关系,针对相同属性的if-match是"或"的关系。因此,route-policy的同一个node下配置多个if-match community-filter是或的关系,只要满足其中一个community-filter即可。


A5: whole-match表示路由中的团体属性必须与community-filter完全一致。例如:
ip community-filter 1 permit 1:1 1:3
路由的团体属性是"<1:1> <1:3>"可以匹配,"<1:1> <1:2> <1:3> <1:4>"或者"<1:1>"都不能匹配。

注意:whole-match仅对basic类型的community-filter生效,advanced类型的即使配了whole-match也不会生效。


A6: 把命令行展开就容易理解了,if-match community-filter { <filter1> [ whole-match ] } [ <filter2> [ whole-match ] ] [ <filter3> [ whole-match ] ]...,可以看出whole-match只是针对其前面的一个<filter>号的可选参数,也就是说whole-match只对其前面的一个<filter>号生效。当if-match community-filter中指定了多个<filter>,且要求每一个<filter>都必须完全匹配,则需要在每个<filter>后面增加whole-match参数。例如:
ip community-filter 1 permit 1:1 1:2
ip community-filter 2 permit 2:1 2:2
ip community-filter 3 permit 3:1 3:2
ip community-filter 4 permit 4:1 4:2
ip community-filter 5 permit 5:1 5:2
route-policy test permit node 10
if-match community-filter 1 2 whole-match 3 4 whole-match 5
只有2和4后面带了whole-match,所以只有2和4需要按照whole-match进行匹配。结合前一问题,这条if-match的过滤规则就是包含"<1:1> <1:2>",或等于"<2:1> <2:2>",或包含"<3:1> <3:2>",或等于"<4:1> <4:2>",或包含"<5:1> <5:2>"。


A7: 由于命令行长度的原因,一条ip community-filter 命令不可能配置太多团体属性,因此如果需要配置更多团体属性就需要配置多条ip community-filter 命令。其匹配规则是按照配置顺序逐条匹配,只要满足其中一条就认为满足。例如:
ip community-filter 1 permit 1:1
ip community-filter 1 permit 1:1 1:2 1:3 1:4 1:5 1:6
ip community-filter 1 permit 1:1 1:3
ip community-filter 1 permit 1:2 1:3 1:4
/* 下面分别称为第1条、第2条... */
route-policy test permit node 10
if-match community-filter 1 whole-match
apply cost 10
route-policy test permit node 20
if-match community-filter 1
apply cost 20
route-policy test permit node 100
如果路由r1携带的团体属性为"<1:1> <1:3>",先进入route-policy的node 10,因为配有whole-match,所以community-filter 1的第1条、第2条都不匹配,第3句可以匹配,因此命中,执行apply cost 10操作。
如果路由r2携带的团体属性为"<1:1> <1:2> <1:3>",先进入route-policy的node 10,因为配有whole-match,所以4条都不匹配;再进入route-policy的node 20,第1句就可以满足,因此命中,执行apply cost 20操作。
如果路由r3携带的团体属性为"<1:2>",先进入route-policy的node 10,4条都不匹配;再进入route-policy的node 20,4条也都不匹配;再进入route-policy的node 100,node 100不做if-match限制,因此路由被接受但不做操作。假如没有配置node 100,或配置变为route-policy test deny node 100,则此路由被拒绝。


注:关于正则表达式的匹配规则请参考"正则表达式"的相关手册,此案例中不做详解。

解决方案

END