三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

BGP AS_Path属性详解:从防环选路到高级流量工程实战

BGP AS_Path属性详解:从防环选路到高级流量工程实战

1. 项目概述:理解BGP的“足迹”与“信任链”

在互联网这个由数万个自治系统(AS)构成的庞大网络中,边界网关协议(BGP)扮演着“全球路由导航系统”的角色。它不负责计算最短路径,而是专注于在自治系统之间传递和选择最佳路径。在这个过程中,BGP需要一套严谨的“评判标准”来决定如何走,而AS_Path属性正是这套标准中最核心、最基础,也最容易被误解的“路径足迹”记录。

简单来说,AS_Path就是一张记录了某条路由从起源AS,一路经过哪些中间AS,最终到达你这里的“护照签证页”。每经过一个AS,这个AS的编号就会被像盖章一样,按顺序添加到路径列表的前面。这个看似简单的列表,却承载着三大核心使命:防环、选路和策略控制。防环是它的“本职工作”,BGP路由器看到自己的AS号出现在某条路由的AS_Path里,就会直接丢弃该路由,这是BGP赖以生存的无环基础。选路则是它的“高级应用”,在其它属性(如Local_Preference、MED)相同的情况下,AS_Path最短的路径通常会被优选,这符合“经过的中间人越少,路径可能越优”的直觉。而策略控制,则是网络工程师施展魔法的舞台,通过精心地添加、删除或修改AS_Path,可以灵活地引导或拒绝流量的流向。

很多刚接触BGP的朋友容易把AS_Path简单地理解为“跳数”,类似于IGP协议里的度量值(Metric),认为它越短越好。这个理解虽然在实际选路中常常成立,但却忽略了其本质是一个有序的AS编号序列,以及背后复杂的策略交互。尤其是在涉及路由聚合、联盟(Confederation)、路由反射器(Route Reflector)等场景时,AS_Path的行为会变得微妙。理解AS_Path,不仅是理解BGP协议本身的关键,更是构建稳定、可控、高效互联网络的基础。无论你是正在备考认证的网络工程师,还是负责运维大型网络架构的专家,透彻掌握AS_Path的运作机制和实战应用,都是不可或缺的一课。

2. AS_Path属性深度解析:结构、类型与运作原理

2.1 AS_Path的底层数据结构与表现形式

AS_Path在BGP更新消息(Update Message)中是一个必遵属性(Well-known mandatory attribute)。它的数据结构本质上是一个有序列表,列表中的每个元素称为一个路径段(Path Segment)。每个路径段都有一个类型字段和一个或多个AS编号序列。

最常见的路径段类型有两种:

  • AS_SEQUENCE:这是最标准的类型。它表示路径段中的AS编号是按严格的传输顺序排列的。列表中的第一个AS编号是最近经过的AS(即上一跳AS),最后一个AS编号是最早经过的AS(即起源AS)。当你在路由器上查看BGP表时,显示的通常就是这种类型。例如,100 200 300表示这条路由起源于AS 300,先传给AS 200,再传给AS 100,最后传到了你这里。
  • AS_SET:这是一个无序的AS编号集合。它主要用于路由聚合(Aggregation)场景。当执行聚合时,来自多条明细路由的AS_Path信息会被合并。为了防环,需要保留这些原始AS的信息,但顺序已无意义,因此将它们放入一个AS_SET中。在选路时,无论AS_SET里包含多少个AS编号,其长度通常被视为1(具体行为可能因厂商和设备软件版本而异,这是一个重要的实操细节)。

在命令行界面,我们通常看到的是简化表示。例如:

Router# show ip bgp Network Next Hop Metric LocPrf Weight Path *> 10.1.1.0/24 192.168.1.1 0 0 100 200 300 i

这里的Path列显示为100 200 300 i。其中100 200 300就是AS_SEQUENCE,末尾的i表示起源属性(Origin)为IGP(通常通过network命令注入),这是一个附加信息,帮助我们理解路由的源头。

2.2 AS_Path在路由传递过程中的动态更新机制

AS_Path不是一成不变的,它在路由传递的每一个EBGP(外部BGP)对等体之间都会发生关键变化。这个更新规则是理解BGP环路预防和路径选择的基石。

