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更慢但它是一个简单有效的默认度量标准。这个原则直接影响了网络运营商的流量工程和商业策略。为了吸引流量成为去往某些目的地的更优路径运营商会想方设法让自己的通告路径看起来更“短”。这就引出了两种常见操作路径聚合Aggregation当通告一个聚合路由比如将多个更精确的子网路由汇总成一个大网段时路由器可以生成一个空的AS_Path称为AS_CONFED_SEQUENCE或直接置空取决于实现这使得聚合路由看起来路径极短极具吸引力。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_SETAS_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长度为1AS_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组成。路由在联盟内传递从子AS 65001到子AS 65002AS_Path可能变为(65001)。当路由从联盟AS100通告给外部AS200时(65001)会被剥离AS200看到的AS_Path就是简单的100 ...。3.3 EBGP与IBGP传递时的差异防环规则的核心这是BGP学习中最容易混淆的点之一也是理解AS_Path防环作用域的关键。从EBGP对等体学到的路由可以传给IBGP和EBGP对等体。传给EBGP对等体时添加自己的AS号到AS_SEQUENCE最前面。传给IBGP对等体时AS_Path原封不动地传递。从IBGP对等体学到的路由只能传给其他IBGP对等体不能传给EBGP对等体除非是路由反射器特定场景或打开了相关特性。这是BGP一个非常重要的防环规则。因为IBGP传递不修改AS_Path如果允许将IBGP路由传给EBGP就无法防止AS间的环路。例如AS100从IBGP邻居学到一条AS_Path为200 300的路由如果它能把这条路由再传给EBGP邻居AS200AS200看到AS_Path里没有自己因为没被添加就会接受从而可能形成环路。这个规则导致了IBGP需要全互联或使用路由反射器/联盟。同时它也解释了为什么在作为中转AS时需要运行IBGP来传递从某个EBGP邻居学到的路由给另一个EBGP邻居。实操心得在配置多宿主网络连接多个上游运营商时务必检查你的IBGP配置。如果你在一台边界路由器上从运营商AEBGP学到了路由希望另一台边界路由器也能使用这些路由去往运营商B你必须确保这两台边界路由器之间建立了IBGP会话或者通过路由反射器交换路由。仅仅依靠IGP如OSPF传递BGP路由的下一跳是不够的因为BGP路由器默认不会将EBGP路由重新通告给另一个EBGP对等体。4. 实战解析AS_Path在复杂组网中的应用与排错让我们结合一个更复杂的场景看看AS_Path如何在实际中发挥作用。考虑一个常见的“OSPFBGP”组网模型企业拥有AS65001内部使用OSPF作为IGP同时双线接入两个互联网服务提供商ISP1AS100和ISP2AS200。网络拓扑简述企业边界路由器R1连接ISP1 R2连接ISP2。R1和R2之间建立IBGP会话。企业向两个ISP通告自己的公司网段192.168.1.0/24。ISP1和ISP2也向企业通告默认路由和部分特定路由。4.1 路径选择与流量入站控制假设ISP1AS100和ISP2AS200都向你的企业网络通告了去往云服务商AS300网段10.1.0.0/16的路由。ISP1通告的路由AS_Path为100 300ISP2通告的路由AS_Path为200 150 300在你的边界路由器R1和R2上通过IBGP学习到这两条路由。根据“最短AS路径”原则AS_Path长度为2100 300的路由优于长度为3200 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从而允许或拒绝特定路径传来的路由。场景你发现从ISP2AS200经常传来一些路径非常奇怪、经过某些你不信任的AS例如AS666的路由。你希望屏蔽所有AS_Path中包含AS666的路由。在Cisco路由器上你可以这样配置一个路由映射Route-mapip 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 300或666 400这样的路径。更复杂的场景只接受直接来自相邻AS或经过特定AS路径的路由。例如只接受来自ISP1AS100且是其直连客户即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显示流量绕行了奇怪的路径。排查思路检查边界路由器的BGP表在R1和R2上使用show ip bgp 目标前缀查看关于该目标的所有BGP路径。对比AS_Path比较从两个ISP学来路径的AS_Path长度和序列。很可能“最优”路径AS_Path短所经过的AS在国际链路上拥塞而“次优”路径AS_Path长实际链路质量更好。检查路径属性确认是否因为Local Pref、MED或多出口鉴别器MED等属性的配置导致选择了非预期的路径。查看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长度时计算AS_SEQUENCE中AS号的数量。每个AS_SET无论包含多少AS号都计为1。AS_CONFED_SEQUENCE和AS_CONFED_SET即括号内的部分不参与计数。因为联盟对外是不可见的。例1路径100 200 {300,400,500} 600AS_SEQUENCE:100,200,600- 计数 3AS_SET:{300,400,500}- 计数 1总长度 4例2路径100 (65001 65002) 200AS_SEQUENCE:100,200- 计数 2AS_CONFED_SEQUENCE:(65001 65002)- 忽略不计总长度 25.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息息相关。这里简要关联一下只发布最优路由BGP Speaker只会将自己BGP表中的最优路由发布给对等体。AS_Path是决定“最优”的关键因素之一。从EBGP对等体获得的路由会发布给所有对等体包括EBGP和IBGP如前所述发布给EBGP时会添加自己的AS号修改AS_Path发布给IBGP时AS_Path不变。从IBGP对等体获得的路由不会发布给其他IBGP对等体防止环路这是IBGP水平分割规则。因为AS_Path在IBGP间传递不变无法防环所以需要此规则。路由反射器环境是此规则的例外。从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它讲述的正是数据包穿越互联网疆域的故事。
返回列表