更新时间:2024-10-25 GMT+08:00

AS_Path列表概述

AS_Path列表简介

AS_Path列表是一组针对BGP路由的AS_Path属性进行过滤的规则。在BGP的路由信息中,包含有AS_Path属性,AS_Path属性按矢量顺序记录了BGP路由从本地到目的地址所要经过的所有AS编号,因此基于AS_Path属性定义一些过滤规则,就可以实现对BGP路由信息的过滤。

AS_Path路径记录AS编号越少,证明该路径越短,当两条AS_Path均能实现通信目的时,优选路径较短的。

由于AS_Path属性是BGP协议的私有属性,因此AS路径过滤器也仅应用于BGP协议。

AS_Path匹配规则

BGP路由的AS_Path属性实际上可以看作是一个包含空格的字符串,因此可以通过正则表达式来进行匹配。

图1所示,ER-A的AS号为100,来自ER-A邻居的BGP路由的经过ER-A,AS_Path会自动在最左边的位置增加ER-A的AS号100。

图1 AS_Path原理图示

正则表达式就是用一个“字符串”来描述一个特征,然后去验证另一个“字符串”是否符合这个特征。AS_Path规则主要是定义“AS_Path正则表达式”,然后去匹配BGP路由的AS_Path属性信息,从而实现对BGP路由信息的过滤。

一个AS_Path列表中可以创建多个AS_Path规则,每个AS_Path规则对应一条过滤规则。如图2所示,待过滤路由按照序列号从小到大的顺序进行匹配:
  • 当匹配上某一AS_Path规则时,如果该AS_Path规则的匹配模式是允许,则这条路由被允许通过;如果该AS_Path规则的匹配模式是拒绝,则这条路由被拒绝通过。
  • 当遍历了AS_Path列表中的所有AS_Path规则,均没有匹配上,那么这条路由就被拒绝通过。
图2 AS_Path匹配规则

AS_Path列表过滤路由的原则可以总结为:顺序匹配、唯一匹配、默认拒绝。

  • 顺序匹配:按序列号从小到大按顺序进行匹配。同一个AS_Path列表中的多条AS_Path规则设置不同的序列号,可能会有不同的过滤结果,实际配置时需要注意。
  • 唯一匹配:待过滤路由只要与一个AS_Path规则匹配,就不会再去尝试匹配其他AS_Path规则。
  • 默认拒绝:默认所有未与任何一个AS_Path规则匹配的路由,均为未通过AS_Path列表的过滤。因此在一个AS_Path列表中创建了一个或多个拒绝模式的AS_Path规则后,需要创建一个AS_Path规则来允许所有其他路由通过。

AS_Path正则表达式说明

AS_Path规则过滤的核心内容就是正则表达式。关于正则表达式的内容较为复杂,这里仅讨论一些跟AS_Path过滤器相关的内容。

AS_Path规则使用正则表达式来定义匹配规则。正则表达式由元字符和字符两部分组成:

  • 元字符定义了匹配的规则
  • 字符定义了匹配的对象

BGP AS_Path支持的元字符及正则表达式配置示例如表1所示。

表1 AS_Path正则表达式

元字符

含义

示例

.

匹配除“\n”之外任何单个字符,包括空格。

.*表示匹配任意字符串,即AS_Path为任意,可以用来匹配所有路由。

说明:

在一个AS_Path列表中创建了一个或多个拒绝模式的AS_Path规则后,需要创建一个.*规则,来允许所有其他路由通过。

*

之前的字符在目标对象中出现0次或连续多次。

参考上例。

+

之前的字符在目标对象中出现1次或连续多次。

65+表示6在AS_Path的首位,而5在AS_Path中出现一次或多次,那么:
  • 以下字符串都符合这个特征:65,655,6559,65259,65529等。
  • 以下字符串不符合这个特征:56,556,5669,55269,56259等。

|

竖线左边和右边的字符为“或”的关系。

100|65002|65003表示匹配100、65002或65003。

以下字符串均符合这个特征,包含其中任意一个字符即可:
  • 100,655,6559
  • 65,655,65002
  • 65,65003,100

^

之后的字符串必须出现在目标对象的开始。

^65表示匹配以65开头的字符串,那么:
  • 以下字符串都符合这个特征:65,651,6501,65001等。
  • 以下字符串不符合这个特征:165,1650,6650,60065等。

$

之前的字符串必须出现在目标对象的结束。

65$表示匹配以65结尾的字符串,那么:
  • 以下字符串都符合这个特征:65,165,1065,10065,60065等。
  • 以下字符串不符合这个特征:651,1650,6650,60650,65001等。
说明:

^$表示匹配空字符串,即AS_Path为空,通常用来匹配本地始发路由。

( )

一对圆括号内的正则表达式作为一个子正则表达式,匹配子表达式并获取这一匹配。

100(200)+表示100在AS_Path的首位,而200在AS_Path中出现一次或多次,那么

以下字符串都符合这个特征:
  • 100200
  • 100200200
  • 100200200200

[ ]

匹配方括号内的任意字符或指定范围内的任意字符。

  • [896]表示匹配含有8、9或6中任意一个字符。
  • [2-4]表示匹配2,3,4的任意字符。
  • [0-9]表示匹配数字0~9的任意字符。
说明:

方括号内“[ ]”只能填写数字0到9。例如,如果需要匹配735~907,则需要写成(73[5-9]|7[4-9][0-9]|8[0-9][0-9]|90[0-7])。

[^ ]

匹配除了方括号内列出的字符外的任意字符或不在指定范围内的任意字符。

  • [^2-4]表示匹配除2,3,4外的其他字符。
  • [^0-9]表示匹配除数字0~9外的其他字符。
  • [^896]表示匹配含有8、9或6这几个字符之外的任意一个字符。

_

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

  • ^65001_表示匹配字符串的开始为65001,字符串的后面为符号,也即AS_Path最左边AS(最后一个AS)为65001,可以用来匹配AS 65001邻居发送的路由,
  • _65001_表示匹配字符串里有65001,即AS_Path中有65001,可以用来匹配经过AS 65001的路由。
  • _65001$表示匹配字符串的最后为65001,字符串前面是符号,即AS_Path最右边AS(第一个AS)为65001,可以用来匹配AS 65001始发的路由。

\

转义字符。

AS_Confed_Sequence是用“(” 、“)”表示的,“(” 、“)”在正则表达式中是特殊字符,有特殊用处,所以对于这种特殊字符,可以使用“\”来去除其特殊意义进行匹配。例如:

  • \(65002_表示匹配字符串为(65002,字符串的后面为符号,也即AS_Confed_Sequence最左边AS(最后一个AS)为65002,可以用来匹配AS 65002邻居发送的路由。
  • \(.*_65003_.*\) 表示AS_Confed_Sequence中间有65003,可以用来匹配经过AS 65003的路由。
  • _65004\)表示匹配字符串最后为65004),字符串的前面为符号,也即AS_Confed_Sequence最右边AS(第一个AS)为65004,可以用来匹配AS 65004始发的路由,还可以用来匹配AS 65004直接发布的路由。

同理,AS_Confed_Set使用的“[”、“]”,AS_Set使用的“{”、“}”也都可以使用“\”符号来去除这些特殊符号的特殊意义。

约束与限制

  • 默认情况下,一个用户最多可创建5个AS_Path列表。
  • 默认情况下,一个AS_Path列表中最多可创建100个AS_Path规则。
  • AS_Path列表的变更会改变路由的流量走向,因此为了减少变更对网络性能的影响,同一个AS_Path列表在40 s内只允许变更一次。