本指南可帮助您诊断和解决使用 Magic Transit 时的常见隧道健康状况问题。隧道健康检查会监控您的 GRE 和 IPsec 隧道端点(在 Cloudflare 仪表板中也称为连接器)并将流量引导至最佳的可用路由。
使用下表将您的症状与最可能的原因和第一步操作进行匹配:
| 症状 | 最可能的原因 | 第一步操作 |
|---|---|---|
| 隧道显示 Down,且从未变健康 | 配置不匹配或防火墙阻止了 IKE | 检查 IPsec 参数和防火墙规则。请参阅 IPsec 隧道建立失败。 |
| 仪表板显示某些数据中心(colos)为 "100% degraded"(100% 已降级) | 正常——这是一个状态指示器,而非丢包率 | 检查受影响的数据中心是否承载了您的流量。请参阅理解已降级状态。 |
| 隧道在健康与不健康之间抖动 | 防重放保护或重签密钥(rekey)中断 | 禁用您路由器上的防重放保护。请参阅 IPsec 隧道不稳定。 |
| 健康检查失败但流量能正常流动 | 状态防火墙丢弃了健康检查探测数据包 | 将健康检查类型从 Reply 更改为 Request。请参阅隧道显示 Down 但流量正常流动。 |
| 基于策略的 VPN 隧道健康检查失败 | Reply 类型的健康检查落在隧道流量选择器之外 | 使用带有环回目标的 Request 类型健康检查。请参阅基于策略的 VPN 健康检查失败。 |
| 某特定区域的所有隧道均已降级或 Down | 该区域与您的网络之间的网络路径存在问题 | 检查 ISP 连接性。使用 traceroute 或 MTR 从您的隧道端点向 Cloudflare 进行测试。 |
| 全球范围内的所有隧道均已降级或 Down | 您的网络边缘存在问题 | 检查您的隧道端点路由器及上行连接。 |
- 仪表板:每个数据中心的隧道健康状态和每条隧道的流量大小(转到 Insights(洞察) > Network health(网络运行状况) > Network health(网络运行状况))
- API:通过 Magic Transit 隧道健康 API 获取的隧道健康状态
- Network Analytics:通过 Network Analytics 监控流量大小、数据包计数和协议分布
- 在您的网络中:从您的隧道端点向 Cloudflare 发起 Traceroute 和 MTR。由于 Cloudflare 端点使用 Anycast,这将仅测试到最近数据中心的路径。要测试特定区域,请使用 Cloudflare Traceroute API 来运行从特定 Cloudflare 区域到您网络的 traceroute。
- 隧道健康事件与 Cloudflare 网络事件之间的关联
- 逐包转发决策(哪个数据中心通过哪条隧道转发了哪个数据包)
- 超过仪表板保留期限的历史健康检查探测数据
如果您遇到隧道健康问题,请先检查以下各项:
- 健康检查类型:如果使用状态防火墙(例如 Palo Alto Networks、Check Point, Cisco 或 Fortinet),请将健康检查类型从 Reply 更改为 Request。
- 防重放保护:禁用您路由器上的防重放保护,或将重放窗口设置为
0。 - MTU 设置:验证 MTU 设置是否正确(通常 GRE 为
1476,IPsec 为1400-1450)。 - IPsec 参数:确认您的加密参数与 Cloudflare 支持的配置相匹配。
- 健康检查方向:Magic Transit 默认为 Unidirectional (direct server return)。
- Cloudflare Network Firewall 规则(较少见):确保允许来自 Cloudflare IP 地址 ↗的 ICMP 流量。
Cloudflare 仪表板中的 Network health ↗ 页面显示三种隧道健康状态:
| 状态 | 仪表板显示 | 技术阈值 |
|---|---|---|
| Healthy(健康) | 超过 80% 的健康检查通过 | 失败率低于 0.1% |
| Degraded(已降级) | 介于 40% 和 80% 的健康检查通过 | 过去五分钟内至少有 0.1% 的失败(最少两次失败) |
| Down(宕机) | 少于 40% 的健康检查通过 | 所有健康检查均失败(最后一秒内至少三次采样均失败) |
仪表板显示从承载您流量的每个 Cloudflare 数据中心测量到的隧道健康状况。由于互联网路径问题,看到某些位置报告已降级状态是正常现象。请关注在 Traffic volume (1h)(流量大小(1 小时))列中显示流量的位置。
隧道健康状况仪表板按数据中心按隧道报告健康状态。每个 Cloudflare 数据中心都会独立跟踪每个隧道的健康状况。
常见的困惑来源是在仪表板上看到 "100% degraded"(100% 已降级),并将其误解为 100% 丢包。请注意,这两者是不同的。
已降级状态是如何触发的:
当健康检查探测失败时,Cloudflare 会发送两个额外的探测。如果有些探测成功有些失败,隧道在该数据中心就会进入已降级状态。几秒钟的间歇性丢包就足以触发这种转换。
要检查的内容:
请关注在 Traffic volume (1h)(流量大小(1 小时))列中显示流量的数据中心。对于显示已降级状态且流量为零或极少的数据中心,这仅是参考信息——它表明该特定 Cloudflare 数据中心与您的网络之间存在路径问题,但如果没有流量通过该数据中心路由,则它不会影响您的流量。
恢复时间:
即使健康检查立即开始成功,隧道也会在已降级状态下保持至少五分钟。从已降级恢复到健康需要持续在一段时间内通过健康检查,这可能需要长达 30 分钟。有关隧道如何在这两种状态之间转换的详细信息,请参阅下文的恢复行为。
当隧道变得不健康时,Cloudflare 会对通过该隧道的路由应用优先级惩罚:
- Degraded(降级):向路由优先级增加
500,000 - Down(中断):向路由优先级增加
1,000,000
这些惩罚会在维持冗余的同时将流量转移到更健康的隧道。Cloudflare 从不完全移除路由,即使在所有隧道都不健康的情况下也能保留故障转移选项。
隧道在状态之间的转换是不对称的,以防止抖动:
- Healthy(健康) 到 Degraded(降级)/Down(中断):检测到失败时快速转换。如果所有探测重试都失败,隧道可以直接从 Healthy 转为 Down。
- Down(中断) 到 Degraded(降级):需要连续三次成功的健康检查探测。
- Degraded(降级) 到 Healthy(健康):需要连续 30 次探测的失败率低于 0.1%。
有关监控隧道状态的说明,请参阅 在仪表板中检查隧道健康状况。
健康检查类型:
| 类型 | 行为 | 适用场景 |
|---|---|---|
| Reply(默认) | Cloudflare 发送 ICMP 回复数据包 | 没有状态防火墙的简单网络 |
| Request(请求) | Cloudflare 发送 ICMP 回显请求 | 具有状态防火墙的网络(建议大多数部署使用) |
健康检查方向:
| 方向 | 行为 | 默认用于 |
|---|---|---|
| Bidirectional(双向) | 探测和响应都穿越隧道 | Cloudflare WAN (前称 Magic WAN) |
| Unidirectional(单向) | 探测穿越隧道;响应通过互联网返回 | Magic Transit(直接服务器返回) |
- 仪表板显示隧道为
Down或Degraded - 实际用户流量成功通过隧道
- 尽管连接正常,健康检查失败率仍为 100%
状态防火墙(如 Palo Alto Networks、Check Point、Cisco 和 Fortinet)会丢弃健康检查数据包。默认情况下,Cloudflare 发送 ICMP Reply 数据包作为健康检查探测。
状态防火墙会检查这些数据包,并在其会话表中寻找匹配的 ICMP Request。当不存在匹配的请求时,防火墙会因“状态异常”而丢弃该回复。
将健康检查类型从 Reply 更改为 Request:
-
转到 Connectors(连接器) 页面。
Go to Connectors ↗ -
在 IPsec/GRE tunnels(IPsec/GRE 隧道) 中,在受影响的隧道上选择 Edit(编辑)。
-
在 Health check type(运行状况检查类型) 下,由 Reply 更改为 Request。
-
选择 Update tunnel(更新隧道)。
当您使用 Request 类型健康检查时,Cloudflare 将发送 ICMP 回显请求。您的防火墙状态检测引擎会将其识别为合法请求,并自动允许 ICMP 回复响应。
- 在启用 Cloudflare Network Firewall 之前,隧道是健康的
- 添加 Cloudflare Network Firewall 规则后,健康检查失败
- 阻止 ICMP 流量导致立即发生健康检查失败
Cloudflare Network Firewall 会处理所有流量,包括 Cloudflare 的健康检查探测。如果您创建了阻止 ICMP 流量的规则,您也会阻止 Cloudflare 发送用来监控隧道状态的健康检查数据包。
在任何阻止规则之前,为来自 Cloudflare IP 地址的 ICMP 流量添加一条允许规则:
-
转到 Firewall policies(防火墙策略) 页面。
Go to Firewall policies ↗ -
创建具有以下参数的新策略:
| 字段 | 值 |
|---|---|
| Action(操作) | Allow(允许) |
| Protocol | ICMP |
| Source | Cloudflare IP ranges ↗ |
- 将此规则置于任何阻止 ICMP 流量的规则之前。
有关更多信息,请参阅Cloudflare Network Firewall 规则与端点健康检查。
- IPsec 隧道频繁在 healthy 和 down 状态之间抖动
- 隧道上出现间歇性丢包
- 流量能工作一段时间,然后无需更改配置就会停止
- 路由器日志显示由于以下原因导致丢包:
- "replay check failed"(重放检查失败)
- "invalid sequence number"(序列号无效)
- "invalid SPI" (安全参数索引无效)
您的路由器上启用了防重放保护。IPsec 防重放保护期望数据包按顺序从单个发送方到达。
Cloudflare 的 Anycast 架构意味着您的隧道流量可能源自数百个数据中心的数千台服务器。每台服务器都维护自己的序列计数器,从而从路由器的角度导致数据包到达无序。
禁用路由器上的防重放保护:
对于大多数路由器:
在您的 IPsec 配置中找到防重放(anti-replay)或重放保护(replay protection)设置并将其禁用。
如果只能设置重放窗口大小:
将重放窗口设置为 0 以有效地禁用该检查。
对于不支持禁用防重放的设备:
在 Cloudflare 仪表板中启用重放保护(replay protection)。这会将所有隧道流量路由到单个服务器,从而以失去 Anycast 优势为代价来保持正确的序列号。
-
转到 Connectors(连接器) 页面。
Go to Connectors ↗ -
在 IPsec/GRE tunnels(IPsec/GRE 隧道) 中,在您的 IPsec 隧道上选择 Edit(编辑)。
-
启用 Replay protection(重放保护)。
-
选择 Update tunnel(更新隧道)。
对于遇到 "invalid SPI"(无效 SPI)错误的 Cisco IOS/IOS-XE 路由器:
启用 ISAKMP 无效 SPI 恢复,以帮助路由器重新同步安全关联(Security Associations):
configure terminal
crypto isakmp invalid-spi-recovery
exit有关为何此设置是必需的详细解释,请参阅 防重放保护。
- 隧道健康状况定期降至
Degraded或Down - 问题与 IPsec rekey 间隔重合(通常是每隔几个小时)
- 隧道在 1-3 分钟后自动恢复
- 路由器日志显示 rekey 成功完成
当您的隧道端点发起 IPsec rekey 时,新的安全关联(SA)必须在 Cloudflare 的整个网络中传播。Rekey 传播延迟已显着减少,并且在大多数部署中不常见。但在某些配置中,仍可能在 rekey 期间发生简短的隧道降级。
Cloudflare 从不发起 rekey,只做响应。所有 rekey 尝试都必须来自您的隧道端点。如果您的设备在 rekey 期间收到 TEMPORARY_FAILURE 响应,它必须重新建立 IKE 会话以进行恢复。
此行为是预料之内的,且隧道会自动恢复。为最大程度减少影响:
-
配置带 restart(重启)的死联检测(DPD):将隧道端点的 DPD 动作设置为 "restart",以便如果 rekey 失败并返回 TEMPORARY_FAILURE 时,它能自动重新建立 IKE 会话。如果没有 DPD 重启,设备可能会陷入 rekey 失败的死循环中。
-
增加 rekey 间隔:在隧道端点上配置更长的 SA 生存周期以减少 rekey 频率。常用值为 IKE SA 8-24 小时,IPsec SA 1-8 小时。
-
调整健康检查敏感度:如果 rekey 期间的短暂降级触发了警报,请考虑降低健康检查速率:
- 转到 Connectors(连接器) 页面。
- 在 IPsec/GRE tunnels(IPsec/GRE 隧道) 中,选择该隧道上的 Edit(编辑)。
- 将 Health check rate(健康检查频率) 更改为 Low。
-
交错 rekey 时间:如果您有多条隧道,配置不同的 SA 生存周期,使其不会同时执行 rekey。
- 配置为双向的健康检查始终失败
- 单向健康检查能正常工作
- 流量正常通过隧道
双向健康检查要求探测包和响应包都穿过隧道。您的路由器必须:
- 接受目的地为隧道接口 IP 地址的 ICMP 数据包
- 将 ICMP 响应路由回穿过隧道发送到 Cloudflare
如果流量选择器或防火墙规则不允许此流量,则双向健康检查将失败。
For IPsec tunnels:
配置流量选择器以接受隧道接口地址的数据包。例如,如果您的隧道接口地址为 10.252.2.27/31:
- 允许往返于
10.252.2.26(Cloudflare 侧)的流量 - 允许往返于
10.252.2.27(您这侧)的流量
对于所有隧道类型:
确保您的防火墙允许隧道接口上的 ICMP 流量。许多防火墙需要显式规则才允许隧道接口上的管理流量(包括 ping)。
有关双向健康检查如何工作的详细信息,请参阅 隧道健康检查。
- 隧道状态显示为
Down且从未变健康 - 没有流量通过隧道
- 路由器日志显示 IKE 协商失败
IPsec 隧道建立可能会因几种配置不匹配而失败:
| 问题 | 症状 |
|---|---|
| 加密参数不匹配 | IKE 协商失败,提示 "no proposal chosen"(未选择提议) |
| 预共享密钥 (PSK) 不正确 | 阶段 1 中出现身份验证失败 |
| IKE ID 格式错误 | 尽管 PSK 正确,但身份验证仍失败 |
| 防火墙阻止 IKE | 没有任何 IKE 流量到达 Cloudflare |
-
验证加密参数是否符合 Cloudflare 支持的配置:
阶段 1 (IKE)
| 参数 | 支持的值 |
|---|---|
| IKE version | 仅限 IKEv2 |
| Encryption | AES-GCM-16, AES-CBC-256 |
| Authentication | SHA-256, SHA-384, SHA-512 |
| DH Group | DH group 14, 15, 16, 19, 20 |
阶段 2 (IPsec)
| 参数 | 支持的值 |
|---|---|
| Encryption | AES-GCM-16, AES-CBC-256 |
| Authentication | SHA-256, SHA-512 |
| PFS Group | DH group 14, 15, 16, 19, 20 |
-
验证预共享密钥 (PSK):
- 在 Cloudflare 仪表板中重新生成 PSK
- 准确复制新的 PSK(不能有额外的空格或字符)
- 用新的 PSK 更新您的路由器
-
检查 IKE ID 格式:Cloudflare 使用 FQDN 格式作为 IKE ID。请确保您的路由器配置为接受 FQDN 对端身份。该 FQDN 显示在 Cloudflare 仪表板中的隧道详细信息中。
-
验证防火墙规则:确保您的边缘防火墙允许:
- UDP 端口
500(IKE) - UDP 端口
4500(IKE NAT-T) - IP 协议
50(ESP)
- UDP 端口
有关受支持参数的完整列表,请参阅 支持的配置参数。
- 基于策略的 IPsec 隧道上健康检查持续失败
- 符合隧道流量选择器(加密域)的流量正常流动
- 同一设备上基于路由的隧道能正常工作
基于策略的 IPsec 隧道使用流量选择器来定义隧道中允许哪些前缀。Reply 类型的健康检查自我寻址到 Cloudflare IP 地址。由于这些地址落在隧道的流量选择器(其仅允许客户网络目的地)之外,因此隧道端点会丢弃健康检查数据包。
此外,一些防火墙(如 Check Point)即使在基于路由的隧道上,也可能会因 Reply 形式健康检查数据包自我寻址的特性而将其标记为欺骗(spoofed)。
- 将健康检查类型从 Reply 更改为 Request。
- 在隧道端点上配置环回地址作为健康检查目标。该目标必须:
- 可从隧道端点路由
- 被隧道的流量选择器(加密域)所涵盖
- 对于双向健康检查,确保健康检查源(在 Cloudflare 仪表板中配置的隧道接口地址)也被流量选择器覆盖。
| 厂商 | 常见问题 | 解决方案 |
|---|---|---|
| Palo Alto Networks | 默认设置下健康检查失败 | 将健康检查类型更改为 Request;禁用防重放 |
| Cisco Meraki | 无法禁用防重放 | 在 Cloudflare 仪表板中启用重放保护 |
| AWS VPN Gateway | 无法禁用防重放 | 在 Cloudflare 仪表板中启用重放保护 |
| VeloCloud | 无法禁用防重放 | 在 Cloudflare 仪表板中启用重放保护 |
| Check Point | 状态异常数据包被丢弃 | 将健康检查类型更改为 Request |
如果您在通读本指南后仍遇到隧道健康问题,在联系 Cloudflare 支持之前,请收集以下信息:
- 受影响的 Account ID 和隧道名称
- 问题发生的时间戳(以 UTC 为单位)
- 隧道配置详细信息:
- 隧道类型(GRE 或 IPsec)
- 健康检查类型(Request 或 Reply)
- 健康检查方向(Bidirectional 或 Unidirectional)
- 健康检查速率(Low、Medium 或 High)
- 路由器信息:
- 厂商和型号
- 固件/软件版本
- IPsec 配置(已做脱敏处理,去除了 PSK)
- 观察到的症状:
- 仪表板中的隧道健康状态
- 用户流量是否受到影响
- 路由器日志中的错误消息
- 来自您路由器且显示隧道流量的数据包捕获(Packet captures)
- 涵盖问题时间段的路由器日志
- 从您的网络到 Cloudflare 端点的 Traceroute 结果
- 隧道健康状况仪表板的屏幕截图
- 使用类似 ping.pe ↗ 的工具进行分布式 traceroute,以测试多个全球位置的可达性
收集以下命令的输出(语法因厂商而异):
- IPsec SA 状态:
show crypto ipsec sa - IKE SA 状态:
show crypto isakmp sa - 隧道接口状态:
show interface tunnel <number> - 路由表:
show ip route
- 隧道健康检查:关于健康检查行为的技术细节
- 防重放保护:为什么必须禁用防重放
- 配置隧道端点:隧道设置说明
- 在仪表板中检查隧道健康状况:仪表板导航指南
- Network Analytics:流量分析工具