ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

BGP AS_Path防环机制与路径选择原理详解

BGP AS_Path防环机制与路径选择原理详解

1. 从一次路由环路说起:为什么我们需要AS_Path

如果你接触过BGP,大概率听过一个说法:BGP是互联网的“胶水”,它负责将成千上万个自治系统(AS)粘合在一起。但你想过没有,在这样一个由无数独立网络组成的、缺乏中央权威的分布式世界里,BGP如何保证数据包不会在两个AS之间来回打转,陷入永无止境的循环?这可不是靠“信任”就能解决的。

几年前,我在排查一个跨国专线的网络抖动问题时,就差点掉进这个坑里。我们的AS号是AS65001,通过两家不同的运营商(AS100和AS200)接入互联网。某天,从AS100收到的去往某个海外目标的路由,其下一跳竟然指向了AS200,而AS200通告的同一路由,下一跳又指回了AS100。这听起来就像个死循环。当时我第一反应是去查路由的AS_Path属性,果然,在AS100通告的路由中,AS_Path里已经包含了AS200,而AS200通告的路由里也包含了AS100。正是BGP的AS_Path防环机制阻止了这条“有毒”的路由被真正采纳,否则流量就会在两家运营商之间来回反射,形成路由黑洞。

这个经历让我深刻体会到,AS_Path绝不仅仅是BGP更新报文里一串“好看”的AS号码序列。它是BGP在无中心的互联网世界中维持秩序、防止环路的核心基石。没有它,全球互联网的稳定路由将无从谈起。今天,我们就来彻底拆解这个看似简单、实则至关重要的BGP属性——AS_Path。无论你是刚入门网络的新手,还是正在为复杂组网头疼的工程师,理解AS_Path的运作机制和细微之处,都是你驾驭BGP的必修课。

2. AS_Path的本质:一张记录路由“护照”的行程单

简单来说,AS_Path属性记录了某条BGP路由从起源AS传递到本地AS所经过的所有自治系统的序列。你可以把它想象成路由的“护照”和“行程单”的结合体。每本“护照”(路由)在穿越国境线(AS边界)时,都会被盖上当前国家的“入境章”(AS号)。最终,当路由到达你手中时,你可以通过翻看这一连串的“印章”,清晰地知道它从哪来,途径了哪些地方。

2.1 AS_Path的格式与构成

在BGP更新消息中,AS_Path以路径段(Path Segment)的列表形式存在。最常见的类型是AS_SEQUENCE,它就是一个有序的AS号列表。列表的最左边(第一个AS号)是离接收方最近的上一个AS,最右边(最后一个AS号)是路由的起源AS。

举个例子: 假设一条路由起源于AS500,然后依次经过AS300、AS200,最后被AS100收到,并由AS100通告给我们(AS65001)。那么,当AS100向我们发送这条路由时,其AS_Path属性通常表示为:100 200 300 500

这里有一个关键细节:AS_Path是在路由传递过程中被“追加”的,而不是“覆盖”的。当一台BGP路由器将一条路由通告给它的EBGP对等体(属于不同AS)时,它会将自己的AS号添加在AS_Path列表的最左端(即AS_SEQUENCE的开头)。如果是通告给IBGP对等体(同一AS内),则AS_Path保持不变。

这个“追加”机制,正是防环的核心。回到开头的案例,当AS100从AS200学到一条路由时,其AS_Path里包含了AS200。如果AS100试图再把这条路由发回给AS200,它会在AS_Path最前面加上自己的AS号100,形成100 ... 200。AS200收到后,检查AS_Path,发现列表中已经包含了自己的AS号200,于是判定这条路由可能形成环路,从而拒绝接收。

2.2 AS_Path在BGP选路中的核心作用

BGP选择最优路径时,会依次比较一系列属性,而AS_Path的优先级非常高,仅次于“本地优先级”(Local Preference)和“AS路径始发地”(AS_PATH origin)。在默认的BGP选路规则中,AS_Path越短的路由越优先。这就是著名的“最短AS路径”原则。

为什么路径短就好?这基于一个合理的假设:数据包穿越的AS越少,其经过的独立管理域就越少,通常意味着路径更直接、延迟可能更低、经过的潜在故障点也更少。当然,这不是绝对的(比如一个跨越全球的AS内部可能比穿过三个本地AS更慢),但它是一个简单有效的默认度量标准。

