ASA 的 failback:路由回切时到底有什么在动
路由回切到主路径,并不等于旧连接已经迁移。要把 uplink、隧道、连接表和业务结果放在一起看。
在双 uplink 的 ASA 上,failback 并不是 failover 的逆向操作。去往对端的路由变了,随后平台要把三套彼此独立的状态机对齐:路由表、IKE 与 IPsec 安全联盟、连接表。三者会互相落后,而多数人所说的“隧道回不来”,正是这种滞后。
failback 真正改变了什么
路由查表只是看得见的那一层。被监控对象恢复后,去往对端外部地址的监控路由回来了,ASA 发出的下一个包重新走主链路。此后的一切,取决于已有状态是否与新路径一致。
ARP 与 NAT 是安静的依赖项。新的下一跳需要一个能解析的网关,以及仍然与远端匹配的转换;否则回切后的最初几个包无处可去,路由看着正常,却什么都不通。
同一条时间线上的四个视角
在切换前、切换中和切换后记录同样四件事,因为单张快照无法告诉你到底是哪一层动了。
| View | What to record |
|---|---|
| Uplink and route | Interface state, the tracked object result, the route selected for the outer peer address |
| IKE and IPsec | The live peer, IKE version, security associations, protected-traffic counters |
| Connection table | Interface and endpoint pair for old flows and for flows created after the change |
| Application | One 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。