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$ 。所以这也是一个仁者见仁,智者见智的表现。

浙公网安备 33010602011771号