这个原则直接影响了网络运营商的流量工程和商业策略。为了吸引流量(成为去往某些目的地的更优路径),运营商会想方设法让自己的通告路径看起来更“短”。这就引出了两种常见操作:

  1. 路径聚合(Aggregation):当通告一个聚合路由(比如将多个更精确的子网路由汇总成一个大网段)时,路由器可以生成一个空的AS_Path(称为AS_CONFED_SEQUENCE或直接置空,取决于实现),这使得聚合路由看起来路径极短,极具吸引力。
  2. AS路径预置(AS Path Prepending):这是相反的操作。为了让自己的路径看起来不那么有吸引力(例如,在有多条上行链路时,希望主要流量走A链路,备份流量走B链路),网络管理员可以在向某些对等体通告路由时,故意多次添加自己的AS号。例如,AS100本来通告的路由AS_Path是100 500,通过预置可以变成100 100 100 500。其他AS在选择时,看到这条“冗长”的路径,就会优先选择其他AS_Path更短的通告。

注意:AS路径预置是一种“软”影响手段,它只影响其他AS的入站流量如何来到你这里。它无法控制从你这里出去的流量如何选择路径。控制出站流量需要其他属性,如本地优先级(Local Pref)或MED。

3. 深入AS_Path的四种类型与防环机制

前面我们主要讨论了AS_SEQUENCE,这是最常用的类型。但实际上,AS_Path有四种类型,用于处理更复杂的场景,比如联盟(Confederation)和聚合(Aggregation)。理解它们,有助于你读懂那些看起来“奇怪”的AS_Path。

3.1 AS_SEQUENCE 与 AS_SET

  • AS_SEQUENCE:有序的AS号列表。严格记录了路由传递的顺序,用于EBGP之间的防环。这是我们之前一直在讨论的类型。
  • AS_SET:无序的AS号集合。当进行路由聚合时,如果被聚合的明细路由来自不同的AS路径,为了不丢失这些AS信息(以防在聚合后某些明细路由失效时,还能依据AS_SET中的信息进行防环判断),BGP会将所有明细路由AS_Path中的AS号提取出来,去重后放入一个AS_SET中。AS_SET在路径长度计算上被视为长度为1,无论其中包含多少个AS号。

例如,AS100从两个邻居收到去往10.0.0.0/16的路由:

  • 来自AS200: Path:200 300 400
  • 来自AS500: Path:500 600AS100决定聚合为10.0.0.0/8并通告出去。此时,聚合路由的AS_Path可能包含:100 {200,300,400,500,600}。这里大括号{}表示AS_SET。接收方看到这个路径,在计算长度时,AS_SEQUENCE部分100长度为1,AS_SET部分长度为1,总长度为2。

3.2 AS_CONFED_SEQUENCE 与 AS_CONFED_SET

这两个类型专为BGP联盟(Confederation)设计。联盟是将一个大AS在内部逻辑上划分成多个子AS,对外仍表现为一个整体。这主要用于解决IBGP全互联的扩展性问题。

  • AS_CONFED_SEQUENCE:记录路由在联盟内部子AS之间传递的顺序。括号()表示。
  • AS_CONFED_SET:类似于AS_SET,但用于联盟内部聚合场景,是无序的子AS号集合。

关键点在于:联盟内部的子AS号在路由传出该联盟时,会被从AS_Path中移除。外部AS根本看不到这些括号里的子AS号。联盟内部的防环基于这些类型,而对外部的防环仍然基于清理后的AS_SEQUENCE

假设联盟AS100由子AS 65001和65002组成。

  1. 路由在联盟内传递:从子AS 65001到子AS 65002,AS_Path可能变为(65001)
  2. 当路由从联盟AS100通告给外部AS200时,(65001)会被剥离,AS200看到的AS_Path就是简单的100 ...

3.3 EBGP与IBGP传递时的差异:防环规则的核心

这是BGP学习中最容易混淆的点之一,也是理解AS_Path防环作用域的关键。

  1. 从EBGP对等体学到的路由,可以传给IBGP和EBGP对等体。

    • 传给EBGP对等体时:添加自己的AS号到AS_SEQUENCE最前面。
    • 传给IBGP对等体时:AS_Path原封不动地传递。
  2. 从IBGP对等体学到的路由,只能传给其他IBGP对等体,不能传给EBGP对等体(除非是路由反射器特定场景或打开了相关特性)。

    • 这是BGP一个非常重要的防环规则。因为IBGP传递不修改AS_Path,如果允许将IBGP路由传给EBGP,就无法防止AS间的环路。例如,AS100从IBGP邻居学到一条AS_Path为200 300的路由,如果它能把这条路由再传给EBGP邻居AS200,AS200看到AS_Path里没有自己(因为没被添加),就会接受,从而可能形成环路。

    这个规则导致了IBGP需要全互联(或使用路由反射器/联盟)。同时,它也解释了为什么在作为中转AS时,需要运行IBGP来传递从某个EBGP邻居学到的路由给另一个EBGP邻居。

