跳到正文
Lutong's Homepage

华为H3C实战 | 第12章 BGP 协议配置详解

📚 本系列共 43 篇(第 12 / 43 篇) · 第二卷 路由与广域网篇 —— 让数据找到路

← 上一篇:第 11 章 OSPF 协议配置详解  下一篇:第 13 章 IS-IS 协议配置详解 →


本章导读:OSPF 管的是"村里怎么走",BGP 管的是"邻村之间怎么交换地址簿"。记住一句话:BGP 是策略协议,不是算法协议——它通了只是开始,选路对了才算交付。本章讲 EBGP 对接运营商、IBGP + RR,以及两家在策略调整上的写法差异。

本章结构:

  • 12.1 功能原理与业务场景 —— “几个村子签快递协议"的比喻、AS 路径防环、TCP 三次握手 + Open/Update/Keepalive 的状态机、IGP 与 EGP 的分工
  • 12.2 华为设备配置详解 —— 三个模板:EBGP 对接运营商、IBGP 全互联 + 路由反射器(RR)、联邦骨架;connect-interface 为什么必须配、next-hop-local 在解决什么、import/export 的语义
  • 12.3 H3C 设备配置详解 —— 先理清视图结构,再给 EBGP 与 RR 两套模板,最后是路由策略调整、四个关键差异,以及本章命令的官方核实结果
  • 12.4 命令对照表 —— 两家并排
  • 12.5 配置验证 —— 五层验证法:邻居 → 能力 → 路由 → 选路 → 策略,第一眼看 display bgp peer 是不是全部 Established
  • 12.6 排错与故障树 —— 按状态机走:Idle(单向配置/路由不可达)、Active(179 端口被拦)、OpenSent 卡住(AS 号或 Router-ID)
  • 12.7 新手踩坑 —— AS 号填错、EBGP 跨跳忘了 ebgp-max-hop
  • 12.8 本章小结 —— 要点清单 + 自测题

重点提示:邻居起不来,先查 TCP 再查 BGP——Active 表示 TCP 都打不通(链路/路由/179 端口),这是 12.6 的分水岭。邻居 Established 但路由不对,直接跳 12.5 的"路由"和"选路"两层,别在邻居上耗时间。AS 号填错永远是第一大原因。 关联章节:前置的路由基础见第 10 章、IGP 怎么把 Loopback 宣告出去见第 11 章;BGP 的属性调整、前缀列表与 route-policy 见第 17 章;出口 NAT 与 BGP 的配合见第 14 章。

12.1 功能原理与业务场景

12.1.1 这功能是干嘛的(通俗版)

前面几章讲的 OSPF、IS-IS 解决的都是「一个村子内部的路怎么走」。可互联网是几万个村子连在一起,各有各的规矩、各算各的路,要串门就得有人告诉邻村「我们村有哪些地址、从我家大门进来怎么走」。

边界网关协议(BGP,Border Gateway Protocol)[16] 干的就是这件事:它是两个村子之间签的快递协议,只负责把自家的地址簿发给邻村,并声明「这些地址交给我、我负责送过去」;至于村子内部从家门到门口这一段怎么走,BGP 不管,交给村里的 OSPF 去算。

这个比喻还能剥三层:

  • 地址簿就是路由表:写着「目的地网段 + 从哪个门出去 + 路上经过几个村」。邻村抄走后不能把它原样抄回去——这就是靠「经过的村」(AS 路径)防环。
  • 签约要有身份:邻居间先亮出自己属于哪个村(自治系统号,AS 号),对不上就不签——「AS 号填错」永远是邻居建不起来的第一大原因。
  • 签约像打官司:先接通电话(TCP 三次握手),再互验身份(Open),再点清清单(Update),最后双方点头(Keepalive);中途一句话没对上就谈崩。

记住一句话:BGP 是「策略协议」,不是「算法协议」。OSPF 靠公式算路,BGP 靠一串可被人改写的规则选路,几乎每条路由都能被改掉、拦掉、偏袒掉——所以运维圈说「BGP 通了只是开始,选路对了才算交付」。

12.1.2 在网络里怎么落地(设计视角)

先分清楚 IGP 和 EGP

路由协议按作用范围分两类:跑在自治系统内部的是内部网关协议(IGP),跑在自治系统之间的是外部网关协议(EGP)。IGP 负责「把村里的路算对」,EGP 负责「把各村的地址簿交换好」。

自治系统(AS,Autonomous System) 是被同一机构管辖、对外采用统一路由策略的网络,用 AS 号标识:传统 2 字节号范围 165535,不够用后扩展出 4 字节号。公用号由注册机构分配,私有号范围 **6451265535**,用于内部实验与私有对接——本教材示例一律用这一段。

对比项 IGP(OSPF / IS-IS) EGP(BGP)
作用范围 一个 AS 内部 AS 之间(以及 AS 内部传递外部路由)
目标 算出一条最优路径 按策略交换与筛选路由
规模 几十到几百台设备 全球几十万条路由
收敛方式 拓扑变化即重算 增量更新(Update)
选路依据 最小 cost 一组可被策略修改的属性
典型协议 OSPF、IS-IS、RIP BGP-4

为什么用 TCP

IGP 大多用组播互相发现,BGP 选的却是传输控制协议(TCP),端口 179,理由有三:

  1. 邻居可能隔着几十跳。要和几千公里外的运营商对等体建邻居,中间的链路替它扛不起「可靠传输 + 会话保持」,只能让 TCP 自己做。
  2. 报文大且需要可靠。一条路由带几十个属性,Update 报文还要分块传输,直接用 TCP 的重传与流控省掉了自研可靠传输的工作量。
  3. 断了之后有全量重传的兜底,且 TCP 之上可以再挂 MD5 摘要(BGP 的 password)做认证。

代价也来自 TCP:它带来了 TTL 限制与「路由依赖路由」的鸡生蛋问题。建会话本身需要到对端地址的路由,若这个地址又要靠 BGP 学回来,就永远建不起来——这正是「next-hop 要用 IGP 保证可达」的根因。

本章拓扑

本章所有模板都基于下面这张图:左侧是公司网络(AS 65001),右侧是运营商(AS 65002,用私有号模拟),中间两条对外链路:

                    AS 65002(运营商,模拟)
                   10.200.200.0/24 = 110.1.0.0/16 的下一跳
                +---------------------------+
                |   ISP-R(MSR3610-X1)      |
                |   Loopback0 10.200.200.2  |
                +---------------------------+
                   | 172.16.12.0/30            | 172.16.13.0/30
                   | .1 (ISP 侧)               | .1 (ISP 侧)
       +-----------+                           +-----------+
       |                                                       |
 172.16.11.0/30                                       172.16.14.0/30
       |                                                     |
[HUAWEI-Edge1  AR6140-16G4XG]                     [HUAWEI-Edge2  AR6140-16G4XG]
  AS 65001                                          AS 65001
  GE0/0/0 172.16.12.2(连 ISP)                     GE0/0/0 172.16.13.2(连 ISP)
  GE0/0/1 172.16.11.1(连 Core1)                   GE0/0/1 172.16.14.1(连 Core2)
  Loopback0 10.200.1.254                            Loopback0 10.200.2.254
       |                                                     |
       +-----> 172.16.11.0/30 / 172.16.14.0/30 <------------+
                        |                     |
              [HUAWEI-Core1  S5735-L24T4S-A1] [HUAWEI-Core2  S5735-L24T4S-A1]
               Loopback0 10.200.1.1              Loopback0 10.200.2.1
               Vlanif10  192.168.10.1           Vlanif20  192.168.20.1
               (办公网段)                       (服务器网段)
                       \_____ 10.200.1.0/30 _____/

理解这张图的三个要点:

第一,Edge1/Edge2 是「门口的快递员」:一只脚在 AS 65001、一只脚在 AS 65002,对外跑 EBGP、对内跑 IBGP,把内网网段告诉运营商。

第二,Core1/Core2 只跑 IBGP 和 OSPF:不直连运营商(EBGP 缺省要求直连),用 Loopback 与 Edge 建 IBGP,由 OSPF 保证对方 Loopback 可达。

第三,同一 AS 内的 IBGP 也必须成对建。规则是:从 IBGP 学来的路由不会再传给另一个 IBGP 邻居(防环)。所以 Core2 想拿到 Edge1 学来的运营商路由,要么与 Core1 全互联,要么上路由反射器。本章采用 RR 方式:Edge1 当反射器,Core1、Core2 当客户机。

