HCIP 数通:BGP 协议详解、IBGP/EBGP 邻居建立与路由通告实战
深入讲解 BGP(边界网关协议)的核心机制:BGP vs OSPF 的本质区别、IBGP 与 EBGP 邻居建立差异、BGP 路由通告规则(IBGP 水平分割)、Next-hop 属性问题与解决方案、BGP 路由属性(AS-Path/LOCAL_PREF/MED),覆盖华为 VRP 平台企业出口双线 BGP 配置。
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 影响回程流量的运营商选择。
