关键词:BGP、eBGP、多跳、TTL、TTL Safety、EBGP-Max-Hop、对等会话、TTL 检查
第94篇:eBGP 多跳与 TTL 安全
一、引言
默认情况下,BGP eBGP 对等体要求直连建立邻接关系。这是因为 BGP 在发送 eBGP 报文时会设置 IP 头部的 TTL = 1,只有直连的对端才能收到(TTL 递减后仍大于 0)。
但在实际部署中,很多场景需要 eBGP 对等体跨越多台路由器建立会话:防火墙隔离、VRF 间互联、环回口建邻等。eBGP Multihop(多跳)通过提高 BGP 报文的 TTL 值,使得非直连的 eBGP 对等体也能建立邻接关系。
与此同时,TTL Security 机制利用 TTL 值防止 BGP 会话遭受中间人攻击,是 BGP 安全部署的重要组成部分。
二、核心概念
2.1 BGP 报文的 TTL 机制
BGP 使用 TCP 179 端口传输,但在 IP 层面有一个特殊的 TTL 处理机制:
| 对等体类型 | 默认 TTL | 接收方期望的最小 TTL |
|---|---|---|
| eBGP | 1 | 1 |
| iBGP | IGP 默认(通常 64 或 128) | 无特殊要求 |
TTL 检查流程:

2.2 eBGP Multihop
eBGP Multihop 通过以下方式放宽直连限制:
| 配置项 | 作用 |
|---|---|
| ebgp-max-hop N | 将发送 BGP 报文的 TTL 设置为 N(默认 1) |
| 环回口建邻 | 使用环回口 IP 作为对等体地址,提高稳定性 |
| Update-source | 指定 BGP 会话的源 IP 地址 |
2.3 TTL Security(GTSM)
Generic TTL Security Mechanism(GTSM,RFC 5082)通过验证接收到的 BGP 报文的 TTL 值来防止中间人攻击:
| 场景 | 发送 TTL | 接收最小 TTL 要求 | 安全性 |
|---|---|---|---|
| 直连 eBGP | 1 | 1 | 基本安全 |
| eBGP Multihop(2跳) | 2 | 2 | 防1跳内攻击 |
| eBGP Multihop(N跳) | N | N | 防N-1跳内攻击 |
三、技术细节
3.1 eBGP Multihop 的适用场景
| 场景 | 说明 | 多跳跳数 |
|---|---|---|
| 防火墙隔离 | eBGP 对等体之间有防火墙,不直连 | 2-3 跳 |
| VRF 间互联 | 不同 VRF 内的路由器建立 eBGP | 视 VRF 路由 |
| 环回口建邻 | 使用环回口 IP 建立 eBGP,提高可靠性 | 取决于环回口间路由 |
| 跨路由器互联 | 通过中间路由器连接 | 视拓扑 |
| 测试环境 | 非直连设备的 BGP 测试 | 任意 |
3.2 eBGP Multihop 配置方法
# 基本配置
bgp 100
peer 203.0.113.1 as-number 200
peer 203.0.113.1 ebgp-max-hop 3
# 发送 BGP 报文的 TTL = 3
# 使用环回口建邻(完整配置)
bgp 100
peer 10.255.0.1 as-number 200
peer 10.255.0.1 connect-interface LoopBack0
peer 10.255.0.1 ebgp-max-hop 5
peer 10.255.0.1 update-source LoopBack0
3.3 TTL Security 配置
# 配置 TTL 安全(接收端检查)
bgp 100
peer 203.0.113.1 as-number 200
peer 203.0.113.1 ttl-security hop-count 3
# 接收端检查:收到的 BGP 报文 TTL >= 3
# 等价配置(华为设备)
bgp 100
peer 203.0.113.1 as-number 200
peer 203.0.113.1 ebgp-max-hop 3
peer 203.0.113.1 ttl-security hop-count 3
# ebgp-max-hop 设置发送 TTL
# ttl-security hop-count 设置接收最小 TTL
3.4 TTL Security 的数学原理

原理说明:如果两个路由器之间相隔 N 跳,发送方设置 TTL = N。正常情况下,报文到达接收方时 TTL = 1。如果有攻击者在路径中间注入伪造的 BGP 报文,攻击者发送的报文经过更少跳数到达接收方,TTL 值会更高(因为攻击者从更近的位置发送)。但 TTL Security 要求 TTL 等于特定值(即发送方设置的值减去跳数后的期望值),所以伪造报文会被丢弃。
实际上,GTSM 的配置更为直接:发送方设置 TTL = 跳数 + 1,接收方要求 TTL >= 特定值。中间人发送的报文 TTL 通常不匹配。
四、实战配置/案例分析
4.1 场景一:防火墙隔离的 eBGP 多跳
需求:两台边界路由器之间有防火墙隔离,不能直连建立 eBGP。

