BGP正则表达式简单说明

本文转载自:http://www.h3c.com/cn/d_201010/922170_30005_0.htm
BGP使用正则表达式进行路由操作和过滤,主要是作用与AS-PATH,下面是一个AS-PATH示例:

AS-PATH由0-9,(),{},[]和空格组成。其中小括号表示联盟有序自治区号序列,中括号标志表示无序自治区号集合,无括号表示有序自治区号序列,大括号表示无序自治区号集合,空格作为分隔符。

常见的正则表达式特殊符号

? 允许前面的一个字符出现零次或者一次
. 匹配任意一个字符
***** 允许前面的字符出现零次,一次或者多次
+ 允许前面的字符出现一次或者多次
^ 必须在开头出现
$ 需要在结尾出现
[] 表示一组字符的集合,如果集合中第一个字符为"^",则表示补集
_ 下杠,匹配一个符号,如逗号、左大括号、右大括号、左括号、右括号和空格等符号,在表达式的开头或结尾时还可作起始符、结束符(同^ ,$)
- 中杠,连接符
\ 转义操作符,去除特殊字符的特殊意义

常见例子

^$ 表示匹配的字符串为空,即AS_PATH为空,表示只匹配本地路由。
.* 表示匹配任意字符串,即AS_PATH为任意,表示匹配所有路由。
^100 表示匹配字符串开始为100,即AS_PATH最左边AS前3位(最后一个AS)为100、1001、1002等,表示匹配AS100、1001、1002等邻居发送的路由。
^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始发的路由

应用场景

实例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

场景

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

部署:

于是A国路由器的配置变成:
ip as-path 2 permit _30 .+ 70$   (接受从AS70始发的路由但是要经过AS30)                                   
ip as-path 2 permit _30 70$   (有可能AS30与AS70直接相连)
ip as-path 2 deny 70$   (拒绝从AS70始发的路由)
ip as-path 2 permit .*   (允许其他AS的路由)

实例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)$   (有可能AS30与AS70-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的路由)

实例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的路由)

实例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)$ (作用与以前的一样)

总结

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

posted @ 2020-01-19 15:37  ouyangxibao  阅读(2743)  评论(0)    收藏  举报