AS路径正则表达式对BGP路由的控制及应用
AS路径正则表达式对BGP路由的控制及应用
前言
Internet路由表中的BGP路由条目,目前规模已经达到十几万。在面对庞大的Internet路由表时,我们免不了需要进行路由过滤。在处理如此大规模的路由表时,如果利用地址前缀去过滤BGP路由,那么一来有可能配置比较繁琐,二来且有新的路由加入不好维护,所以提出了利用AS_PATH进行BGP路由过滤的办法。
由于Internet核心AS的分布都是有记录的,所以利用AS的过滤更有针对性,例如可以使用AS_PATH作过滤,解决过滤从某个AS_PATH始发的全部路由,只需一个AS_PATH列表即可,当然利用AS_PATH过滤可以解决的问题远不仅如此。
AS-Path格式
AS_PATH,公认必遵属性。这个属性在传递UPDATE报文中标识了到达一个目的地所经过的AS信息。
| AS-Path类型 | 备注 |
|---|---|
| AS_SEQUENCE | 用于路由AS路径记录 |
| AS_SET | 用于聚合路由的明细路由AS集合 |
| AS_CONFED_SEQUENCE | 用于联盟路由AS路径记录 |
| AS_CONFED_SET | 用于联盟聚合路由 |
AS_PATH在BGP路由表中的显示格式:
正则表达式
按照一定的模板来匹配字符串的公式,由普通字符+特殊字符组成。
| 特殊字符 | 功能 | 举例 |
|---|---|---|
| ^ | 匹配行首的位置 | ^10匹配10.10.10.1,不匹配20.10.10.1 |
| $ | 匹配行尾的位置 | 1$匹配10.10.10.1,不匹配10.10.10.2 |
| * | 匹配前面的子正则表达式0次或多次 | 10*可以匹配1、10、100、1000、… |
| + | 匹配前面的子正则表达式1次或多次 | 10+可以匹配10、100、1000、…… (10)+可以匹配10、1010、101010、…… |
| ? | 匹配前面的子正则表达式0次或1次 | 10?可以匹配1或者10 (10)?可以匹配空或者10 |
| . | 匹配任意单个字符 | 0.0可以匹配0x0、020、…… .oo.可以匹配book、look、tool、…… |
| () | 一对圆括号内的正则表达式作为一个子 正则表达式,匹配子表达式并获取这一 匹配。圆括号内也可以为空 |
100(200)+可以匹配 100200、100200200、…… |
| x|y | 匹配x或y | 100|200可以匹配100或2001(2|3)4可以匹配124或134,而不匹配1234,14,1224,1334 |
| [xyz] | 匹配正则表达式中包含的任意一个字符 | [123]匹配255中的2 |
| [^xyz] | 匹配正则表达式中未包含的字符 | [^123]匹配除123之外的任何字符 |
| [a-z] | 匹配正则表达式指定范围内的任意字符 | [0-9]匹配0到9之间的所有数字 |
| [^a-z] | 匹配正则表达式指定范围外的任意字符 | [^0-9]匹配所有非数字字符 |
| _ | 匹配一个逗号(,)、左花括号({)、右花括号(})、左圆括号、右圆括号。匹配输入字符串的开始位置。匹配输入字符串的结束位置。匹配一个空格。 | _2008__匹配2008、空格2008空格、空格2008、2008空格、,2008,、{2008}、(2008)、{2008)、(2008} |
| \ | 转义操作符,去除特殊字符的特殊意义 | |
| - | 连接符 |
正则表达式常见应用
| 正则表达式 | 意义 |
|---|---|
| ^$ | 表示匹配的字符串为空,即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邻居发送的路由。 |
| _100$ | 表示匹配字符串最后为100,即AS_PATH最右边AS(起始AS)为100,表示匹配AS100始发的路由。 |
| 100_ | 表示字符串中间有100,即AS_PATH中有100,表示匹配经过AS100的路由。 |
| ^100$ | 只通过AS 100的路由。 |
| ^[0-9]+$ | 只有一个AS号的路由。 |
应用案例
实例一
场景
A国政府近年来和B国战争不断,而且许多B国网页上有A国的反动言论,所以A国政府希望本国人民无法访问B国的网页,A国经过调查发现B国的AS号为70。
部署
于是A国政府在本国路由器上配置:
ip as-path 2 deny 70$ (拒绝从AS70始发的路由)
ip as-path 2 permit .* (允许其他AS的路由)
实例二
场景
但是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的路由)
实例三
场景
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的路由)
实例四
场景
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的路由)
实例五
场景
在以后的日子新任管理员逐渐熟悉了各个路由器的配置后,他发现以前的配置比较繁琐,比如:
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)$ (作用与以前的一样)
总结
以上只是对一些常用应用的总结。对于正则表达式”[]”许多厂家实现的不一样,H3C和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$
所以这也是一个仁者见仁,智者见智的表现。





