技术博客

HCIP 数通:BGP 协议详解、IBGP/EBGP 邻居建立与路由通告实战

深入讲解 BGP(边界网关协议)的核心机制:BGP vs OSPF 的本质区别、IBGP 与 EBGP 邻居建立差异、BGP 路由通告规则(IBGP 水平分割)、Next-hop 属性问题与解决方案、BGP 路由属性(AS-Path/LOCAL_PREF/MED),覆盖华为 VRP 平台企业出口双线 BGP 配置。

BGPHCIPIBGPEBGP路由协议互联网数通

BGP(Border Gateway Protocol)是互联网的路由协议,全球 AS(自治系统)之间通过 BGP 交换路由。企业网工程师学 BGP 主要为了:双线出口策略(联通+电信路由优化)、数据中心互联(BGP ECMP)、SD-WAN 路由控制。

BGP vs OSPF 本质区别

OSPF(链路状态协议):
  目的:同一 AS 内的路由器互相了解网络拓扑
  传播:LSA(链路状态通告),每台路由器用 LSDB 算最短路径
  适合:企业内网,路由器规模几十到几百台
  特点:自动发现邻居,快速收敛

BGP(路径向量协议):
  目的:不同 AS 之间交换可达性信息(不关心 AS 内部拓扑)
  传播:路径向量(携带完整 AS-Path,防止环路)
  适合:ISP 互联,互联网级别(全球 90 万条路由)
  特点:手动配置邻居,策略控制丰富,收敛慢但稳定

为什么不在企业内部用 BGP?
  → BGP 需要手动配置邻居,运维复杂
  → BGP 收敛慢(分钟级),适合稳定的 AS 间互联
  → OSPF/IS-IS 更适合快速变化的企业内网

一、BGP 基础概念

自治系统(AS):
  一组使用统一路由策略、统一管理的网络
  用 AS 号标识(16位:1-65535,32位更大范围)
  公有 AS 号:向 IANA 申请
  私有 AS 号:64512-65534(企业内部使用)

BGP 两种运行模式:
  EBGP(External BGP):不同 AS 之间的 BGP 邻居关系
  IBGP(Internal BGP):同一 AS 内部的 BGP 邻居关系

BGP 使用 TCP 179 端口传输路由信息(可靠传输,不用自己实现可靠机制)

BGP 消息类型:
  OPEN     → 建立邻居(协商参数)
  KEEPALIVE → 保持邻居关系(默认 60s 发一次)
  UPDATE   → 通告路由(增量更新)
  NOTIFICATION → 报错(邻居关系终止)

二、BGP 邻居建立

EBGP 邻居(不同 AS 之间)

# 网络拓扑:
# 企业 AS 65000(路由器 R1:10.0.12.1) ←→ ISP AS 100(路由器 R2:10.0.12.2)

# R1(企业路由器)配置 EBGP
system-view
bgp 65000              # 本 AS 号
  peer 10.0.12.2 as-number 100    # 对端 IP 和 AS 号(EBGP 邻居)
  # EBGP 特点:邻居通常是直连接口 IP
  # TTL 默认 1(直连链路),不需要额外配置
quit

# R2(ISP 路由器)配置 EBGP
system-view
bgp 100
  peer 10.0.12.1 as-number 65000
quit

# 验证 EBGP 邻居状态
display bgp peer
# Peer             V   AS    MsgRcvd  MsgSent  OutQ  Uptime  State  PrefRcv
# 10.0.12.2        4   100        10       10     0  00:05:30  Established   5
# State=Established 表示邻居已建立

IBGP 邻居(同 AS 内部)

# 网络拓扑(企业 AS 65000 内部):
# 路由器 A(1.1.1.1) ←IBGP→ 路由器 B(2.2.2.2) ←IBGP→ 路由器 C(3.3.3.3)
# A 和 C 都与 B 建立 IBGP,A 和 C 之间不需要直连