邻居关系一览

设备 在本 AS 内的角色 对端 对端地址 类型
Edge1 路由器反射器(RR) ISP-R / Core1 / Core2 172.16.12.1 / 10.200.1.1 / 10.200.2.1 1 条 EBGP + 2 条 IBGP
Edge2 客户机 ISP-R / Edge1 172.16.13.1 / 10.200.1.254 1 条 EBGP + 1 条 IBGP
Core1 / Core2 客户机 Edge1 10.200.1.254 各 1 条 IBGP(Loopback 建)

把这六条全建通,剩下的就是宣告、策略、选路。

EBGP 与 IBGP:一字之差,规矩全变

这是初学者最容易糊涂的地方。同样是 BGP,一旦对端在本 AS 内,规则立刻换了一副面孔:

对比项 EBGP(对等体在别 AS) IBGP(对等体在本 AS)
AS 号 对端 AS 号 ≠ 本机 AS 号 对端 AS 号 = 本机 AS 号
起包 TTL 缺省 1,必须直连 缺省 255,可跨多跳
报文 next-hop 改成自己的接口地址 保持不变
是否需要 IGP 可达 不需要(直连即可) 必须要(这是 IBGP 最大的坑)
防环靠什么 AS 路径(AS_PATH) 水平分割(学自 IBGP 不传 IBGP)
典型用途 对接运营商、跨 AS 组网 把 EBGP 路由传遍本 AS

逐条解释这张表:

AS 号是身份:本机 bgp 65001、peer 172.16.12.1 as-number 65002,两边声明一致才握手成功;不一致就永远卡在 Idle 或 Active。

TTL 是防旁路的闸:EBGP 缺省 TTL=1,一条 BGP 报文最多走一跳,防止 AS 间会话被第三方设备绕进去;IBGP 缺省 255,因为对端可能隔着十几跳。

next-hop 决定这条路由能不能用:EBGP 发路由时把 next-hop 改成自己的接口地址;IBGP 发路由时保持不变,于是运营商地址一路传进 AS 内部。这就是「EBGP 路由进入 AS 后,AS 内设备必须能直达那个外部地址」的由来——否则 BGP 表里看得到、主路由表里进不去。

防环靠不同的东西:EBGP 靠 AS 路径,每经过一个 AS 就在头部加自己的 AS 号,发现自己的号已在路径里就丢弃;IBGP 靠水平分割——从 IBGP 学来的路由不发给任何 IBGP 邻居。

解决水平分割的两种办法:一是 Full Mesh,N 台设备两两建会话,共 N×(N-1)/2 条,10 台要 45 条、50 台要 1225 条,不可维护;二是 路由反射器(RR),客户机只与 RR 建邻居,由 RR 替它们转发。本章采用 RR。

数据的实际流向:以办公网 192.168.10.0/24 访问运营商侧 110.1.0.0/16(模拟地址)为例:

   业务流(数据面)
   PC(192.168.10.x) --> Core1 --> Edge1 --> ISP-R --> 110.1.0.0/16
                          ^         ^
                          |         |  两段路由,缺一不可
   控制面:Core1 路由表         Edge1 路由表
       192.168.10.0/24 直连     192.168.10.0/24 由 IBGP 学到(next-hop 指向 Core1)
       110.1.0.0/16 BGP 学到     110.1.0.0/16 由 EBGP 学到(next-hop 172.16.12.1)

两个方向都要有路由:Core1 靠 OSPF 知道办公网段,靠 **IBGP(从 Edge1 学)**知道运营商网段;ISP-R 靠 EBGP(从 Edge1 学)知道我们的地址。「全网可达」由两种协议拼出来:AS 内的地址与会话源地址由 OSPF/IS-IS 保证,AS 之间的地址靠 BGP 交换,缺一边数据都过不去。

报文与状态机。BGP 只有四种主要报文:

报文 作用 类比
Open 问候并交换能力:AS 号、Router-ID、Hold Time、能力参数 交换名片、报出身份
Keepalive 心跳,缺省 60 秒一次 打个电话确认在线
Update 携带路由的属性;撤销路由也用 Update 寄地址簿的新页或撤回页
Notification 报错并关闭会话 对方说「谈不下去了」,挂电话

会话建立走一个六状态机,每个状态的检测点都不同:

  1. Idle:还没开始,或在等重启计时器。
  2. Connect:已发出 TCP SYN,等待对端回应。
  3. Active:TCP 连接失败、正在反复重连。这是最误导人的状态名——不是「活跃」,而是「我打不通」。卡在 Active,八成是地址不可达、179 被挡、connect-interface 配错或 ebgp-max-hop 没配。
  4. OpenSent:TCP 已建立,已发 Open,等对方的 Open。
  5. OpenConfirm:双方 Open 都收到,等对方的 Keepalive。
  6. Established:开始交换 Update,只有到了这里邻居才算真的建起来。

排错口诀:Idle/Active 查 TCP;OpenSent 查 AS 号、Router-ID、认证、版本;OpenConfirm 查 Keepalive 与 Hold Time;Established 但没路由查 network、next-hop、策略。

network 宣告:只宣告「路由表里真实存在且掩码精确一致」的路由

BGP 的 network 与 OSPF 的 network 完全不同:OSPF 用反掩码把接口 IP 纳入进程,BGP 的 network x.x.x.x mask 255.255.255.0 则是去路由表里找有没有这条精确路由,找到才发。

两条硬性条件:路由表里必须已有这条网段(直连、静态、OSPF 都行),且掩码必须完全一致——/24 写成 /25 或 /16 都发不出。所以「宣告了但邻居收不到」,九成不是 BGP 的错,而是本机路由表里没有这条精确路由。

另一条路是 import-route(重发布),主动去直连、静态、OSPF 等路由源里取路由,同样生成一条本地始发路由。风险有二:搬得太多(一次 import-route direct 可能把互联段、管理段全送给运营商看),源路由消失后不一定自动撤销(静态路由删了,BGP 里还可能挂着)。

选路原则

BGP 选路按固定顺序逐条比较,先分出胜负就选它、后面不看。华为文档有十余条规则,本章压成最常用的 9 条:

顺序 比较项 缺省值 比较方向 常见用途
1 协议首选值(Weight,华为私有) 0 大者优 本机选路,不出 AS
2 本地优先级(Local_Pref) 100 大者优 本 AS 全体选出口(多数场景的主力)
3 本地始发(network / aggregate / import-route) — 本地始发优先 本机产生的最优先
4 AS 路径长度 实际长度 短者优 绕路多路径的自然淘汰
5 起源(Origin) IGP 来源记为 I I < E < ? 由 network 产生的优先
6 MED(缺省 0) 0 小者优 相邻 AS 之间「你选哪条进来」
7 EBGP 优于 IBGP — EBGP 优先 从外部学来的优先于内部反射的
8 到下一跳的 IGP cost 实际 cost 小者优 本 AS 内离出口最近的设备胜出
9 Router-ID 小者优先 — 小者优 最后的兜底,通常用于等同路由

几条细节必须说透:

Weight 是华为私有属性,只在本机生效、不传邻居,适合在双出口设备上给主出口加权。

Local_Pref 只在 IBGP 之间传递,发给 EBGP 邻居时会被剥掉,所以它最有效的用法是从 RR 或边界设备「往内打」。

本地始发优先于 AS 路径:自己 network / import-route 产生的路由,哪怕 AS 路径更长也优先——「我明明配了更好的路径,怎么还走我自己宣告的」,就是这一条在起作用。

MED 只在相邻 AS 间比较、小者优,多数 ISP 不认客户发来的 MED,只能当参考。EBGP 优于 IBGP 体现「外部视野优先」。到下一跳的 IGP cost 最容易被忽略:一旦比到这一条,谁离出口近谁胜,于是不同设备可能选出不同出口。

路由策略:BGP 的「闸门」

BGP 与 IGP 最大的区别是策略优先:每条路由的进和出都能被单独定义。常用工具五类:

工具 作用对象 典型场景 方向
peer ... filter-policy import / ip-prefix 按目的网段过滤 只收运营商的特定网段 收 / 发
peer ... as-path-filter 按 AS 路径正则匹配 拦截从某家 ISP 绕过来的路由 收 / 发
peer ... route-policy import/export 综合匹配 + 改属性 改 Local_Pref / MED / 打标记 收 / 发
apply community + peer ... advertise-community 打团体属性 跨设备批量筛选路由 传出
peer ... route-limit / discard-extra 数量上限 防邻居发来 100 万条把内存打爆 收

