as-path-filter与正则表达式

阅读下文之前,作者视同你知晓并了解BGP,对BGP的路由过滤技术以及路由过滤工具的使用缺乏了解,那么此文正适合你。

AS_Path的组成

AS_Path属性由四部分组成,分别是:AS_Sequence、AS_Set、AS_Confed_Sequence和AS_Confed_Set。
AS_Sequence:它是到目的地的路径上所经过的AS号的有序集合,按照顺序记录了路由经过的所有AS。
AS_Set:它是到目的地的路径上所经过的AS号的无序集合。AS_Set通常用在路由聚合的场景,由于路由聚合后,系统无法将聚合前的具体路由所经过的AS再排出一个有序集合,所以只能使用AS_Set进行无序记录。AS_Set内不管含有多少AS号,在BGP选路时都按照长度为1进行计算。
AS_Confed_Sequence:是联盟内子AS的一个有序集合。
AS_Confed_Set:是联盟内子AS的一个无序集合,主要用在联盟内路由聚合的场景。

AS_Path在BGP路由表中的显示格式如下图所示。从图中可以看出,AS_Path可以看成是一个由数字0~9,“()”,“[]”,“{}”和空格组成的字符串,通过定义合适的AS_Path正则表达式就能匹配BGP路由的AS_Path属性信息。下图是AS_Path属性的最完整格式,实际应用中并不是所有字段都有填充的。

正则表达式,Regular-Expression,简称Regex。

正则表达式是用特定字符及特定字符的组合来组成一个规则集,然后程序调用这个规则集来对目标字符进行逻辑过滤,满足规则集条件的字符串将被筛选出来。
对于刚刚接触正则表达式的朋友来说,很多人的想法或许都是从入门到放弃,这源于正则表达式晦涩难懂的规则。正则表达式是一款工具,正则表达式可以用于很多场景下,但这里只介绍关于使用正则表达式来过滤BGP路由的相关知识。

正则表达式由普通字符(例如字符a到z)和特殊字符(或称“元字符”)组成:
普通字符
普通字符匹配的对象是普通字符本身。包括所有的大写和小写字母、数字、下划线、标点符号以及一些特殊符号。
例如:a匹配abc中的a,20匹配20.1.1.1,@匹配xxx@xxx.com中的@。
特殊字符
特殊字符配合普通字符匹配复杂或特殊的字符串组合。下表是BGP AS_Path支持的元字符及其应用描述。

元字符含义示例
.匹配除“\n”之外任何单个字符,包括空格。.*表示匹配任意字符串,即AS_Path为任意,可以用来匹配所有路由。
通常定义了多个deny模式的ip as-path-filter子句之后,会定义一个ip as-path-filter as-path-filter-name permit .*子句,用于允许其他路由通过。
*之前的字符在目标对象中出现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。
^之后的字符串必须出现在目标对象的开始。^65表示匹配以65开头的字符串,那么:
如下字符串都符合这个特征:65,651,6501,65001等。
如下字符串不符合这个特征:165,1650,6650,60065等。
$之前的字符串必须出现在目标对象的结束。65$表示匹配以65结尾的字符串,那么:
如下字符串都符合这个特征:65,165,1065,10065,60065等。
如下字符串不符合这个特征:651,1650,6650,60650,65001等。
^$表示匹配空字符串,即AS_Path为空,通常用来匹配本地始发路由。
(xyz)一对圆括号内的正则表达式作为一个子正则表达式,匹配子表达式并获取这一匹配。圆括号内也可以为空。100(200)+可以匹配100200、100200200、……
[xyz]匹配方括号内列出的任意字符。[896]表示匹配含有8、9或6中任意一个字符。
[^xyz]匹配除了方括号内列出的字符外的任意字符(^号在字符前)。[^896]表示匹配含有8、9或6这几个字符之外的任意一个字符。
[a-z]匹配指定范围内的任意字符。[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])。
[^a-z]匹配不在指定范围内的任意字符。[^2-4]表示匹配除2,3,4外的其他字符;[^0-9]表示匹配除数字0~9外的其他字符。
_匹配一个符号,包括逗号、左大括号、右大括号、左括号、右括号和空格,在表达式的开头或结尾时还可作起始符、结束符(同^ ,$)。^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直接发布的路由。_65004\)与65004\)作用相同。
同理,AS_Confed_Set使用的“[”、“]”,AS_Set使用的“{”、“}”也都可以使用“\”符号来去除这些特殊符号的特殊意义。

