BGP 的选路和属性,这个东西我琢磨了挺久才算是彻底捋顺。一开始看各路文档,什么权重、本地优先级、MED、AS Path,名词堆了一堆,感觉每个都认识,但真到了排障或者调优的时候,根本不知道从哪儿下手。后来在真实环境里踩了几次坑,把选路流程跟属性之间的关系理清楚之后,才发现这玩意儿其实没那么玄乎,核心就一句话:BGP 不会告诉你哪条路最合适,它只按照一套固定的规则,挑出一条它认为“最好”的路。你要做的,就是通过改属性去影响这套规则,让路由器按你的意图走。这篇文章我就把选路顺序和常用属性掰开揉碎了讲清楚,适合刚接触 BGP 或者总在选路问题上犯迷糊的同行参考。
1. BGP 选路的整体思路与设计逻辑
1.1 为什么选路规则如此固定
BGP 是跑在互联网核心层的外部网关协议,它的核心职责就是在不同的自治系统(AS)之间传递路由信息。这里先明确一个概念:BGP 的路由单位不是传统的“走到某个网段”,而是“走到某个网段要经过哪几个 AS”。这就决定了它的选路机制跟 OSPF、IS-IS 这类内部协议有本质区别。
内部网关协议(IGP)选路主要看开销值,开销低的就是最优路径,链路断了就靠 SPF 重算。BGP 不一样,它承载的路由条目极其庞大,动辄几十万条,如果每条路由都搞复杂的计算,路由器根本扛不住。所以 BGP 设计成了一种基于策略的路径向量协议,它不看带宽、不看时延,只看属性。每个属性就像是一个筛选条件,路由器拿着这些条件一层层过滤,最终只剩一条最优路径放进路由表。
这个设计思路的巧妙之处在于,它把“选路策略”和“路由传播”解耦了。你可以用属性控制自己路由器上的选路结果,也可以控制发送给邻居的路由属性,从而间接影响对端的选路。这种灵活性,让 BGP 能够适应互联网这种多运营商、多层级、多策略的复杂环境。
1.2 选路决策是逐跳执行的
理解 BGP 选路的另一个关键点,是它的决策过程是逐跳(hop-by-hop)的。每一台路由器都只基于自己收到的路由属性做判断,它不会去考虑路径上的其他路由器是怎么想的。假设 A 路由器从 B 和 C 都能学到去往目标 X 的路由,A 会自己做出选择,但这个选择可能跟 B 或 C 的选择完全不同。
举个例子,AS 100 里有一台路由器,它从上游 AS 200 和 AS 300 都能收到去往某目标的 BGP 路由。如果它把去往该目标的流量都送给了 AS 200,但 AS 200 那台路由器实际上认为去往该目标的最优路径是 AS 300,那么流量就会形成一种折返。这就是 BGP 的“路由黑洞”风险。为了避免这类问题,实际运维中通常会在 AS 边界统一规划和设计选路策略,确保整个 AS 内部对同一目标的出方向选择保持一致。
1.3 选路的前提是路由必须可用
说选路规则之前,有个前提必须先讲清楚:路由器只会对“可用”的路由做选路。什么叫可用?至少满足这几个条件:
- 路由的下一跳必须是可达的。如果下一跳不可达,这条路由永远进不了候选队列,自然谈不上选路。这在 iBGP 场景中特别常见,因为 iBGP 的路由下一跳往往是邻居的接口地址,如果没有通过 IGP 学到这个地址,BGP 路由即使收到也不会生效。
- 路由不能是重复收到的。如果从同一邻居收到重复的路由更新,会直接忽略。
- 路由不能是 AS 环路。BGP 会检查 AS Path 中是否包含自己的 AS 号,如果包含说明形成了环路,直接丢弃。
只有通过了这些基本检查,路由才会进入 BGP 路由表,参与后面的选路决策。
2. 核心属性详解与实际作用
BGP 属性是选路规则中的“原材料”。官方定义了很多属性,但实际日常工作里,真正需要深入理解和操作的,主要就是那几个标准属性。我把它们分成几类,分别说明作用机制和适用场景。
2.1 Weight 权重:本地专属的优先级
首先要说的是 Weight(权重),注意,这是某厂商设备私有属性,只存在于本地路由器上,不会传递给任何邻居。权重值范围从 0 到 65535,值越大优先级越高。默认情况下,本地直连通告的路由权重为 32768,从邻居学来的路由权重为 0。
这个属性的特点是“只有自己能看见”,所以适合做单台设备上的策略。比如说,你有两条上行链路到两个不同的运营商,希望在某一台路由器上强制让去往某个网段的流量走 A 运营商,不走 B 运营商,就可以在入方向修改权重,或者直接对从 A 学到的路由手动设置一个较高的权重值。
我之前在实际项目里遇到过这种情况:一台边界路由器连接了两个上游 ISP,其中一个线路带宽大但不稳定,另一个带宽小但很稳。需求是大部分流量走大带宽线路,但部分核心业务流量必须走稳定线路。如果单纯依靠其他属性控制,可能会波及到下游别的路由器。而用权重,就可以只在这一台路由器上精确控制,不影响全局策略,简单高效。
2.2 Local Preference 本地优先级:AS 内部的意志
Local Preference(本地优先级)是一个重大属性,字面意思是“本地偏好”,但它影响的不是单台路由器,而是整个 AS 内部的所有路由器。它的值范围是 0 到 4294967295,默认值为 100,值越大越优先。
理解这个属性的关键点在于:它是在 AS 边界路由器上从外部邻居收到路由时设置的,然后通过 iBGP 在 AS 内部传递。这样,AS 内部所有路由器都会遵循这个偏好设置,统一出方向的选择。
我举一个典型的应用场景:你是一家企业的网络管理员,企业有两个运营商出口,一个叫 ISP-A,一个叫 ISP-B。你希望去往互联网的大部分流量都走 ISP-A,因为它的带宽更大、价格也更优惠;ISP-B 只作为备份链路。这个时候,你在连接 ISP-A 的边界路由器上,将从 ISP-A 学到的所有路由的 Local Preference 设置为 200,而连接 ISP-B 的边界路由器上保持默认值 100 或设为 50,那么整个 AS 内部的所有路由器,在收到这两条相同前缀的路由时,都会优先选择 Local Preference 更高的那一条,也就是经过 ISP-A 那条。
这个属性的价值就在于,它能把“策略控制点”从边界路由器扩展到整个 AS 内部。不需要每台内部路由器单独配置策略,只需要边界路由器做好标记,内部分发即可。
2.3 AS Path 长度:运营商之间的常规竞争
AS Path 属性是 BGP 路径选择中最直观的一个因素,它记录了路由经过的 AS 编号列表。BGP 在选路时会优先选择 AS Path 长度最短的路径,路径越短,说明经过的 AS 越少,通常也意味着更直接的路由。
但这里要注意,AS Path 长度短不等于实际网络路径短,更不等于性能好。它只是 BGP 默认选路规则中的一项指标。比如,你从 ISP-A 学到的去往某目标的路由 AS Path 长度是 3,从 ISP-B 学到的同一路由 AS Path 长度是 5,那么默认情况下,路由器会选 ISP-A。但如果 ISP-A 的实际链路质量很差,延迟和丢包都很高,ISP-B 反而更快,那就要通过调整其他属性来覆盖默认选路逻辑了。
AS Path 还有一个重要用途:它天然防止了路由环路。一台路由器收到一条路由后,如果发现 AS Path 中包含自己的 AS 号,就可以确定这是一个环路,直接丢弃。这是互联网能够稳定运转的基础机制之一。
另外,AS Path 还有一个“隐蔽”的功能,就是支持 AS Path 追加(prepend)。所谓 prepend,就是在通告给邻居的路由中,把自己的 AS 号多写几遍,人为加长 AS Path 长度,让对方路由器“认为”这条路径更远,从而降低这条路径被选中的概率。这在实际多线接入场景中非常常用。比如你有两个运营商出口,希望流量主要走 ISP-A,那可以在给 ISP-B 通告路由时做 AS Path prepend,让从 ISP-B 学到的路由看起来“变远”,这样上游 AS 选路时就会自动偏向前者。
2.4 MED 多出口标识:AS 之间的“商量”
MED 的全称是 Multi-Exit Discriminator,多出口标识。它是在两个 AS 之间有多个连接点时使用的属性,用于告诉对端 AS:“如果你要访问我这个 AS 里的某个网段,请优先通过我指定的这个入口进来。”
MED 只在相邻的两个 AS 之间传递,不会传得比邻居更远。MED 值越小优先级越高。默认情况下,Cisco 设备的 MED 值是 0,华为设备的默认 MED 值是 0。但在没有设置的情况下,很多实施会在通告前缀时显式设置 MED。
它的典型应用场景是双归属接入:你的 AS 与 ISP 之间有两条链路,一条是主链路,一条是备份链路。你希望入方向的流量(即 ISP 访问你内部服务器)优先走主链路,那么在主链路上通告路由时设置较小的 MED(比如 50),备份链路上设置较大的 MED(比如 200),ISP 那边的路由器在收到来自同一个 AS 的相同前缀路由时,就会根据 MED 比较选择较小的那条,于是流量就会从主链路进来。
需要注意的是,MED 与 Local Preference 的重要区别:Local Preference 是影响本 AS 出方向流量,而 MED 是影响对方 AS 入方向流量。一个是管自己往外走怎么走,一个是管别人往自己这里来怎么来。这个方向搞反了,配置出来的效果就会完全不符合预期。
2.5 其他影响选路的关键因素
除了上面四个属性,BGP 选路流程中还有几个因素,虽然不是属性,但在特定场景下会影响选路结果,也必须了解。
下一跳可达性:这是最基础的检查项,前面已经讲过。在 iBGP 环境下,要确保通过 IGP 学到了 BGP 下一跳地址,否则路由不会参与选路。
同步规则:旧版本 BGP 要求路由必须同时存在于 IGP 中才允许在 iBGP 中通告。现在的默认配置大多已经关闭了同步检查,但了解这个概念仍然有助于理解历史网络设备上的行为。
路由器 ID 比较:在所有其他条件都相同的情况下,BGP 会比较路由器 ID 来决定胜负,ID 小的优先。这个规则通常只在某些特殊场景下才会发挥作用,比如配置了负载均衡但路径数大于可均衡的数量。实际上遇到这种“最后的绝杀”比较时,多半是配置有问题,应该回头仔细检查前面的属性设置是否合理。
3. 实操:BGP 选路过程与配置演示
理论讲了一大堆,还是得上手跑一跑才能记得住。这一节我用一个简化的实验拓扑来演示 BGP 选路的实际操作。假设你有三台路由器,R1 和 R2 模拟两个不同的 AS,R3 模拟内部路由器。R1 上有一个业务网段,R2 上也有一个业务网段,R3 作为边界路由器同时连接它们,需要决定去往不同网段时走哪一条路径。
3.1 基础配置与邻居建立
先做最小化配置,把 BGP 邻居关系建立起来。以下配置片段我以常见厂商命令行格式演示,实际设备请以你手上的具体型号为准。
R3: router bgp 65000 neighbor 10.0.12.1 remote-as 65001 neighbor 10.0.13.1 remote-as 65002 R1: router bgp 65001 neighbor 10.0.12.3 remote-as 65000 network 192.168.1.0 mask 255.255.255.0 R2: router bgp 65002 neighbor 10.0.13.3 remote-as 65000 network 192.168.2.0 mask 255.255.255.0查看邻居状态,确保 Established。
R3# show ip bgp summary如果状态不是 Established,优先检查接口地址是否可达、配置的 AS 号是否写对、有没有被访问控制列表拦住。建立 BGP 邻居本身并不难,难的是后续策略生效的问题。
3.2 默认情况下的选路演示
建立好邻居之后,查看 R3 的 BGP 路由表,观察默认会导致什么样的选路结果。因为 R1 和 R2 各自只通告了不同网段,所以 R3 上看不到重复前缀,选路压根儿不需要太复杂的比较,学一条用一条。
要让选路过程变得“有意思”,需要让 R1 和 R2 都通告相同的前缀。比如模拟某个目标网段 10.10.10.0/24 同时存在两个 AS 中。
R1: router bgp 65001 network 10.10.10.0 mask 255.255.255.0 R2: router bgp 65002 network 10.10.10.0 mask 255.255.255.0这时候 R3 的 BGP 路由表里就会出现两条相同前缀的路径,系统开始进入选路流程。查看路由详情:
R3# show ip bgp 10.10.10.0输出结果中会显示多路径条目,每一条都会列出对应的属性:权重、本地优先级、AS 路径、MED、下一跳等。在没有任何策略干预的默认状态下,权重一样(0)、本地优先级一样(100),AS Path 长度也一样,MED 也一样(0),最终就会落到路由器 ID 比较上,选出一个结果。
这个“默认结果”往往不是我们想象中的最优结果,所以才会需要后续的策略配置。
3.3 用 Local Preference 统一 AS 出方向
假设我们希望 R3 及它内部的所有路由器,去往 10.10.10.0/24 都优先走 R1 这条路径(AS 65001),因为 R1 是我们的主运营商,R2 只做备份。那么在 R3 上对从 R1 学到的路由设置更高的 Local Preference。
可以通过路由映射来实现:
route-map SET-LP permit 10 match ip address prefix-list FROM-ISP-A set local-preference 200 router bgp 65000 neighbor 10.0.12.1 route-map SET-LP in这里还需要一个前缀列表来匹配路由:
ip prefix-list FROM-ISP-A seq 5 permit 10.10.10.0/24配置完成后,再次查看 BGP 路由表,应该能看到从 R1 学到的路径 Local Preference 已经变成 200,优先级明显高于从 R2 学到的路径(Local Preference 100)。最终选路结果就是 R1 路径。
这个配置的意图要说明白:它影响的不只是 R3 这台路由器,R3 会通过 iBGP 把这条带 200 优先级的路径通告给 AS 65000 内部其他路由器,结果整个 AS 内部去往 10.10.10.0/24 都会优先走 R1。
3.4 用 MED 控制入方向流量
再来看另一个方向。假设 R3 自身也有一个网段 172.16.1.0/24 需要对外通告,R1 和 R2 都能访问这个网段。我们希望外部流量优先从 R1(ISP-A)线路进入我们的网络,这样服务器的对外服务主要流量走这条高质量链路。
实现方式是在向 R1 通告路由时设置较小的 MED,向 R2 通告时设置较大的 MED。
route-map SET-MED-ISP-A permit 10 match ip address prefix-list LOCAL-NET set metric 50 route-map SET-MED-ISP-B permit 10 match ip address prefix-list LOCAL-NET set metric 200 router bgp 65000 neighbor 10.0.12.1 route-map SET-MED-ISP-A out neighbor 10.0.13.2 route-map SET-MED-ISP-B out前缀列表 LOCAL-NET 匹配本地的 172.16.1.0/24。
配置完成后,从 R1 和 R2 的角度各自查看路由详情,R1 收到的这条路由 MED 是 50,R2 收到的是 200。R1 和 R2 在同时收到来自 R3 的相同前缀时,会比较后选择 MED 更小的路径,于是从 R1 进入的流量就多了。
注意,MED 的比较前提是两条路径来自同一个邻居 AS。R1 和 R2 是不同的 AS,它们不会直接比较从不同 AS 学到的路由 MED 值。但在真实的双归属场景中,两个 ISP 往往会交换路由信息,AS 之间的比较逻辑会更复杂,配置时需要考虑这一点。
3.5 用 AS Path Prepend 让上游少走备路
AS Path Prepend 是另一种常见的入方向流量控制手段。假设你在向两个 ISP 通告同样前缀时,希望 ISP-A 优先选你,ISP-B 作为后备。你已经将 ISP-A 方向的 MED 设为 50,ISP-B 方向设为 200,但这还不够保险。为了进一步强化 ISP-B 方向的“远距离”感,可以对通告给 ISP-B 的路由追加 AS 号,让路径长度变长。
route-map PREPEND-ISP-B permit 10 match ip address prefix-list LOCAL-NET set as-path prepend 65000 65000 65000 router bgp 65000 neighbor 10.0.13.2 route-map PREPEND-ISP-B out这样 ISP-B 收到的路由,AS Path 就会从“65000”变成“65000 65000 65000”,看起来经过了三个 AS,变得很远,选路时自然就落后于 ISP-A 方向。
但这里有一个风险要提醒大家:AS Path prepend 只能影响对端 AS 的选路偏好,但如果对端 AS 内部的策略明确指定了要从特定出口接收某些路由,prepend 就不一定奏效。另外,如果有多级上游,prepend 的效果会被传递放大,可能影响更远范围的选路,需要谨慎评估。
4. 常见问题与排查技巧实录
4.1 路由一直不是优选状态
最典型的问题是:BGP 邻居都正常,路由表里也看到了多条相同前缀的路径,但实际选中结果不是自己想要的。排查这类问题,第一步永远是逐项检查“show ip bgp”输出中每条路径的所有属性,而不是凭记忆猜测。
我整理了一张速查表,按选路顺序列出检查点,非常实用。
| 选路顺序 | 检查项 | 常见问题 |
|---|---|---|
| 1 | Weight 权重 | 是否在某台设备上设置了意外的高权重 |
| 2 | Local Preference | 是否在入方向策略中误设了过低/过高的值 |
| 3 | 本地起始路由 | 是否本地 network 或重分发导致意外高优先级 |
| 4 | AS Path 长度 | 是否收到了意外的 AS Path prepend |
| 5 | Origin 类型 | IGP(i)优先于 EGP(e),EGP 优先于 incomplete(?) |
| 6 | MED | 是否从不同 AS 收到了可比路由,或者 MED 值是否被意外修改 |
| 7 | eBGP 优先于 iBGP | 是否既有 eBGP 路径又有 iBGP 路径 |
| 8 | IGP 度量到下一跳 | 下一跳在 IGP 中是否管理距离较长 |
| 9 | 是否允许负载均衡 | 是否配置了 maximum-paths 但路径数量不足 |
| 10 | eBGP 邻居早于 iBGP | 邻居建立时间影响排序 |
| 11 | 路由器 ID | 最后绝杀,比较 router-id |
拿到一条非优选路由时,我会习惯性地把 BGP 路由详情全部拉出来,按这个顺序一行行对照,哪个属性对不上就往哪个方向查。实践经验证明,绝大多数问题都定位在前六项。
4.2 iBGP 路由不生效的经典坑
另一个高频问题:iBGP 学习到了路由,但路由表中死活不出现这条路由。上一节提过,很可能就是下一跳不可达导致的。
假设 R3 通过 eBGP 从 R1 学到 10.10.10.0/24,并通过 iBGP 通告给内部的 R4。R4 收到了这条路由,但下一跳地址是 R1 的接口地址(比如 10.0.12.1)。R4 的 IGP 中没有这条主机路由,那么 R4 认为下一跳不可达,BGP 路由虽然学到,但不进入路由表。
解决办法是让内部 IGP 能够通告这条下一跳地址。常见做法是在 R3 上把与 R1 互联的接口网段重分发进 IGP,或者使用 BGP 下一跳自换(next-hop-self)功能,让 R3 通告给 iBGP 邻居时把下一跳改写成自己的地址。
router bgp 65000 neighbor 10.0.34.4 next-hop-self这个配置在真实网络中非常常见,几乎所有使用 iBGP 的场景都会用到,尤其是当 IGP 无法承载外部下一跳路由时。
4.3 BGP 收敛慢的排查思路
BGP 的收敛速度通常比 IGP 慢,这是协议特性,不必过度焦虑。但如果发现收敛慢得异常,比如断链后路由迟迟不撤销,需要考虑几个原因。
第一,BGP 默认的 keepalive 间隔是 60 秒,holdtime 是 180 秒,如果你没有调低这些定时器,链路故障后最快也要等到 holdtime 超时才宣告邻居失效,这是个正常的设计,重启邻居可以等待 timer 到期。如果需要更快的收敛,可以调整定时器。
router bgp 65000 neighbor 10.0.12.1 timers 10 30但要注意,改动 BGP 定时器必须是双方协商的,如果对端不接受调整也会失败。生产环境要谨慎调整,避免引发额外振荡。
第二,BGP 路由刷新机制。当策略变更后,BGP 不会自动重新评估所有路由,需要手动触发路由刷新,或者使用软重配功能。这个操作比重置邻居更温柔,不会造成流量中断。
R3# clear ip bgp 10.0.12.1 soft in这条命令会重新应用入方向策略并重新评估路由。软重配在实际维护中几乎是每日必备操作,务必记住。
4.4 属性修改不生效的排查
配置了 route-map 修改属性,但实际情况不符合预期,通常有几个原因。
一是 route-map 的匹配条件写错。特别是前缀列表的掩码长度匹配,很容易出错。我见过不少人在 prefix-list 中写了精确匹配 24 位掩码,但通告的路由却是 25 位或者聚合路由,导致匹配不上。
二是 route-map 的应用方向弄反了。影响入方向流量要应用在“in”方向,影响出方向流量要应用在“out”方向。很多新手朋友把修改 MED 的 route-map 应用在入方向,结果怎么调都不生效,因为 MED 是在通告给邻居之前就应该由本端设置好的属性。
三是配置了路由策略但 BGP 邻居需要重置才能生效。软重配可以解决大部分问题,但如果修改的是出方向策略,可能需要结合 clear ip bgp 命令,具体以设备命令行为准。
5. 一条 BGP 路由在互联网上的完整旅行
光看单台路由器上的属性还不够,最好能把 BGP 路由的传播过程完整走一遍,这样才能把每一个属性的作用场景对应起来。
假设你在一个 AS 65000 里有一个网段 203.0.113.0/24,要向互联网通告。你连接了两个上游 ISP,分别记为 ISP-A(AS 65100)和 ISP-B(AS 65200)。
本地路由器 R3 通过 network 命令发布这条路由,路由表里它的属性是:权重 32768,Local Preference 默认(本地起始路由 Local 优先),AS Path 为空(本机通告),Origin 为 i(IGP)。
R3 向两个 ISP 分别通告这条路由。通告给 ISP-A 时,AS Path 写为“65000”,MED 如果没设置,默认是 0。如果设置了 MED 50,那么 ISP-A 收到后 MED 为 50。同时,R3 还可以在 ISP-B 方向做 AS Path prepend,于是 ISP-B 收到的路由 AS Path 写为“65000 65000 65000”。
ISP 的边界路由器收到来自你的两条不同方向的路径后,它会把这条路由通告给它的其他邻居。在它的通告中,AS Path 会追加自己的 AS 号,变成“65100 65000”(从 ISP-A 方向)或“65200 65000 65000 65000”(从 ISP-B 方向)。如果 ISP 采用了客户路由策略,还可能会改变 Local Preference。
当互联网上其他 AS 的路由器看到这两条相同前缀的路由时,它们会按照 BGP 选路规则比较:Local Preference 大概率相同(都是 100);AS Path 长度则相差悬殊,较短的是“65100 65000”,较长的是“65200 65000 65000 65000”。于是全球流量大概率选择从 ISP-A 方向进入你的网络。这样你就实现了入方向流量的主备控制。
理解了这一整条链路,你就知道,你在自己路由器上做的每一个属性修改,不仅影响本设备,还会顺着 BGP 的传播被携带到整个互联网。这也是为什么说 BGP 策略无小事,一个错误的属性设置可能导致全网流量路径异常。
6. 模拟环境与学习建议
纸上得来终觉浅,BGP 这种协议如果不实际搭环境操作一遍,光看文档很难真正掌握。搭建一个 BGP 模拟环境并不难,建议在虚拟机或者模拟器中,准备三到四台路由器,分别模拟不同 AS,重点练习以下几种场景。
6.1 学习场景一:多 AS 路径选择
准备 R1(AS 100)、R2(AS 200)、R3(AS 300)三台路由器,其中 R3 同时连接 R1 和 R2。让 R1 和 R2 都通告相同的前缀,观察 R3 的默认选路结果。然后依次修改 Local Preference、MED、AS Path 这三个关键属性,验证选路结果的变化。
这个演练能建立最基本的“属性变化导致选路变化”的直觉。我在学习阶段就是通过反复做这种实验,才真正记住每个属性的优先级顺序。
6.2 学习场景二:iBGP 全互联与下一跳
配置三台路由器在同一 AS 内运行 iBGP,观察没有全互联时会有什么问题(路由学习不完整),以及下一跳地址不可达时路由状态如何。然后配置 next-hop-self 和其他收敛手段,看路由表的变化。
这个场景能帮助你理解 iBGP 和 eBGP 在行为上的差异,尤其是传递规则:eBGP 学到的路由可以通告给 iBGP 邻居,但 iBGP 学到的路由默认不能通告给其他 iBGP 邻居,这就是 iBGP 需要全互联的根本原因。
6.3 学习场景三:路由反射器
理解了上述场景后,可以进一步学习路由反射器(RR)。三台路由器组成 iBGP 网络,其中一台充当 RR,另外两台作为客户端,观察反射器如何减少 iBGP 对等体的数量,同时避免环路。
RR 是 BGP 网络中大规模部署必不可少的技术,掌握了它才能理解实际运营商网络中的 BGP 设计。反射器会修改一些属性来防止环路,比如 Originator ID、Cluster List,这些内容在模拟环境里可以直观地看到。
6.4 学习资源与方法
市面上关于 BGP 的教程和文档非常多,但信息繁杂,初学者容易迷失。我的建议是先看官方标准文档(相关 RFC)了解协议设计原则,再结合模拟环境操作,最后再去研究具体厂商的配置手册,理解各厂商的属性默认值差异。
一个值得注意的点是:不同厂商设备对 BGP 属性的默认值可能不同。比如某些厂商设备默认开启 rfc-compatible MED 比较方式,而另一些厂商对来自不同 AS 的路径也默认比较 MED,这会直接影响选路结果。在跨厂商设备组成的网络里,这些默认差异经常是排障的绊脚石,提前了解能省很多时间。
我个人在实际操作中的体会是,BGP 选路的关键不是背下那十几条规则,而是理解属性设计的初衷和应用场景。搞清楚“谁在什么情况下用什么属性控制哪个方向的流量”,再复杂的网络也能理顺。最后分享一个小技巧:每做完一次策略调整,养成同时查看 BGP 路由详情和全局路由表的习惯,确认最终选路符合预期后再进行下一步操作,不要怕麻烦,这一步能挡住百分之八十以上的低级错误。