团体属性(Community) 是可以自定义的 32 位标签,用「AS 号:数值」写在路由上随路由传递,接收方能用 route-policy 匹配、修改、过滤它,相当于「一次打标、处处生效」。但它缺省不会传出门,必须在邻居上配 peer ... advertise-community——这是踩坑榜前列的错误。

路由反射器(RR) 的规则只有四条:从非客户机学来的路由反射给所有客户机;从客户机学来的路由反射给除来源外的所有客户机与非客户机;反射时不改变 next-hop 等属性。

RR 与客户机构成一个簇(Cluster),用 cluster-id 标识(缺省取 RR 的 Router-ID);多台 RR 冗余时同簇的 cluster-id 推荐配成一致。

联邦(Confederation) 是另一种拆解全互联的办法:把大 AS 拆成若干子 AS,子 AS 内跑 IBGP、子 AS 间跑「联邦 EBGP」。对外仍表现为一个 AS,代价是配置复杂。本章只给骨架,实战中 RR 更常用。

适用版本:华为 VRP V200R019 及以上(AR6000 系列);H3C Comware V7(R2610 及以上)。

12.2 华为设备配置详解

12.2.1 命令行基础速览(本章会用到的那几条)

先把本章反复出现的华为命令按「建对等体 / 宣告 / 调优 / 查看」分四类列出来,混个脸熟:

# 进入 BGP 进程视图,参数是本 AS 号(私有 AS 号范围 64512~65535)
bgp 65001

# 配置 Router-ID(缺省取最大的 Loopback 地址)
 router-id 10.200.1.254

# 建 EBGP 对等体:对端在别 AS
 peer 172.16.12.1 as-number 65002

# 建 IBGP 对等体:对端在本 AS,必须用 Loopback 做源
 peer 10.200.1.1 as-number 65001
 peer 10.200.1.1 connect-interface LoopBack0

# EBGP 跨设备对接(非物理直连)时放宽 TTL
 peer 172.16.12.1 ebgp-max-hop 2

# 给对等体加描述,运维排错时救命
 peer 172.16.12.1 description To-ISP-R

接下来是宣告与调优类命令:

# 进入 IPv4 单播地址族,宣告与策略都在这里配
bgp 65001
 ipv4-family unicast
  # 宣告网段:要求本机路由表里有精确存在的同掩码路由
  network 192.168.10.0 255.255.255.0
  # 从 IBGP 邻居学来的路由,发出时把下一跳改成本机
  peer 10.200.1.1 next-hop-local
  # 团体属性必须显式允许传出,否则邻居看不到
  peer 10.200.1.1 advertise-community
  quit

# 以下三条在 BGP 进程视图里配
 # 把本机设为反射器、把对端设为客户机
 peer 10.200.1.1 reflect-client
 # TCP MD5 认证,两端必须完全一致
 peer 10.200.1.1 password cipher Bgp@2024
 # 重发布直连路由(有风险,务必配 route-policy 限制范围)
 import-route direct

最后是查看类命令,排错时这是你的「听诊器」:

# 看邻居状态与收发的路由数量
 display bgp peer
# 看某个邻居的详细参数(连接源、TTL、Keepalive、能力协商)
 display bgp peer verbose
# 看 BGP 路由表与指定邻居的收发路由
 display bgp routing-table
 display bgp routing-table peer 172.16.12.1 advertised-routes
 display bgp routing-table peer 172.16.12.1 received-routes

视图层级先记住,敲错视图是新手最普遍的报错来源:

视图 提示符 能配什么
系统视图 [HUAWEI] ip ip-prefix、route-policy、ip as-path-filter
BGP 进程视图 [HUAWEI-bgp] peer as-number、connect-interface、password、reflect-client
BGP IPv4 地址族视图 [HUAWEI-bgp-af-ipv4] network、import-route、next-hop-local、advertise-community、filter-policy
路由策略视图 [HUAWEI-route-policy] if-match、apply

特别注意:next-hop-local、advertise-community、filter-policy 都在 ipv4-family unicast 视图下,而 as-number、connect-interface、password、reflect-client 在 BGP 进程视图下。跨厂商互查配置时最容易在这里出错。

再看几个关键参数的缺省值,配之前对照一下:

参数 华为缺省值 说明
BGP 版本 4 与 H3C 缺省一致
Hold Time 180 秒 Keepalive 缺省 60 秒(Hold 的 1/3)
EBGP 起包 TTL 1 IBGP 为 255
Local_Pref 100 只在 IBGP 内传递
Weight 0 华为私有,本机有效
MED 0 只在相邻 AS 间比较

12.2.2 完整配置模板

模板一:EBGP 对接运营商(Edge1,AR6140-16G4XG)

先配 Edge1 的底层:两个物理口、一个 Loopback,再用 OSPF 把内网互联段与 Loopback 宣告出去,保证 IBGP 的源地址互相可达。

# ===== Edge1 第一阶段:接口地址 + OSPF 保证 Loopback 可达 =====
system-view
sysname HUAWEI-Edge1

# Loopback 作为 IBGP 会话的源地址与 Router-ID 的来源
interface LoopBack0
 ip address 10.200.1.254 255.255.255.255
 quit

# GigabitEthernet0/0/0 接运营商(EBGP),GigabitEthernet0/0/1 接内网核心
interface GigabitEthernet0/0/0
 ip address 172.16.12.2 255.255.255.252
 quit
interface GigabitEthernet0/0/1
 ip address 172.16.11.1 255.255.255.252
 quit

# OSPF 只负责内网:Loopback 与互联段
ospf 1 router-id 10.200.1.254
 bandwidth-reference 1000
 area 0
  network 10.200.1.254 0.0.0.0
  network 172.16.11.0 0.0.0.3
  quit
 # 把一条指向运营商的默认路由引入 OSPF,让内网知道出口在哪
 default-route-advertise always
 quit
quit

接着配置 BGP 进程本身,这是本章的核心:

# ===== Edge1 第二阶段:BGP 进程、EBGP 对端、IBGP 对端(RR)=====
bgp 65001
 # 手工指定 Router-ID:本机 Loopback
 router-id 10.200.1.254

 # 与运营商建 EBGP:对端是 65002,物理直连,TTL 缺省 1
 peer 172.16.12.1 as-number 65002
 peer 172.16.12.1 description To-ISP-R

 # 与 Core1 建 IBGP,源地址用 Loopback
 peer 10.200.1.1 as-number 65001
 peer 10.200.1.1 connect-interface LoopBack0
 peer 10.200.1.1 description To-Core1

 # 与 Core2 建 IBGP,同样用 Loopback
 peer 10.200.2.1 as-number 65001
 peer 10.200.2.1 connect-interface LoopBack0
 peer 10.200.2.1 description To-Core2

 # 进入 IPv4 单播地址族,宣告与策略都在这里配
 ipv4-family unicast
  # 把办公网段宣告给运营商,前提是本机路由表有 192.168.10.0/24
  network 192.168.10.0 255.255.255.0
  network 192.168.20.0 255.255.255.0

  # EBGP 邻居的进出策略也挂在地址族视图下:只收 110.1.0.0/16 段,只发公司网段
  peer 172.16.12.1 filter-policy ip-prefix PREFIX_FROM_ISP import
  peer 172.16.12.1 route-policy RP_TO_ISP export
  quit
 quit

注意这里的 network 有个前提:本机路由表里必须有这两条精确路由。模板一中 Edge1 的 OSPF 只宣告了 Loopback 与互联段,所以它没有这两条——宣告了也不发出去,这是很多人卡一整天的地方。修正办法是让 OSPF 宣告这些网段,或在 Edge1 上 import-route ospf 1;下一段给出带策略限制的正确写法。

继续补齐 Edge1 的完整宣告、下一跳处理与 IBGP 防环:

