了解用作路由策略匹配条件的 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 路径正则表达式匹配实际上是一个逻辑或操作。
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 路径 1 2 3 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 |
123 |
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 路径,请使用用引号括起来的括号运算符,中间没有空格:
“()"
在以下示例中,本地管理的 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] 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; } } }