了解用作路由策略匹配条件的 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 路径正则表达式,请在 as-path
语句中包含 from
匹配条件。
此外,您可以创建由 AS 路径正则表达式组成的命名 AS 路径组,然后将其包含在具有匹配条件的 as-path-group
路由策略中。要创建命名的 AS 路径组,请包含该 as-path-group
语句。
[edit policy-options] as-path-group group-name { name [ regular-expressions ]; }
要在路由策略的 AS 路径组中包括 AS 路径正则表达式, as-path-group
请在语句中包含 from
匹配条件。
不能在同一策略条款中同时包含 和 as-path
as-path-group
语句。
您可以在语句的from
匹配条件中包含as-path
多个 AS 路径正则表达式的名称。如果执行此操作,则只需匹配一个 AS 路径正则表达式即可进行匹配。AS 路径正则表达式匹配实际上是一种逻辑 OR 操作。
AS 路径名标识正则表达式。它可以包含字母、数字和连字符 (-),最多可包含 65,536 个字符。要在名称中包含空格,请用引号 (“ ”) 将整个名称括起来。
正则表达式用于匹配全部或部分 AS 路径。它由两个组件组成,您可以按以下格式指定:
term <operator>
term
— 标识 AS。您可以通过以下方式之一指定它:AS 编号 — 整个 AS 编号组成一个术语。不能引用 AS 编号中的单个字符,因为 AS 编号与 POSIX 1003.2 中定义的正则表达式不同。
通配符 — 匹配任何单个 AS 编号。通配符是一个句点 (.)。可以指定多个通配符。
AS 路径 — 单个 AS 编号或一组括在括号中的 AS 编号。以这种方式对正则表达式进行分组允许您对整个组执行常见操作,并赋予组优先级。分组路径本身可以包含运算符。
在 Junos OS 9.1 及更高版本中,您可以指定 RFC 4893 中定义的 4 字节 AS 编号、 BGP 对四字节 AS 编号空间的支持以及早期版本的 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 2 从 AS 1 到 AS 3 的传输流量。为了防止传输流量,导出策略 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; } } }