# ===== Edge1 第三阶段:宣告、下一跳与反射器 =====
bgp 65001
 ipv4-family unicast
  # 把 OSPF 学来的内网路由重发布进 BGP,但要限制范围
  # 不做限制会把互联段 172.16.x 也送给运营商,属于典型事故
  import-route ospf 1 route-policy RP_TO_BGP

  # 从 IBGP 邻居学来的路由,下一跳要改成自己,否则 AS 内设备不可达
  peer 10.200.1.1 next-hop-local
  peer 10.200.2.1 next-hop-local

  # Edge1 当路由反射器,Core1/Core2 是客户机
  peer 10.200.1.1 reflect-client
  peer 10.200.2.1 reflect-client

  # 允许团体属性传给两个 IBGP 邻居
  peer 10.200.1.1 advertise-community
  peer 10.200.2.1 advertise-community

  # 只接受运营商发来的、AS 路径以 65002 结尾的路由,挡掉绕路来的坏路由
  peer 172.16.12.1 filter-policy ip-prefix PREFIX_FROM_ISP import
  quit
 quit
quit

这段模板引用了两个策略对象,需要先在系统视图下定义:

# ===== Edge1 第四阶段:策略对象定义(系统视图)=====
system-view

# 前缀列表:只匹配 110.1.0.0/16 及更细的子网,用于收运营商路由时过滤
ip ip-prefix PREFIX_FROM_ISP index 10 permit 110.1.0.0 16 less-equal 24

# 路由策略:只把公司网段送给运营商,其他一律不发
ip ip-prefix LAN_ONLY index 10 permit 192.168.10.0 24
ip ip-prefix LAN_ONLY index 20 permit 192.168.20.0 24
route-policy RP_TO_BGP permit node 10
 if-match ip-prefix LAN_ONLY
 quit
quit

# 收运营商路由时,给所有进来的路由打上团体属性,便于内网统一筛选
route-policy RP_FROM_ISP permit node 10
 apply community 65001:100
 quit
quit

filter-policy 的缺省行为是「匹配的放行,不匹配的丢弃」,所以 PREFIX_FROM_ISP 只放行 110.1.0.0/16 段内掩码 16~24 的路由。要打标记、改 MED 就得改用 route-policy。

最后,把主链路、备份链路与选路捏在一起:Edge1 是主出口,Edge2 是备份。用 Local_Pref 让 Core 走 Edge1,用 MED 让运营商从 Edge1 进来。两个策略对象都在系统视图里先定义好:

# ===== 策略对象:抬高本地优先级 + 设置 MED(系统视图)=====
system-view
route-policy RP_TO_IBGP permit node 10
 # 发给 IBGP 邻居的路由本地优先级抬到 200,缺省 100
 apply local-preference 200
 quit
quit

route-policy RP_TO_ISP permit node 10
 # 发给运营商的路由设置 MED=100,缺省 0
 apply cost 100
 quit
quit

再回到 BGP 地址族视图,把两个策略挂到对应邻居上:

# ===== Edge1 第五阶段:出口优先级与 MED(挂策略)=====
bgp 65001
 ipv4-family unicast
  # 对 Core 发路由时抬高本地优先级,让他们优先选本机出口
  peer 10.200.1.1 route-policy RP_TO_IBGP export
  peer 10.200.2.1 route-policy RP_TO_IBGP export
  # 对运营商宣告时带 MED,引导它从本机进来
  peer 172.16.12.1 route-policy RP_TO_ISP export
  quit
 quit
quit

注意 Local_Pref 只在 IBGP 之间传递:对 EBGP 邻居抬 Local_Pref,命令敲得上,对方收到的仍是缺省值。所以「给运营商调优」只能用 MED。

模板二:IBGP 全互联 + RR(Core1 / Core2)

Core1 与 Core2 的配置结构相同,只换地址与描述。先给 Core1(S5735-L24T4S-A1):

# ===== Core1:S5735-L24T4S-A1,IBGP 客户机 =====
system-view
sysname HUAWEI-Core1

interface LoopBack0
 ip address 10.200.1.1 255.255.255.255
 quit
interface Vlanif10
 ip address 192.168.10.1 255.255.255.0
 quit
interface Vlanif11
 ip address 172.16.11.2 255.255.255.252
 quit

# OSPF 负责内网可达:Loopback、办公网段、互联段
ospf 1 router-id 10.200.1.1
 bandwidth-reference 1000
 area 0
  network 10.200.1.1 0.0.0.0
  network 192.168.10.0 0.0.0.255
  network 172.16.11.0 0.0.0.3
  quit
 quit
quit

Core1 的 BGP 配置很短,因为客户机只管连 RR:

# ===== Core1:BGP 只连 Edge1(RR)=====
bgp 65001
 router-id 10.200.1.1
 # Source 必须用 Loopback,与 RR 侧的 connect-interface 一致
 peer 10.200.1.254 as-number 65001
 peer 10.200.1.254 connect-interface LoopBack0
 peer 10.200.1.254 description To-Edge1-RR
 ipv4-family unicast
  # 客户机一般不配 next-hop-local:它不替别人转发外部路由
  # 允许团体属性传递,RR 打上的标记才收得到
  peer 10.200.1.254 advertise-community
  quit
 quit
quit

Core2 只换地址与描述,其余结构相同:

# ===== Core2:S5735-L24T4S-A1,IBGP 客户机 =====
system-view
sysname HUAWEI-Core2
interface LoopBack0
 ip address 10.200.2.1 255.255.255.255
 quit
interface Vlanif20
 ip address 192.168.20.1 255.255.255.0
 quit
interface Vlanif14
 ip address 172.16.14.2 255.255.255.252
 quit
ospf 1 router-id 10.200.2.1
 bandwidth-reference 1000
 area 0
  network 10.200.2.1 0.0.0.0
  network 192.168.20.0 0.0.0.255
  network 172.16.14.0 0.0.0.3
  quit
 quit
quit
bgp 65001
 router-id 10.200.2.1
 peer 10.200.1.254 as-number 65001
 peer 10.200.1.254 connect-interface LoopBack0
 peer 10.200.1.254 description To-Edge1-RR
 ipv4-family unicast
  peer 10.200.1.254 advertise-community
  quit
 quit
quit

模板三:联邦骨架(了解即可)

联邦把 AS 65001 拆成两个子 AS 65010 与 65020,对外声明仍是 65001。下面只给骨架,不配完整策略:

# ===== 子 AS 内部的边界设备:声明联邦身份与对端子 AS =====
bgp 65010
 # 对外表现的 AS 号是 65001,不是 65010
 confederation id 65001
 # 对端属于联邦内的子 AS 65020
 confederation peer-as 65020
 peer 172.16.15.1 as-number 65020
 peer 172.16.15.1 description To-SubAS-65020
 quit
quit

联邦最容易被误解的一点是:子 AS 之间的 BGP 邻居,报文里仍然带着真实的私有子 AS 号,但在对外宣告时,AS 路径里会被替换成「联邦 ID + 联邦外的 AS」,因此外部世界只看得到 65001,看不到 65010 和 65020 这两层。这一点在抓包时最容易迷惑人——你看的包里的 AS 号跟对端路由表显示的不一样,是正常的。实战中联邦的排错成本很高(要同时看子 AS 内部、子 AS 之间、联邦对外三个层次),RR 才是更常见的选择。

适用版本:华为 VRP V200R019 及以上(AR6000 系列);H3C Comware V7(R2610 及以上)。

12.2.3 逐行讲解

下面挑出模板里最容易出问题的行,逐条对照讲清楚:

命令 作用 新手常填错的地方
bgp 65001 建 BGP 进程,声明本 AS 号 与 router-id 写反;AS 号是身份不是进程号
router-id 10.200.1.254 指定 BGP 的身份证 与 OSPF 的 Router-ID 缺省会取同一地址,最好都手工指定
peer 172.16.12.1 as-number 65002 建 EBGP 邻居 对端 AS 号填成自己的 65001,邻居永远起不来
peer 10.200.1.1 connect-interface LoopBack0 指定与对端通信的源接口 对端 peer 指向 Loopback,本机源却用物理口,TCP 建不起来
peer 172.16.12.1 ebgp-max-hop 2 放宽 EBGP 的 TTL(直连 EBGP 不需要) IBGP 不需要;直连 EBGP 也不要配——H3C 官方提示「建议不要指定直连 EBGP 对等体配置 peer ebgp-max-hop,否则可能导致 BGP 路由无法正常迭代」
network 192.168.10.0 255.255.255.0 宣告网段 路由表里没有精确同掩码路由,宣告不生效
import-route ospf 1 route-policy RP_TO_BGP 重发布 OSPF 路由 不加 route-policy 会把互联段、管理段全送出去
peer 10.200.1.1 next-hop-local 改 IBGP 发出去路由的下一跳 漏配则 AS 内设备下一跳不可达,路由不进 FORWARD 表
peer 10.200.1.1 reflect-client 把对端设为客户机 RR 上的 peer 必须已经先建好,否则这条命令报错
peer 10.200.1.1 advertise-community 允许团体属性传出 漏配则 apply community 打了标对方也看不到
peer 10.200.1.1 password cipher xxx TCP MD5 认证 两端必须一致;错一个字就卡在 OpenSent