核心规则:当一台BGP路由器将一条路由通告给它的EBGP对等体时,它必须将自己的AS号添加到AS_Path列表的最前面(最左端)。

让我们通过一个具体场景来跟踪这个过程:

  1. 起源:在AS 300中,路由器通过network命令将路由10.1.1.0/24注入BGP。此时,这条路由的AS_Path在AS 300内部是空的,或者在某些实现中显示为本地AS号(取决于查看方式),其起源属性被标记。
  2. 第一次传递:AS 300的路由器将这条路由通告给它的EBGP邻居,位于AS 200的路由器。在发出更新消息前,AS 300的路由器会将自己的AS号300添加到AS_Path中。AS 200的路由器收到后,在其BGP表中,该路由的AS_Path变为300
  3. 第二次传递:AS 200的路由器决定将这条路由继续通告给它的EBGP邻居,位于AS 100的路由器。同样,在发出前,AS 200的路由器将自己的AS号200添加到AS_Path的最前面。AS 100的路由器收到后,其BGP表中该路由的AS_Path变为200 300
  4. 最终状态:AS 100的路由器看到的路径200 300清晰地表明:要去往10.1.1.0/24,数据包需要先经过AS 200,再经过AS 300。

关键注意事项:这个“添加自己AS号”的规则仅适用于EBGP会话。在IBGP(内部BGP)对等体之间传递路由时,AS_Path不会被修改。这是BGP的另一个基本原则:在同一个AS内部,所有路由器被认为是一个统一的决策实体,因此不需要通过修改AS_Path来防环。IBGP的防环依赖于其他机制,比如从IBGP学到的路由不会传递给另一个IBGP对等体(除非使用路由反射器)。

2.3 AS_Path长度计算与BGP最佳路径选择

BGP选择最佳路径时,会遵循一个严格的决策过程,通常被称为“BGP Best Path Selection Algorithm”。AS_Path长度是其中的一个关键比较步骤(通常排在第三步,在比较权重(Weight)、本地优先级(Local Preference)之后)。

AS_Path长度的计算规则如下:

  1. 统计AS_SEQUENCE类型路径段中AS编号的个数。
  2. 如果存在AS_SET,则无论其中包含多少个AS编号,通常计为1。这是需要特别注意的点,因为不同的路由器厂商或软件版本可能有细微差别,但主流实现(如Cisco IOS/XE)默认将AS_SET长度计为1。
  3. 将上述两部分的数量相加,得到AS_Path长度。

举例说明:

  • 路径A:100 200 300(三个AS_SEQUENCE) -> 长度 = 3
  • 路径B:100 200 {400,500,600} 300(两个AS_SEQUENCE + 一个AS_SET) -> 长度 = 2 + 1 = 3
  • 路径C:100 200-> 长度 = 2

在这种情况下,BGP会选择AS_Path最短的路径C。

为什么AS_Path短通常更优?这基于一个合理的网络假设:数据包经过的自治系统越少,可能遇到的策略控制点、潜在拥塞点或故障点就越少,端到端的延迟和不确定性也可能更低。因此,“最短AS_Path”成为一个简单有效的默认优选准则。然而,这不是绝对的。网络管理员完全可以通过设置更高的Local Preference(本地优先级)或修改权重(Weight)来优先选择AS_Path更长的路径,以实现流量工程或备份目的。AS_Path长度只是一个决策因子,其优先级可以被更高权重的属性覆盖。

3. AS_Path在高级网络场景中的应用与变形

3.1 路由聚合(Aggregation)中的AS_Path处理与AS_SET

当我们需要将多条连续或非连续的明细路由汇总成一条更粗粒度的聚合路由(超网路由)并通告给其他AS时,就涉及到路由聚合。聚合能显著减少全球BGP路由表的大小,但会丢失明细路由的路径信息,这可能会破坏AS_Path的防环功能。

问题场景:假设AS 100从AS 200收到了10.1.0.0/2410.1.1.0/24,从AS 300收到了10.1.2.0/24。AS 100决定聚合为10.1.0.0/22并通告给AS 400。如果AS 100在聚合时简单地生成一个空的AS_Path或只包含自己AS号的AS_Path,那么:

  • AS 400收到聚合路由10.1.0.0/22,路径为100
  • 如果AS 400的某个下游网络(比如AS 500)恰好有更具体的10.1.1.0/24路由,并传回给AS 400,AS 400可能会错误地认为通过AS 100(路径100)和通过下游(路径可能更长)是两条不同的路径,甚至可能形成环路。

