常用BGP AS_PATH正则表达式应用

                                                                                文/杨默寒、姜杏春

前言

BGP协议提供了非常丰富的路由策略,尤其是在路由过滤和路由选择方面有其它路由协议无法比拟的优势。使用好BGP就像做一道好的高考题一样,需要考察我们的分析能力、应用能力、以及发散思维能力。

Internet路由表中的BGP路由条目,目前规模已经达到十几万。在面对庞大的Internet路由表时,我们免不了需要进行路由过滤。在处理如此大规模的路由表时,如果利用地址前缀去过滤BGP路由,那么一来有可能配置比较繁琐,二来且有新的路由加入不好维护,所以提出了利用AS_PATH进行BGP路由过滤的办法。由于Internet核心AS的分布都是有记录的,所以利用AS的过滤更有针对性,例如可以使用AS_PATH作过滤,解决过滤从某个AS_PATH始发的全部路由,只需一个AS_PATH列表即可,当然利用AS_PATH过滤可以解决的问题远不仅如此,这还需要我们在下文中慢慢体会。

1         AS_PATH与正则表达式介绍

1.1        AS_PATH格式

首先让我们来认识一下BGPAS_PATH属性。

AS_PATH,公认必遵属性。这个属性在传递UPDATE报文中标识了到达一个目的地所经过的AS信息。

AS_PATH4种类型:

Ø         AS_SEQUENCE(用于路由AS路径记录)

Ø         AS_SET(用于聚合路由的明细路由AS集合)

Ø         AS_CONFED_SEQUENCE(用于联盟路由AS路径记录)

Ø         AS_CONFED_SET(用于联盟聚合路由)

让我们看看AS_PATHBGP路由表中的显示格式,如图1

图1 AS_PATH显示格式

AS_PATH的显示格式看出,AS_PATH可以看成一个由数字0-9" ""[ ]""{}"和空格组成的字符串。当然例子中是最复杂的格式,实际应用中并不是所有字段都有填充的。

1.2        正则表达式常用操作符

当我们想利用匹配AS_PATH做路由过滤的时候,怎么实现对AS_PATH匹配呢?根据之前分析过AS_PATH可以看作是字符串的这一特点,我们找到了处理字符串的强大工具正则表达式这把利剑来帮我们实现匹配,这样正则表达式就在BGP的舞台登场了。

正则表达式介绍:

首先让我们来认识一下正则表达式,正则表达式是按照一定的模板来匹配字符串的公式。在BGP中,正则表达式可以应用于基于AS_PATHACL,根据BGP路由的AS_PATH属性决定路由的接受与拒绝。

正则表达式常用操作符:

符号

说明

匹配任意字符,包括特殊字符,空格。

*

匹配*前面字符中0次或多次。

+

匹配+前面字符中1次或多次。

匹配?前面字符中0次或1次。

^

匹配字符串的开始。

$

匹配字符串的结束。

_

匹配一个符号,如逗号、左大括号、右大括号、左括号、右括号和空格等符号,在表达式的开头或结尾时还可作起始符、结束符(同^ $)。

( )

匹配一个变化的字符或一个独立的匹配,通常和"|"一起使用。

|

逻辑或,交替匹配

[ ]

表示一组字符的集合,如果集合中第一个字符为"^",则表示补集

-

连接符

\

转义操作符,去除特殊字符的特殊意义

(注1:?为正则表达式通用操作符,但是comware中该符号作为关键字被占用,所以comware不支持该操作符。)

  表1 正则表达式常用操作符说明

 

2         实际应用

2.1        AS_PATH常用表达式

下面就利用介绍的符号来对AS_PATH进行匹配,看看这些符号能够给我们带来多么奇妙的效果。

 

^$   

表示匹配的字符串为空,即AS_PATH为空,表示只匹配本地路由。

 

.*  

表示匹配任意字符串,即AS_PATH为任意,表示匹配所有路由。

 

^100

表示匹配字符串开始为100,即AS_PATH最左边AS3位(最后一个AS)为10010011002等,表示匹配AS10010011002等邻居发送的路由。

 

^100_

表示匹配字符串开始为100后面为符号,即AS_PATH最左边AS(最后一个AS)为100,表示匹配AS100邻居发送的路由,比较前一个表达式,"_"的好处就体现出来了,它可以和用来帮助我们限制匹配单独的一个AS 

 

_100$

表示匹配字符串最后为100,即AS_PATH最右边AS(起始AS)为100,表示匹配AS100始发的路由。

 

_100_

表示字符串中间有100,即AS_PATH中有100,表示匹配经过AS100的路由。

 