逐条展开其中最重要的四条:

逐条展开其中最重要的三条:

connect-interface 为什么必须配。IBGP 邻居地址是 Loopback,指向「那台设备」而不是「那条线」。本机发出的 TCP SYN 若用物理口地址当源,对端对不上会话,报文直接被丢,所以两端都要配 connect-interface 互指自己的 Loopback;用物理口作源的后果是链路一抖会话就断、全 AS 重收敛。

next-hop-local 在解决什么。运营商发来的 110.1.0.0/16 的 next-hop 是 172.16.12.1,Edge1 若原样反射给 Core1,Core1 到不了这个地址,路由「有但不可用」,进不了主路由表;加上之后 next-hop 变成 Edge1 的 172.16.11.1,Core1 就能把包交给 Edge1。所以 AS 边界设备与 RR 都把它当必配项。

import 与 export 的语义。import 是收到之后先过策略再进 BGP 表,export 是发出之前先过策略;filter-policy 只做开关式过滤,route-policy 还能改属性。同一个方向只用一种工具最稳,因为两者的执行先后在不同版本间并不完全统一。若出现「策略写了 permit、路由却全没了」,先比较 display bgp routing-table peer <邻居> received-routes 与 display bgp routing-table 的条数,差额就是被策略拦掉的。

适用版本:华为 VRP V200R019 及以上(AR6000 系列);H3C Comware V7(R2610 及以上)。

12.3 H3C 设备配置详解

H3C Comware V7 的 BGP 与华为 VRP 概念一致,但配置结构多了一层:V7 把 BGP 拆成「BGP 视图」与「地址族视图」,peer 的建立写在 BGP 视图下,与 IPv4 宣告、策略相关的命令写在 address-family ipv4 unicast 视图下,通常还要在这里再用一次 peer <地址> enable。这是华为转 H3C 时最容易卡住的地方。

12.3.1 H3C 侧的视图结构先理清

先把两层结构图示出来,后面所有配置都按这个框架套:

 [H3C] 系统视图
   |
   +-- bgp 65001                     ← BGP 进程视图(AS 号)
         |
         +-- router-id 10.200.1.254
         +-- peer 172.16.12.1 as-number 65002      ← 建对等体:写在 BGP 视图
         +-- peer 10.200.1.1 as-number 65001
         +-- peer 10.200.1.1 connect-interface LoopBack0
         |
         +-- address-family ipv4 unicast            ← 地址族视图
               |
               +-- peer 172.16.12.1 enable          ← 显式使能(部分版本缺省已使能,但不赌缺省值)
               +-- peer 10.200.1.1 enable
               +-- network 192.168.10.0 24          ← 宣告与策略:写在这里
               +-- peer 10.200.1.1 next-hop-local
               +-- peer 10.200.1.1 reflect-client

把这张图记牢,H3C 的 BGP 就再也不会敲错位置。判断方法很简单:凡是与「路由」有关的(network、import-route、route-policy、filter-policy、next-hop-local、reflect-client、advertise-community),都在地址族视图下;凡是与「会话」有关的(as-number、connect-interface、ebgp-max-hop、password、description),都在 BGP 视图下。

⚠ 版本差异:Comware V5 没有地址族视图,peer 与 network 都写在 BGP 视图下,与华为 VRP 更接近;V7 引入地址族后才有上述两层结构。迁移 V5 老配置时要逐条搬到地址族视图里。

关于 peer <ip> enable 要给一个准确说明:H3C 有 default ipv4-unicast 开关,部分版本缺省即使能,此时不写 enable 也能通;但不同产品线缺省不一致,且一旦有人 undo default ipv4-unicast,依赖缺省的邻居会静默失效。生产环境一律显式写,宁可多敲一行,不赌缺省值。

⚠ 待核实:待核实 H3C Comware V7 各产品线 default ipv4-unicast 的出厂缺省状态(启用/未启用)——这一条需要逐产品线查出厂配置,无法从单份文档确认;本章写法按显式 enable 给出,不依赖缺省值,故不影响正确性

12.3.2 完整配置模板:EBGP 对接运营商(H3C MSR3610-X1)

沿用 11.1.2 的拓扑:Edge1 换用 H3C MSR3610-X1,对外 GigabitEthernet0/0 连运营商 ISP-R(ISP 侧 172.16.12.1,AS 65002),对内 GigabitEthernet0/1 连 Core1,Loopback0 是 10.200.1.254。

先把接口与 OSPF 准备好(IBGP 依赖 IGP 保证 Loopback 可达):

# 进入系统视图
system-view
sysname H3C-Edge1

# 环回口:IBGP 邻居与 Router-ID 都靠它
interface LoopBack 0
 ip address 10.200.1.254 255.255.255.255
 quit

# 连运营商的口
interface GigabitEthernet0/0
 ip address 172.16.12.2 255.255.255.252
 quit

# 连 Core1 的口
interface GigabitEthernet0/1
 ip address 172.16.11.1 255.255.255.252
 quit

# 内网跑 OSPF,让 Loopback 与互联段可达
ospf 1 router-id 10.200.1.254
 area 0
  network 10.200.1.254 0.0.0.0
  network 172.16.11.0 0.0.0.3
  quit
 quit

# 默认路由指向运营商
ip route-static 0.0.0.0 0.0.0.0 172.16.12.1

接着是 BGP 本体,注意两层视图的切换:

# 进入 BGP 视图,声明本 AS 号
bgp 65001

 # Router-ID 与邻居会话参数写在 BGP 视图
 router-id 10.200.1.254
 peer 172.16.12.1 as-number 65002
 peer 172.16.12.1 description To-ISP-R
 peer 10.200.1.1 as-number 65001
 peer 10.200.1.1 connect-interface LoopBack0

 # 进入 IPv4 单播地址族,宣告与策略都在这里
 address-family ipv4 unicast

  # 地址族里显式使能一次(部分版本缺省已使能,但显式写不依赖缺省值)
  peer 172.16.12.1 enable
  peer 10.200.1.1 enable

  # 宣告内网网段(要求路由表里有精确同掩码路由)
  network 192.168.10.0 255.255.255.0
  network 192.168.20.0 255.255.255.0

  # 给 IBGP 邻居发路由时把下一跳改成本机
  peer 10.200.1.1 next-hop-local

  # 团体属性允许传出
  peer 10.200.1.1 advertise-community
  quit
 quit

save force

12.3.3 完整配置模板:RR 与客户机(H3C)

Edge1 同时充当路由反射器,把 Core1、Core2 设为客户机:

# Edge1:reflect-client 在 bgp 视图下声明,然后在地址族里使能
bgp 65001
 peer 10.200.1.1 as-number 65001
 peer 10.200.2.1 as-number 65001
 peer 10.200.1.1 reflect-client
 peer 10.200.2.1 reflect-client
 address-family ipv4 unicast
  peer 10.200.1.1 enable
  peer 10.200.2.1 enable
  peer 10.200.1.1 next-hop-local
  peer 10.200.2.1 next-hop-local
  quit
 quit

客户机侧(Core1,S5130S-28S-EI)配置更简单,只建邻居、不需要反射配置:

# Core1:只做客户机,所有 IBGP 路由都从 Edge1 反射过来
system-view
sysname H3C-Core1

interface LoopBack 0
 ip address 10.200.1.1 255.255.255.255
 quit

# 内网 OSPF,保证 Edge1 的 Loopback 可达
ospf 1 router-id 10.200.1.1
 area 0
  network 10.200.1.1 0.0.0.0
  network 192.168.10.0 0.0.0.255
  network 172.16.11.0 0.0.0.3
  quit
 quit

# 只与 Edge1 建一条 IBGP,不需要与 Core2 建邻居
bgp 65001
 router-id 10.200.1.1
 peer 10.200.1.254 as-number 65001
 peer 10.200.1.254 connect-interface LoopBack0
 address-family ipv4 unicast
  peer 10.200.1.254 enable
  quit
 quit

save force