解决方案:使用AS_SET。在配置聚合时,可以指定包含原始AS_Path信息。路由器会将所有明细路由的AS_Path中的AS编号提取出来,去除重复项,然后放入一个AS_SET中,再与聚合路由自己的AS号(作为AS_SEQUENCE)一起组成新的AS_Path。

配置示例(以Cisco IOS为例):

router bgp 100 aggregate-address 10.1.0.0 255.255.252.0 summary-only as-set
  • summary-only:抑制所有明细路由的通告,只通告聚合路由。
  • as-set:关键参数。生成包含原始AS信息的AS_SET。

聚合后的AS_Path可能看起来像:100 {200,300}。对于AS 400来说,它看到这条路由来自AS 100,并且其来源关联着AS 200和AS 300。如果AS 400试图将去往10.1.1.0/24的流量发回给AS 100,而AS 100的明细路由又指向AS 200,就可能形成环路。此时,AS 100的路由器在检查AS_Path时,会发现自己的AS号100在AS_SEQUENCE中,而目标IP10.1.1.0/24匹配聚合路由10.1.0.0/22。更重要的是,当它需要将流量转发给AS 200时,它会检查AS 200是否在AS_Path的AS_SET中。发现AS 200在AS_SET中,这就构成了一个环路迹象。虽然BGP标准对AS_SET的防环处理不如AS_SEQUENCE严格(有些实现可能不会因此丢弃),但它提供了重要的环路预警信息。

实操心得:在实际工程中,出于简化路径和避免不可预测选路行为的考虑,很多网络会在进行聚合时故意不使用as-set选项。但这要求网络管理员对聚合范围外的路由可达性有清晰的把握,确保不会因此引入路由黑洞或环路。这是一个典型的权衡:减少路由表大小 vs. 保留路径信息的完整性。

3.2 联盟(Confederation)与路由反射器场景下的AS_Path行为

在大型AS内部,为了解决IBGP全互联的需求,引入了联盟和路由反射器(RR)两种技术。它们对AS_Path的处理有特殊之处。

联盟(Confederation): 联盟将一个大的AS划分成多个小的“成员AS”(Sub-AS)。在联盟内部,这些成员AS之间使用一种特殊的EBGP( Confederation eBGP)会话通信。为了不让外部AS感知到内部的分割,联盟引入了两种特殊的AS_Path段类型:

  • AS_CONFED_SEQUENCE:类似于AS_SEQUENCE,但记录的是成员AS的路径。
  • AS_CONFED_SET:类似于AS_SET,但用于成员AS的集合。

关键规则:当路由在联盟内部的成员AS之间传递时,添加的是成员AS号,并放入AS_CONFED_SEQUENCE。当路由从联盟出口,通告给真正的外部EBGP对等体时,所有联盟内部的AS_CONFED_SEQUENCE/SET信息会被完全剥离,对外只显示联盟的公共AS号。这样,外部世界看到的AS_Path就像是从一个统一的AS发出来的一样,保持了AS_Path的简洁性和防环功能。

路由反射器(Route Reflector, RR): RR是另一种解决IBGP全互联的方案。在RR架构中,AS_Path在IBGP会话中传递时不会被修改,这与标准的IBGP行为一致。RR只是将从某个客户端(Client)或非客户端(Non-Client)学到的路由,反射给其他客户端或非客户端,它本身不会在AS_Path中添加自己的AS号(因为它不是AS边界路由器)。因此,在纯RR环境中,AS_Path在整个AS内部保持不变,直到路由被通告给外部EBGP对等体。

3.3 利用AS_Path进行策略控制:正则表达式与路由策略

AS_Path不仅是BGP自动计算和使用的属性,更是网络工程师实施流量策略的强大工具。通过路由策略(Route-map),我们可以匹配、修改AS_Path,从而影响BGP的选路和路由传播。

核心工具:AS_Path访问列表(AS-Path Access List)这通常通过正则表达式(Regex)来实现。正则表达式允许我们灵活地匹配AS_Path字符串中的特定模式。