在同一个过滤器编号下,可以定义多条过滤规则(permit或deny模式)。在匹配过程中,这些规则之间是“或”的关系,即只要路由信息通过其中一项规则,就认为通过由该过滤器编号标识的这组AS_Path过滤器。在下文中,将分不同的场景来对AS_Path过滤器的作用进行举例说明。

as-path-filter路由过滤实验

as-path-filter_basic_topo_ieclub.net
as-path-filter实验拓扑图

R2、R3、R4、R5、R6向BGP进程下发布n.n.n.n/32环回口路由;
R1、R7向BGP进程下发布n.n.0.0/24、n.n.1.0/24、n.n.2.0/24、n.n.3.0/24路由。
首先看一下当没有使用AS_Path过滤器时,R1的原始BGP路由表如下:

display-bgp-routing-table_ieclub.net

可以看到全网各台设备发布的路由条目都有显示。

案例1:使用正则表达式定义一个as-path-filter from666,只接收AS666始发的路由,同时在R1的BGP进程下调用。

ip-as-path-filter-from666-permit-_666$_ieclub.net
as-path-filter与正则表达式

再次查看R1的BGP路由表,只显示本地发布的路由以及始发于AS666的路由条目。

display-bgp-routing-table_ieclub.net

案例2:定义一个as-path-filter deny666,过滤AS666始发的路由,允许接受其他路由,同时在R1的BGP进程下调用。

ip-as-path-filter-deny666-deny-_666$_ieclub.net

再次查看R1的BGP路由表,从显示的信息可以看出,AS666始发的路由被拒绝,其他路由被允许(包括经过AS666传递的路由也被允许)。

display-bgp-routing-table_ieclub.net_3

案例3:定义一个as-path-filter deny555,过滤经过AS555的路由,允许接受其他路由,同时在R1的BGP进程下调用。

ip-as-path-filter-deny555-deny-_555_ieclub.net

再次查看R1的BGP路由表,从显示的信息可以看出,(凡是)经过AS555的路由都被拒绝(包括始发于AS555),其他路由被允许。

display-bgp-routing-table_ieclub.net_4

案例4:定义一个as-path-filter GoBy666,只过滤经由AS666传递的路由,而始发于AS666、最后一个AS为666以及其他路由,都被允许,同时在R1的BGP进程下调用。

ip-as-path-filter-GoBy666-deny-._666_._ieclub.net

再次查看R1的BGP路由表,从显示的信息可以看出,只有AS_Path的中间AS是666的路由被拒绝,其他路由被允许(包括始发于AS666)。

display-bgp-routing-table_ieclub.net_5

案例5:定义一个as-path-filter local,只允许匹配本地始发的路由,过滤其他路由,同时在R1的BGP进程下调用。

ip-as-path-filter-local-permit-^$_ieclub.net

再次查看R1的BGP路由表,从显示的信息可以看出,只有AS_Path为空的本地始发路由被允许,其他路由被拒绝。

display-bgp-routing-table_ieclub.net_6

案例6:定义一个as-path-filter from7goby5,只允许匹配始发于AS777并且经过AS555传递过来的路由,过滤其他路由,同时在R1的BGP进程下调用。

as-path-filter-from777goby555_ieclub.net

再次查看R1的BGP路由表,从显示的信息可以看出,只有本地发布的路由和来自AS777且经由AS555传递的路由符合条件被允许,其他路由都被拒绝。

display-bgp-routing-table_ieclub.net_7

原创不易,转载请注明出处:本文由IEClub.net原创首发。