这就是 RR 的价值:Core1 只维护一条 IBGP 会话,却能拿到全 AS 的外部路由;不用 RR 就要两两全互联,五台设备就是十条会话。

12.3.4 H3C 侧的路由策略与选路调整

策略工具在 H3C 上同样齐全,写法与华为高度相似,主要差别在视图位置(都在地址族视图下)与个别关键字:

# 用前缀列表圈定只允许宣告的内网网段
ip prefix-list LAN_OUT index 10 permit 192.168.10.0 24
ip prefix-list LAN_OUT index 20 permit 192.168.20.0 24
ip prefix-list LAN_OUT index 30 deny 0.0.0.0 0 less-equal 32

# 路由策略:匹配后打团体属性并放行
route-policy RP_TO_ISP permit node 10
 if-match ip-prefix LAN_OUT
 apply community 65001:100
 quit

# 在地址族里把策略挂到邻居上
bgp 65001
 address-family ipv4 unicast
  peer 172.16.12.1 enable
  peer 172.16.12.1 route-policy RP_TO_ISP export
  peer 172.16.12.1 advertise-community
  quit
 quit

调整出口方向最常用的两个属性,在 H3C 上的写法:

# 对本 AS 内所有路由统一抬高本地优先级(越大越优)
route-policy RP_HIGH_LP permit node 10
 apply local-preference 200
 quit

# 从某邻居学来的路由降低本地优先级(做成备份出口)
route-policy RP_LOW_LP permit node 10
 apply local-preference 50
 quit

# 挂到邻居上
bgp 65001
 address-family ipv4 unicast
  peer 10.200.1.1 route-policy RP_HIGH_LP import
  peer 172.16.13.1 route-policy RP_LOW_LP import
  quit
 quit

AS 路径过滤用正则表达式,H3C 与华为的正则语法一致(^ 开始、$ 结束、_ 表示 AS 分隔符):

# 拒绝任何路径里含 AS 65100 的路由(防止经过某个不良中转)
ip as-path 1 deny _65100_
ip as-path 1 permit .*

bgp 65001
 address-family ipv4 unicast
  peer 172.16.12.1 as-path-acl 1 import
  quit
 quit

12.3.5 H3C 与华为的四个关键差异

与 11.2 对照,差异集中在下列几处,每一处都足以让「照抄华为配置」失败:

差异点 华为(VRP) H3C(Comware V7) 踩错的后果
视图结构 bgp 视图里直接写 network、peer ... enable 不需要 必须进 address-family ipv4 unicast 命令敲进去没报错但不生效
对等体使能 不需要单独 enable 地址族里写 peer <ip> enable 不写时依赖 default ipv4-unicast 缺省值,换型号可能失效
AS 路径过滤 peer ... as-path-filter 引用 ip as-path-filter peer ... as-path-acl 引用 ip as-path 命令不存在
前缀列表 ip ip-prefix ip prefix-list 命令不存在
宣告网段 network x.x.x.x mask network x.x.x.x mask(也可写位数) 基本相同

AS 路径过滤命令族已确证:H3C 只有 peer as-path-acl 一套,不存在 as-path-filter 写法(在 H3C 《06-BGP配置》全文 36 万字中 as-path-filter 出现 0 次,peer as-path-acl 出现 2 次)。ip as-path { as-path-number | as-path-name } { deny | permit } regular-expression,列表号范围 1~256。出处:H3C 06-BGP配置 、H3C 12-路由策略命令 。

H3C 路由策略与团体属性位置已确证:peer route-policy import、peer prefix-list import、peer advertise-community 均在 address-family ipv4 unicast 视图下配,不在 BGP 视图。且 H3C 官方给出接收策略的执行顺序:filter-policy import → peer filter-policy import → peer as-path-acl import → peer prefix-list import → peer route-policy import(前面的挡住了,后面的就不再执行)。出处:H3C 06-BGP配置 (原文「如果同时配置了几种过滤策略,则按照如下顺序过滤接收的路由…只有通过前面的过滤策略,才能继续执行后面的过滤策略」)。

适用版本:华为 VRP V200R019 及以上(AR6000 系列);H3C Comware V7(R2610 及以上)。

12.3.6 本章 BGP 命令的官方核实结果

第二轮全量核实中,把本章主干命令逐条对照了官方文档,结论如下(可直接按 URL 复核):

命令 核实到的官方口径 出处
peer x as-number / connect-interface 华为官方:peer connect-interface 用于「指定发送 BGP 报文的源接口,并可指定发起连接时使用的源地址」 华为 peer connect-interface(S5700/S6700)
peer x ebgp-max-hop H3C 官方:「缺省情况下,不允许同非直连网络上的邻居建立 EBGP 会话」;且「建议不要对直连 EBGP 对等体配置 ebgp-max-hop,否则可能导致 BGP 路由无法正常迭代」 H3C 06-BGP配置 、H3C 07-BGP高级配置
peer x next-hop-local H3C 官方:「缺省情况下,向 EBGP 对等体发布路由时,将下一跳属性修改为自身的地址;向 IBGP 对等体发布路由时,不修改下一跳属性」——这正是 IBGP 必须显式配 next-hop-local 的官方依据 同上
next-hop-local 的配置视图 H3C 在 address-family ipv4 unicast 视图下配(官方示例:[SwitchB-bgp-default-ipv4] peer 4.4.4.4 next-hop-local),不在 BGP 视图 H3C 06-BGP配置
address-family ipv4 unicast + peer enable 官方示例通篇为 [SwitchB-bgp-default] address-family ipv4 unicast → [SwitchB-bgp-default-ipv4] peer 10.1.1.1 enable 的两段式 同上
邻居建不起来的排查顺序 H3C 官方排障步骤原文列了 8 步:查 AS 号 → 查邻居 IP → 查 Loopback 是否配 connect-interface → 查非直连 EBGP 是否配 ebgp-max-hop → 查路由表有无到邻居的路由 → ping 链路 → display tcp 查 TCP → 查是否被禁 179 端口的 ACL 拦截 H3C BGP配置·故障处理

其中**「非直连 EBGP 不要画蛇添足配 ebgp-max-hop」**这一条,是官方明确的风险提示,本章 11.7 的踩坑第 7 条按此口径写。

12.4 华为 / H3C 命令对照表

下面这张表是本章的「双语词典」,覆盖了 BGP 从建邻居到调优的常用命令,最后一列专门点出那些「照抄过去就报错」的地方:

功能 华为(VRP) H3C(Comware V7) 差异说明
建进程 / 地址族 bgp 65001 → ipv4-family unicast bgp 65001 → address-family ipv4 unicast 地址族视图名词序不同
使能邻居 不需要 peer <ip> enable(地址族视图) H3C 多一步
会话身份 peer <ip> as-number peer <ip> as-number 相同,都在 BGP 视图
会话源 / TTL peer <ip> connect-interface LoopBack0 / peer <ip> ebgp-max-hop 2 同左 相同
宣告 / 重发布 network 192.168.10.0 255.255.255.0 / import-route ospf 1 network 192.168.10.0 24 / import-route ospf 1 掩码可写长度
下一跳 / 反射 / 团体 peer <ip> next-hop-local / reflect-client / advertise-community 同左 名称相同
认证 peer <ip> password cipher X peer <ip> password cipher X 相同
前缀列表 / 过滤 ip ip-prefix P index 10 permit ... + peer <ip> filter-policy ip-prefix P import ip prefix-list P index 10 permit ... + peer <ip> ip-prefix P import 命令名与写法不同
AS 路径过滤 ip as-path-filter 1 permit .* + peer <ip> as-path-filter 1 import ip as-path 1 permit .* + peer <ip> as-path-acl 1 import 命令族不同
查看 / 保存 display bgp peer / display bgp routing-table / save display bgp peer ipv4 / display bgp routing-table ipv4 / save force H3C 带地址族后缀

最值得反复确认的是视图归属:华为「进程管身份、地址族管策略」,H3C 在此基础上多一个「地址族里 peer enable」的步骤。

适用版本:华为 VRP V200R019 及以上(AR6000 系列);H3C Comware V7(R2610 及以上)。

12.5 配置验证

验证 BGP 按「邻居 → 能力 → 路由 → 选路 → 策略」五层走,第一眼先看邻居:邻居不是 Established,后面所有检查都没有意义。

第一步,看邻居是否全部建起来:

display bgp peer

期望三条邻居都在 Established,PrefRcv 不为 0:

BGP local router ID : 10.200.1.254
Local AS number : 65001
Total number of peers : 3          Peers in established state : 3

  Peer            V    AS  MsgRcvd  MsgSent  OutQ  Up/Down       State      PrefRcv
  10.200.1.1      4 65001     1287     1301     0 01:22:14  Established        1
  10.200.2.1      4 65001      987     1021     0 01:01:03  Established        1
  172.16.12.1     4 65002     2210     2195     0 02:11:45  Established        2

重点看三列:State 必须是 Established;PrefRcv 为 0 说明对端没发或本机策略拦了;Up/Down 每次看都是几秒,说明会话在反复重建。

第二步,看单个邻居的详细参数:

display bgp peer verbose

重点看会话类型与本端源地址:

BGP Peer is 10.200.1.1,  remote IP address is 10.200.1.1
  Type: IBGP link
  BGP version 4, Remote router ID 10.200.1.1
  BGP current state: Established, Up for 01:22:14
  BGP current event: RecvKeepalive
  BGP last state: OpenConfirm
  Port:  Local - 179    Remote - 49732

Type 一栏能直接告诉你会话类型(显示 EBGP link 而你以为配的是 IBGP,就是 as-number 填错);BGP last state 会告诉你这次会话是从哪个状态走过来的。

第三步,确认宣告出去的路由对端真的收到。先在本机看自己发出去了什么:

display bgp routing-table peer 172.16.12.1 advertised-routes

期望看到办公网段与服务器网段,Origin 为 i,AS_PATH 为空:

BGP Local router ID is 10.200.1.254
Status codes: * valid, > best, d damped, h history
Origin codes: i - IGP, e - EGP, ? - incomplete

    Network             NextHop         MED     LocPrf   Path/Ogn
 *>  192.168.10.0/24     172.16.12.2     0                i
 *>  192.168.20.0/24     172.16.12.2     0                i

这里一条都没有,问题在本机宣告或出口策略;这里有而对端没有,问题在对端入口策略——「本机发出的」与「对端收到的」是两个独立检查点。

第四步,看运营商发来的路由有没有进来、下一跳是什么:

display bgp routing-table 110.1.0.0

期望带 *>(最优可用),Original nexthop 为 172.16.12.1:

BGP local router ID : 10.200.1.254
Paths:   1 available, 1 best, 1 select
BGP routing table entry information of 110.1.0.0/16:
  From: 172.16.12.1 (10.200.200.2)
  Original nexthop: 172.16.12.1
  AS-path 65002, origin igp, MED 0, pref-val 0, valid, external, best, select

From 说明是哪位邻居发来的,external 说明来自 EBGP,best 说明已被选中;只有 valid 没有 best,说明还有别的路径在竞争。

第五步,在 Core1 上验证 IBGP 与 RR 是否在起作用——Core1 没有连运营商,它必须能从 Edge1 反射得到这条路由:

display bgp routing-table 110.1.0.0
display ip routing-table 110.1.0.0

Core1 的 BGP 表与主路由表里都应有这条路由:

BGP local router ID : 10.200.1.1
BGP routing table entry information of 110.1.0.0/16:
  From: 10.200.1.254 (10.200.1.254)
  Original nexthop: 172.16.11.1
  AS-path 65002, origin igp, MED 0, localpref 200, external

Original nexthop: 172.16.11.1 就是 next-hop-local 生效的证据——它被改成了 Edge1 面向内网的地址。如果这条路由在 BGP 表里有、在主路由表里没有,说明下一跳不可达,这是本章反复强调的最大坑。

第六步,验证团体属性有没有传到位:

display bgp routing-table community 65001:100

为空就按「源设备 apply community → 每一跳的 advertise-community」逐个排查。

H3C 侧验证命令(带 ipv4 地址族后缀):

display bgp peer ipv4
display bgp routing-table ipv4
display bgp routing-table ipv4 peer 172.16.12.1 advertised-routes
display bgp routing-table ipv4 community

H3C 的 display bgp peer ipv4 输出格式略有不同,同样只看 State 一列是否为 Established:

BGP local router ID: 10.200.1.254
Local AS number: 65001
Total number of peers: 2          Peers in established state: 2

  Peer         AS    MsgRcvd  MsgSent  OutQ  PrefRcv  Up/Down          State
  10.200.1.1   65001  1287     1301     0      1      01:22:14        Established
  172.16.12.1  65002  2210     2195     0      2      02:11:45        Established

汇总成一张日常清单:

检查项 命令 通过标准
邻居状态 display bgp peer 全部 Established,PrefRcv 不为 0
会话类型与源 display bgp peer verbose Type、Local 地址与设计一致
发出的路由 advertised-routes 有设计中的网段,Origin 为 i
收到的路由 display bgp routing-table 目的网段 带 *>,属性符合预期
下一跳可达 display ip routing-table 下一跳 主路由表里有条目
团体属性 display bgp routing-table community 标记按设计传递

适用版本:华为 VRP V200R019 及以上(AR6000 系列);H3C Comware V7(R2610 及以上)。

12.6 排错与故障树

BGP 排错的思路与 OSPF 不同:OSPF 靠组播找邻居,BGP 靠 TCP 建会话,所以先查 TCP、再查 BGP。按状态机顺序画成故障树:

邻居不是 Established
  |
  +- 邻居列表里根本没有 / 一直 Idle
  |    +- 一端配了 peer、另一端没配(单向配置)
  |    +- 对端地址写错,或本地没有到对端的路由
  |    +- connect-interface 指到 Loopback,但 Loopback 地址没被 IGP 宣告
  |
  +- Active(TCP 打不通,正在反复重拨)
  |    +- 物理链路断:display interface brief
  |    +- 路由不可达:IBGP 的 Loopback 没被 OSPF 保证
  |    +- 179 端口被 ACL 或防火墙拦:典型表现是一边通、一边不通
  |    +- EBGP 中间隔了设备却没配 ebgp-max-hop
  |    +- peer 地址与本端源接口不在同一可达范围
  |
  +- OpenSent(TCP 通了,Open 报文谈不拢)
  |    +- AS 号不一致(最常见)
  |    +- password 认证不一致
  |    +- 两端 Router-ID 冲突
  |    +- BGP 版本或能力协商失败(老设备)
  |
  +- OpenConfirm(只差最后一个 Keepalive)
  |    +- Hold Time 配得过短,或路径丢包严重
  |
  +- Established 但路由不对
       +- 对端没宣告:对端 `network` 的精确路由不在其路由表
       +- 策略拦了:import/export 的 route-policy、ip-prefix
       +- 下一跳不可达:IBGP 漏配 next-hop-local
       +- 选路不符合预期:按属性顺序逐条比对

逐个症状对应原因与定位命令:

症状 可能原因 排查命令 定位方法
列表里没有对端 单向配置 display current-configuration configuration bgp 与对端配置逐行对照
一直 Idle 地址不可达 ping -a <本机源> <对端> 必须带源地址 ping,才测的是 BGP 真实路径
Active TCP 179 不通 display tcp status、telnet <对端> 179 连得上说明 TCP 没问题,问题在协议层
Active 源接口与 peer 不匹配 display bgp peer verbose 看 Local 地址是否是设计中的 Loopback
Active EBGP 跨设备未放宽 TTL display bgp peer verbose 检查 ebgp-max-hop 是否配
OpenSent AS 号错 对端 display bgp peer 两边 as-number 逐字核对
OpenSent 认证不一致 display logbuffer 找 authentication 相关报错
OpenSent Router-ID 冲突 两端 display bgp peer verbose 两台设备的 Router ID 相同则必错
Established 但无路由 对端没宣告 对端 advertised-routes 对端发出的为空就去查对端路由表
Established 但路由不可用 next-hop 不可达 display ip routing-table BGP 表有、主路由表没有
选了次优路径 属性不符预期 display bgp routing-table <网段> 按 localpref → AS 路径 → MED 顺序比

再看三个现场案例。

案例一:AS 号抄错,卡在 OpenSent。链路通、telnet 对端 179 也能连上,邻居却在 Active 与 OpenSent 之间跳。查日志有「AS 号与本地配置不一致」的提示,一对发现我方写 65002、运营商单子上是 65003——照着另一条链路复制来的。AS 号必须从对接单上逐字核对。