配置:
# === R1 (AS 100) ===
interface LoopBack0
ip address 10.255.0.1 255.255.255.255
# 确保环回口 IP 可达(通过 IGP 或静态路由)
ip route-static 10.255.0.2 32 1.1.1.2
bgp 100
router-id 10.255.0.1
peer 10.255.0.2 as-number 200
peer 10.255.0.2 connect-interface LoopBack0
peer 10.255.0.2 update-source LoopBack0
peer 10.255.0.2 ebgp-max-hop 5
peer 10.255.0.2 ttl-security hop-count 5
# === R2 (AS 200) ===
interface LoopBack0
ip address 10.255.0.2 255.255.255.255
ip route-static 10.255.0.1 32 2.2.2.1
bgp 200
router-id 10.255.0.2
peer 10.255.0.1 as-number 100
peer 10.255.0.1 connect-interface LoopBack0
peer 10.255.0.1 update-source LoopBack0
peer 10.255.0.1 ebgp-max-hop 5
peer 10.255.0.1 ttl-security hop-count 5
4.2 场景二:eBGP 多跳的 Next_Hop 处理
eBGP 多跳场景下,Next_Hop 通常是对端的环回口 IP,需要确保 IGP 可达:
# R1 从 R2 学到的路由,Next_Hop = 10.255.0.2(环回口 IP)
# 需要确保 10.255.0.2 在 IGP 中可达
# 方式1:在 IGP 中发布环回口
ospf 1
area 0
network 10.255.0.1 0.0.0.0
# 方式2:在 BGP 中修改 Next_Hop
bgp 100
peer 10.255.0.2 as-number 200
peer 10.255.0.2 next-hop-local
4.3 故障案例:eBGP 多跳无法建立邻接
故障现象:配置了 eBGP Multihop,但对等体状态停留在 Idle 或 Active。
排查步骤:
# 步骤1:检查 TCP 连接
display tcp connection brief
# 确认端口 179 的 TCP 连接是否建立
# 步骤2:检查 IP 可达性
ping -a <源IP> 10.255.0.2
# 确保对端环回口 IP 可达
# 步骤3:检查防火墙
# 确认防火墙允许 TCP 179 端口的双向通信
# 包括 ESTABLISHED 和 RELATED 状态的连接
# 步骤4:检查 BGP 配置
display current-configuration configuration bgp 100
# 确认 ebgp-max-hop 值足够大
# 确认 update-source 与对端的 connect-interface 匹配
# 步骤5:检查 TTL 安全
display bgp peer 10.255.0.2 verbose
# 确认 ttl-security hop-count 与对端 ebgp-max-hop 匹配
常见根因:
| 根因 | 表现 | 解决 |
|---|---|---|
| 环回口不可达 | TCP 连接无法建立 | 检查路由,确保环回口 IP 可达 |
| 防火墙阻断 | TCP 连接被丢弃 | 在防火墙上放行 TCP 179 |
| ebgp-max-hop 值过小 | 报文到达前 TTL 耗尽 | 增大 ebgp-max-hop 值 |
| TTL 安全不匹配 | 报文被接收方丢弃 | 确保 ttl-security hop-count 与对端一致 |
| update-source 配置错误 | TCP 连接使用错误源地址 | 确认 update-source 为可达的 IP |
五、总结
| 配置项 | 作用 | 建议值 |
|---|---|---|
| ebgp-max-hop | 设置发送 BGP 报文的 TTL | 跳数 + 1(至少 2) |
| ttl-security hop-count | 设置接收 BGP 报文的最小 TTL | 与对端 ebgp-max-hop 一致 |
| update-source | 指定 BGP 会话源 IP | 环回口 IP |
| connect-interface | 指定连接使用的接口 | 环回口 |
eBGP Multihop 安全建议: 1. 始终配合 TTL Security 使用,防止中间人攻击 2. ebgp-max-hop 值设为实际跳数 + 1,不要过大 3. 使用环回口建邻提高会话稳定性 4. 确保环回口 IP 在 IGP 中可达 5. 部署双向 TTL Security(发送端和接收端都配置)
思考
- eBGP 默认要求直连(TTL = 1),这个设计除了实现方便之外,还有什么安全上的考量?
- TTL Security(GTSM)能防止什么样的攻击?如果攻击者能够在报文路径上修改 TTL 值,GTSM 是否还有效?
- eBGP 多跳使用环回口建邻时,如果环回口间的 IGP 路由发生震荡,对 BGP 会话有什么影响?如何缓解?
下篇预告:第95篇:BGP 软复位与路由刷新