路由震荡
路由震荡
产生原因
- 当一条线路上的路由器频繁下线并重新上线,导致其他路由成员频繁的学习和删除相关路由,这被称为路由震荡(Flapping)。在 BGP 中,路由振荡是一个很大的问题,每当 BGP 邻居下线时,连接到该邻居的所有路由器都会在其路由表中发生对应变化。这会在网络上产生大量的 BGP 管理流量。当该路由器重新上线时,相同的流量会再次出现。如果是由于网络线路故障,比如每隔 10 秒就会交替在线和离线,就可能发送大量非必要的路由更新。
- 另一个可能导致路由振荡的原因是在 HA 模式下有多个 FortiGate 设备。当 HA 的主设备切换到另一个成员时,网络上的其他路由器可能会将 HA 集群视为离线,导致路由振荡。虽然这不经常发生,但仍可能导致网络用户的服务中断。解决此问题的简单方法是增加 HA 集群上的 route-ttl,以确保从原主设备上同步的 BGP 路由在故障切换后不会立即过期。另外,配置 HA 集群上的 Graceful Restart 有助于实现平滑故障切换。
处理方法
- 处理路由振荡的首先应该检查硬件。如果线缆松动或损坏,可以更换并消除问题。如果是路由器上的接口有问题,要么避免使用该接口,要么更换一个正常的路由器。如果路由器上的电源有问题,要么更换电源,要么使用备用电源。这些快速简单的修复方法可以避免配置更复杂的 BGP 选项。
- 如果路由振荡是由于其他原因,配置 BGP 以处理中断将确保网络用户获得不间断的服务。一些缓解 BGP 路由振荡的方法包括:
- 调整 Holdtime 计时器
- Dampening
- Graceful Restart
- BFD
调整 Holdtime 计时器
在排查路由振荡问题时应先考虑调整 Holdtime 计时器,此计时器可以降低路由器下线导致路由更新的频率。
一旦 Holdtime 计时器激活,其将在持续时间内禁止 FortiGate 接受对该邻居的任何更改。例如在 Holdtime 计时器期间对端路由器振荡 5 次,FortiGate 只会识别到第 1 次中断。在后续 Holdtime 计时器持续时间内,不会发生任何变化,FortiGate 在 Holdtime 期间内都将这个路由器视为离线。如果路由器在 Holdtime 计时器到期后仍在振荡,将重新启动计时器。
如果对端路由器没有振荡(例如下线后重新上线,并保持在线),计时器仍然会倒计时,并在计时器持续时间内忽略该路由器的上线。在这种情况下,路由被视为下线的时间比实际时间长。在实际使用中,这不会引起严重问题,因为更新不是频繁的。而且当一个在线的路由器被视为离线时,可以看作是一种 BGP 的健壮性功能。通常情况下,我们不希望大部分流量通过一个不稳定的路由,这由 Holdtime 计时器来实现。
以下 3 种不同的路由振荡情况,都可以使用 holdtime 计时器来处理:
- 路由频繁上下波动。
- 路由在很长一段时间内下线再上线一次。
- 或者路由在很长一段时间内下线并保持下线。
例如,你的网络有两个路由邻居需要设置计时器:
- 一个是主路由邻居(101.103.1.1),所有的互联网流量都经过这个路由,如果它下线时间过长则会引起较大影响,主要路由的 Holdtime 计时器应该相对较短,如 60s。
- 另一个是很少使用的邻居(202.103.1.1)。主要路由的计时器应该相对较短(例如,60 秒)。次要路由邻居的 Holdtime 计时器可以较长,如默认值 180s。
config router bgp
config neighbor
edit 101.103.1.1
set holdtime-timer 60
set keepalive-timer 60
next
edit 202.103.1.1
set holdtime-timer 180
set keepalive-timer 60
next
end
endDampening
Dampening 是一种通过限制对端学习的路由而限制路由振荡的方法。使用 Dampening 时,虽然路由仍然会振荡,但对该对端路由的关注会逐渐减少。第一次振荡不会启动 Dampening,但第二次振荡将启动一个计时器,FortiGate 在计时器持续时间内将无视该路由器发送的路由。如果在 Dampening 计时器到期之前对端路由器再次振荡,计时器将继续增加。有一个称为 dampening-reachability-half-life 的时间,之后路由振荡将被抑制 Dampening 计时器一半的时间。当一个路由已经稳定一段时间,但尚未完全清除所有 Dampening 时,这个 half-life 就会生效。想要再次将振荡的路由加入路由表中,必须等待 Dampening 计时器到期。
如果路由振荡是暂时的,可以通过使用execute router clear bgp CLI 从 FortiGate 设备的缓存中清除 Dampening:
# execute router clear bgp dampening {<ip_address> | <ip_address/netmask>}
或
# execute router clear bgp flap-statistics {<ip_address> | <ip_address/netmask>}例如,要删除 10.10.1.0/24 子网的路由 Dampening 信息,请输入以下 CLI 命令:
# execute router clear bgp dampening 10.10.1.0/24配置 Dampening:
config router bgp
set dampening {enable | disable}
set dampening-max-suppress-time <minutes_integer>
set dampening-reachability-half-life <minutes_integer>
set dampening-reuse <reuse_integer>
set dampening-route-map <routemap-name_str>
set dampening-suppress <limit_integer>
set dampening-unreachability-half-life <minutes_integer>
endGraceful Restart
在某些情况下,路由振荡是由 BGP 邻居中断但硬件部分(控制平面)仍然可以正常运行的情况引起的。例如当 BGP 进程重新启动,但硬件仍然可以正常运行和转发流量。Graceful Restart 适用于这种情况,GR 期间路由不会中断,但路由器对路由更新是不响应的。需要网络中的其他 BGP 路由器也支持优雅重启。
FortiGate HA 也可以从 Graceful Restart 中受益。当发生 HA 切换时,HA 集群会广播它即将下线,其他路由器不会视其为路由振荡。例如,FortiGate 是四个相互发送更新的 BGP 路由器之一。其中任何一个路由器都支持 GR。当 FortiGate(GR Restarter)发生 HA 切换后,GR Restarter 向其邻居发送一条消息,通知它正在重新启动。BGP 邻居(GR Helper)将所有正在重新启动的路由器的路由标记为 Stale,但它们继续使用这些路由。在重新启动完成后,将检查其路由并在需要时对其进行处理。对等方还知道在路由器重新启动期间可以维护哪些服务。在路由器完成重新启动后,路由器向其对等方发送一条消息,通知它已完成重新启动。
FortiGate 设备支持其自己的 BGP GR 和作为邻居 BGP 路由器的 GR Helper,配置请参考 路由 → 动态路由 → BGP → BGP GR章节。
BFD
Bidirectional Forwarding Detection(BFD)是一种用于快速定位网络中硬件故障的协议。运行 BFD 的路由器相互通信,如果检测计时器超时,那么该路由器将被宣告为下线。然后,BFD 将此信息通知给路由协议,路由信息将得到更新。
BFD 的原理和相关配置请参考:https://handbook.fortinet.com.cn/routing/bfd/