Darklovy 2011-11-23
BGP协议提供了非常丰富的路由策略,尤其是在路由过滤和路由选择方面有其它路由协议无法比拟的优势。使用好BGP就像做一道好的高考题一样,需要考察我们的分析能力、应用能力、以及发散思维能力。
Internet路由表中的BGP路由条目,目前规模已经达到十几万。在面对庞大的Internet路由表时,我们免不了需要进行路由过滤。在处理如此大规模的路由表时,如果利用地址前缀去过滤BGP路由,那么一来有可能配置比较繁琐,二来且有新的路由加入不好维护,所以提出了利用AS_PATH进行BGP路由过滤的办法。由于Internet核心AS的分布都是有记录的,所以利用AS的过滤更有针对性,例如可以使用AS_PATH作过滤,解决过滤从某个AS_PATH始发的全部路由,只需一个AS_PATH列表即可,当然利用AS_PATH过滤可以解决的问题远不仅如此,这还需要我们在下文中慢慢体会。
1AS_PATH与正则表达式介绍
1.1AS_PATH格式
首先让我们来认识一下BGP的AS_PATH属性。
AS_PATH,公认必遵属性。这个属性在传递UPDATE报文中标识了到达一个目的地所经过的AS信息。
AS_PATH有4种类型:
AS_SEQUENCE(用于路由AS路径记录)
AS_SET(用于聚合路由的明细路由AS集合)
AS_CONFED_SEQUENCE(用于联盟路由AS路径记录)
AS_CONFED_SET(用于联盟聚合路由)
让我们看看AS_PATH在BGP路由表中的显示格式,如图1:
图1AS_PATH显示格式
从AS_PATH的显示格式看出,AS_PATH可以看成一个由数字0-9,“()”,“[]”,“{}”和空格组成的字符串。当然例子中是最复杂的格式,实际应用中并不是所有字段都有填充的。
1.2正则表达式常用操作符
当我们想利用匹配AS_PATH做路由过滤的时候,怎么实现对AS_PATH匹配呢?根据之前分析过AS_PATH可以看作是字符串的这一特点,我们找到了处理字符串的强大工具正则表达式这把利剑来帮我们实现匹配,这样正则表达式就在BGP的舞台登场了。
正则表达式介绍:
首先让我们来认识一下正则表达式,正则表达式是按照一定的模板来匹配字符串的公式。在BGP中,正则表达式可以应用于基于AS_PATH的ACL,根据BGP路由的AS_PATH属性决定路由的接受与拒绝。
正则表达式常用操作符:
表1正则表达式常用操作符说明
2实际应用
2.1AS_PATH常用表达式
下面就利用介绍的符号来对AS_PATH进行匹配,看看这些符号能够给我们带来多么奇妙的效果。
^$
表示匹配的字符串为空,即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\)