实操心得:在配置多宿主网络(连接多个上游运营商)时,务必检查你的IBGP配置。如果你在一台边界路由器上从运营商A(EBGP)学到了路由,希望另一台边界路由器也能使用这些路由去往运营商B,你必须确保这两台边界路由器之间建立了IBGP会话,或者通过路由反射器交换路由。仅仅依靠IGP(如OSPF)传递BGP路由的下一跳是不够的,因为BGP路由器默认不会将EBGP路由重新通告给另一个EBGP对等体。

4. 实战解析:AS_Path在复杂组网中的应用与排错

让我们结合一个更复杂的场景,看看AS_Path如何在实际中发挥作用。考虑一个常见的“OSPF+BGP”组网模型:企业拥有AS65001,内部使用OSPF作为IGP,同时双线接入两个互联网服务提供商ISP1(AS100)和ISP2(AS200)。

网络拓扑简述:

  • 企业边界路由器R1连接ISP1, R2连接ISP2。
  • R1和R2之间建立IBGP会话。
  • 企业向两个ISP通告自己的公司网段192.168.1.0/24
  • ISP1和ISP2也向企业通告默认路由和部分特定路由。

4.1 路径选择与流量入站控制

假设ISP1(AS100)和ISP2(AS200)都向你的企业网络通告了去往云服务商AS300(网段10.1.0.0/16)的路由。

  • ISP1通告的路由AS_Path为:100 300
  • ISP2通告的路由AS_Path为:200 150 300

在你的边界路由器R1和R2上,通过IBGP学习到这两条路由。根据“最短AS路径”原则,AS_Path长度为2(100 300)的路由优于长度为3(200 150 300)的路由。因此,企业内所有去往10.1.0.0/16的流量,默认都会选择从R1(连接ISP1)出口。

如果你希望分流流量,让一部分内网用户走ISP2出去呢?这时,你可以在R2上针对从ISP2学来的这条路由,修改其Local Preference(本地优先级)属性,使其值高于从ISP1学来的路由。因为Local Pref的优先级高于AS_Path长度。这样,尽管AS_Path更长,但R2(以及通过IBGP学到这条更高Local Pref路由的R1)会优先选择从ISP2的路径。AS_Path在这里成为了一个可以被更高优先级属性覆盖的默认度量。

4.2 利用AS_Path进行路由过滤与策略控制

AS_Path是一个强大的过滤工具。你可以使用正则表达式(Regex)来匹配AS_Path,从而允许或拒绝特定路径传来的路由。

场景:你发现从ISP2(AS200)经常传来一些路径非常奇怪、经过某些你不信任的AS(例如AS666)的路由。你希望屏蔽所有AS_Path中包含AS666的路由。

在Cisco路由器上,你可以这样配置一个路由映射(Route-map):

ip as-path access-list 10 deny _666_ # 匹配任何包含666的AS_Path ip as-path access-list 10 permit .* # 允许其他所有 route-map FILTER_FROM_ISP2 permit 10 match as-path 10 ! router bgp 65001 neighbor <ISP2_IP> route-map FILTER_FROM_ISP2 in

这里_666_是一个AS路径正则表达式,_匹配一个空格或字符串的开头/结尾,所以_666_能匹配到像100 666 300666 400这样的路径。

更复杂的场景:只接受直接来自相邻AS或经过特定AS路径的路由。例如,只接受来自ISP1(AS100)且是其直连客户(即AS_Path末尾是100,表示ISP100是起源)的路由,或者接受经过AS100和AS300的路由。

ip as-path access-list 20 permit ^100$ # 路径仅为AS100(直接客户路由) ip as-path access-list 20 permit ^100 300_.* # 路径以100 300开头

4.3 典型排错案例:AS_Path导致的路径次优或路由丢失

问题现象:内网用户访问某个海外站点延迟异常高,traceroute显示流量绕行了奇怪的路径。

排查思路

  1. 检查边界路由器的BGP表:在R1和R2上使用show ip bgp <目标前缀>,查看关于该目标的所有BGP路径。
  2. 对比AS_Path:比较从两个ISP学来路径的AS_Path长度和序列。很可能“最优”路径(AS_Path短)所经过的AS在国际链路上拥塞,而“次优”路径(AS_Path长)实际链路质量更好。
  3. 检查路径属性:确认是否因为Local Pref、MED或多出口鉴别器(MED)等属性的配置,导致选择了非预期的路径。
  4. 查看AS_Path细节:使用show ip bgp <目标前缀> regexp或更详细的命令,分析AS_Path中的每一个AS。你可能需要借助公开的AS信息数据库(如whois)来了解这些AS所属的公司和地理位置,判断绕行是否合理。

