ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

BGP联邦实验详解:从配置到验证,彻底搞懂AS_PATH与下一跳

BGP联邦实验详解:从配置到验证,彻底搞懂AS_PATH与下一跳 BGP联邦BGP Confederations这个东西我见过太多人把它当成考试题里的背诵段落来处理了。它总是被放在路由反射器后面草草讲完文档里看概念也简单无非是“把大AS拆成小AS”。可真到自己在模拟器或者VyOS里动手搭实验的时候问题全冒出来了联邦EBGP和真正的EBGP到底哪里不一样为什么我配完之后外部邻居看到的AS号不是65001联邦内部跨子AS传递路由时下一跳到底改不改这些问题光看PPT永远说不清楚必须亲手把路由从一端转到另一端看一遍AS_PATH和下一跳的变化才算真正搞懂。这篇东西是我基于VyOS底层FRR完整跑通的一个BGP联邦综合实验拓扑里同时包含真实EBGP、IBGP、联邦EBGP三种会话关系覆盖了绝大多数组网场景。适合刚学完BGP基础、正在准备网络认证或者在实际工作中规划中型IBGP网络的人参考。我会直接给拓扑、给配置、给验证命令和输出每个关键动作都解释为什么这么做。跟着做一遍你对联邦的理解会扎实很多。1. 从全互联数量公式看联邦到底解决了什么问题先说清楚联邦这个特性诞生的背景否则你配置的时候会觉得它很多余。BGP内部有一条非常“不讲情面”的规则从IBGP邻居学到的路由不会再通告给其他IBGP邻居。这是BGP防止AS内部环路的核心机制但副作用也很明显——同一AS内部所有运行IBGP的路由器必须两两建立会话全网全互联。否则路由传不出去。这里有一个很经典的公式需要建立的IBGP会话数量是 N×(N-1)/2N 是AS内部BGP路由器数量。我见过不少真实网络的教训这里直接算给你看AS内BGP路由器数量 NIBGP全互联会话数 N×(N-1)/25101045201905012251004950N20的时候190条会话已经很难维护了。到100台设备的时候接近5000条会话每条都要手工配置、监控、排障这基本就是灾难。1.1 联邦的“子AS”拆解思路联邦的解决办法是把一个大的AS比如AS 100划分成多个内部子AS。子AS内部仍然走IBGP子AS之间跑一种特殊形态的EBGP。因为子AS之间确实用了不同的AS号所以它们之间建立的是EBGP邻居。但关键是这些子AS之间传递路由的时候会保留IBGP的很多关键行为比如下一跳不修改、本地优先级可以跨子AS传递、MED不会被重置。对外部真正的EBGP邻居来说整个联邦仍然表现为一个AS 100而不是一堆65001、65002。这个设计聪明的地方在于它把“必须全互联”的范围从整个大AS缩小到了每个子AS内部。子AS内部的设备数量少了IBGP会话数量自然大幅度下降。还是用20台设备举例。如果把AS 100拆成4个子AS每个子AS 5台设备内部各自全互联那么每个子AS内部只有10条IBGP会话4个子AS总共40条。子AS之间的联邦EBGP连接只需要几条用来把路由串起来。整体会话量从190条降到了50条左右而且每个子AS可以独立管理。1.2 联邦 vs 路由反射器RR的取舍说到解决IBGP扩展性很多人第一反应是路由反射器为什么还要用联邦路由反射器的思路是打破水平分割客户端把路由发给反射器反射器再反射给其他客户端这样不需要全互联。它配置简单一台RR可以服务几十台甚至上百台客户端所以现实中RR用得更多。但RR有一个很少有人注意的弱点普通客户端只会保留从RR学到的路径。如果RR的选路不是最优的全网跟着走偏。RR本身成为选路的关键节点所以生产环境通常要上双RR并且配合BGP策略来保证路径可靠。联邦的路线不一样。它保留了EBGP那种“每个路由器自己保留完整路径、自己算最优”的能力。子AS之间的联邦EBGP连接虽然是“外部”连接但在路由属性上尽量保持内部语义所以每个路由器仍然能独立判断哪条路径更优。这对于多出口、需要精细化选路的网络非常有价值。实际部署中联邦和RR并不是二选一而是经常组合使用大AS用联邦切成几个子AS子AS内部再用RR减少全互联。这样两层结构都能把规模控制住。2. 联邦机制的五个“像EBGP又不像EBGP”的规则联邦之所以容易让人混淆是因为它夹在IBGP和EBGP之间行为规则一半像这个一半像那个。我把它拆成五条规则每一条都对应实验里能验证到的现象。2.1 对等体类型子AS之间是EBGP但属于同一个联盟在配置上子AS之间因为remote-as填的是不同的子AS号所以走的确实是EBGP的协商流程。但设备会检查一个关键配置这些子AS是否在“confederation peers”列表里。如果在BGP就把这个邻居当作联邦内部成员处理。这个身份识别非常重要。它决定了后面几条规则是否生效。如果没有正确配置confederation identifier和confederation peers设备会把子AS之间的会话当成真实EBGP对待导致路由属性处理全乱套。2.2 下一跳与本地优先级IBGP属性不被重置这是联邦最反直觉的地方也是实验中一定要亲手验证的重点。真实的EBGP会话在通告路由时会把下一跳改成自己的地址但联邦EBGP会话不会。路由在联邦内部从子AS 65001传到子AS 65002下一跳字段保持最初的BGP发言者不变。也就是说接收方必须通过IGP能到达那个原始下一跳否则路由就是“看起来有实际不可达”。本地优先级也一样。真实EBGP收到的路由本地优先级会被重置为默认值LOCAL_PREF在AS之间不会传播但联邦内部的路由传递会保留LOCAL_PREF。这意味着你可以在联邦内的入口设备上设置本地优先级整条联邦内的所有设备都能按照这个优先级选路。2.3 AS_PATH处理内部可见子AS号外部只看到联盟AS号AS_PATH是联邦实验里最有观察价值的一个点我建议你重点抓。当路由在联邦内部跨越子AS边界时发送方会把自己的子AS号追加到AS_PATH里。联邦内的设备看AS_PATH能看到类似“65002 200”这样的路径里面包含子AS号。但当这条路由通告给联邦外部的真正EBGP邻居时协议要求把所有子AS号从AS_PATH中剥离只保留联邦的联盟ID。所以外部AS 200的设备看这些前缀AS_PATH里只有AS 100完全看不到65001、65002。这就是联邦对外表现为“单AS”的核心机制。如果你的实验里外部邻居看到了子AS号那一定是配置有问题后面排错部分我会细说。2.4 MED和路由通告规则的保留MEDMulti-Exit Discriminator在多出口网络里用来表达“哪个入口更优先”。真实EBGP会话会把MED重置为0但联邦内部跨子AS传递时MED会保留下来。路由通告规则上联邦EBGP会话比IBGP灵活它允许路由器把从IBGP学到的路由继续通告给其他子AS的联邦EBGP邻居同时也保留AS_PATH环路检测来防止真正环路。这解决了IBGP水平分割带来的传播限制又不会造成无限循环。我把这五条规则整理成一张对比表后面实验验证的时候可以对照着看行为IBGP真实EBGP联邦EBGP下一跳是否修改不修改修改为自身不修改LOCAL_PREF传递保留重置保留MED传递保留重置保留AS_PATH追加自身AS不追加追加追加子AS号对外部EBGP隐藏子AS号--隐藏3. 综合实验拓扑、地址规划与底层IGP下面进入正题我把整个实验环境完整描述一遍。你可以在GNS3、EVE-NG里用VyOS镜像也可以用装了FRR的Linux容器配置命令基本兼容。3.1 拓扑设计思路实验环境为一台外部路由器 R6 位于 AS 200它要与联邦 AS 100 建立真实 EBGP 会话。AS 100 被划分为两个子 ASAS 65001 和 AS 65002。AS 65001 内有 R1、R2、R3 三台路由器三台之间形成 IBGP 全互联。AS 65002 内有 R4、R5 两台R4 与 R5 建立 IBGP。两个子 AS 之间用两条联邦 EBGP 连接做冗余R2 连 R4R3 连 R5。外部边界路由器是 R1它和 R6 之间建立真实 EBGP。业务网段分别挂在 R3、R5 和 R6 后面这样三种会话关系都能传递业务路由方便观察行为差异。3.2 地址规划整个实验的地址规划如下建议你严格照抄后面看输出不会乱设备所属子ASLoopback0BGP角色业务网段R1650011.1.1.1/32IBGP全互联 真实EBGP到R6-R2650012.2.2.2/32IBGP全互联 联邦EBGP到R4-R3650013.3.3.3/32IBGP全互联 联邦EBGP到R5172.16.10.0/24R4650024.4.4.4/32IBGP到R5 联邦EBGP到R2-R5650025.5.5.5/32IBGP到R4 联邦EBGP到R3172.16.20.0/24R62006.6.6.6/32真实EBGP到R1203.0.113.0/24各设备之间的互联网段全部使用 30 位掩码R1-R210.0.12.0/30R1-R310.0.13.0/30R2-R310.0.23.0/30R2-R410.0.24.0/30R3-R510.0.35.0/30R4-R510.0.45.0/30R1-R610.0.16.0/303.3 为什么底层必须跑OSPF联邦实验的底层IGP我这里用OSPF不是可选项是必须项。原因有两个。第一IBGP会话我用的是Loopback地址建立比如R1和R2之间的IBGP邻居关系建立在 1.1.1.1 和 2.2.2.2 之间。这样即使中间的直连链路断了只要OSPF还能找到其他路径BGP会话不会断。但前提是OSPF必须把这些Loopback地址全网通告。第二联邦EBGP不修改下一跳。R2从R4学到的路由下一跳可能是R5的Loopback 5.5.5.5R2必须通过OSPF能到达 5.5.5.5这条BGP路由才是可用的。如果IGP没有覆盖Loopback地址你会看到“BGP表里有路由但ip route里下一跳是空的”这种诡异现象。OSPF只要单区域就行。每台联邦内设备都宣告自己的Loopback0和所有互联网段业务网段的Loopback不宣告——那些由BGP承载。4. 逐台设备联邦配置与命令解读配置部分以VyOS命令为主FRR的等价命令我会在旁边标注。先给你们建立整体概念联邦配置的核心就三条confederation identifier、confederation peers、以及邻居的remote-as。4.1 R1配置IBGP全互联 真实EBGP边界R1是联邦与外部AS 200的边界它的配置最能看到“对外表现为AS 100”这个效果。# 接口 set interfaces ethernet eth0 address 10.0.12.1/30 set interfaces ethernet eth1 address 10.0.13.1/30 set interfaces ethernet eth2 address 10.0.16.1/30 set interfaces loopback lo0 address 1.1.1.1/32 # OSPF set protocols ospf parameters router-id 1.1.1.1 set protocols ospf area 0 network 1.1.1.1/32 set protocols ospf area 0 network 10.0.0.0/16 # BGP联邦 set protocols bgp 65001 set protocols bgp 65001 confederation identifier 100 set protocols bgp 65001 confederation peers 65002 set protocols bgp 65001 neighbor 2.2.2.2 remote-as 65001 set protocols bgp 65001 neighbor 2.2.2.2 update-source 1.1.1.1 set protocols bgp 65001 neighbor 3.3.3.3 remote-as 65001 set protocols bgp 65001 neighbor 3.3.3.3 update-source 1.1.1.1 set protocols bgp 65001 neighbor 10.0.16.6 remote-as 200解释几个关键点。confederation identifier 100 表示“我所属的联邦对外使用AS 100这个身份”。这不是本地AS只是联邦ID本地AS仍然是65001。confederation peers 65002 告诉R1AS 65002不是外部AS而是同一个联邦内的成员。漏了这条路基在联邦EBGP会话上就会被当成真实外部路由处理行为全错。给R6的remote-as填的是200这个没问题。但注意R6那边看R1填的是100而不是65001这一点极其容易错我在排错章节会专门讲。FRR等价配置router bgp 65001 bgp confederation identifier 100 bgp confederation peers 65002 neighbor 2.2.2.2 remote-as 65001 neighbor 2.2.2.2 update-source 1.1.1.1 neighbor 3.3.3.3 remote-as 65001 neighbor 3.3.3.3 update-source 1.1.1.1 neighbor 10.0.16.6 remote-as 2004.2 R6配置外部EBGP邻居眼中的联邦R6在AS 200它不需要知道联邦内部结构只需要把R1当作AS 100的边界路由器即可。set interfaces ethernet eth0 address 10.0.16.6/30 set interfaces loopback lo0 address 6.6.6.6/32 set interfaces loopback lo1 address 203.0.113.1/24 set protocols bgp 200 set protocols bgp 200 neighbor 10.0.16.1 remote-as 100 set protocols bgp 200 address-family ipv4-unicast network 203.0.113.0/24这里的remote-as 100是整个实验第一个“坑”。很多人会下意识填65001因为R1配置BGP时的本地AS就是65001。但在联邦环境中真实EBGP邻居必须用联邦ID去和对端建邻居否则R6发出去的OPEN报文里携带的AS号是它期待的100而R1回应的AS号是65001两边对不上会话起不来。4.3 R2配置IBGP 联邦EBGP双角色R2要同时和R1、R3建立IBGP并且和R4建立联邦EBGP。来看完整配置set interfaces ethernet eth0 address 10.0.12.2/30 set interfaces ethernet eth1 address 10.0.23.2/30 set interfaces ethernet eth2 address 10.0.24.2/30 set interfaces loopback lo0 address 2.2.2.2/32 set protocols ospf parameters router-id 2.2.2.2 set protocols ospf area 0 network 2.2.2.2/32 set protocols ospf area 0 network 10.0.0.0/16 set protocols bgp 65001 set protocols bgp 65001 confederation identifier 100 set protocols bgp 65001 confederation peers 65002 set protocols bgp 65001 neighbor 1.1.1.1 remote-as 65001 set protocols bgp 65001 neighbor 1.1.1.1 update-source 2.2.2.2 set protocols bgp 65001 neighbor 3.3.3.3 remote-as 65001 set protocols bgp 65001 neighbor 3.3.3.3 update-source 2.2.2.2 set protocols bgp 65001 neighbor 10.0.24.4 remote-as 65002注意最后一行联邦EBGP邻居R4的remote-as是65002这和普通EBGP唯一一样的地方。区别在于前面已经声明了confederation peers 65002所以R2知道这个邻居是自己人。4.4 R4、R5配置另一个子AS的完整示例R4属于AS 65002它要建立两台IBGP和一台联邦EBGPset interfaces ethernet eth0 address 10.0.24.4/30 set interfaces ethernet eth1 address 10.0.45.4/30 set interfaces loopback lo0 address 4.4.4.4/32 set protocols ospf parameters router-id 4.4.4.4 set protocols ospf area 0 network 4.4.4.4/32 set protocols ospf area 0 network 10.0.0.0/16 set protocols bgp 65002 set protocols bgp 65002 confederation identifier 100 set protocols bgp 65002 confederation peers 65001 set protocols bgp 65002 neighbor 5.5.5.5 remote-as 65002 set protocols bgp 65002 neighbor 5.5.5.5 update-source 4.4.4.4 set protocols bgp 65002 neighbor 10.0.24.2 remote-as 65001R5的配置思路和R4对称IBGP邻居是4.4.4.4联邦EBGP邻居是R3的10.0.35.3业务网段宣告为172.16.20.0/24。R3配置完OSPF和IBGP后加上业务网段宣告即可set protocols bgp 65001 address-family ipv4-unicast network 172.16.10.0/24同样R5set protocols bgp 65002 address-family ipv4-unicast network 172.16.20.0/24这里的network命令要求本地路由表里必须存在对应网段所以业务网段要配置成Loopback1并保持up状态。4.5 我建议的配置顺序联邦配置最容易乱我建议你按这个顺序操作先把所有接口地址配完再把OSPF跑通确认每台设备都能ping通所有Loopback地址然后配置BGP的confederation identifier、confederation peers最后再配置邻居关系先从IBGP开始再联邦EBGP最后真实EBGP。这样可以最大程度减少“路由学不到时不知道是IGP问题还是BGP问题”的排查成本。5. 验证路由行为AS_PATH、下一跳与选路对比配置全部完成后按下面这个顺序做验证每个点都能看到联邦与其他BGP类型的关键差异。5.1 看联邦EBGP的下一跳保留现场先在R2上查看从AS 65002学到的业务路由 172.16.20.0/24show bgp ipv4 unicast 172.16.20.0/24类似下面的输出BGP routing table entry for 172.16.20.0/24 Paths: (1 available, best #1) 65002 5.5.5.5 from 10.0.24.4 (4.4.4.4) Origin IGP, metric 0, localpref 100, valid, external, best这个输出信息量非常大。AS_PATH显示的是65002说明这是R5在AS 65002里通过IBGP传给R4再由R4通过联邦EBGP传给R2的。下一跳是5.5.5.5这是R5的Loopback地址而不是R4的地址。如果这是真实EBGP下一跳一定会被改成R4的10.0.24.4因为它是联邦EBGP下一跳被原样保留。这就是联邦“像EBGP但不是EBGP”最直接的证据。5.2 看联邦EBGP的AS_PATH内部可见同样的路由在R2的BGP表里AS_PATH是65002。这个子AS号在联邦内部是可见的它用来做联邦内部的环路检测。如果R2再把这条路由通过联邦EBGP传给R3R3的BGP表里AS_PATH会变成“65002 65001”这样的形式吗这里有个细节IBGP传播不会追加AS号联邦EBGP传播会追加发送方的子AS号。所以R3从R2学到这条路由时AS_PATH显示的是65002R2在追加时写自己子AS 65001吗实际上R2传给R3如果走IBGP不追加如果走联邦EBGP路径不同。在我的拓扑里R3有两台IBGP邻居R1、R2所以R3大概率从IBGP学到172.16.20.0/24AS_PATH仍然是65002。你可以自己在实验里对比一下从IBGP学到的和从联邦EBGP学到的AS_PATH长度差多少。这就是联邦EBGP追加子AS号的直观体现。5.3 看真实EBGP邻居如何“只见联盟不见子AS”切到R6查看172.16.20.0/24show bgp ipv4 unicast 172.16.20.0/24输出类似BGP routing table entry for 172.16.20.0/24 Paths: (1 available, best #1) 100 10.0.16.1 from 10.0.16.1 (1.1.1.1) Origin IGP, metric 0, localpref 100, valid, external, best看到区别了吗R6的AS_PATH只有100完全没有65001和65002。R6只知道AS 100这个整体联邦内部的子AS结构对外完全透明。这就是联邦对外表现为单AS的机制。如果你在这里看到了65001或者65002说明有些设备漏配了confederation identifier或confederation peers导致子AS号没有被正确剥离。5.4 查看外部路由在联邦内的传播再看反向流量。R6通告的203.0.113.0/24进入联邦后在R2上查看show bgp ipv4 unicast 203.0.113.0/24你会看到AS_PATH为200下一跳是1.1.1.1。这条路由从R1传到R2走IBGP下一跳是R1的Loopback这符合IBGP规则再传到R4走联邦EBGP下一跳仍然是1.1.1.1没有被R2篡改。R4必须通过OSPF能到达1.1.1.1否则这条路由在R4上就是死路由。我建议你在实验里故意把R4上关于1.1.1.1/32的OSPF路由删掉然后再看R4的BGP表你会看到路由还在但ip route找不到1.1.1.1数据面完全无法转发。这个坑很值得自己踩一次。5.5 冗余验证断掉一条联邦EBGP连接联邦的优势之一是多路径冗余。你可以把R2和R4之间的链路或BGP会话shutdown然后观察172.16.20.0/24这条路由的路径变化。正常情况下R3和R5之间的联邦EBGP连接会承担起路由传递任务R2依然能从R3学到关于172.16.20.0/24的路由R2到R3有IBGP。整个联邦内所有设备依然能学到全部前缀。这比单点RR的组网抗故障能力强。如果你的实验环境里有现成的Controller或自动化工具可以写个简单的脚本来轮询show bgp summary观察断链后会话状态的变化时间。实测下来联邦的收敛速度取决于IGP感知速度一般不超过几秒。6. 联邦实验里最容易翻车的三个地方这部分是我自己搭建实验时踩过的坑还有一个是学员群里高频出现的问题。单独写一节希望你能绕开。6.1 外部邻居的remote-as填错把联盟ID当本地AS这是频率最高的错误。很多人在R6上看R1的本地AS是65001于是把R6的neighbor remote-as配成65001结果是会话一直起不来。原因是真实EBGP邻居必须用联邦对外的联盟ID去建邻居。R1对外是AS 100R6必须写remote-as 100R1对R6则写remote-as 200。两者都在自己本地BGP进程里填了confederation identifier 100FRR在处理对外EBGP会话时使用100作为自身AS号。如果你看到BGP邻居反复进入Active状态并且系统日志里有类似“BGP Notification sent”的报错第一反应就去看remote-as是不是填成了65001。6.2 漏配confederation peers路由行为全线混乱联邦EBGP会话有一个特点即使不配置confederation peersR2和R4之间的EBGP会话也能建立成功。因为它们的本地AS号确实不同65001对65002协议层面认为这就是两个不同的AS。但这样建立起来的会话不是联邦行为而是真实EBGP行为。后果包括下一跳被修改、LOCAL_PREF被重置、MED被重置更严重的是AS_PATH里的子AS号没有被隐藏R6会看到65001、65002这些子AS号。整个“联邦对外表现为单AS”的承诺就失效了。所以检查配置时一定要确认所有联邦内的路由器都同时配置了confederation identifier和confederation peers。用show running-config过滤bgp相关段落检查每一台。6.3 下一跳不可达联邦EBGP不会帮你改下一跳联邦EBGP保留下一跳这个特性在不理解的人看来就是个大坑。路由学过来了BGP表里也是valid的但就是ping不通业务地址一看ip route下一跳对应地址没有路由。原因就是前面反复强调的联邦EBGP不修改下一跳接收方必须自己通过IGP知道下一跳怎么走。所以在联邦组网里底层IGP的覆盖范围必须包含所有可能成为BGP下一跳的地址。我自己的习惯是把每台设备的Loopback0都宣告进OSPF并且BGP的IBGP会话全部用Loopback地址建立。这样下一跳地址一定是Loopback地址你只需要保证所有路由器的Loopback全网互通就不会有下一跳问题。6.4 联邦EBGP用Loopback建邻记得加多跳这是一个进阶坑。我在拓扑里联邦EBGP用的是直连接口不需要额外配置。但如果你在生产或实验里把联邦EBGP会话也用Loopback地址建立比如R2和R4之间用2.2.2.2对4.4.4.4那就要配置ebgp-multihop。因为EBGP的报文TTL默认是1跨多跳建立会话时TTL会被丢弃。真实EBGP和联邦EBGP在这个行为上没有区别。VyOS里对应的命令是set protocols bgp 65001 neighbor 4.4.4.4 ebgp-multihop 2FRR里是neighbor 4.4.4.4 ebgp-multihop最后分享一个我实际实验时的小习惯先把所有BGP邻居用直连接口建起来跑通路由以后再改成Loopback这样能快速隔离到底是BGP配置问题还是IGP问题。联邦这个特性生产环境里确实不如RR常见但在需要多个管理域自治、对外又要隐藏内部细节的组网里价值很高尤其是配合RR把子AS内部再折叠一次能撑起非常大的网络规模。你如果也在搭类似的实验建议把“下一跳不变”和“AS_PATH隐藏”这两个点亲手抓一遍。抓住这两个点你对BGP联邦的理解基本就到下一个层次了。
返回列表