了解用作路由策略匹配条件的 AS 路径正则表达式
BGP AS 路径 是网络数据包要遍历以到达指定路由器的自治系统序列。AS 编号按从右到左读的顺序进行组合。例如,对于要通过 AS 路径为 5 、4 、3 、2 、1 的路由到达目标的数据包,将先遍历 AS 5,依此类推,直至到达 AS 1。在这种情况下,AS 1 是数据包目标之前的最后一个 AS;它是数据包源要与之对等的 AS。
在处理 AS 路径和路由策略匹配条件时,您可以使用正则表达式来定位路由。为此,请基于部分或全部 AS 路径创建一个或多个匹配条件,然后将其包含在路由 策略中。
以下部分介绍了 AS 路径正则表达式,并提供配置示例。
配置 AS 路径正则表达式
您可以创建命名的 AS 路径正则表达式,然后将其包含在带有匹配条件的路由策略 as-path 中( 在路由策略匹配条件中介绍)。要创建命名的 AS 路径正则表达式,请包含以下 as-path 语句:
[edit policy-options] as-path name regular-expression;
要在路由策略中包含 AS 路径正则表达式,请在语句中from包含as-path匹配条件。
此外,您还可以创建由 AS 路径正则表达式组成的命名 AS 路径组,然后将其包含在具有匹配条件的 as-path-group 路由策略中。要创建命名的 AS 路径组,请包含该 as-path-group 语句。
[edit policy-options]
as-path-group group-name {
name [ regular-expressions ];
}
要在路由策略的 AS 路径组中包含 AS 路径正则表达式,请在语句中from包含as-path-group匹配条件。
您不能在同一策略术语中同时包含两个 and as-path as-path-group 语句。
您可以在语句的from匹配条件中as-path包含多个 AS 路径正则表达式的名称。如果执行此操作,则只需匹配一个 AS 路径正则表达式即可进行匹配。AS 路径正则表达式匹配实际上是一个逻辑 OR 运算。
AS 路径名称标识正则表达式。它可以包含字母、数字和连字符 (-),最多可以包含 65,536 个字符。要在名称中包含空格,请用引号 (“ ”) 将整个名称括起来。
正则表达式用于匹配 AS 路径的全部或部分。它由两个组件组成,您按以下格式指定:
term <operator>
-
term— 标识 AS。您可以通过以下方式之一对其进行指定:-
AS 编号 — 整个 AS 编号组成一个术语。您不能引用 AS 编号中的单个字符,这与 POSIX 1003.2 中定义的正则表达式不同。
-
通配符 — 匹配任意单个 AS 编号。通配符是一个句点 (.) 。您可以指定多个通配符。
-
AS 路径 — 单个 AS 编号或括在括号中的一组 AS 编号。以这种方式对正则表达式进行分组允许您对整个组执行通用操作,并赋予组优先级。分组路径本身可以包含运算符。
在 Junos OS 9.1 及更高版本 中,您可以指定 RFC 4893 中定义的 4 字节 AS 编号、四字节 AS 编号空间的 BGP 支持以及 Junos OS 早期版本中支持的 2 字节 AS 编号。可以配置 1 到 4,294,967,295 范围内 的值 。
-
-
operator—(可选)指定术语必须如何匹配的运算符。大多数运算符描述必须找到该术语多少次才能被视为匹配项(例如,任意次数的出现次数、零次或一次出现)。 表 1 列出了 AS 路径支持的正则表达式运算符。您可以紧接在后面term放置运算符,中间没有空格,除了竖线 ( | ) 和短划线 (–) 运算符(放置在两个术语之间)和括号(用括号括住术语)。
您可以在单个正则表达式中指定一个或多个术语-运算符对。
表 2 显示了如何定义正则表达式以匹配 AS 路径的示例。
| 操作人员 |
匹配定义 |
|---|---|
|
|
至少 |
|
|
的精确 |
|
|
|
|
|
零次或多次重复 |
|
|
一个或多个重复 |
|
|
零个或一个重复 |
|
|
管道两侧的两个术语之一。 |
|
|
在开始范围和结束范围之间(含)。 |
|
|
社区属性正则表达式开头的字符。此字符是隐式添加的;因此,它的使用是可选的。 |
|
|
社区属性正则表达式末尾的字符。此字符是隐式添加的;因此,它的使用是可选的。 |
|
|
括在括号中的一组术语。括号和术语之间的中间空格将被忽略。如果一组括号用引号括起来,中间没有空格“()”,则表示空路径。 |
|
|
一组 AS 编号。该集中的一个 AS 编号必须匹配。要指定范围的开始和结束,请使用连字符 (-)。插入符号 (^) 可用于指示它与集合中的特定 AS 编号不匹配,例如 [^123]。 |
| 要匹配的 AS 路径 |
正则表达式 |
匹配示例 |
|---|---|---|
| AS 路径为 1234 |
1234 |
1234 |
| AS 编号 1234 出现零次或多次 |
1234* |
1234 1234 1234 1234 1234 1234 空 AS 路径 |
| AS 编号 1234 出现零次或一次 |
1234?或 1234{0,1} |
1234 空 AS 路径 |
| AS 编号 1234 出现一到四次 |
1234{1,4} |
1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 |
| 编号 AS 12 出现一到四次,然后是 AS 编号 34 出现一次 |
12{1,4} 34 |
12 34 12 12 34 12 12 12 34 12 12 12 12 34 |
| 与单个 AS 编号匹配的 AS 编号范围 |
123–125 |
123 124 125 |
| [123–125]* |
空 AS 路径 123 124 124 125 125 125 123 124 125 123 |
|
| 第二个 AS 编号必须为 56 或 78 的 路径 |
(. 56) | (. 78) 或 . (56 | 78) |
1234 56 1234 78 9876 56 3857 78 |
| 第二个 AS 编号可能为 56 或 78 的 路径 |
( 56 | 78)? |
1234 56 52 34 56 1234 1234 78 39 794 78 2 |
| 第一个 AS 编号为 123,第二个 AS 编号为 56 或 78 的路径 |
123 (56|78) |
123 56 123 78 |
| 任意长度的路径(不存在除外),第二个 AS 编号可以是任何内容,包括不存在 |
. .* 或 . . .{0,} |
1234 1234 5678 1234 5 6 7 8 |
| AS 路径为 1、2、3 |
1 2 3 |
1 2 3 |
| AS 编号 1 和 2 出现一次,随后 AS 编号 3 出现一次或多次 |
1 2 3+ |
1 2 3 1 2 3 3 1 2 3 3 3 |
| AS 编号 1 出现一次或多次,随后 AS 编号 2 出现一次或多次,之后 AS 编号 3 出现一次或多次 |
1+ 2+ 3+ |
1 2 3 1 1 2 3 1 1 2 2 3 1 1 2 2 3 3 |
| 以 AS 编号 4、5、6 开头的任意长度的路径 |
4 5 6 .* |
4 5 6 4 5 6 7 8 9 |
| 以 AS 编号 4、5、 6 结尾的任意长度的路径 |
.* 4 5 6 |
4 5 6 1 2 3 4 5 6 4 9 4 5 6 |
| AS 路径 5、12 或 18 |
5 | 12 | 18 |
5 12 18 |
配置空 AS 路径
您可以使用 AS 路径正则表达式创建空 AS 路径,以匹配源自 AS 的路由(前缀)。这些路由尚未由任何外部对等方播发至您的 AS。要创建空 AS 路径,请使用用引号括起来的括号运算符,中间不带空格:
[edit policy-options] as-path null-as “()";
在以下示例中,本地管理的 AS 2 连接到 AS 1 (10.2.2.6) 和 AS 3。AS 3 将其路由播发至 AS 2,但 AS 2 的管理员不希望将其 AS 3 路由播发至 AS 1,从而允许从 AS 1 到 AS 3 通过 AS 2 的传输流量。为了防止中转流量,导出策略 only-my-routes 将应用于 AS 1。它允许将从 AS 2 播发到 AS 1 的路由,但阻止将 AS 3 的路由(或任何其他连接的 AS 的路由)播发至 AS 1:
[edit policy-options]
as-path null-as "()";
policy-statement only-my-routes {
term just-my-as {
from {
protocol bgp;
as-path null-as;
}
then accept;
}
term nothing-else {
then reject;
}
}
protocol {
bgp {
neighbor 10.2.2.6 {
export only-my-routes;
}
}
}
如何评估 AS 路径正则表达式
AS 路径正则表达式实现 POSIX 1003.2 中定义的扩展(现代)正则表达式。它们与 UNIX 正则表达式相同,但有以下例外:
-
AS 路径正则表达式中的基本匹配单位是 AS 编号,而非单个字符。
-
只有当路由中的 AS 路径完全匹配
regular-expression时,正则表达式才会匹配路由。等效的 UNIX 正则表达式是^regular-expression$。例如,AS 路径正则表达式1234等同于 UNIX 正则表达式^1234$。 -
您可以使用通配符运算符指定正则表达式。
示例:配置 AS 路径正则表达式
完全匹配具有 AS 路径 1234 56 78 9 的路由并接受它们:
[edit]
policy-options {
as-path wellington "1234 56 78 9";
policy-statement from-wellington {
term term1 {
from as-path wellington;
}
then {
preference 200;
accept;
}
term term2 {
then reject;
}
}
}
将备用路径与 AS 匹配,并在修改首选项后接受这些路径:
[edit]
policy-options {
as-path wellington-alternate “1234{1,6} (56|47)? (78|101|112)* 9+”;
policy-statement from-wellington {
from as-path wellington-alternate;
}
then {
preference 200;
accept;
}
}
}
匹配 AS 路径为 123、124 或 125 的路由,并在修改优先级后接受这些路由:
[edit]
policy-options {
as-path addison "123–125";
policy-statement from-addison {
from as-path addison;
}
then {
preference 200;
accept;
}
}
}