FRR的BGP路由策略
过滤器
FRR提供了基于IP,基于Community和基于AS-PATH的三种类型过滤器来匹配路由。
IP Access List
基于IP的路由ACL规则,比较少使用,通常是用IP Prefix List来设置策略。
1 2 3 4 5 6 7 8 9 10 11 12 | access-list NAME [seq (1-4294967295)] permit IPV4-NETWORK access-list NAME [seq (1-4294967295)] deny IPV4-NETWORK #NAME:规则名称 #seq:规则序列号,不填则在上一个规则序列号基础上加5,若存在则加10,以此类推 #permit(deny):允许通过还是拒绝通过 #IPV4-NETWORK: ipv4网络 #example access-list filter deny 10.0.0.0/9 access-list filter permit 10.0.0.0/8 access-list filter seq 13 permit 10.0.0.0/7 |
IP Prefix List
IP Prefix List提供了强大的基于IP前缀的过滤机制,除了access list之外,还能够基于ip掩码和ip掩码区间进行过滤。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | ip prefix-list NAME (permit|deny) PREFIX [le LEN] [ge LEN] ip prefix-list NAME seq NUMBER (permit|deny) PREFIX [le LEN] [ge LEN] no ip prefix-list NAME #取消io前缀规则 show ip prefix-list NAME #显示ip前缀规则 #NAME:规则名称 #seq:规则序列号,不填则在上一个规则序列号基础上加5,若存在则加10,以此类推 #permit(deny):允许通过还是拒绝通过 #PREFIX: ip前缀 #le LEN:匹配小于LEN的ip前缀 #ge LEN:匹配大于LEN的ip前缀 #example ip prefix-list pl-allowed-adv seq 5 permit 82.195.133.0/25 ip prefix-list pl-allowed-adv seq 10 deny any |

R2向R3通告BGP路由时,只过滤掉1.2.2.0/24路由,其他路由放行
1 2 3 4 5 | #只列出和prefix-list相关命令 ip prefix-list 1 deny 1.2.2.0/24 ip prefix-list 1 permit any router bgp 200 peer 10.1.23.3 prefix-list 1 out #out表示往外发送的方向; |
Community-list
Community属性值是一种路由标记 ,FRR提供了基于Community的路由过滤方法。
1 2 3 4 5 6 7 8 9 10 11 | bgp community-list [standard|expanded] NAME permit|deny COMMUNITY no bgp community-list [standard|expanded] NAME show bgp community-list [NAME detail] #standard:COMMUNITY是一个确切值 #expanded:COMMUNITY可为正则表达式,都不填则由系统自动识别 #permit|deny:过滤规则 #example bgp community-list 70 permit 7675:70 bgp community-list 70 deny |
as-path access-list
as-path access-list是基于as-path的过滤规则,能够使用正则表达式对as-path进行过滤。
1 2 3 4 5 6 7 8 9 | bgp as-path access-list WORD permit|deny LINE #WORD:列表号 #LINE:正则表达式 #example bgp as-path access-list 99 permit _0_ bgp as-path access-list 99 permit _23456_ bgp as-path access-list 99 permit _1310[0-6][0-9]_|_13107[0-1]_ |
路由策略
FRR的路由策略通过设置Route Maps来实现。Route Maps一共可分为五个模块,分别是Matching Conditions(条件匹配)、Set Actions(策略设置)、Matching Policy(条件策略)、Call Action(跳转)和Exit Policy(结束策略)。
1 2 3 4 | route-map ROUTE-MAP-NAME (permit|deny) ORDER #ROUTE-MAP-NAME: 策略名称 #permit|deny:条件策略Matching Policy #ORDER:策略匹配排序 |
Matching Conditions
Matching Conditions主要是基于过滤器对策略的适用范围进行圈定,可过滤的命令包括
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #匹配ACL match ip|ipv6 address ACCESS_LIST #匹配IP Prefix List match ip|ipv6 address prefix-list PREFIX_LIST #匹配Community-list match community COMMUNITY_LIST #匹配as-path access-list match as-path ACCESS_LIST #匹配其他路由参数 match ip|ipv6 address prefix-len 0-32 match ip|ipv6 next-hop address IPV4_ADDR|IPV6_ADDR match metric METRIC match local-preference METRIC match peer IPV4_ADDR|IPV6_ADDR #ZEBRA匹配 match source-protocol PROTOCOL_NAME match source-instance NUMBER |
Set Actions
Set Actions决定策略的生效方式,通过修改路由属性来影响路由策略,可设置的路由属性包括
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | #设置路由参数 set ip next-hop IPV4_ADDRESS set ip next-hop peer-address set ip next-hop unchanged set ipv6 next-hop peer-address set ipv6 next-hop prefer-global set ipv6 next-hop global IPV6_ADDRESS set ipv6 next-hop local IPV6_ADDRESS [no] set distance DISTANCE set weight WEIGHT #设置BGP协议属性 set local-preference LOCAL_PREF set local-preference +LOCAL_PREF set local-preference -LOCAL_PREF set as-path prepend AS_PATH set community COMMUNITY set origin ORIGIN <egp|igp|incomplete> set metric METRIC #即MED #设置路由写入哪个路由表 set table (1-4294967295) #设置标签(相当于Linux的域reaml) set tag TAG |
Matching Policy
Matching Policy包括permit和deny
permit表示如果路由条目匹配(Matching Conditions来判断),则执行Set Actions,然后接收该路由或者执行Exit Policy。
deny表示如果路由条目匹配(Matching Conditions来判断),则拒绝接收该条路由。
注意:route-map默认Matching Policy是deny,也就是说如果Matching Conditions没有匹配到,那么路由默认将会被拒绝,因此在设置route-map时,一般会在最后加入一条permit规则
Call Action
Call Action由Set Action调用,表示调用其他RouteMap策略。如果返回deny,则拒绝接收;返回permit则继续往下执行Matching Policy和Exit Policy,一般用于配置多个route-map。
Exit Policy
Exit Policy由next和goto N两个语法组成,next执行下一条规则,goto是跳到规则N后顺序执行。
举例
- 在R1上部署路由策略,当其通告1.1.1.0/24及1.2.2.0/24路由时携带Community属性

