1. BGP基础回顾:协议概述、路径属性、选路原则与会话建立

大家好,我是老张。做网络这行十几年了,BGP 一直是我又爱又恨的协议。爱它灵活,恨它复杂。今天咱们先打好基础,把 BGP 的核心脉络理清楚。嗯,这部分内容虽然基础,但很多高级攻击手法,说白了都是利用这些基础机制的漏洞。

1.1 BGP协议概述

BGP,全称是边界网关协议。它是互联网的「粘合剂」。没有它,不同运营商之间的网络根本没法互通。我经常跟团队里的新人说:BGP 不是用来做路由的,它是用来做策略的

为什么这么讲?你想想看,OSPF 和 IS-IS 这类 IGP,它们的目标是找到「最短路径」。但 BGP 不一样,它关心的是「我允许谁经过我的网络」。说白了,BGP 是一个基于策略的路径向量协议

核心要点:

  • BGP 使用 TCP 179 端口建立连接——这意味着它依赖 TCP 的可靠性
  • BGP 是路径向量协议,不是链路状态协议——它不关心链路带宽和延迟
  • BGP 只传递路由前缀和路径属性,不传递完整的拓扑信息

我记得刚入行那会儿,有个老工程师跟我说:「BGP 的路由表里,每一条路由都是一个政治决策。」当时不太理解,后来做跨国互联项目时才真正体会到——BGP 路由的本质,是网络管理员之间的一种「契约」

1.2 BGP路径属性

路径属性是 BGP 的灵魂。没有属性,BGP 就是个空壳。我习惯把属性分成四类,这样好记:

类别 属性名称 作用
公认必遵 AS_PATH、Next_Hop、Origin 所有BGP更新消息必须包含
公认任意 Local_Pref、Atomic_Aggregate 所有BGP路由器都能识别,但可选是否携带
可选传递 Community、Aggregator 即使不理解,也要传递给邻居
可选非传递 MED、Cluster_List、Originator_ID 不理解就丢弃,不传递

这里我重点说几个实战中容易踩坑的属性:

  • AS_PATH:防环的核心机制。我曾经见过一个案例,有人误配了 AS_PATH prepend,导致路由绕了半个地球才回来——延迟直接飙到 300ms。
  • Local_Pref:只在 IBGP 邻居间传递。我习惯把它叫做「出站偏好」——值越高,越优先从本 AS 出去。
  • MED:这是给对端 AS 看的「入站偏好」。值越低,越希望对方从你这里进来。
  • Community:这是个「标签」属性。很多 DDoS 清洗策略就是靠 Community 来标记流量。

我的小技巧: 调试 BGP 问题时,先看 AS_PATH 和 Local_Pref。这两个属性能解决 80% 的选路异常。别一上来就查 MED,那玩意儿经常被忽略。

1.3 BGP选路原则

BGP 的选路原则,一共 13 条。但说实话,日常工作中你只需要记住前 5 条就够了。我画了张图,帮你理清这个决策流程:

BGP 选路决策流程(前7条) 收到多条路由 ① 权重(Weight):越高越优先(Cisco私有) ② Local_Pref:越高越优先 ③ 本地起源:本地注入 > 从邻居学来 ④ AS_PATH:越短越优先 ⑤ Origin:IGP > EGP > Incomplete ⑥ MED(越低越优先)→ ⑦ EBGP > IBGP → ...

选路原则的优先级,我习惯用一句话记:「本地的、高的、短的、优的」。具体来说:

  1. 权重(Weight):Cisco 私有属性,只在本路由器有效。值范围 0-65535,越高越优先。我一般只在特殊场景下用,比如多宿主的出口选路。
  2. Local_Pref:整个 AS 内有效。这是最常用的选路工具。我建议你把它作为默认策略的入口。
  3. 本地起源:network 命令注入的路由,优先级高于从邻居学来的路由。
  4. AS_PATH 长度:越短越优先。但注意,AS_PATH prepend 可以人为加长路径,用来做流量工程。
  5. Origin 类型:IGP(i)优于 EGP(e)优于 Incomplete(?)。
  6. MED:值越低越优先。只在同一个 AS 的邻居之间比较。
  7. 路径类型:EBGP 优于 IBGP。

⚠️ 避坑指南: 我曾经遇到过一个故障——两条 EBGP 链路,一条是直连,一条经过了两跳。结果流量全走了直连那条,因为 AS_PATH 更短。但直连那条带宽只有 100M,另一条是 10G。这就是典型的「选路原则不考虑带宽」的坑。解决方案?用 Local_Pref 或者 MED 来干预。

1.4 BGP会话建立过程

BGP 会话的建立,说白了就是两个路由器「握手」的过程。一共 6 个状态:Idle → Connect → Active → OpenSent → OpenConfirm → Established。

我习惯把这个过程拆成三个阶段:

  • TCP 连接阶段(Idle → Connect → Active):BGP 先尝试建立 TCP 连接。谁先发起连接?看配置——通常主动方是 Connect 状态,被动方是 Active 状态。
  • Open 消息交换阶段(OpenSent → OpenConfirm):双方交换 BGP 版本、AS 号、Hold Time、Router ID 等信息。这里有个常见坑——AS 号不匹配,会话直接卡在 OpenSent 状态。
  • Keepalive 确认阶段(Established):双方互发 Keepalive,确认参数无误后进入 Established 状态。这时候才开始交换路由。

实战排错命令(Cisco 设备):

show ip bgp summary          # 查看BGP邻居状态
show ip bgp neighbors x.x.x.x  # 查看邻居详细信息
debug ip bgp updates          # 调试路由更新(慎用,生产环境小心)

嗯,这里要注意一个细节:Hold Time 的协商机制。双方在 Open 消息中各自声明自己的 Hold Time,实际生效的是较小值。我建议生产环境不要用默认的 180 秒,改成 30 秒或 60 秒——这样故障检测更快。

我的经验: 如果你发现 BGP 会话频繁 flapping,先检查 TCP 连接是否稳定。很多时候不是 BGP 的问题,而是底层链路丢包导致 TCP 重传超时。我曾经花了一整天排查 BGP 配置,最后发现是光纤收发器坏了——教训深刻。

好了,BGP 的基础就回顾到这里。这些内容虽然看起来简单,但它们是后续理解劫持攻击和防护策略的基石。你想想看,如果连选路原则都搞不清楚,怎么去识别「恶意路由注入」?如果不懂会话建立过程,怎么去防范「TCP RST 攻击」?

下一节,我们会深入分析 BGP 劫持的几种典型攻击手法。到时候你会发现——嗯,原来攻击者就是利用了我们今天讲的这些基础机制。


公众号:蓝海资料掘金营,微信 deep3321