# 路由器 A 配置 IBGP
system-view
bgp 65000
  peer 2.2.2.2 as-number 65000    # 同 AS 号 = IBGP 邻居
  # IBGP 特点:通常使用 Loopback 接口地址(更稳定,不依赖物理链路)
  peer 2.2.2.2 connect-interface LoopBack0   # 使用 Loopback 发起连接
quit

# 关键注意:IBGP 邻居需要物理可达(OSPF/IS-IS 保证 Loopback 路由可达)
display ip routing-table 2.2.2.2    # 确认 B 的 Loopback 路由存在

# IBGP 全互联(Full Mesh)要求:
# 同一 AS 内所有 BGP 路由器必须互相建立 IBGP 邻居
# 原因:IBGP 水平分割(从 IBGP 邻居学到的路由不能再传给其他 IBGP 邻居)
# 4 台路由器 → 6 条 IBGP 邻居关系(n*(n-1)/2)
# 100 台路由器 → 4950 条 → 规模问题!→ 用路由反射器解决

三、BGP 路由通告规则

Next-Hop 属性问题

# 问题:IBGP 场景下,EBGP 学到的路由 Next-Hop 不修改
# 
# ISP R2(AS 100)通告路由 8.8.8.0/24,Next-Hop=10.0.12.2
# 企业 A(AS 65000)从 R1 接收此路由,Next-Hop 仍为 10.0.12.2
# 企业内部 C 从 B 接收 IBGP 路由,Next-Hop=10.0.12.2
# 但 C 内部路由表里没有 10.0.12.2(出口在 A,C 不知道)
# → C 无法转发到 8.8.8.0/24

# 解决方案1:IBGP 邻居上配置 next-hop-local
# 在 EBGP 路由器(R1)上配置,向 IBGP 邻居通告时把 Next-Hop 改为自己
bgp 65000
  peer 2.2.2.2 next-hop-local    # 向 IBGP 邻居通告时,Next-Hop 改为本机 Loopback IP

# 解决方案2:在内部 IGP 中注入 EBGP 邻居 IP(让内部可达)
# 这样 C 可以通过 IGP 找到 10.0.12.2 的路径
ospf 1
  import-route direct   # 把直连路由引入 OSPF

IBGP 水平分割

# IBGP 水平分割规则:
# 从 IBGP 邻居学到的路由,不能再通告给其他 IBGP 邻居
# 这要求 AS 内所有 BGP 路由器全互联(Full Mesh)

# 大型网络解决方案:路由反射器(Route Reflector, RR)
# 指定一台或多台路由器作为 RR,其他路由器作为 RR Client
# RR 打破水平分割规则:可以把 Client 的路由反射给其他 Client

# 配置路由反射器
bgp 65000
  peer 10.0.0.1 as-number 65000
  peer 10.0.0.1 reflect-client   # 10.0.0.1 是 RR 的 Client
  peer 10.0.0.2 as-number 65000
  peer 10.0.0.2 reflect-client   # 10.0.0.2 也是 Client

# RR Client 之间通过 RR 交换路由,不需要直接建立 IBGP 邻居

四、BGP 路由通告

注入路由到 BGP

# 方法1:Network 命令(精确宣告,必须在 IP 路由表中存在)
bgp 65000
  network 10.100.0.0 255.255.0.0   # 宣告 10.100.0.0/16(精确匹配)

# 方法2:引入(Import)其他路由协议
bgp 65000
  import-route ospf 1               # 把 OSPF 路由引入 BGP

# 方法3:汇总(Aggregate)
bgp 65000
  aggregate 10.100.0.0 255.255.0.0 detail-suppressed
  # detail-suppressed:只通告汇总路由,抑制明细路由
# 查看 BGP 路由表
display bgp routing-table
# BGP Local router ID is 1.1.1.1
# Status codes: * valid, > best, i - internal, e - external
#       Origin: i - IGP, e - EGP, ? - incomplete
# Network         NextHop        MED   LocPrf  PreVal  Path/Ogn
# *>  8.8.8.0/24  10.0.12.2      0              0       100i
# *>  10.100.0.0/16 0.0.0.0      0     100     0       i