案例二:179 只放行了一个方向。我方看对端 Established,对端看我方一直 Active。这类单向不通几乎都是中间设备只放了一个方向:两端 display tcp status 看 179 连接、再在防火墙查会话表即可确认。两个方向的 TCP 179 都要放行,因为双方都可能主动发起连接。

案例三:RR 漏配 next-hop-local,BGP 一切正常但用户上不了网。邻居全 Established、BGP 表里运营商路由一条不少,可主路由表里没有、ping 也不通——RR 反射时没改下一跳,客户机拿着不可达的下一跳,路由被判为不可用。BGP 表里有路由不等于数据能过去,下一跳可达才是判定标准。

H3C 侧排错命令同构,同样带地址族:

display bgp peer ipv4
display bgp routing-table ipv4
display logbuffer | include BGP
display tcp verbose

跨厂商对接时,若邻居卡在 OpenSent 且 AS 号、认证都核对无误,就要怀疑「能力协商」:display bgp peer verbose 里有收到的能力列表,两边对比着看。

华为侧的 BGP 能力协商命令已核实(官方命令参考原文):peer { group-name | ipv4-address } capability-advertise { 4-byte-as | route-refresh | conventional }(IPv6 对等体去掉 conventional)。该命令用来「使能 BGP 的发布可选能力」,undo 形式用来恢复缺省配置。

实操要点:跟极老的邻居(不支持 4 字节 AS 号或 Route-refresh)对接时,常用 undo peer x capability-advertise 4-byte-as 或 ... route-refresh 来关闭相应能力,避免 OpenSent 阶段能力协商失败导致卡住。本章 11.6 的"卡在 OpenSent"排查里可以按这条去试。

出处:NetEngine AR1000V V300R021 命令参考 · BGP 配置命令 。H3C 侧同名命令的取值集合未核实。

适用版本:华为 VRP V200R019 及以上(AR6000 系列);H3C Comware V7(R2610 及以上)。

12.7 新手踩坑与注意事项

  1. 把 Active 当成「正常运行」——它的含义是「TCP 打不通、正在重拨」。避法:卡在哪个状态就查对应的那一层。
  2. network 宣告了却没生效——路由表里没有精确同掩码路由,BGP 不报错也不生成宣告。避法:宣告前 display ip routing-table <网段> 确认。
  3. IBGP 用物理口地址做源——物理口一断就全 AS 重收敛。避法:一律用 Loopback 建,两端都配 connect-interface,并让 IGP 宣告 Loopback。
  4. 漏配 next-hop-local——BGP 表里有、主路由表里没有。避法:边界设备与 RR 对每个向内的 IBGP 邻居都配上。
  5. 指望 IBGP 路由再传给 IBGP——水平分割是 BGP 的基本规则,不是配置能绕开的。避法:要么 Full Mesh,要么用 RR。
  6. import-route direct 一把梭——互联段、管理段全被送出去。避法:一律配 route-policy 限定重发布范围。
  7. 团体属性「打了没传」——apply community 只负责打标,advertise-community 才决定能不能出门。避法:要带标出 AS,就在出口邻居上显式打开。
  8. EBGP 的 TTL 与物理直连——缺省 TTL 为 1,中间隔一台设备就建不起来。避法:确需跨设备时配 ebgp-max-hop 2,并清楚这等于放弃了旁路检查。
  9. Router-ID 冲突——两台设备配了同一个 Router-ID,会话反复建立又断开。避法:全网统一用 Loopback 规划 Router-ID,且逐台登记。
  10. 改完策略不刷新——部分策略改动不会立刻作用于已有邻居。避法:改完主动 refresh bgp 触发一次,别等用户报障。
  11. H3C 漏了 peer enable——as-number 配了、地址族里没 enable,邻居在该地址族里根本没激活。避法:H3C 配完立刻 display bgp peer ipv4 确认能看到它。
  12. reset bgp all 图省事——可能引发全网震荡。避法:精确到邻居,如 reset bgp 172.16.12.1。
  13. 两台 RR 的 cluster-id 不一致——同簇不统一会让簇检查失效,可能绕行甚至回环。避法:同簇 RR 统一 cluster-id 并写进设计文档。
  14. 把 Local_Pref 用在 EBGP 上——发给 EBGP 邻居的 Local_Pref 会被剥掉,对方看不到。避法:跨 AS 只调 MED,AS 内才调 Local_Pref。
  15. 忘了 save——华为 save 要敲 y,H3C 用 save force。避法:割接最后一步必 save,并用 display saved-configuration 复核。

适用版本:华为 VRP V200R019 及以上(AR6000 系列);H3C Comware V7(R2610 及以上)。

12.8 本章小结

BGP 是「村子之间的快递协议」:它不负责算村内的路,只负责把地址簿发给邻村,用 AS 路径防环、用属性选路、用策略过滤。本章的要点压缩成下面几条:

  • BGP 是路径矢量协议,跑在 TCP 179 上;这决定了「先查 TCP、再查 BGP」的排错顺序。
  • EBGP 与 IBGP 的差别不止 AS 号:TTL、next-hop、IGP 可达要求、防环手段全不同,其中最大的坑是「IBGP 下一跳必须由 IGP 保证可达」。
  • 状态机就是排错地图:Idle/Active 查 TCP,OpenSent 查 AS 号与认证,OpenConfirm 查 Keepalive,Established 之后才轮到路由与策略。
  • network 要求本机路由表有精确同掩码路由;import-route 有「搬太多」和「源消失不撤销」的风险,都要配策略。
  • 选路按顺序逐条比:weight → local-preference → 本地始发 → AS 路径 → origin → MED → EBGP 优于 IBGP → IGP cost → Router-ID。
  • RR 解决 IBGP 全互联;RR 与 AS 边界设备必须有 next-hop-local。
  • 策略四件套:filter-policy/ip-prefix、as-path-filter、route-policy、community;团体属性要 advertise-community 才传得出去。
  • 华为与 H3C 的核心差异是视图归属:H3C 要进 address-family ipv4 unicast 再 peer <ip> enable;华为没有 enable 这一步,但宣告与策略同样在 ipv4-family unicast 下。

自测题

  1. 两台路由器建 EBGP 邻居,中间经过一台三层交换机,配置照模板敲的却一直卡在 Active。最可能的原因是什么?怎么改?
  2. 同一目的网段收到两条路由:一条 Local_Pref 为 150、AS 路径长度 3;另一条 Local_Pref 为 100、AS 路径长度 1。它选哪一条?为什么?
  3. IBGP 邻居已 Established,display bgp routing-table 里有运营商路由,但 display ip routing-table 里没有。最可能的两个原因与对应修复命令是什么?
  4. RR 上配了 reflect-client,而客户机上什么都没配,邻居能建起来吗?如果 RR 上漏了 reflect-client,会出现什么现象?
  5. H3C 上配了 peer 172.16.12.1 as-number 65002,display bgp peer 里却看不到这个邻居,最可能漏了什么?华为上会不会有这个问题?
  1. EBGP 缺省 TTL 为 1,中间多一台三层设备报文就被丢弃,TCP 建不起来,卡在 Active。解决:两端对 EBGP 邻居配 peer 172.16.12.1 ebgp-max-hop 2,并确认中间设备有到对端路由、未过滤 179。
  2. 选 Local_Pref 为 150 的那条。BGP 按固定顺序比较,Local_Pref 排在 AS 路径长度之前,先分出胜负后面的规则就不看了——这正是「BGP 是策略协议」的体现。
  3. 一是下一跳不可达(EBGP 路由反射后未改 next-hop),在边界设备或 RR 上配 peer <ip> next-hop-local;二是被策略拦了,检查 import/export 方向的 filter-policy 与 route-policy。
  4. 能建起来。reflect-client 只在 RR 上配,影响的是反射行为而不是会话建立。若 RR 漏配,两个客户机之间的路由不会互相反射,现象是「都能和 RR 通,但客户机之间学不到对方的 BGP 路由」。
  5. 漏的是 address-family ipv4 unicast 视图下的 peer 172.16.12.1 enable:as-number 只是在 BGP 视图登记身份,还要在 IPv4 单播地址族里 enable 才激活。华为没有这一步,配完 as-number 即激活,所以从华为迁移过来的人最容易漏。

关于本书:《华为 / H3C 网络设备典型功能配置详解》—— 面向国内高校/企业网络环境, 华为 VRP 与 H3C Comware 双厂商并排配置的实操教材,共 43 章。 全书所有命令尽量有官方出处,查不到的显式标注「待核实」。 返回系列目录