1 2 3 4 5 6 7 8 9 10 11 12 13 14 | ip prefix-list 1 permit 1.1.1.0/24 ip prefix-list 2 permit 1.2.2.0/24 route-map add_community_out permit 10 match ip address prefix-list 1 #additive:若已经有community属性,追加100:1 set community 100:1 additive route-map add_community_out permit 20 match ip address prefix-list 2 set community 100:2 additive route-map add_community_out permit 30 router bgp 100 neighbor 10.1.12.2 route-map add_community_out out |
- R2传递EBGP路由给R3,其中部分路由为R2本地始发,另一部分为AS600传递给R2再由R2更新给R3。 现在R3上部署路由策略,过滤掉始发于AS600的路由,R1将不会从R3收到始发于AS600的路由。

1 2 3 4 5 6 7 8 | bgp as-path access-list permit-600 permit _600$ route-map ban-AS600 permit 10 match as-path permit-600 #将community标记为no-export发给R3 set community no-export route-map ban-AS600 permit 20 router bgp 300 neighbor 10.1.23.3 route-map ban-AS600 out |
路由汇总
BGP支持对路由条目进行汇总,并将汇总后的路由发送给其他对等体

上图R3将多条172.16段的路由汇总成一条新的路由172.16.0.0/16发送给R4,以减少路由条目的交互。FRR对汇总路由的支持方式有三种,缺省方式、as-set和summary-only。
缺省方式
缺省方式直接通告汇总路由以及明细路由。由于汇总路由丢失明细路由的路径属性,有可能导致路由环路。
as-set

R3所产生的汇总路由,继承了明细路由的AS_Path属性。本例的环境比较特殊,由于明细路由来自于不同的AS,因此BGP使用一个特殊的AS_Path类型AS-SET(详见AS_Path类型)来描述它们,也就是300 {100,200}中大括号表示的部分。 这样的好处是R3所产生的汇总路由,除了通告给R4,还会通告给R1及R2,由于该汇总路由的AS_Path中存在R1及R2所处的AS号,因此它们忽略R3关于这条汇总路由的更新。这样便可避免出现环路问题。
summary-only
summary-only只会通告汇总路由,并不会对外通告更具体的路由。