BGP 是 HCIP 里绕不开的一关,尤其是带“综合”二字的场景题,很多人在这里翻车。我也见过不少同事把单点配置背得滚瓜烂熟,真到了多 AS、多邻居、多策略叠加的组网里,反而不知道先看哪条命令、先配哪个节点。这篇文章我按自己实际练过来的顺序,把 HCIP-BGP 综合涉及的东西从考点拆解到实验落地完整讲一遍。重点会讲三件事:综合题到底在考什么能力、一个多域组网实验怎么一步步搭起来、排错时该按什么顺序看。适合正在备考 HCIP 的工程师,也适合项目里需要快速捡起 BGP 综合配置、之后还要排障的人。
我不会再把官方文档抄一遍,而是尽量把“当时我是怎么想的”讲清楚——为什么这么规划地址,为什么用这台设备做反射器,为什么策略要挂在 import 方向而不是 export 方向。你跟着做一遍,应该比单纯刷题更能形成肌肉记忆。
1. HCIP-BGP 综合到底在考什么:四块考点与三种能力
1.1 先拆开四块核心考点
HCIP-BGP 综合这部分,内容上基本围绕四块展开。
第一块是 BGP 的工作原理和状态机。考点包括报文类型:Open、Update、Keepalive、Notification,另外还有 Route-Refresh。邻居状态机就是 Idle、Connect、Active、OpenSent、OpenConfirm、Established 这六个状态,考试最喜欢让你判断某个状态对应什么网络问题。连接建立在 TCP 179 端口上,所以 TCP 可达性是所有 BGP 邻居的前提,这个点后面排错要反复用到。
第二块是路由属性和选路规则。Origin、AS_Path、Next_Hop、Local_Pref、MED、Community 是出现频率最高的几个属性。选路规则是“先比 Preferred-Value,再比 Local_Pref,再比本地生成、AS 路径长度、Origin、MED……”这套顺序。综合实验题里最常用的控制手段就是改 Local_Pref 和 MED,这两者必须做到看到配置就能反推路径变化,而不是背下来就了事。
第三块是路由发布和过滤。network、import 两种发布方式,过滤手段包括 ip-prefix、route-policy、filter-policy、as-path-filter。这里有一个很容易混的点:filter-policy 管的是进入 IP 路由表的路由,而对外发布那条路由仍然可能被 BGP 学到。综合题里不要一上来就以为 filter-policy 能挡住所有通告。
第四块是高级特性。路由聚合 aggregate、路由反射器 reflector-client、联盟 confederation,以及安全配置,比如 GTSM、MD5 校验。HCIP 综合实验经常把反射器和聚合放在一个大题里,因为这两个特性能明显减少路由条目和邻居数量,能够考察你对网络规模的判断。
用表格总结一下:
| 板块 | 核心内容 | 典型命令/概念 |
|---|---|---|
| 原理与状态机 | 报文、TCP 179、六个状态 | display bgp peer、reset bgp |
| 属性与选路 | 常用属性、选路顺序 | route-policy apply local-preference / cost |
| 发布与过滤 | network/import、前缀与策略 | ip-prefix、route-policy、filter-policy |
| 高级特性 | 反射器、联盟、聚合、安全 | reflector-client、aggregate、confederation |
1.2 综合题真正考察的是三种能力
第一种能力是读懂拓扑意图。拿到一道综合题,别急着敲命令,先回答三个问题:哪些路由器之间是 eBGP?同一个 AS 内部有几台 BGP 设备,是不是全互联?如果没全互联,是用反射器还是联盟?这三个问题想清楚,实验骨架就有了。
第二种能力是“配置、命令与业务目标”的翻译能力。比如题目要求“AS 200 内部访问 10.1.0.0/16 时优先走某台设备”,你要能翻译成“在对应设备上对从外部学来的路由加大 Local_Pref”。再比如题目要求“R1 不希望把某网段的明细路由全部发给 AS 300”,你要能翻译成“在边界设备上做聚合或者前缀过滤”。翻译不出来,背再多命令也白搭。
第三种能力是验证和排错能力。综合题不会配完就结束,一定有一问是“查看结果并判断路径是否符合预期”。你得会用 display bgp routing-table 看 PrefVal、LocPrf、MED、NextHop 这几个关键字段,用 display bgp routing-table peer ... advertised-routes 看实际对外发布了什么。我后来带新人时发现一个规律:能在综合题里拿高分的人,基本都不是靠背命令,而是靠“先想清楚再动手”的习惯。这也是下面几章想帮你养成的习惯。
2. 建邻居之前先想清楚四件事:组网设计里的 BGP 决策
2.1 邻居关系怎么建:直连、环回还是多跳
BGP 邻居分 eBGP 和 iBGP,建法不太一样。eBGP 跨 AS,设备发出的报文默认 TTL 是 1,所以必须直连;如果题目给的图是环回口建 eBGP 邻居,一定要补一条peer <ip> ebgp-max-hop,不补的话邻居永远卡在 Active。iBGP 通常建议用环回口来建,物理链路断了还能通过其他路径收敛,配置时还要指定connect-interface LoopBack0。不过考题里为了简化,经常直接用直连网段建 iBGP,你要能接受这种设计,它是为了省去底层路由的配置。
无论哪种邻居,华为的命令结构都是两层:先建 peer,再进ipv4-family unicast地址族里 enable。这个结构很关键,有些人只写了peer ... as-number ...忘了 enable,结果邻居状态起不来。考试和现网都一样,进了地址族才能让 BGP 路由真正跑起来。
2.2 路由发什么、怎么发:network 和 import 的分工
BGP 发布路由有两条路。一是network:在 BGP 视图下声明一个网段,如果本机 IP 路由表里有这条精确路由,就把它发布出去。注意它只是个“发布开关”,并不产生路由,路由表里没有就发不出去。二是import:把直连、静态或者 IGP 路由引入 BGP,比如import-connect、import-static。
综合题里怎么选?业务网段一般用 network 发布,因为可以精确控制范围;设备互联地址、loopback 地址用 import-connect 发布,省得一条条 network。你要养成一个习惯:配置前先看 IP 路由表里有没有目标路由,再决定用哪种方式。如果 network 配完路由没出现在 BGP 表里,先检查是不是掩码不匹配或者路由表缺条目,而不是急着重配 BGP。
2.3 选路意图决定策略方向
BGP 的选路规则顺序如下(华为实现):
- Preferred-Value 越大越优
- Local_Pref 越大越优
- 本地通过 network/import 生成的路由优于学习到的路由
- AS_Path 越短越优
- Origin 类型:IGP 优于 EGP 优于 incomplete
- MED 越小越优(跨 AS 比较)
- eBGP 路由优于 iBGP 路由
- 到下一跳的 IGP 度量越小越优
综合实验最常用的两个抓手就是 Local_Pref 和 MED。Local_Pref 是在 AS 内部传递的,一般通过 import 方向的路由策略修改,值越大越优先;MED 是对外传递的,通过 export 方向修改,值越小越优先。拿到题先判断目标路径是“入 AS 方向的路径”还是“出 AS 方向的路径”,再决定改哪个属性,就不会把方向搞反。
2.4 常用属性一张表
| 属性 | 传递范围 | 影响方向 | 值的大/小 | 配置位置 |
|---|---|---|---|---|
| Preferred-Value | 本设备 | 本设备选路 | 越大越优 | peer preferred-value |
| Local_Pref | AS 内 | 出 AS 时的首选出口 | 越大越优 | route-policy apply local-preference |
| MED | 相邻 AS | 对端入方向 | 越小越优 | route-policy apply cost |
| AS_Path | 全局 | 选路/防环 | 越短越优 | route-policy apply as-path |
| Next_Hop | 逐跳改变 | 可达性 | —— | peer next-hop-local |
这里不要求你全记住,但解题时至少要在纸上画出“本地→AS 边界→对端”的箭头,把配置挂到对应箭头上。方向错了,后面越调越乱。
3. 多 AS 场景从零搭起:地址、配置、策略与验证全链路
3.1 实验拓扑与地址规划
我下面写一个典型的多 AS 综合实验,照着搭一遍基本能覆盖 HCIP-BGP 的常规考点。拓扑如下:四台路由器,R1 独立在 AS 100,R2 和 R3 在 AS 200,R4 独立在 AS 300。R1 连接 R2,R3 连接 R4,R2 和 R3 通过直连网段建立 iBGP。每个 AS 里都挂一个业务网段,R1 发布 10.1.0.0/16,R4 发布 172.16.0.0/16。
地址规划就按最简单的方式:
| 设备 | AS | 接口/用途 | IP 地址 |
|---|---|---|---|
| R1 | 100 | GE0/0/0 | 10.0.12.1/24 |
| R2 | 200 | GE0/0/0 | 10.0.12.2/24 |
| R2 | 200 | GE0/0/1 | 10.0.23.2/24 |
| R3 | 200 | GE0/0/1 | 10.0.23.3/24 |
| R3 | 200 | GE0/0/2 | 10.0.34.3/24 |
| R4 | 300 | GE0/0/2 | 10.0.34.4/24 |
| R1 | 100 | LoopBack0 | 1.1.1.1/32 |
| R4 | 300 | LoopBack0 | 4.4.4.4/32 |
R2、R3 各自加了环回口 2.2.2.2 和 3.3.3.3,目的先留着,后面做反射器或细节验证时能用上。
3.2 基础 BGP 配置:eBGP 与 iBGP 邻居
先看 R1。R1 要和对端 R2 建立 eBGP,并发布业务网段:
[R1] bgp 100 router-id 1.1.1.1 peer 10.0.12.2 as-number 200 # ipv4-family unicast peer 10.0.12.2 enable network 10.1.0.0 16R2 上同时有 eBGP 和 iBGP 两条邻居关系:
[R2] bgp 200 router-id 2.2.2.2 peer 10.0.12.1 as-number 100 peer 10.0.23.3 as-number 200 # ipv4-family unicast peer 10.0.12.1 enable peer 10.0.23.3 enableR3 的配置和 R2 对称:
[R3] bgp 200 router-id 3.3.3.3 peer 10.0.23.2 as-number 200 peer 10.0.34.4 as-number 300 # ipv4-family unicast peer 10.0.23.2 enable peer 10.0.34.4 enableR4 只连 R3,发布 172.16.0.0/16:
[R4] bgp 300 router-id 4.4.4.4 peer 10.0.34.3 as-number 200 # ipv4-family unicast peer 10.0.34.3 enable network 172.16.0.0 16配完之后先在每台设备上执行display bgp peer。看到对端状态是 Established,说明邻居完成。这里强调一点:华为设备的输出里会显示 State,状态是 Established 才算成功,卡在 Active 就要进入下一章的排错流程。
3.3 用 route-policy 调整选路结果
邻居起来之后,路由会自动通过 BGP 传播。但综合题一般会要求你控制路径。我给这个实验设置两个典型需求。
需求一:让 AS 200 内部访问 10.1.0.0/16 时,更倾向从 R2 进来。做法是在 R2 上对从 R1 学到的路由加大 Local_Pref:
[R2] route-policy LOCAL_PREF permit node 10 apply local-preference 200 # bgp 200 peer 10.0.12.1 route-policy LOCAL_PREF import理解一下这条配置:策略挂在 import 方向,意思是“从 R1 邻居收到路由时,把 Local_Pref 改成 200”。Local_Pref 默认 100,改成 200 后,AS 200 内部的 R3 只要学到这条路由,会比较它的 Local_Pref,自然会选 R2 作为出口。
需求二:让 R1 发往 R4 的路由里,10.1.0.0/16 的 MED 值改成 50,方便对端做选择性判断。在 R1 上加 export 方向的策略:
[R1] route-policy SET_MED permit node 10 apply cost 50 # bgp 100 peer 10.0.12.2 route-policy SET_MED export策略挂在 export 方向,意思是“发给 R2 的路由里,把 MED 改成 50”。MED 在跨 AS 时会传到 R4,R4 收到的 10.1.0.0/16 路由 MED 就会显示为 50。
这里最值得记住的是方向判断:改协议里传给自己的属性用 import,改协议里发出去给别人的属性用 export。这个判断贯穿所有策略配置。
3.4 验证命令与结果解读
配置加完,不要急着高兴。综合题最后一步永远是看结果。我习惯按这个步骤验证:
| 验证点 | 命令 | 看什么 |
|---|---|---|
| 邻居状态 | display bgp peer | State 是否为 Established |
| 全局路由表 | display bgp routing-table | 是否有预期路由、下一跳、MED、LocPrf |
| 发给某邻居的路由 | display bgp routing-table peer A.B.C.D advertised-routes | 实际通告了什么 |
| 策略是否生效 | display route-policy | Node、Match、Apply 是否正确 |
| 最终 BGP 配置 | display current-configuration configuration bgp | 眼过一遍,确认没漏 |
看表还要会读前缀标识:BGP 路由表里内部路由一般显示 i,外部路由显示 e,状态前面如果有*,表示这条路由有效;如果没有*,说明它虽然存在但不能被使用,多半是下一跳不可达。这一点直接衔接下一章。
4. 状态机卡住之后怎么办:从 Active 到 Established 的排错复盘
4.1 邻居卡在 Active:逐层排查的完整顺序
实际练实验时,邻居关系起不来是遇到最多的问题。命令显示对端状态是 Active,说明本端已经在尝试向对端发起 TCP 连接,但连接没有建立起来。这是 BGP 完整排错场景中最好复现的一个。
排查顺序我会按照下面这样走。先看 TCP 可达性,用 ping 对端地址,不通就先解决底层路由。然后看 peer 配置,display current-configuration configuration bgp里 peer 后面的 as-number 是否和对端 bgp 进程里的 AS 号一致。经常有人把 as-number 填成自己这边的 AS 号,两边都写错,TCP 能通但状态还是 Active。
再看是不是多跳 eBGP。R1 和 R4 如果中间隔着其他设备,又没有配ebgp-max-hop,BGP 报文到不了对端。配多跳邻居要在 peer 下加一条peer <ip> ebgp-max-hop 2,2 是允许跨越的跳数。
接着看环回接口邻居。同一 AS 内如果用 loopback 互相建邻居,需要保证对端能够通过 IGP 或静态路由学习到你的 loopback 地址,并且指定connect-interface LoopBack0。很多 iBGP 邻居卡 Active 不是因为 BGP 配置错,而是底层路由表里压根没有对端 loopback。
最后看 ACL 或防火墙控制策略。有些综合题会在接口上配 ACL,放行了业务流量却忘了放行 TCP 179,这种情况邻居也会一直起不来,但隐蔽性很强,一眼不容易看出来。
4.2 路由学得到却不可用:下一跳的隐藏逻辑
还有一类常见现象:BGP 邻居已经 Established,路由表里也看到了路由,但它前面没有*,ping 测试时也走不通。
我之前遇到的情况是:R2 通过 eBGP 从 R1 学到了 10.1.0.0/16,然后把它传给 iBGP 邻居 R3。理论上 R3 应该能学到,但 R3 上这条路由一直无效。用display bgp routing-table一看,NextHop 还是 10.0.12.1,也就是 R1 的接口地址,而 R3 的 IP 路由表里根本没有 10.0.12.1 这一项,下一跳不可达。
根因就在 iBGP 传递外部路由时,默认情况下不会把下一跳改成自己。解决办法是在 R2 上向 iBGP 邻居发布路由时强制修改下一跳:
[R2] bgp 200 peer 10.0.23.3 next-hop-local这条命令的意思是:给对端 R3 发布路由时,把 next-hop 改成 R2 自己的地址。配完后再 display,R3 上这条路由的 NextHop 就变成 10.0.23.2,状态开始有效。
这个坑值得记下来。HCIP 综合题里,只要涉及 eBGP 边界到 iBGP 内部再往外传的二层场景,next-hop 的处理很容易丢分。
4.3 策略下发后不生效:三个高发原因
还有一个更隐蔽的坑:配置了 route-policy,display 显示也有这条策略,但路由选路结果完全没变。我总结出三个高发原因。
第一,策略没挂到正确的 peer 上。route-policy 单独定义好不会自动生效,必须在bgp视图下通过peer ... route-policy ... import/export挂到具体邻居方向。挂错邻居,比如在 iBGP 邻居上做了 import 方向的 Local_Pref 策略,但路由是从 eBGP 邻居进来的,等于白配。
第二,方向搞反。import 和 export 弄反是最常见的应试错误。判断方法很简单:看策略想影响的属性在哪个 AS 里被使用。Local_Pref 影响本 AS 内选路,所以在入方向的 peer 上挂;MED 发给对端去比较,所以在出方向的 peer 上挂。
第三,节点顺序或者匹配条件写错。route-policy 是按 node 数值从小到大逐个匹配的,一旦命中某个 permit 节点就会停止继续匹配。如果你开头写了一个deny node 5配成通配,后面 node 10 写得再漂亮也没用。另外 ip-prefix 的掩码范围如果写错,比如少写了greater-equal,生效的路由范围可能完全不是你想的。
每次调整策略后,我都会执行refresh bgp all import或refresh bgp all export软刷新,让新策略尽快生效。整个排查链路走完,基本能覆盖 HCIP 综合题里一半以上的排错考点。
5. 按这个节奏练一周,BGP 综合题会顺很多
5.1 十天练习节奏:从单点到综合
如果你是从零开始,我给一个比较稳的练习节奏。前两到三天只练基础配置加状态机验证,用四台设备组一个简单的两 AS 组网,敲一遍建立邻居的完整命令,看到 Established 再继续。第四到五天练属性和策略,每改一个属性值,都做一次前后对比,记录路径变化。第六到八天做综合复盘,固定一个拓扑不变,把考试可能出现的目标轮换一遍:改选路、做过滤、做反射器、做聚合、做路由通告控制。目标是看到目标条件就能反应出具体配置命令。第九到十天回到排错,把前面遇到过的所有异常整理成清单,互相出题盲测。
这个节奏核心就是多动手。BGP 综合题不是背下来的,是自己一遍遍配置、验证、排错排出来的。最好每完成一个目标就把配置清掉,重搭一遍,重点练速度。
5.2 考场上容易被忽略的细节
考场上时间紧凑,有几个细节值得提前盯住。
命令行一定要记得进地址族。华为设备 BGP 的不少配置要同时写在普通 BGP 视图和 IPv4 单播地址族视图下。我见过有人把 peer enable 漏在 ipv4-family 外面,邻居状态一直起不来。
改完配置先 display 再继续。每完成一小步就做一次验证,不要让错误一路累积到最后才查。用小命令存现场,比如display bgp peer、display bgp routing-table peer ... advertised-routes,输出短、信息准。
重置邻居要优先用软重置。快速重读配置用refresh bgp all import/export,不要一上来就reset bgp all,后者会拆掉所有邻居关系。模拟环境里路由小可能问题不大,但如果实验规模大,一边重置一边等恢复的时间就白白损耗掉了。
5.3 我给自己的三条铁律
这些东西实践多次以后就成了我自己的经验铁律,分享出来。
第一,先画邻居图再敲命令。把所有 BGP 关系抽象成本端地址/AS 号、对端地址/AS 号两张表,每一步配置都能对应上图中某一条边。第二,策略方向用箭头标出来。凡是 import 就是外部指向设备本体,凡 export 就是设备本体指向外部,画在纸上就能避免最蠢的方向错乱。第三,任何策略改动以后,用“配置确认—路由表确认—软刷新”三步闭环,别改完就跑。
我个人最受益的做法是:每次实验结束,把完整的display bgp routing-table输出存下来,隔天不看配置,直接看图反推当时的策略。你把它当一个强迫症的小习惯来养,对理解 BGP 真的很有帮助。HCIP-BGP 综合真正的作用不只是让你过一科考试,而是把 BGP 从一个需要死记的命令集合变成一套能推理、能验证的系统。平时练习多问自己“为什么这条命令放在这里、为什么这个属性会改变路径”,考场上就不会慌。这个习惯带到项目里,长远来看比证书本身更有用。