# 查看特定路由的 BGP 属性
display bgp routing-table 8.8.8.0
# BGP routing table entry for 8.8.8.0/24:
# Paths: (1 available, best #1)
# Path #1: Received by speaker 0
# ...
# AS-path 100
# Next hop: 10.0.12.2
# Origin: IGP
# MED: 0

五、BGP 路由属性

属性影响路由选择(选最优路径):

LOCAL_PREF(本地优先级):
  IBGP 属性,不传给 EBGP 邻居
  值越大越优先(默认 100)
  用途:控制本 AS 的流量从哪个出口出去

AS-Path(AS 路径):
  每经过一个 AS,在 AS-Path 前面加上本 AS 号
  AS-Path 越短越优先
  用途:选择较短路径;AS-Path Prepend 人为加长路径(影响对方选路)

MED(Multi-Exit Discriminator,多出口鉴别器):
  传给 EBGP 邻居,建议对方使用哪个入口
  值越小越优先(默认 0)
  用途:控制流量从哪个入口进来(影响对方的选路)
# 配置 LOCAL_PREF(企业双线出口,电信优先)
route-policy TELECOM-IN permit node 10
  apply local-preference 200   # 电信路由 LOCAL_PREF=200(优先)

route-policy UNICOM-IN permit node 10
  apply local-preference 100   # 联通路由 LOCAL_PREF=100(次优)

bgp 65000
  peer 10.0.12.2 route-policy TELECOM-IN import   # 应用到电信对等体
  peer 10.0.13.2 route-policy UNICOM-IN import    # 应用到联通对等体

# 配置 AS-Path Prepend(让流量从联通进来)
route-policy UNICOM-OUT permit node 10
  apply as-path 65000 65000 additive   # 在 AS-Path 中多加几次本 AS 号(路径变长)
  # ISP 看到路径更长,会优先选其他路径进入我们的网络

bgp 65000
  peer 10.0.13.2 route-policy UNICOM-OUT export   # 向联通发送时追加 AS-Path

六、BGP 状态机与排障

# BGP 状态机(必须理解的 HCIP 考点):
# Idle → Connect → Active → OpenSent → OpenConfirm → Established

# Idle:刚启动,等待 TCP 连接
# Connect:正在尝试 TCP 连接
# Active:TCP 连接失败,重试中(通常是对端不可达或端口 179 被拦截)
# OpenSent:TCP 已连,发送 OPEN 消息
# OpenConfirm:收到 OPEN 确认,等待 KEEPALIVE
# Established:建立成功,开始交换路由

# 常见问题排查
display bgp peer         # 查看所有邻居状态
display bgp error-peer   # 查看错误邻居

# 邻居卡在 Active 状态
ping 10.0.12.2 -c 5      # 测试 TCP 连通性
telnet 10.0.12.2 179     # 测试 179 端口
# 检查防火墙/ACL 是否放行 TCP 179

# 路由没有传递过来
display bgp routing-table peer 10.0.12.2 advertised-routes  # 我发了什么
display bgp routing-table peer 10.0.12.2 received-routes    # 我收到了什么
display bgp routing-table peer 10.0.12.2 accepted-routes    # 通过了策略的路由

# 开启 BGP debug(谨慎使用)
debugging bgp event
debugging bgp packet
undo debugging bgp all

小结

BGP 是互联网级别的路由协议,学 HCIP 需要掌握:EBGP 和 IBGP 的本质区别(AS 间 vs AS 内,Next-Hop 处理不同);IBGP 全互联要求(或用路由反射器解决规模问题);关键属性影响选路(LOCAL_PREF 控制出口,MED 影响入口,AS-Path 防环路/影响对端选路)。企业场景最常见的是双线出口 BGP:通过 LOCAL_PREF 控制业务流量优先走某个运营商,通过 AS-Path Prepend 影响回程流量的运营商选择。