在双 uplink 的 ASA 上,failback 并不是 failover 的逆向操作。去往对端的路由变了,随后平台要把三套彼此独立的状态机对齐:路由表、IKE 与 IPsec 安全联盟、连接表。三者会互相落后,而多数人所说的“隧道回不来”,正是这种滞后。

failback 真正改变了什么

路由查表只是看得见的那一层。被监控对象恢复后,去往对端外部地址的监控路由回来了,ASA 发出的下一个包重新走主链路。此后的一切,取决于已有状态是否与新路径一致。

ARP 与 NAT 是安静的依赖项。新的下一跳需要一个能解析的网关,以及仍然与远端匹配的转换;否则回切后的最初几个包无处可去,路由看着正常,却什么都不通。

同一条时间线上的四个视角

在切换前、切换中和切换后记录同样四件事,因为单张快照无法告诉你到底是哪一层动了。

ViewWhat to record
Uplink and routeInterface state, the tracked object result, the route selected for the outer peer address
IKE and IPsecThe live peer, IKE version, security associations, protected-traffic counters
Connection tableInterface and endpoint pair for old flows and for flows created after the change
ApplicationOne pre-existing operation and one fresh request, each marked success, reset, stall or recovered

一条从未变化的路由,和一条在旧连接仍保留转发状态时发生变化的路由,会产生同样的抱怨,却给出完全不同的证据。

旧连接为何留在备份路径上

ASA 不会因为路由变化就拆掉一条流。已建立的连接保留创建时的转发决定,平台为这段允许时间提供了彼此独立的控制项:floating-connection timeout 与 connection holddown。Cisco 的Cisco 关于 ASA 9.24 连接设置的指南把它们当作两个不同的问题,实际行为也正是如此。前者管已有流能否存活,后者管新流何时可以使用首选路径。

改动其中任何一个之前,先读你所在版本的实际取值。调低会关掉人们仍在使用的会话;调高会让 failback 看起来从未发生,因为新连接在这段时间里一直走旧路径。

路由回来,隧道不会因此重新协商密钥

IPsec 安全联盟带有自己协商出来的生存期,并且能在承载它的路由变化中存活。因此隧道可以在一次 failback 中保持建立,而它的外部地址已经不再匹配正在使用的路径——这正是 DPD 的意义,也是把对端地址固定下来、而不是让它浮动的设计的意义。

crypto-map 与 VTI 两种设计在这里表现不同,Cisco 9.24 的 VTI 文档也描述了基于路由的选项。过去那种“ASA 不能跑基于路由的 VPN”的笼统说法,在受支持的版本上并不成立。

按这个顺序读证据

从控制面开始:用show route看选中的路径,用show interface看链路状态,再用 SLA 监控的计数看被监控对象。然后读show crypto ikev2 sa,或 IKEv1 的对应命令,确认哪个对端还活着;接着用show crypto ipsec sa看受保护的流。再用show conn address <host>把连接表收窄,比较新旧条目里的接口列。把这些输出连同时间戳一起记下来,因为它们的先后顺序就是诊断本身。

最后做一次业务验证:一条原本就存在的流,一条在路由回来之后新建的流。若旧流失败而新流正常,你面对的是连接状态问题;若两者都失败,那是隧道或策略错了,连接表只是干扰项。

三个阶段都保持同样的记录格式,并写清确切版本。当时间线始终指向同一次切换时,把记录交给支持,而不是去猜 bug ID。

相关文章