\(65535_

表示匹配字符串为(65535后面为符号,即AS_CONFED_SEQUENCE最左边AS(最后一个AS)为65535,表示匹配联盟AS65535邻居发送的路由,我们知道,AS_CONFED_SEQUENCE是用"(" ")"表示的,"(" ")在正则中是特殊字符,有特殊用处,所以对于这种特殊字符,可以使用"\"来去除其特殊意义进行匹配,同理AS_CONFED_SET使用的"[""]" AS_SET使用的"{""}"都可以使用"\"符号来去除这些特殊符号的特殊意义,举例\[65533_\{202_

 

\(.*_205_.*\)

表示字符串AS_CONFED_SEQUENCE中间有205,即AS_CONFED_SEQUENCE中有205,表示匹配经过联盟AS205的路由。

 

_207\)

表示匹配字符串最后为207),即AS_PATH最右边AS_CONFED_SEQUENCE(起始AS)为207,表示匹配联盟AS207始发的路由。

2.2        应用场景

2.2.1       实例一

场景:

A国政府近年来和B国战争不断,而且许多B国网页上有A国的反动言论,所以A国政府希望本国人民无法访问B国的网页,A国经过调查发现B国的AS号为70

部署:

于是A国政府在本国路由器上配置:

ip as-path 2 deny 70$   (拒绝从AS70始发的路由)

ip as-path 2 permit .*   (允许其他AS的路由)

2.2.2       实例二

场景:

但是A国有些政府官员要和B国保持联系,协商如何促进两国和平等事情。于是A国又收购了一个AS30,要求可以接受AS70始发的路由,但是一定要经过AS30检查过滤。

部署:

于是A国路由器的配置变成:

ip as-path 2 permit _30 .+ 70$   (接受从AS70始发的路由但是要经过 AS30                                             

ip as-path 2 permit _30 70$   (有可能AS30AS70直接相连)

ip as-path 2 deny 70$   (拒绝从AS70始发的路由)

ip as-path 2 permit .*   (允许其他AS的路由)

2.2.3       实例三

场景:

B国恐怖组织后来发现自己在A国的分部无法访问AS70内的网站,于是联盟了多年饱受A国欺负的其他国家,在AS70-140里大肆放置A国反动网站。A国几番周折终于掌握了这些内部消息,但是想到自己的国家政府还要与这些国家政府保持联系(所以还是要经过AS30来过滤的)

部署:

于是A国路由器的配置变成:

ip as-path 2 permit _30 .+ (7[0-9]|8[0-9]|9[0-9]|1[0-3][0-9]|140)$   (接受从AS70-140始发的路由但是要经过AS30

ip as-path 2 permit _30 (7[0-9]|8[0-9]|9[0-9]|1[0-3][0-9]|140)$   有可能AS30AS70-140直接相连)

ip as-path 2 deny (7[0-9]|8[0-9]|9[0-9]|1[0-3][0-9]|140)$   (拒绝从AS70-140始发的路由)

ip as-path 2 permit .*   (允许其他AS的路由)

2.2.4       实例四

场景:

A国政府年老的网络管理员退休了,于是换了一位年轻的管理员,上任后发现本地AS内的路由器保存着许多本地始发的BGP路由,同时路由表里装载的是该路由为IGP路由(只是前缀一样),想了许久给出了一个解决办法,首先定义一个内部组,把所有IBGP邻居归纳整合到这个组,根据组来进行as-path过滤。

部署:

bgp xxxx

group 1 internal

   peer 1 as-path-acl 100 export

正则表达式如下:

   ip as-path 100 deny ^$     (拒绝发布本地始发路由)

ip as-path 100 permit .*   (允许发布其他AS的路由)

2.2.5       实例

场景:   

在以后的日子新任管理员逐渐熟悉了各个路由器的配置后,他发现以前的配置比较繁琐,比如"ip as-path-acl 2 permit _30 .+ (7[0-9]|8[0-9]|9[0-9]|1[0-3][0-9]|140)$"这条命令,看起来复杂而且理解起来又很晦涩,于是新任管理员重新修改了配置。

部署:

修改后的正则表达式如下:

ip as-path 2 permit _30 .+ (7.|8.|9.|1[0-3].|140)$  (作用与以前的一样)

3         总结

以上只是对一些常用应用的总结。对于正则表达式"[]"许多厂家实现的不一样,我们和CISCO是一样的在方括号里只能填写数字09,比如要是限制范围为1020那么只能写成(1[0-9]|2[0-9]),如果是40000-65000那么配置任务还是很巨大的啊。有一些个别的厂商实现了该功能的扩展比如要限定范围为40005000,那么配置[4000-5000]就可以了。

最后想说的是正则表达式是一个非常灵活的东西,我们可以用不同形式表达相同的目的,当然这样也就有了简单复杂、好与不好的区分。例如实例二中提到的配置,

ip as-path 2 permit _30 .+ 70$                    

ip as-path 2 permit _30 70$

我们完全可以简化为一个命令ip as-path 2 permit _30 .+ 70$|_30 70$ 。所以这也是一个仁者见仁,智者见智的表现。

 

感谢您对本刊物的关注,如果您在阅读时有何感想,请点击反馈。
联系我们