常用AS_Path正则表达式示例:

  • ^$:匹配空的AS_Path。通常用于匹配本AS内起源的路由。
  • ^100$:匹配AS_Path恰好为100的路由(即直接从AS 100学来的)。
  • _100_:匹配AS_Path中包含100的路由(无论出现在什么位置)。下划线_匹配一个空格、字符串开头或结尾。
  • ^200_:匹配AS_Path以200开头的路由(即上一跳是AS 200)。
  • _300$:匹配AS_Path以300结尾的路由(即起源AS是300)。
  • ^(100|200):匹配AS_Path以100200开头的路由。

实战策略案例:

  1. 过滤特定AS传来的路由:不想接收来自AS 666的所有路由。

    ip as-path access-list 10 deny _666_ ip as-path access-list 10 permit .* router bgp 100 neighbor 1.1.1.1 filter-list 10 in
  2. 设置本地优先级(Local Preference):对于从AS 200传来(路径以200开头)的路由,给予更高的优先级,使其成为出口首选。

    route-map SET_LP permit 10 match as-path 20 set local-preference 200 route-map SET_LP permit 20 ip as-path access-list 20 permit ^200_ router bgp 100 neighbor 1.1.1.1 route-map SET_LP in
  3. AS_Path预挂(Prepending):这是最常用的流量工程手段之一。通过向AS_Path中重复添加自己的AS号,人为地增加路径长度,使该路径对其他AS的吸引力降低,从而将入站流量引导至其他入口点。

    route-map PREPEND_OUT permit 10 set as-path prepend 100 100 100 router bgp 100 neighbor 2.2.2.2 route-map PREPEND_OUT out

    通告给邻居2.2.2.2的路由,其AS_Path会从原来的100 ...变成100 100 100 100 ...,长度增加了3。其他AS在比较从不同入口(例如,另一个入口没有预挂)学到到同一AS 100的路由时,会选择AS_Path更短的路径,从而实现了流量的分流。

重要注意事项:AS_Path预挂只影响入站流量(其他AS如何将流量发送到你)。它不影响你网络的出站流量方向。出站流量方向由你本地的BGP选路结果(如Local Preference, MED, AS_Path长度等)决定。

4. 常见问题排查与AS_Path相关故障诊断

AS_Path相关的配置错误或理解偏差,常常导致路由无法传递、环路或次优路径选择。以下是一些典型场景和排查思路。

4.1 路由未被优选:AS_Path长度非预期

现象:你从两个不同的ISP(ISP A在AS 200, ISP B在AS 300)学习到了去往同一目的网络的路由,你期望流量走ISP A,但实际上BGP选择了ISP B的路径。

排查步骤:

  1. 检查BGP表:使用show ip bgp <network>命令,查看两条路由的所有属性。
    Router# show ip bgp 10.2.2.0/24 BGP routing table entry for 10.2.2.0/24, version 42 Paths: (2 available, best #2) Advertised to update-groups: 1 200 400 500 600 1.1.1.1 from 1.1.1.1 (10.0.0.1) Origin IGP, metric 0, localpref 100, valid, external 300 400 2.2.2.2 from 2.2.2.2 (10.0.0.2) Origin IGP, metric 0, localpref 100, valid, external, best
  2. 分析选路过程
    • 首先比较权重(Weight):都是0(默认)。
    • 比较本地优先级(Local Preference):都是100(默认)。
    • 比较路径起源(Origin):都是i(IGP)。
    • 比较AS_Path长度:第一条路径200 400 500 600长度为4,第二条路径300 400长度为2。因此,BGP优选了第二条路径(来自AS 300),尽管它可能不是你期望的。
  3. 解决方案
    • 调整Local Preference:这是最干净的方法。在从ISP A(AS 200)学来路由的入方向Route-map上,设置更高的Local Preference(如150)。
    route-map LP_FROM_ISP_A permit 10 set local-preference 150 router bgp 100 neighbor 1.1.1.1 route-map LP_FROM_ISP_A in
    • 使用AS_Path预挂:如果你无法控制入方向(例如,你是ISP的客户),可以在通告给ISP B的出方向上进行AS_Path预挂,让你通过ISP B通告的路由对其他AS显得更长,从而减少从ISP B来的入站流量。但这需要ISP B的配合或在你们之间的会话上配置。