一个真实踩过的坑:我们曾配置了AS路径预置,在向备份ISP通告路由时添加了多个自己的AS号,目的是降低这条路径的优先级。但配置时写错了正则表达式,导致预置操作应用在了所有出向路由上,包括发给主ISP的路由。结果就是,我们的主路径在别人看来也变得很长,导致大量入站流量被引到了备份链路上,主链路几乎空闲。故障排查时,在外部Looking Glass服务器上查看我们网段的BGP路由,才发现AS_Path异常冗长,从而定位到配置错误。

重要提示:对AS_Path的任何操作(过滤、预置、修改)都必须极其谨慎,最好在变更窗口进行,并提前在测试环境或使用show ip bgp regexp命令验证匹配结果。一个错误的AS路径访问列表,可能会意外屏蔽大量关键路由。

5. 超越基础:AS_Path长度计算的“潜规则”与高级特性

在实际的设备实现和网络运营中,关于AS_Path长度的计算有一些需要留意的细节,这些细节可能会影响你的路径选择策略。

5.1 AS_Path长度计算规则

默认情况下,BGP计算AS_Path长度时:

  1. 计算AS_SEQUENCE中AS号的数量。
  2. 每个AS_SET无论包含多少AS号,都计为1。
  3. AS_CONFED_SEQUENCEAS_CONFED_SET(即括号内的部分)不参与计数。因为联盟对外是不可见的。

例1:路径100 200 {300,400,500} 600

  • AS_SEQUENCE:100,200,600-> 计数 3
  • AS_SET:{300,400,500}-> 计数 1
  • 总长度 = 4

例2:路径100 (65001 65002) 200

  • AS_SEQUENCE:100,200-> 计数 2
  • AS_CONFED_SEQUENCE:(65001 65002)-> 忽略不计
  • 总长度 = 2

5.2bgp bestpath as-path ignore命令的陷阱

某些厂商的设备提供了bgp bestpath as-path ignore这类命令。它的作用是让BGP进程在选路时忽略AS_Path长度这个比较项。当两条路由在其他更高优先级的属性(如Weight、Local Pref、本地起源)上都相同时,原本要比AS_Path长短,启用这个命令后就不比了,直接跳到下一个属性(如Origin类型)进行比较。

什么时候会用?在某些严格的策略控制场景下,网络管理员希望完全通过Local Pref、MED或社区属性来控制路径,不希望AS_Path长度这个“自动”的度量干扰其策略。或者,在实验室测试多路径负载分担时,为了能让不同AS_Path长度的路由被等价看待。

风险是什么?在未精心设计其他属性策略的生产网络中,盲目忽略AS_Path可能导致次优路由甚至环路。因为AS_Path是重要的防环和最短路径依据。关闭它,就等于移除了一个重要的安全阀和优化器。除非你非常清楚你的全网策略,否则不建议在生产环境使用此命令。

5.3 与“BGP路由传递四原则”的关联

网络热词中提到了“BGP路由传递的四个原则”,这与AS_Path息息相关。这里简要关联一下:

  1. 只发布最优路由:BGP Speaker只会将自己BGP表中的最优路由发布给对等体。AS_Path是决定“最优”的关键因素之一。
  2. 从EBGP对等体获得的路由,会发布给所有对等体(包括EBGP和IBGP):如前所述,发布给EBGP时会添加自己的AS号(修改AS_Path),发布给IBGP时AS_Path不变。
  3. 从IBGP对等体获得的路由,不会发布给其他IBGP对等体(防止环路):这是IBGP水平分割规则。因为AS_Path在IBGP间传递不变,无法防环,所以需要此规则。路由反射器环境是此规则的例外。
  4. 从IBGP对等体获得的路由,是否发布给EBGP对等体?默认不发布。这是另一个关键防环规则。同样因为AS_Path不变,直接发布给EBGP可能导致AS间环路。可以通过next-hop-self、路由反射等配合特定配置来实现有条件发布,但需格外小心。

可以看到,这四个原则中有两条半(2、3、4)都与AS_Path的修改和防环机制紧密相关。理解AS_Path,是理解这些原则背后逻辑的基础。

AS_Path是BGP协议中一个兼具工程简洁性与逻辑严谨性的设计。它用一串数字序列,巧妙地解决了分布式系统中最棘手的路由环路问题,同时为路径选择提供了一个直观的度量标准。从简单的路径长度比较,到复杂的正则表达式过滤和策略性预置,AS_Path为网络工程师提供了精细控制流量流向的强大工具。掌握它,意味着你不仅读懂了BGP路由表上那一列列AS号码的含义,更拿到了在复杂网络环境中进行路由策略规划和故障排查的钥匙。下次当你查看show ip bgp输出时,不妨多花几秒钟审视一下AS_Path,它讲述的正是数据包穿越互联网疆域的故事。

返回列表