HCIP BGP学习笔记:从邻居状态机到路径选择的核心要点
HCIP的BGP部分我学了三轮才真正觉得通了。第一轮看教材时最直观的感受是OSPF、IS-IS学得再熟到BGP这儿也得先把脑子切换一下。BGP不是用来算最短路径的它是用来在自治系统之间搬运路由的。你越早接受这个设定后面看状态机、看路径属性、看各种策略就都不会觉得拧巴。这篇就是HCIP-BGP第一阶段的学习记录适合刚开始啃BGP、或者已经在华为设备上敲过几条peer命令但没完全串起来的读者。1. 为什么HCIP的BGP章节总让人先蒙一半先建立正确的世界观1.1 自治系统与BGP的职责BGP全称是边界网关协议它干的事情是连接不同的自治系统。自治系统也就是AS可以理解成一套拥有统一路由策略的网络域。每个AS有自己独立的编号范围是1到4294967295。看到这个数字范围你应该有印象现在的AS号是32位了早年间大家学的是16位最多到65535。华为设备上配置AS号的时候直接用整数就行比如bgp 100如果碰到AS号超过65535的情况可以用asplain格式的整数表示。我一开始理解的偏差在于总觉得BGP是路由协议里的一种应该和OSPF差不多都是让路由器自己算出一条路来。实际上完全不是。OSPF、IS-IS这种IGP解决的是我内部怎么互通的问题它们靠算法在同一个AS内部计算路由而BGP解决的是一个AS怎么把自己的路由告诉另一个AS的问题它本质上更像一套路由通告和策略控制的规则而不是路由计算算法。1.2 BGP与IGP的分工不是同一层的对手这个观念不掰正后面全是坑。IGP是用来让一个AS内部的路由器学习到去往内部所有网段的路由比如你在内部起OSPF所有路由器最终都有一张一致的内部路由表。BGP呢你在一台边界路由器上配了BGP它不会自己去全网发现路由它只会做两件事从对端邻居收路由以及把自己知道的指定路由通告给邻居。换句话说BGP的路由从哪里来要么你自己通过network命令宣告要么用import命令从路由表里引入再要么就是从别的BGP邻居学过来再传下去。它不自己发现路由它只负责搬运和过滤。这就是为什么很多人在HCIP实验里配完BGP邻居发现路由表里什么都没有就开始怀疑配置有问题——其实大概率只是没执行network或者import。HCIP考试也很有意思它很少让你默写一大段复杂的算法流程更多是考你规则本身。比如给你一条路由的AS_PATH、LOCAL_PREF、MED这些属性让你判断到底选哪条。这种题考的不是命令背得多熟而是对BGP属性优先级和通告原则的理解度。1.3 HCIP在BGP第一阶段到底想让你掌握什么按照我自己的体会第一阶段的考点基本集中在四块邻居建立和状态机、IBGP与EBGP的差异及防环规则、路径选择的核心属性、以及基础配置与排障。这四块是后面学习路由策略、路由反射器、联盟、团体属性这些内容的地基。如果你能把这四块里面的逻辑自圆其说后面BCP再到BGP的进阶内容就只是在一个框架上添加细节而已。2. 邻居建立从Idle到Established的六个状态与排障落点2.1 五类报文先分清责任BGP的报文不多考试也好、排障也好核心就五类。Open报文用来建立连接里面携带了AS号、Hold Time、Router ID这些关键参数对端如果不同意这个会话根本起不来。Update报文用来通告和撤销路由里面装着路径属性没有路由变化时不会发Update。Keepalive报文是保活用的周期性地告诉对方我还活着华为设备上默认每60秒发一次Hold Time默认是180秒也就是说对方如果连续三次没收到Keepalive会话就会被判死。Notification报文是错误通知任何一方发现报文有问题、状态机不对、参数不匹配都会发一个Notification然后断开会话。还有一类Route-Refresh报文是用来在能力协商之后请求对端重新发送路由的这个在刷新策略的时候特别有用。这五类报文的职责边界可以先拿OSPF对比理解。OSPF里面有Hello报文专门用来建立和维护邻居关系而BGP没有单独的Hello它用Keepalive承担这个工作。OSPF的LS Update用来描述链路状态BGP的Update则用来携带路径属性。报文的分类决定了排障时看什么信息。2.2 状态机的六个阶段到底发生了什么BGP邻居状态机是HCIP的必考内容六个状态Idle、Connect、Active、OpenSent、OpenConfirm、Established。虽然看着多其实可以压缩成三个阶段。Idle是初始状态此时BGP不发起任何连接它在等触发条件——一般是peer命令配置完成或者事件触发。然后进入Connect状态开始主动发起TCP连接TCP是BGP的传输层基础端口号179。如果TCP连接成功了就开始发Open报文进入OpenSent。如果TCP连接失败就会跳到Active状态Active状态下会反复重试TCP连接。OpenSent之后如果收到了对端的Open报文并且双方参数能匹配上就进入OpenConfirm此时会互相发Keepalive。最后收到对端Keepalive状态变成Established邻居建立成功之后就开始互相收发Update报文了。排障的时候我个人的经验是不要一上来就逐条看状态先确认两个点TCP通不通、Open报文里的参数对不对。TCP不通大概率是网络层问题——IP地址写错、接口没起来、中间有防火墙拦了TCP 179端口。Open参数不对常见的有AS号不匹配、Router ID冲突、Hold Time协商失败。这两个方向排查完基本能解决绝大多数邻居起不来的问题。2.3 华为设备上起BGP的最小命令集合HCIP是华为认证实验一般都跑在eNSP或者真实设备上。起一个最基本的BGP邻居命令非常少。bgp 100 router-id 1.1.1.1 peer 10.0.12.2 as-number 200 ipv4-family unicast peer 10.0.12.2 enablebgp 100进入BGP视图并指定本端AS号router-id指定标识peer 10.0.12.2 as-number 200表示我要和对端10.0.12.2建立BGP会话对端的AS号是200。最后进入IPv4单播地址族把这条peer激活。很多新手会漏掉最后这一步peer enable如果在老的华为VRP版本上不激活地址族也会尝试建立会话但新版本上一定要显式激活。这里有个容易忽略的细节EBGP邻居之间报文的TTL默认是1也就是只能直连建立。如果两个EBGP路由器中间隔了一台设备你需要加peer 10.0.12.2 ebgp-max-hop 2来允许跨跳。IBGP没这个限制而且在IBGP环境下惯例是用LoopBack接口地址作为建立邻居的源地址这样即使物理链路断了只要还能路由到LoopBack地址会话也不会中断。bgp 100 peer 10.0.0.2 as-number 100 peer 10.0.0.2 connect-interface LoopBack0 ipv4-family unicast peer 10.0.0.2 enableconnect-interface LoopBack0就是指定用LoopBack0作为TCP连接源地址。如果不写这个默认会用出接口的地址作为源地址在IBGP多链路环境下很容易出问题。2.4 邻居起不来的常见原因给一个排障表这个是我第一轮备考时自己整理出来的比单纯背状态机有用得多。现象常见原因排查方向状态一直停在ActiveTCP不通或对端没配置BGPping对端地址确认端口179可达状态停在OpenSent后被打回对端AS号不匹配display bgp peer核对双方peer命令里的AS号状态停在OpenConfirmRouter ID冲突或Hold Time不一致检查两端router-id、hold time配置已经Established反复震荡物理链路不稳定或Keepalive周期内有丢包查看接口错误计数检查中间链路质量邻居Never配置了peer但从来没触发连接或地址族未激活检查配置里是否有peer enable检查BGP日志这套表在你刷HCIP题库的时候也特别好用很多选择题其实就是把你放在排障现场问你邻居状态卡在某个阶段最可能的原因是什么。只要能把状态机和新阶段的原因对应上这类题基本不会失分。3. 防环机制AS_PATH和IBGP水平分割的真正逻辑3.1 AS_PATH每一跳都记账BGP最核心的防环手段就是AS_PATH。当一条路由在一个AS内部被通告给另一个AS的时候通告方会在路由的AS_PATH属性最前面压上自己的AS号。比如AS 200的路由器从AS 100学到一条路由再通告给AS 300时这条路由的AS_PATH会变成[200, 100]300看到的是这一路经过了200再到100。如果一台路由器收到一条BGP路由在AS_PATH里面发现包含自己的AS号它就知道这个环路不能收直接丢弃。这个逻辑和RIP的水平分割有点神似但力度更大。RIP靠跳数限制BGP直接把整条路径记录下来每个AS都签字画押谁也别想撒谎。3.2 为什么IBGP必须全互联水平分割到底分割什么IBGP是同一个AS内部的BGP会话它也有一个防环规则叫水平分割从IBGP邻居学到的路由不允许再通告给其他IBGP邻居。这意味着在纯IBGP环境下一个AS内部如果只有一台路由器学了外部路由它没法把这条路由再转给别的IBGP路由器除非你建立全互联——也就是每台路由器都和所有其他IBGP路由器建立会话。我记得第一次做实验的时候三台路由器配了IBGP结果只有直接和EBGP相连的那台有外部路由另外两台什么都学不到。当时我还以为是过滤策略的问题查了半天才发现是水平分割在起作用。这个机制在HCIP考试里经常以为什么IBGP需要全互联或IBGP学到路由能否通告给IBGP邻居的形式出现答案就是不能。当然全互联在路由器数量多的时候非常不现实n台路由器要n乘n减1除以2个会话所以后面才有了路由反射器和联盟这些解决方案。第一阶段你只要把水平分割这条规则记清楚就够了。3.3 同步规则的历史包袱现在为什么默认关了老教材里还有一条BGP同步规则BGP路由器不能把从IBGP学到的路由通告给EBGP邻居除非这条路由在IGP路由表里也存在。这条规则诞生在一个很老的年代当时很多网络设备不支持在纯BGP环境下转发数据所以非要等IGP也学会了才敢往外通告。到了现在设备的转发能力早就不是问题绝大多数网络里这条同步规则默认就是关闭的华为设备环境下我们也不用手动开启。但考试的时候可能会碰到历史题万一问到同步规则的作用你要能说清楚它是为了确保自治系统内部不会因为BGP路由和IGP路由不一致而导致数据黑洞。理解归理解实际配置中保持默认关闭状态就好。3.4 防环规则在HCIP实操题里的体现知道规则还不够要能在拓扑题里快速判断这条路由允不允许被通告。给你一个经验判断法则从EBGP学到的路由可以通告给所有BGP邻居不管IBGP还是EBGP。从IBGP学到的路由只能通告给EBGP邻居不能通告给IBGP邻居。本地通过network和import生成的路由可以通告给所有BGP邻居。这个所有只能可以的对应关系在HCIP的很多选择题里都是直接的正确答案。你把它想成是在一个公司内部传话外来的消息可以到处说内部听来的消息只能对外说自己研发的消息随便说。这么一记基本就不会忘。4. 路径选择HCIP第一轮备考中必须吃透的属性优先级4.1 华为设备选路顺序全表BGP本身不计算路径它根据属性做决策。华为设备上一条路由如果有多条可达路径默认按下面的顺序选排在前面的优先生效Preferred Value数值越大越优这是华为私有属性只在本地有意义。LOCAL_PREF本地优先数值越大越优用于在AS内部影响流量怎么出去。本地生成路由优先于从邻居学来的路由。AS_PATH越短越优。Origin类型IGP优于EGP优于Incomplete也就是不完全。MED数值越小越优用于告诉对方AS我这边更希望你怎么进来。路由来源类型EBGP优于IBGP。到下一跳的IGP度量值越小越优。负载分担。Router ID越小越优。Cluster_List越短越优。对端IP地址越小越优。这一长串看起来吓人其实第一阶段只需要抓住前六条后面的条目在默认情况下很少会走到。HCIP的考试题大部分也集中在LOCAL_PREF、AS_PATH、MED这几个属性的比较上。4.2 前几项属性到底怎么用LOCAL_PREF是AS内部的属性只在AS内传播不会传给EBGP邻居。它解决的是我们AS有多条出口流量应该从哪个出口出去的问题。数值越大的路径越优先默认值是100。你在实验里想验证LOCAL_PREF生效最直观的做法是给一条入方向的路由设置较高的LOCAL_PREF然后在IBGP邻居上观察它是不是变成了优选的出口。AS_PATH则是在出方向策略里很有存在感。你可以用apply as-path命令在路由通告出去之前追加AS号人为地把AS_PATH拉长让对方AS流入的流量不选这条路线。这在很多跨地域的网络设计中是常见手段而HCIP考试里主要考的是它会排在LOCAL_PREF之后比较。MED是给外部邻居看的它影响的是对方AS的流量进入本AS时选哪条路。MED值越小越优默认情况下只有相邻AS传来的多个路由之间才会比较MED如果收到来自不同AS的路由MED不会逐条跨AS比较。这点考试经常考容易错。4.3 Next_Hop可达性与迭代路由BGP里有个概念叫下一跳迭代。BGP更新的路由里带着NEXT_HOP属性但这条下一跳不一定在BGP路由表里它需要去IGP路由表里找到一条能到达这个NEXT_HOP的路由才算这个BGP下一跳可达。如果IGP路由表里没有这条BGP路由就是无效的不会被放进转发表。我在实验里犯过这个错EBGP邻居是直连的NEXT_HOP是直连接口地址一切正常。后来换成了IBGP环境R2从R1学到一条外部路由通告给R3的时候默认NEXT_HOP还是R1的接口地址这时R3如果IGP里学不到R1那个地址的路由这条BGP路由就是不可用的。解决方法是把IBGP会话的下一跳改成自己用peer 10.0.0.3 next-hop-local这也是华为设备上IBGP场景里常见的一个配置。4.4 几个值得用实验验证的边界情况有些细节光看文档记不住我建议你动手验证一下。第一LOCAL_PREF和MED同样是调数值一个影响出方向一个影响入方向。你在AS内部两台路由器上分别设置不同的LOCAL_PREF然后看BGP路由表里优先路径的变化比背定义直观得多。第二AS_PATH长度的比较只基于AS号个数不看AS号大小。哪怕一个自治系统号是65000另一个是200在比较路径长度时都一样只数个数。第三Origin属性是IGP时最优但实际组网中通过network宣告的路由Origin是IGP通过import引入的路由Origin是Incomplete也就是?。这两者的优先级差异在选路时会在AS_PATH之后比较。5. 动手把规则变成肌肉记忆实验拓扑与常用验证命令5.1 一个能覆盖核心规则的拓扑第一阶段不需要搭太复杂的网络四台路由器加三个AS就够用。R1在AS 100R2和R3在AS 200R4在AS 300。R1连R2、R3连R4是EBGPR2和R3是IBGP。这个拓扑能一次验证三件事EBGP路由怎么跨AS传递IBGP水平分割怎么阻止路由在内部转圈以及LOCAL_PREF、MED这些属性改动后在BGP路由表里的实际表现。我习惯的IP规划很简单链路用10.0.12.0/30、10.0.23.0/30、10.0.34.0/30LoopBack接口从1.1.1.1到4.4.4.4。R2和R3的IBGP会话用LoopBack建记得加peer connect-interfaceR3才能通过IGP学到R2的LoopBack地址这个IGP在实验里用OSPF跑一下就行。5.2 必背的三类验证命令华为设备上第一阶段至少要学会这三类命令。查看邻居状态display bgp peer这个命令能看到BGP邻居的AS号、状态、建立时间、报文收发计数。如果状态不是Established这里是最直接的取证地点。查看路由表display bgp routing-table。这个命令显示所有BGP路由及其属性包括Network、NextHop、MED、LocPrf、PrefVal等。当你修改了路径属性之后可以用它来对照是否选路生效。查看IP路由表里的BGP路由display ip routing-table protocol bgp。这两者的区别是BGP路由表是决策前的原始表IP路由表是决策后真正用来转发的表。有些调试中你会看到BGP表里有路由但IP表里没有这时候就要去查下一跳可达性。刷新路由的命令也要会改完策略后想让BGP重新发送路由可以用refresh bgp all import或者refresh bgp all export前者是让BGP重新引入本地的路由后者是让BGP重新向对端发送已收到的路由实验里调策略时几乎每次都会用到。5.3 我踩过的坑和容易误判的地方第一个坑是IBGP会话用了LoopBack地址却忘记在中间设备上放行BGP流量。比如R2和R3之间隔了另一台路由器这台路由器如果开了ACL把TCP 179端口拦掉了IBGP状态就会一直在Active和Connect之间反复跳。排查时千万别只盯着BGP配置看先确认TCP层的连通性。第二个坑是next-hop的问题。IBGP环境下从R1传来的路由到了R3手里NEXT_HOP默认还是R1的接口地址如果R3没有通向R1的路由这条BGP路由就是Invalid。这时候要在R2上加peer 10.0.0.3 next-hop-local把通告给IBGP邻居的下一跳改成自己。这是实验里最常见的不通原因。第三个坑是关于选路顺序的误判。很多人在比较两条路由时只看着AS_PATH长度差不多就往下比MED却忽略了LOCAL_PREF的优先级更高。在HCIP考试里看选路题要按顺序一条一条比对不要跳到属性堆里直接挑数值好看的。第四个坑是我自己反复犯的改完MED或者LOCAL_PREF之后忘了刷新BGP路由结果在display里看到的还是旧值一度以为配置没生效。后面养成习惯每次调整策略都执行refresh bgp all再配合display bgp routing-table查看排查效率高很多。BGP这部分内容属于越用越顺的类型。你第一遍看完状态机和各种属性名称会觉得规则多到记不住但只要你进了eNSP把邻居建起来看几遍路由通告、改几条属性、再看着路由表里的优先路径发生变化那些干巴巴的概念就全部对上了。HCIP的BGP第一阶段说白了就是让你把这些基础的转发和决策逻辑刻进本能里。后面学路由反射器、团体属性、BGP策略的时候你会发现所有东西都还是建立在这些最基础的东西之上地基打得稳比刷多少题都管用。