2. BGP基础回顾与工程视角
在单出口网络里,默认路由几乎能解决所有问题;一旦进入多出口、多运营商场景,BGP 就从“可选协议”变成“策略中枢”。本节不重复协议教科书,而是从工程视角把几个关键概念重新梳理一遍:它们分别解决什么问题、在设备上如何体现、配置时哪些参数会直接影响选路结果。
一、AS 与两种会话:EBGP 与 IBGP
自治系统(AS)是一组由同一机构管理、对外使用统一路由策略的网络集合,用 AS 号标识。工程上最需要记住的是:AS 号决定了会话类型,而会话类型决定了路由传播规则。
- EBGP:位于不同 AS 的路由器之间建立,通常直连,TTL 默认为 1。EBGP 邻居之间传递的是“外部路由”,AS_PATH 每经过一个 AS 就追加一次本 AS 号。
- IBGP:位于同一 AS 内部的路由器之间建立,通常不要求直连,但需要底层 IGP 提供可达性。IBGP 邻居之间传递的是“本 AS 从外部学到的路由”,AS_PATH 不追加。
这里有一个工程上极易踩坑的规则:IBGP 水平分割。路由器从 IBGP 邻居学到的路由,不会再转发给其他 IBGP 邻居。因此在一个 AS 内,若要让外部路由在全网可达,要么建立全互联 IBGP(n 台路由器需要 n(n-1)/2 条会话),要么使用路由反射器(RR)或联盟来打破水平分割。多出口场景中,出口路由器通常不止一台,这个规则直接决定了内部拓扑怎么设计。
二、路由通告与下一跳
BGP 通告的本质是“我可以用这条路径到达某个前缀”。工程上要区分两个动作:把本地路由引入 BGP(network 或重分发),以及把 BGP 路由通告给邻居(由策略控制)。
下一跳是 BGP 选路和转发中最容易出问题的一环。规则可以概括为:
- EBGP 通告给 EBGP 邻居时,默认把下一跳改为自己(本端接口地址)。
- EBGP 通告给 IBGP 邻居时,默认保留原下一跳,不改为自己。
- IBGP 通告给 EBGP 邻居时,默认把下一跳改为自己。
第二条规则是工程故障的高发点:AS 内部路由器从 IBGP 学到一条外部路由,下一跳是外部 AS 的地址,如果本 AS 内没有到达该地址的路由,这条 BGP 路由就无法进入转发表,表现为“BGP 表里有、路由表里没有”。常见处理方式有两种:一是在边界路由器上配置 next-hop-self,让 IBGP 邻居把下一跳改为自己;二是确保内部 IGP 能到达该外部下一跳。多出口环境下,选择哪种方式会直接影响流量从哪个出口离开。
三、同步与常用属性
同步(Synchronization)是一条历史规则:IBGP 学到的路由,必须同时能从 IGP 学到,才允许通告给 EBGP 邻居,目的是防止流量黑洞。现代网络中,AS 内部普遍运行完整的 IBGP 或使用 RR,同步通常关闭(Cisco 默认关闭,华为默认不启用)。但在与老设备对接或迁移场景中,仍需确认该状态,否则会出现“路由学得到、传不出去”的现象。
BGP 属性决定了选路结果,工程中最常用的是以下几类:
| 属性 | 作用方向 | 工程用途 |
|---|---|---|
| AS_PATH | 越短越优 | 通过 prepend 影响入向选路 |
| LOCAL_PREF | 越大越优,仅在本 AS 内传递 | 决定本 AS 从哪个出口离开 |
| MED | 越小越优,可跨 EBGP 传递 | 建议邻居从哪个入口进入 |
| Next_Hop | 必须可达 | 决定路由能否进入转发表 |
| Community | 标签传递 | 配合策略做批量标记与过滤 |
选路顺序上,工程中真正频繁使用的是:Weight(厂商私有)→ LOCAL_PREF → 本地始发 → AS_PATH → Origin → MED → EBGP 优于 IBGP → IGP 度量 → Router ID。理解这个顺序,才能在多出口时准确预测流量走向,而不是靠试错。
四、工程视角下的配置要点
把上述概念落到设备上,一个典型的多出口边界路由器配置骨架如下(以 Cisco IOS 风格为例,参数为教学示例):
router bgp 100
bgp log-neighbor-changes
neighbor 10.0.12.2 remote-as 200
neighbor 10.0.12.2 description To-ISP-A
neighbor 10.0.13.2 remote-as 300
neighbor 10.0.13.2 description To-ISP-B
neighbor 10.0.1.3 remote-as 100
neighbor 10.0.1.3 update-source Loopback0
neighbor 10.0.1.3 next-hop-self
!
address-family ipv4 unicast
network 192.168.10.0 mask 255.255.255.0
neighbor 10.0.12.2 activate
neighbor 10.0.13.2 activate
neighbor 10.0.1.3 activate
exit-address-family
这段配置里,next-hop-self 是给 IBGP 邻居用的,解决前面提到的下一跳可达性问题;network 语句把本地前缀引入 BGP,注意它要求路由表中已存在精确匹配的前缀,否则不会生效。多出口场景下,通常还会在邻居上挂 route-map,对入向和出向分别设置 LOCAL_PREF、AS_PATH prepend 或 Community 标记。
五、多出口场景下的属性配合
假设 AS 100 同时接入 AS 200 和 AS 300,希望正常流量走 AS 200、AS 200 故障时切到 AS 300。工程做法是:在 R1 上对来自 AS 200 的路由设置较高的 LOCAL_PREF(例如 200),对来自 AS 300 的设置较低(例如 100)。这样 AS 100 内部所有路由器都会优先选择经 R1 去往 AS 200 的路径。若希望影响对端从哪个入口进入本 AS,则对 AS 300 的邻居做 AS_PATH prepend,让对端看到更长的路径而绕行。
需要强调的是,LOCAL_PREF 只在本 AS 内传递,不会发给 EBGP 邻居;MED 可以跨 EBGP 传递,但对端是否采纳取决于其策略。因此“入向流量”和“出向流量”要分开设计,不能指望一个属性同时解决两个方向的问题。这也是多运营商网络工程中最核心的思维转变:BGP 不是自动选路,而是用属性表达策略意图。