第6期 BGP路由策略(下)
前面我们介绍的路由策略基本都是基于路由前缀的,但是我们知道BGP的“用武之地”主要是一些大型骨干网络,在这种网络中一般路由前缀的规模会非常大,如果继续基于路由前缀执行路由策略,那么工作量将会大的不可想象。能否跳出路由前缀的“怪圈”,换一种角度去“抓取”感兴趣的路由呢?对于BGP路由协议来说是可以实现的,本期我们主要介绍一下AS_Path过滤器和团体属性过滤器在BGP路由策略中的使用方法。
1 AS_Path_Filter在BGP中的应用
1.1 AS_Path_Filter及正则表达式
AS_Path过滤器(AS_Path_Filter)
AS_Path属性按矢量顺序记录了某条路由从本地到目的地址所要经过的所有AS编号。如图1所示,某条BGP路由的AS_Path属性实际上可以看作是一个包含空格的字符串,所以可以通过正则表达式来进行匹配。
图片上传中(0)...
图1 BGP路由的AS_Path属性
正则表达式就是用一个“字符串”来描述一个特征,然后去验证另一个“字符串”是否符合这个特征。BGP的AS_Path过滤器主要是定义AS_Path正则表达式,然后去匹配BGP路由的AS_Path属性信息,从而实现对BGP路由信息的过滤。
例如ip as-path-filter 1 permit 495就定义了一个AS_Path过滤器1,使用的正则表达式是495,这个表达式的含义是匹配任何包含495的字符串。
这么来看,AS_Path过滤器的核心内容就是正则表达式。关于正则表达式的内容较为复杂,我们这里仅讨论一些跟AS_Path过滤器相关的内容。
AS_Path正则表达式的组成
AS_Path过滤器使用正则表达式来定义匹配规则。正则表达式由元字符和数值两部分组成:
l 元字符定义了匹配的规则。
l 数值定义了匹配的对象。
BGP AS_Path正则表达式支持的元字符如表1所示。
元字符 | 含义 | 实例 |
. | 匹配除“\n”之外任何单个字符,包括空格。 | .*表示匹配任意字符串,即AS_Path为任意,可以用来匹配所有路由。通常定义了多个deny模式的ip as-path-filter子句之后,会定义一个ip as-path-filter as-path-filter-name permit .*子句,用于允许其他路由通过。 |
* | 之前的字符在目标对象中出现0次或连续多次。 | 参考上例。 |
+ | 之前的字符在目标对象中出现1次或连续多次。 | 65+表示6在AS_Path的首位,而5在AS_Path中出现一次或多次,那么: l 如下字符串都符合这个特征:65,655,6559,65259,65529等。 l 如下字符串不符合这个特征:56,556,5669,55269,56259等。 |
| | 竖线左边和右边的字符为“或”的关系。 | 100|65002|65003表示匹配100、65002或65003。 |
^ | 之后的字符串必须出现在目标对象的开始。 | ^65表示匹配以65开头的字符串,那么: l 如下字符串都符合这个特征:65,651,6501,65001等。 l 如下字符串不符合这个特征:165,1650,6650,60065等。 |
$ | 之前的字符串必须出现在目标对象的结束。 | 65$表示匹配以65结尾的字符串,那么: l 如下字符串都符合这个特征:65,165,1065,10065,60065等。 l 如下字符串不符合这个特征:651,1650,6650,60650,65001等。 ^$表示匹配空字符串,即AS_Path为空,通常用来匹配本地始发路由。 |
(xyz) | 一对圆括号内的正则表达式作为一个子正则表达式,匹配子表达式并获取这一匹配。圆括号内也可以为空。 | 100(200)+可以匹配100200、100200200、…… |
[xyz] | 匹配方括号内列出的任意字符。 | [896]表示匹配含有8、9或6中任意一个字符。 |
[^xyz] | 匹配除了方括号内列出的字符外的任意字符(^号在字符前)。 | [^896]表示匹配含有8、9或6这几个字符之外的任意一个字符。 |
[a-z] | 匹配指定范围内的任意字符。 | [2-4]表示匹配2,3,4;[0-9]表示匹配数字0~9。 |
[^a-z] | 匹配不在指定范围内的任意字符。 | [^2-4]表示匹配除2,3,4外的其他字符;[^0-9]表示匹配除数字0~9外的其他字符。 |
_ | 匹配一个符号,包括逗号、左大括号、右大括号、左括号、右括号和空格,在表达式的开头或结尾时还可作起始符、结束符(同^ ,$)。 | l ^65001_表示匹配字符串的开始为65001,字符串的后面为符号,也即AS_Path最左边AS(最后一个AS)为65001,可以用来匹配AS 65001邻居发送的路由, l _65001_表示匹配字符串里有65001,即AS_Path中有65001,可以用来匹配经过AS 65001的路由。 l _65001$表示匹配字符串的最后为65001,字符串前面是符号,即AS_Path最右边AS(起始AS)为65001,可以用来匹配AS 65001始发的路由。 |
\ | 转义字符。 | 用来将紧跟其后的元字符转变为普通字符 |
表1 AS_Path正则表达式支持的元字符
1.2 AS_Path_Filter的应用方式
AS_Path过滤器只定义一个过滤工具,需要在某个地方调用这个过滤工具才会最终生效。在BGP中可以有两种方式调用AS_Path过滤器:1、通过peer命令直接调用as-path-filter,2、通过route-policy调用AS_Path_Filter。
应用方式一:通过peer命令直接调用as-path-filter
#
ip as-path-filter s1 permit ^100$
#
bgp 65100
peer 10.1.1.2 as-path-filter s1 import
#
在应用方式1中,我们定义了一个AS_Path_Filter并关联了一个正则表达式^100$,这个AS_Path_Filter可以匹配AS_PATH严格为100的路由(不包含任何其他的AS号或其他数字),随后我们将AS_Path_Filter应用在了peer命令上,这样一来,只有被AS_Path_Filter 1所匹配的路由,才会被传递给BGP邻居10.1.1.2。
应用方式二:通过route-policy调用as-path-filter
#
ip as-path-filter s1 permit ^100$
#
route-policy huawei permit node 10
if-match as-path-filter s1
apply local-preference 100
#
bgp 65100
peer 10.1.1.2 route-policy huawei import
#
在应用方式2中,我们在route-policy中的if-match命令调用定义好的AS_Path_Filter,随后使用apply命令设置LP路径属性值,并在BGP配置模式下应用在了peer命令上(import方向)。这样,该交换机在收到BGP邻居10.1.1.2所发送过来的BGP路由中,所有被AS_Path_Filter匹配的路由均将LP路径属性值设置为100。
1.3 AS_Path_Filter的使用举例
上面介绍完了AS_Path_Filter的匹配规则和应用方式,接下来我们通过一个示例来具体看一下在BGP中如何使用AS_Path_Filter进行路由过滤。
如图2所示,LSW1与LSW2之间,LSW1与LSW3之间,LSW2与LSW3之间,LSW2与LSW4之间,LSW3与LSW4之间,LSW4与LSW5之间都建立EBGP邻居。各个设备把LoopBack0接口的IP地址通过network命令发布到BGP中,用作测试路由网段。
图片上传中(0)...
图2 使用AS_Path_Filter对BGP路由进行过滤
当没有使用AS_Path过滤器时,LSW1的原始BGP路由表如下。
[LSW1] display bgp routing-table
BGP Local router ID is 10.1.1.1
Status codes: * - valid, > - best, d - damped,
h - history, i - internal, s - suppressed, S - Stale
Origin : i - IGP, e - EGP, ? - incomplete
Total Number of Routes: 9
Network NextHop MED LocPrf PrefVal Path/Ogn
*> 1.1.1.9/32 0.0.0.0 0 0 i
*> 2.2.2.9/32 10.1.1.2 0 0 65200i
* 10.1.2.2 0 65300 65200i
*> 3.3.3.9/32 10.1.2.2 0 0 65300i
* 10.1.1.2 0 65200 65300i
*> 4.4.4.9/32 10.1.1.2 0 65200 65400i
* 10.1.2.2 0 65300 65400i
*> 5.5.5.9/32 10.1.1.2 0 65200 65400 65500i
* 10.1.2.2 0 65300 65400 65500i
Case1:定义一个AS_Path过滤器s1,只接收AS 65500始发的路由。
[LSW1] ip as-path-filter s1 permit _65500$ //定义一个AS_Path过滤器s1
[LSW1] bgp 65100
[LSW1-bgp] ipv4-family unicast
[LSW1-bgp-af-ipv4] peer 10.1.1.2 as-path-filter s1 import //通过peer命令调用
[LSW1-bgp-af-ipv4] peer 10.1.2.2 as-path-filter s1 import
配置完成后BGP路由表如下:
[LSW1] display bgp routing-table
BGP Local router ID is 10.1.1.1
Status codes: * - valid, > - best, d - damped,
h - history, i - internal, s - suppressed, S - Stale
Origin : i - IGP, e - EGP, ? - incomplete
Total Number of Routes: 3
Network NextHop MED LocPrf PrefVal Path/Ogn
*> 1.1.1.9/32 0.0.0.0 0 0 i
*> 5.5.5.9/32 10.1.1.2 0 65200 65400 65500i
* 10.1.2.2 0 65300 65400 65500i
从以上显示信息可以看出,AS 65500始发的路由被允许,其他路由被拒绝。
Case2:定义一个AS_Path过滤器s2,拒绝AS 65500始发的路由,允许接收其他路由。
[LSW1] ip as-path-filter s2 deny _65500$
[LSW1] ip as-path-filter s2 permit .*
[LSW1] bgp 65100
[LSW1-bgp] ipv4-family unicast
[LSW1-bgp-af-ipv4] peer 10.1.1.2 as-path-filter s2 import
[LSW1-bgp-af-ipv4] peer 10.1.2.2 as-path-filter s2 impor
配置完成后BGP路由表如下:
[LSW1]display bgp routing-table
BGP Local router ID is 10.1.1.1
Status codes: * - valid, > - best, d - damped,
h - history, i - internal, s - suppressed, S - Stale
Origin : i - IGP, e - EGP, ? - incomplete
Total Number of Routes: 7
Network NextHop MED LocPrf PrefVal Path/Ogn
*> 1.1.1.9/32 0.0.0.0 0 0 i
*> 2.2.2.9/32 10.1.1.2 0 0 65200i
* 10.1.2.2 0 65300 65200i
*> 3.3.3.9/32 10.1.2.2 0 0 65300i
* 10.1.1.2 0 65200 65300i
*> 4.4.4.9/32 10.1.1.2 0 65200 65400i
* 10.1.2.2 0 65300 65400i
从以上显示信息可以看出,AS 65500始发的路由被拒绝,其他路由被允许。
Case3:定义一个AS_Path过滤器s3,拒绝经过AS 65400的路由
[LSW1] ip as-path-filter s3 deny _65400_
[LSW1] ip as-path-filter s3 permit .*
[LSW1] bgp 65100
[LSW1-bgp] ipv4-family unicast
[LSW1-bgp-af-ipv4] peer 10.1.1.2 as-path-filter s3 import
[LSW1-bgp-af-ipv4] peer 10.1.2.2 as-path-filter s3 import
配置完成后BGP路由表如下:
[LSW1] display bgp routing-table
BGP Local router ID is 10.1.1.1
Status codes: * - valid, > - best, d - damped,
h - history, i - internal, s - suppressed, S - Stale
Origin : i - IGP, e - EGP, ? - incomplete
Total Number of Routes: 5
Network NextHop MED LocPrf PrefVal Path/Ogn
*> 1.1.1.9/32 0.0.0.0 0 0 i
*> 2.2.2.9/32 10.1.1.2 0 0 65200i
* 10.1.2.2 0 65300 65200i
*> 3.3.3.9/32 10.1.2.2 0 0 65300i
* 10.1.1.2 0 65200 65300i
从以上显示信息可以看出,经过AS 65400的路由被拒绝,其他路由被允许。
Case4:定义一个AS_Path过滤器s4,拒绝经过AS 65400的路由,其中AS 65400既不是路由的始发AS,也不是路由经过的最后一个AS。
[LSW1] ip as-path-filter s4 deny ._65400_.
[LSW1] ip as-path-filter s4 permit .*
[LSW1] bgp 65100
[LSW1-bgp] ipv4-family unicast
[LSW1-bgp-af-ipv4] peer 10.1.1.2 as-path-filter s4 import
[LSW1-bgp-af-ipv4] peer 10.1.2.2 as-path-filter s4 import
配置完成后BGP路由表如下:
[LSW1] display bgp routing-table
BGP Local router ID is 10.1.1.1
Status codes: * - valid, > - best, d - damped,
h - history, i - internal, s - suppressed, S - Stale
Origin : i - IGP, e - EGP, ? - incomplete
Total Number of Routes: 7
Network NextHop MED LocPrf PrefVal Path/Ogn
*> 1.1.1.9/32 0.0.0.0 0 0 i
*> 2.2.2.9/32 10.1.1.2 0 0 65200i
* 10.1.2.2 0 65300 65200i
*> 3.3.3.9/32 10.1.2.2 0 0 65300i
* 10.1.1.2 0 65200 65300i
*> 4.4.4.9/32 10.1.1.2 0 65200 65400i
* 10.1.2.2 0 65300 65400i
从以上显示信息可以看出,只有AS_Path的中间AS是65400的路由被拒绝,其他路由被允许。
Case5:定义一个AS_Path过滤器s5,匹配本地始发路由,不接收其他AS的任何路由。
[LSW1] ip as-path-filter s5 permit ^$
[LSW1] bgp 65100
[LSW1-bgp] ipv4-family unicast
[LSW1-bgp-af-ipv4] peer 10.1.1.2 as-path-filter s5 import
[LSW1-bgp-af-ipv4] peer 10.1.2.2 as-path-filter s5 import
配置完成后BGP路由表如下:
[LSW1] display bgp routing-table
BGP Local router ID is 10.1.1.1
Status codes: * - valid, > - best, d - damped,
h - history, i - internal, s - suppressed, S - Stale
Origin : i - IGP, e - EGP, ? - incomplete
Total Number of Routes: 1
Network NextHop MED LocPrf PrefVal Path/Ogn
*> 1.1.1.9/32 0.0.0.0 0 0 i
从以上显示信息可以看出,只有AS_Path为空的本地始发路由被允许,其他路由被拒绝。
2 Community属性在BGP中的应用
2.1 Community属性介绍
Community属性的作用
在讨论Community属性之前,我们先说一点题外话。相信大家在外出旅游的时候有时候会发现,某个旅行团的游客通常会统一带一个“小红帽”,上面写着某某团队,这样导游就很方便的对这个团队进行引导和管理,比如要上车了,导游只需要喊一嗓子:“某某团队的,上车了”,而不需要逐个喊每个游客的名字。这就相当于为这一类游客打上一个相同的标签(团体属性),后续的引导和管理就统一用这个标签进行,大大提高了效率和安全性。
其实在BGP路由里面,也有一个类似“小红帽”的属性。就是Community属性,即团体属性。
l Community属性是一组4个字节的数值,RFC1997规定前两个字节表示AS号,后两个字节表示基于管理目的设置的标示符,格式为AA:NN。
l Community属性是一种BGP路由标记,用于简化路由策略的执行。可以将某些路由分配一个特定的Community属性值,之后就可以基于Community值而不是每条路由来抓取路由并执行相应的策略了。
图片上传中(0)...
图3 Community属性的应用场景
在图3中,AS100内有大量的路由被引入BGP,这些路由分别用于语音通话和视频监控两种业务。路由通过BGP通告给AS200。现在AS200的设备基于某种需求,需要分别对语音通话和视频监控的路由执行不同的策略,那么怎么匹配这些路由呢?可以用ACL或者ip-prefix逐条匹配路由,但是由于路由前缀非常多,这样工作量太大,效率低下。
可以使用Community属性来解决这个问题。在AS100引入这些路由的时候,就分别打上相应的Community值用来区分语音通话的路由和视频监控的路由,凡是语音通话的路由,就打上标记100:1,凡是视频监控的路由就打上标记100:2,那么这些属性值随着路由传递给了AS200,在AS200上需要分别对语音通话和视频监控的路由做策略的时候,只需要抓取相应Community值即可。例如抓取100:1的community值也就抓取了所有语音业务的路由。
BGP公认的团体属性
BGP定义了一些公认的团体属性,这些团体属性可以直接使用,常见的如表2所示:
团体属性名称 | 说明 |
internet | 缺省情况下,所有的路由都属于Internet团体。具有此属性的路由可以被通告给所有的BGP对等体。 |
no-advertise | 具有此属性的路由在收到后,不能被通告给任何其他的BGP对等体。 |
no-export | 具有此属性的路由在收到后,不能被发布到本地AS之外。如果使用了联盟,则不能被发布到联盟之外,但可以发布给联盟中的其他子AS。 |
no-export-subconfed | 具有此属性的路由在收到后,不能被发布到本地AS之外,也不能发布到联盟中的其他子AS。 |
表2 BGP公认团体属性
2.2 设置路由的Community属性
要使用团体属性过滤器,前提是路由携带了Community属性。就好比游客头上戴的“小红帽”,如果没有这个“小红帽”,那么所有基于这个“小红帽”的策略都无法执行。所以我们先来看一下如何设置路由的Community属性,我们通过下面这个举例来看一下。
图片上传中(0)...
图4 设置路由前缀的Community属性
需求描述
如图4所示,在AS100内的LSW1上通过BGP发布两条路由:10.1.1.0/24和10.1.2.0/24。在LSW1的BGP进程中,使用出方向(export)路由策略,修改10.1.1.0/24这条路由的Community属性为100:1,这样下游设备就可以根据这个Community属性执行相应的策略。
配置方法
R1上的关键配置:
#
ip ip-prefix huawei index 10 permit 10.1.1.0 24 //定义一个前缀列表,匹配目标路由
#
route-policy RP permit node 10 //定义一个路由策略,设置目标路由的团体属性
if-match ip-prefix huawei
apply community 100:1
route-policy RP permit node 20 //用于允许剩余所有路由通过
#
bgp 100
router-id 1.1.1.1
peer 192.168.12.2 as-number 200
#
ipv4-family unicast
undo synchronization
network 10.1.1.0 255.255.255.0 //发布路由
network 10.1.2.0 255.255.255.0 //发布路由
peer 192.168.12.2 enable
peer 192.168.12.2 route-policy RP export //对BGP对等体的export方向绑定路由策略
peer 192.168.12.2 advertise-community //配置将团体属性发布给对等体
#
R2上的关键配置:
#
bgp 200
router-id 2.2.2.2
peer 192.168.12.1 as-number 100
peer 192.168.23.2 as-number 300
#
ipv4-family unicast
undo synchronization
peer 192.168.12.1 enable
peer 192.168.23.2 enable
peer 192.168.23.2 advertise-community //配置将团体属性发布给对等体
#
值得注意的是,默认情况下,Community属性是不会随路由前缀更新给BGP peer的,因此在LSW1和LSW2上都需要通过peer advertise-community配置将团体属性发布给对等体功能。
结果验证
完成上述配置之后,我们在LSW3上查看一下BGP路由,结果如下:
<LSW3> display bgp routing-table 10.1.1.0
BGP local router ID : 3.3.3.3
Local AS number : 300
Paths: 1 available, 1 best, 1 select
BGP routing table entry information of 10.1.1.0/24:
From: 192.168.23.1 (2.2.2.2)
Route Duration: 01h08m07s
Direct Out-interface: Vlanif23
Original nexthop: 192.168.23.1
Qos information : 0x0
Community:<100:1> //这个团体属性就是在LSW1上通过路由策略设置,并传递到下游的
AS-path 200 100, origin igp, pref-val 0, valid, external, best, select, active,
pre 255
Not advertised to any peer yet
从LSW3的BGP路由表项可以看到,在LSW1上设置路由的Community属性以后,经过路由传递,到达LSW3上的时候携带一个Community属性,这样,在LSW3上就可以根据这个标记执行某些策略了。
关于设置BGP路由的Community属性,还有更详细的设置方法,这里我们就不再一一列举,举几个常见的例子,供大家参考,如表3所示:
命令 | 功能 |
apply community 100 | 团体名更改为100。 |
apply community 100 150 | 团体名更改为100或150,即BGP路由属于两个团体。 |
apply community 100 150 additive | 在原来基础上追加100和150两个团体属性。即BGP路由属于三个团体。 |
apply community none | 删除BGP路由的团体属性。 |
表3 设置BGP路由的Community属性举例
2.3 使用Community-filter匹配BGP路由
上一小节,我们介绍了如何设置BGP路由的Community属性,当上游的路由器设置了Community属性以后,这个属性会随着路由传递下来,这样下游的设备就可以根据这个属性执行相应的策略。BGP提供了一个工具:community-filter,即团体属性过滤器。下面我们通过一个例子来看一下如何使用团体属性过滤器。
图片上传中(0)...
图5 使用community-filter匹配BGP路由
需求描述
如图5所示,AS100内的LSW1发布三条BGP路由,Community属性的设置如图所示,这个Community属性随着路由的传递到达AS300内的LSW3设备上。执行策略之前我们先看一下LSW3的BGP路由表:
<LSW3> display bgp routing-table
BGP Local router ID is 3.3.3.3
Status codes: * - valid, > - best, d - damped,
h - history, i - internal, s - suppressed, S - Stale
Origin : i - IGP, e - EGP, ? - incomplete
Total Number of Routes: 3
Network NextHop MED LocPrf PrefVal Path/Ogn
*> 10.1.1.0/24 192.168.23.1 0 200 100i
*> 10.1.2.0/24 192.168.23.1 0 200 100i
*> 10.1.3.0/24 192.168.23.1 0 200 100i
可以看到, LSW3上的BGP路由表里有三条路由。现在LSW3上根据团体属性执行路由策略,允许携带100:999属性的路由通过,其他的路由不允许通过。
配置方法
设置Community属性的方法上面已经讲过,不再赘述,这里只看一下如何使用community-filter过滤路由。
LSW3上的关键配置:
#
ip community-filter 1 permit 100:999 //允许包含团体属性100:999的路由
#
route-policy huawei permit node 10 //通过路由策略调用团体属性过滤器
if-match community-filter 1
#
bgp 300
router-id 3.3.3.3
peer 192.168.23.1 as-number 200
#
ipv4-family unicast
undo synchronization
peer 192.168.23.1 enable
peer 192.168.23.1 route-policy huawei import //对peer使用入方向路由策略
#
结果验证
完成上述配置以后,查看LSW3的BGP路由表:
[LSW3] display bgp routing-table
BGP Local router ID is 3.3.3.3
Status codes: * - valid, > - best, d - damped,
h - history, i - internal, s - suppressed, S - Stale
Origin : i - IGP, e - EGP, ? - incomplete
Total Number of Routes: 2
Network NextHop MED LocPrf PrefVal Path/Ogn
*> 10.1.1.0/24 192.168.23.1 0 200 100i
*> 10.1.2.0/24 192.168.23.1 0 200 100i
由于定义的community-filter匹配包含团体属性为100:999的路由,因此10.1.1.0/24,10.1.2.0/24这两条路由将在LSW3上允许,其他BGP路由被禁止通过。
针对这个场景,我们再给出如下几个常用的community-filter的配置方法,供大家参考:
Case1:
ip community-filter 1 permit 100:1 100:999
需要100:1 100:999这两个团体属性都有才能匹配。因此匹配10.1.1.0/24这条路由。
Case2:
ip community-filter 1 permit 100:1
ip community-filter 1 permit 100:2
只要community属性中包含100:1或者100:2就能匹配到。因此匹配10.1.1.0/24和10.1.2.0/24这两条路由。
Case3:
ip community-filter 1 permit internet
默认所有路由携带internet属性,所以这样会匹配所有的路由。
至此,路由策略专题全部结束了,不知道大家是否有所收获。相信每一位数通网络工程师都曾经追求过一个目标:对路由表做到精准控制,这样才能保证业务流量按照规划的流量模型转发。我们希望通过这个技术贴,让大家更加熟练的掌握路由策略的使用方法,控制路由能够更加得心应手。谢谢大家持续关注,欢迎大家积极留言讨论。
https://forum.huawei.com/enterprise/zh/thread-376201-1-1.html