2023年7月4日发(作者:)
浅谈as-path及基于as-path的路由过滤
摘 要:本文主要针对BGP as-path属性和as-path filter的概念、配置和使用做了介绍,重点讲解AS正则表达式的配置和匹配关系,并对使用as-path access-list进行BGP路由过滤的应用举例进行了简单介绍。
关键词:BGP as-path access-list 路由过滤
缩略语:
BGP Border Gateway Protocol
边界网关协议
AS Autonomous System
自治系统
随着NE路由器、S8016等高端设备的网上位置不断提升,很多应用中都是作为BGP路由器来承担路由交换的核心任务。在BGP的路由策略实施中,as-path、as-path access-list是最常使用过滤方法之一。as-path是BGP协议中的一个非常重要的路径属性(Path attribute),它顺序记录了一条BGP路由从源AS到目的AS所经过的路径(由源到目的所途径的所有as-number组成一个字符串,不包含目的as-number; as-number-自治系统号);每一条BGP路由都携带as-path属性,所以我们可以通过对as-path属性的过滤来灵活实现对BGP路由的过滤。
as-path access-list主要应用在以下几个方面:
对BGP路由的收发过滤,使用 neighbor A.B.C.D filter-list in/out。
限制仅本地(AS)产生的路由允许向自治系统外发送,避免成为Transit AS,as-path必须为空。
基于as-path中的特定as-number选择接收/发送路由。
对BGP路由其他属性的设置、修该,使用route-map、match as-path 、set 等命令。
1. as-number 自治系统号
在路由协议中,as-number用于标识不同的自治系统,在as-path中同样使用as-number记录经过的自治系统,在BGP中自治系统号是一个32bit的数字(1-65535)。与IP地址类似,as-number也分为public、private两类: Public as-number:公网使用的as-number,由InterNIC或RIPE统一管理和分配,范围为1-64511。
Private as-number:保留给私有网络使用,此类as-number不能出现在使用公网扩散的BGP路由的as-path属性中,取值范围为64512-65535。公网边界BGP路由器接入私网AS路由时必须去掉路由as-path中的Private as-number,否则与其它私网AS发生冲突。
X 12X (61) 12X (61) 12AS 12X (61) 12AS 61AS 62X (62 61) 12X (61) 12AS 63AS 42X (63 61) 12AS 64AS 14X 42 12
2. as-path 自治系统路径
as-path是BGP三个众所周知且必须携带的属性(Well-kown mandatory attribute)之一,也是BGP防止路由环路和进行路由优选的一个重要参数。as-path由一系列as-number 及空格、()、{}等特殊符号构成一个字符串,例如:200 300 788、(65001 65002) 387 456、654 400 {99 100 101}。
例一 as-path在自治系统联盟中的变化情况
例二:一个BGP路由表
UPNE16L#show ip bgp
BGP local router ID is 16.16.16.15
Status codes: s suppressed, d damped, h history, * valid, > best, i internal
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Label Metric LocPrf Path *> 20.0.0.0/16 0.0.0.0 0/0
*> 20.0.0.0/17 200.0.0.1 0/0 2000
*> 20.0.0.0/24 200.0.0.1 0/0 2000
*> 20.0.1.0/24 200.0.0.1 0/0 2000
*> 20.0.2.0/24 0.0.0.0 0/0
*> 20.1.0.0/16 0.0.0.0 0/0
*> 20.1.0.0/24 0.0.0.0 0/0
*> 20.1.1.0/24 200.0.0.1 0/0 2000
*> 30.0.0.0/16 200.0.0.1 0/0 2000
下面是几种常见的as-path属性字符串:
{99,100} i
100 {99} i
100 i
100 99 i
i
?
i
100 i
100 99 ?
空字符串:表示此路由为本自治系统内部产生的路由(本路由发布的或从iBGP邻居学到的)。
200 201 300:从AS 300始发(发布)途经AS 201、AS 200,最后到达本AS的一条路由,注意路由实际可能起源一个Private AS(private as-number在公网BGP路由器上被删除)。
64512 64513:这是一个在公网边界BGP路由器上收到的典型的私网AS 路由,从AS
64513始发经AS 64512到达本路由器。公网边界BGP路由器在向核心网络转发这条路由前一定要使用remove-private-as命令删除这两个private as-number。
(65001 65002) 387 456:这是一个在配置了自治系统联盟的BGP路由器上收到的典型路由;()中包含的是途径的联盟内部路径,从AS 456始发经AS 387进入本自治系统联盟,再 经AS confederation(自治系统联盟)成员AS 65002、AS 65001到达本BGP路由器。注意这种as-path只能在联盟内部看到,出联盟时(65001 65002)被替换成联盟as-number(即confederation identifier)。
654 400 {99 100 101 800 900}:这是一条典型的使用aggregate-address (带as-set参数)命令聚合后的汇聚BGP路由,聚合发生在AS 400中,路由的起源AS已无法分辨,{}中包含的是形成本聚合路由的各子网路由到达AS 400前所途径的所有AS的as-number的集合(不重复),如此例中{99 100 101 800 900}。
关于BGP路由聚合、BGP联盟、BGP路由反射器的详细内容请参阅相关资料,本文不做详细描述。
3. as-path access-list
类似IP包过滤使用(ip) access-list定义过滤原则,as-path过滤使用as-path access-list定义对as-path的过滤规则:ip as-path access-list number permit|deny regexp ,即定义一个regular expression(正则表达式)。使用正则表达式来匹配as-path。
as-path access-list的配置方法、匹配顺序和标准的access-lsit类似:支持多个子序列(序列间是“或”关系)、匹配顺序按序号从小到大。
4. regular expression 正则表达式
正则表达式是一种匹配字符串的形式和方法,它通过一组有特殊意义的标记和既定的规则来进行字符串的匹配。as-path access-list中使用的正则表达式可以匹配任何形式的as-path字符串。
4.1 正则表达式的结构
一个正则表达式由以下部分灵活搭配构成:
基本数字符:
“0”-“9”中的任何一个,用于组成as-number。
范围:
[ ] 括起来的一系列基本数字符或用连字符“-”连接的起始、终止基本数字符。范围用于限制输入字符串中的单个数字符的取值范围。例如:[123456]与[1-6]都表示单个数字符的取值范围为“1”到“6”。
替代符:
| expr1|expr2 如果子表达式expr1或expr2匹配输入字符串,则表达式expr1|expr2
匹配输入字符串。如:21|22 可以匹配输入字符串:“21 30”、“22 30 40”。
通配符:
. 匹配输入字符串中任何单个字符(包括基本数字符、分隔符等),如:1.2 可以匹配输入字符串“112”、“182”、“1 2”等。
^ 匹配输入字符串的开始,如:^12 400 可以匹配输入字符串 “12 400”、“12
400 501”等。
$ 匹配输入字符串的结束,如:200 10$ 可以匹配输入字符串 “200 10”、“100
200 10”等。
_ 匹配输入字符串中的任何单个分割符(字符串的开始、结束、空格、TAB、逗号、左括号(、右括号)、左大括号{、右大括号} ),如:100_200 可以匹配输入串 “100,200”、“100(200”、“100 200”、“100 200”等。 字符匹配组:
()可以将一个正则表达式组成一个字符匹配组以便形成更大的正则表达式。字符匹配组可以多层嵌套。如:(10|11) 120 可以匹配输入字符串“10 120”、“9
11 120 130”等。
特殊字符:
放在单个字符或符号的前面将去除该字符或符号在正则表达式中的特殊意义,用于匹配输入字符串中的这个字符或符号。如:(200 匹配输入字符串 “(200
100)100”、“101 (200 100)”等。
重复操作符:重复操作符跟在单个字符或字符匹配组的后面,匹配它们在输入字符串中的连续重复出现。
* 重复0或多次。如:90* 匹配输入字符串 “9”、“90”、“900”等。
? 重复0或1次。如:90?匹配输入字符串 “9”、“90”,不匹配“900”。
+ 重复1或多次。如:90+ 匹配输入字符串 “90”、“900”等,不匹配“9”。
4.2 正则表达式的匹配原则和示例
4.2.1 简单的字符串匹配
正则表达式中的简单字符串匹配输入字符串中的任何等价子串,即只要输入的as-path字符串中任何连续包含这个简单字符串就算匹配成功。示例:
expression:31 as-path:“213 317 2316 31”
匹配结果(彩色部分):“213 317 2316 31”
4.2.2 替代表达式的匹配
由替代符 | 分隔的多个子表达式构成一个大的替代表达式:expr1|expr2|....|exprn
替代表达式的匹配结果是各个子表达式对输入字符串匹配的结果取“或”值,即任一子表达式的匹配成功则整个替代表达式对输入字符串匹配成功。示例:
expression:21|31 as-path:“213 317 2316 31”
匹配结果(彩色部分):“213 317 2316 31”
4.2.3 范围与字符通配符的匹配
范围与字符通配符结合可以匹配较复杂的输入字符串。示例:
expression:[1-3].[34] as-path:“213 317 2316 31” 匹配结果(彩色部分):“213 317 2316 31”、“213 317 2316 31”
4.2.4 包含分隔通配符的表达式的匹配
在实际应用中经常要对as-path字符串的起、止进行匹配。示例:
expression:^21 as-path:“213 317 2316 31 731”
匹配结果(彩色部分):“213 317 2316 31 731”
expression:21$ as-path:“213 317 2316 31 731”
匹配结果(彩色部分):“213 317 2316 31 731”
expression:_31_ as-path:“213 317 31 2316 31 731”
匹配结果(彩色部分):“213 317 2316 31 731”
4.2.5 包含字符匹配组的表达式的匹配
通过使用匹配组可以组合小的表达式形成大的表达式进而匹配更复杂的输入字符串。示例:
expression:(213|218)_31 as-path:“213 317 1218 316 31”
匹配结果(彩色部分): “213 317 1218 316 31”
4.2.6 包含特殊字符的表达式的匹配
对于as-path中包含()的情况,必须使用(进行特殊字符的匹配。示例:
expression:^(213_ as-path:“213 317 1218 316 31”
匹配结果(彩色部分): “(213 317) 1218 316 31”
4.2.7 使用重复操作符的表达式的匹配
对于类似使用 as-path prepend功能路由匹配,必须要使用重复操作符创建表达式。示例:
expression:_23(_78)?_45 as-path:“23 45”和 “23 78 45”
匹配结果(彩色部分): “23 45”、 “23 78 45”
4.3 常用的正则表达式
下面是一些经常要用到的as-path正则表达式的示例:
_100_
^100$
经过AS 100的路由
源自AS 100,中间不经过其他AS的路由 _100$
^100_.
^[0-9]+$
^$
.*
}$
^(
源自AS 100的路由
到AS 100后面的其它网络的路由
as-path只包含一个as-number的路由
本地AS始发的路由
任何路由
as-path中包含as-set的路由
经过自治系统联盟成员AS的路由
5. as-path access-list配置说明
在NE路由器和CISCO路由器上,使用如下命令定义一个as-path access-list:
命令格式:ip as-path access-list number permit|deny regexp
参数说明:
number:控制列表编号,1-199。
permit/deny:允许还是禁止。
regexp:用于过滤as-path的正则表达式,如表达式中包含非法字符则过滤失败。
由于一条命令只允许定义一条正则表达式,对于复杂的过滤条件,只能重复使用此命令定义控制列表的子序列,需要注意的是一定要按顺序定义(因为子序列之间是“或”的关系)。
例:要求在路由器A上定义一个as-path控制列表,允许接收源自AS 100或AS 101或本自治系统始发的路由。
router(config-router)#ip as-path access-list 1 permit _100|101$
router(config-router)# ip as-path access-list 1 permit ^$
6. as-path access-list的应用
6.1 与filter-list配合过滤与BGP邻居之间的路由收发
使用命令: neighbor { group-name | neighbor-address } filter-list
aspath-list-number [
参数说明:
aspath-list-number:指定已配置好的as-path access-list;取值范围1-199。
in | out ] 的路
in|out:控制路由过滤的方向,in表示对从此邻居接收的路由进行过滤,out对发送 由进行过滤。
6.2 与route-map配合进行路由过滤和路由属性设置
使用命令1: route-map map-name { permit | deny } sequence-number
使用命令2:neighbor { group-name | neighbor-address } route-map map-name
[ in | out]
命令说明:使用route-map过滤与BGP邻居间的路由交换、进行路由属性设置。
使用命令3:table-map map-name
命令说明:对所有从BGP邻居学到的路由进行属性设置。
参数说明:
的路
map-name:指定route-map的名字。
in|out:控制路由过滤的方向,in表示对从此邻居接收的路由进行过滤,out对发送 由进行过滤。
6.3 使用as-path prepend控制回程路由(补充)
as-path prepend的使用虽然本身不涉及as-path access-list,但做为as-path的一种重要的应用,我们在此一并简单介绍一下:
大家知道,BGP优选路由的原则是:
1> 忽略下一跳不可达的路由
2> 优选weight最大的路由(Cisco支持,VRP不支持)
3> 优选local-preference最大的路由
4> 优选本路由器发布的路由
5> 优选as-path最短的路由
........
我们可以看到,as-path长短对路由控制的优先级高于我们常用的MED属性,而且由于MED属性不能跨越邻居AS(如要跨越需在邻居AS的EBGP上重新设置MED值,这几乎是不可能的)所以造成MED只能用在到一个邻居AS有多条连接的组网中;而对于用户网络AS连接到多个不同ISP AS的这种组网中,在不能改动ISP EBGP路由器配置的情况下,只有使用as-path的长短来控制远端网络的回程路由才是唯一的解决办法。修改as-path长短的唯一命令就是as-path prepend(在route-map中配置):
InternetISP #1 AS 10010.0.0.1Multi-homedCustomerAS 65001ISP #3 AS 20010.0.0.2ISP #2 AS 10120.0.0.220.0.0.1
命令格式1(VRP格式): set as-path as-number []
命令格式2(IOS 格式): set as-path prepend as-number []
命令说明:在route-map中对特定路由的as-path附加冗余as-number以加长as-path的长度。
特别注意:一般情况只允许附加本AS的as-number,否则容易导致路由混乱。
应用示例:
组网如下图所示,这是一个典型的多穴用户网络接入Internet的组网,用户网络使用保留自治系统号65001,通过2条上行链路接入不同的ISP实现Internet接入的安全备份。要求:
1、用户网络不能成为Transit AS。
2、用户网络对于ISP3内部网络的访问优先使用经过ISP1的路由。
用户EBGP路由器上的配置:
(说明:以下配置只实现上述2个路由过滤要求,实际应用中还需配置很多其它数据)
!启动BGP
RouterA(config)# router bgp 100
!指定BGP要发送的网络
RouterA(config-router-bgp)# network A.B.C.D
!配置EBGP对等体
RouterA(config-router-bgp)# neighbor 10.0.0.1 remote-as 100 RouterA(config-router-bgp)# neighbor 20.0.0.1 remote-as 101
!配置as-path access-list 1用于过滤与两个ISP之间的路由交换,只发送本地AS始发路由
Router(config)# ip as-path access-list 1 permit ^$
!配置as-path access-list 2用于匹配从ISP3始发且途径ISP1的路由
Router(config)# ip as-path access-list 2 permit _100_200$
!定义一个Route-map,一个名为set_lp_200,将as-path匹配_100_200$的路由的local-preference属性设置为200,其它情况设置为100。
RouterA(config)# route-map set_lp_200 permit 10
RouterA(config-route-map)# match as-path 2
RouterA(config-route-map)# set local-preference 200
RouterA(config-route-map)# exit
RouterA(config)# route-map set_lp_200 permit 20
RouterA(config-route-map)#set local-preference 100
RouterA(config-route-map)#exit
应用As-path access-list 1过滤到ISP1、ISP2边界路由器的出口路由更新上,route-map set_lp_200 到ISP1边界路由器的入口路由更新上。
RouterA(config)# router bgp 65001
RouterA(config-router-bgp)# neighbor 10.0.0.1 filter-list 1 out
RouterA(config-router-bgp)# neighbor 20.0.0.1 filter-list 1 out
RouterA(config-router-bgp)# neighbor 10.0.0.1 route-map set_lp_200 in
结束语
本文只是重点对BGP路由属性as-path及匹配as-path的as-path正则表达式、控制列表及as-path属性的应用进行了简单的介绍,BGP协议是当前控制能力最强、路由策略最丰富的路由协议之一,还有其它如Origin、community、MED等十余种路由属性可用于路由策略的定制,这些属性的灵活搭配使BGP具有十分强大的路由控制能力,关于这些属性及BGP协议其它方面的内容请参考相关技术资料。
参考资料:
[1] Cisco,“Configuring BGP” Cisco website [2] Cisco,“Route Filtering and Route Selection in BGP” Cisco website
发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1688419256a135625.html
评论列表(0条)