4.2 路由丢失或环路:AS_Path过滤与防环机制生效

现象:从某个邻居学不到预期的路由,或者路由在BGP表中显示为“inconsistent”(不一致)或直接被抑制。

排查步骤:

  1. 检查AS_Path过滤列表(Filter List):确认是否配置了neighbor <ip> filter-list <acl> in/out,并且AS-Path访问列表可能意外拒绝了所需路由。
  2. 检查AS_Path中的私有AS号:私有AS号(64512-65534)通常不应出现在全球互联网路由中。许多运营商会配置策略,自动过滤掉包含私有AS号的路由更新。如果你在内部测试中使用了私有AS号,并试图将其通告给上游ISP,路由可能会被过滤掉。解决方案是在通告给ISP前,使用neighbor <ip> remove-private-as命令移除私有AS号。
  3. 验证AS_Path防环:最经典的环路场景是,你从EBGP邻居收到一条路由,其AS_Path中包含了你自己AS的编号。BGP路由器会静默丢弃这条路由。使用debug ip bgp updates命令(需谨慎在生产环境使用)可以观察到路由更新被丢弃的原因。在日志中可能会看到“denied due to AS-PATH contains our own AS”之类的信息。
  4. 检查聚合路由的AS_SET:如果你配置了带as-set的聚合路由,并且发现某些特定流量被错误地丢弃或环路,需要检查明细路由的AS_Path是否与聚合路由的AS_SET形成了环路条件。这可能需要更细致的路由跟踪和逻辑分析。

4.3 路径选择不符合预期:联盟、RR环境下的特殊考量

现象:在部署了联盟或大型路由反射器架构的网络中,BGP选路结果看起来很奇怪,例如,没有选择物理上更近的路径。

排查要点:

  1. 联盟环境:确认你查看的是正确的AS_Path。在联盟内部,使用show ip bgp看到的路径可能包含AS_CONFED_SEQUENCE(通常显示在括号()内)。例如,(65001 65002) 200 300。在比较路径长度时,括号内的联盟成员AS编号通常不计算在AS_Path长度内(具体取决于设备厂商和比较阶段)。你需要清楚你的设备在Best Path算法中如何处理联盟AS号。最佳实践是查阅厂商文档。
  2. 路由反射器环境:记住,RR不修改AS_Path。因此,在AS内部,所有路由器(包括RR客户端)看到的通往外部目的地的AS_Path都是一样的。选路差异可能源于其他属性,如IGP度量值到下一跳的代价、多出口鉴别器(MED)或路由器ID的比较。确保RR正确地传递了所有路径属性,并且客户端有正确的下一跳可达性信息(通常通过next-hop-self配置解决)。

4.4 诊断命令与信息查看技巧

熟练掌握以下命令是诊断AS_Path问题的关键:

  • show ip bgp:查看BGP表,这是最基础的信息源,关注Path列。
  • show ip bgp <network>:查看特定路由的详细信息,包括所有路径及其完整属性。
  • show ip bgp neighbors <ip> advertised-routesshow ip bgp neighbors <ip> received-routes:分别查看向特定邻居通告的路由和从该邻居收到的路由(在应用入方向策略之前)。这对于验证策略是否生效至关重要。
  • show ip bgp regexp <regex>:使用正则表达式在BGP表中搜索匹配特定AS_Path模式的路由。例如,show ip bgp regexp ^200_查找所有从AS 200直接学来的路由。
  • debug ip bgp updates:在受控环境下,开启BGP更新调试,可以实时看到路由更新的接收、处理和丢弃原因。生产环境慎用
  • show ip as-path-access-list:查看配置的AS-Path访问列表。

理解AS_Path,就是理解了BGP在广域网中绘制地图和制定交通规则的核心逻辑。它远不止一个简单的长度值,而是融合了防环保障、路径度量和策略工具的复合属性。从基础的路径记录,到高级的流量工程,AS_Path贯穿了BGP设计与运维的始终。在实际网络中,结合Local Preference、MED、Community等属性灵活运用AS_Path控制,是构建高效、可靠、可控网络互联的关键技能。每一次对AS_Path的审视和调整,都是对网络流量走向的一次精准导航。

← 返回列表