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 条就够了。我画了张图,帮你理清这个决策流程:
选路原则的优先级,我习惯用一句话记:「本地的、高的、短的、优的」。具体来说:
- 权重(Weight):Cisco 私有属性,只在本路由器有效。值范围 0-65535,越高越优先。我一般只在特殊场景下用,比如多宿主的出口选路。
- Local_Pref:整个 AS 内有效。这是最常用的选路工具。我建议你把它作为默认策略的入口。
- 本地起源:network 命令注入的路由,优先级高于从邻居学来的路由。
- AS_PATH 长度:越短越优先。但注意,AS_PATH prepend 可以人为加长路径,用来做流量工程。
- Origin 类型:IGP(i)优于 EGP(e)优于 Incomplete(?)。
- MED:值越低越优先。只在同一个 AS 的邻居之间比较。
- 路径类型: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