远端是 Cisco ASA 的 Cloud VPN 隧道上出现 NEGOTIATION_FAILURE,几乎总是提案或选择器不一致,而第一个有用的事实是:任何编辑都修不好它。Cloud VPN 在创建隧道对象时就把 IKE 提案固定下来,没有可以就地修改算法的字段,所以修复方式只能是删除,再按记录好的起点重新创建。把它当成重建,这项工作就会变成一份检查清单,而不是靠猜的一下午。

删任何东西之前先读失败信息

协商失败是阶段问题,对端日志通常会指明是哪一阶段。阶段 1 失败意味着两端无法就提案达成一致,或者互相认证失败。阶段 2 失败意味着隧道已经起来,但受保护的选择器不匹配。这是两种不同的修复,而且值得在任何人动配置之前把那行日志提取出来。

这个失败也排除了一些方向。它不是 VPC 路由,不是隧道接口上的防火墙规则,也不是网络内部的名字解析故障。追着这些方向改,只会得到改不动结果的自信改动,还会让最终修复难以归因。

趁两份配置都还在,先把它们记下来

删一条隧道只要半分钟,却会毁掉你手上唯一的证据。在删之前,写下本地和远端选择器、对端地址、共享密钥归谁管理,以及 ASA 的 crypto map 或 IKEv2 配置文件。ASA 回答两个独立的问题:配置了什么,以及现在什么是起来的:

show running-config crypto ikev2
show crypto ikev2 sa
show crypto ipsec sa | include local ident|remote ident|status

在 Google 一侧要读隧道对象,而不是控制台摘要,因为对端地址和选择器字段正是你必须原样复现的值:

gcloud compute vpn-tunnels describe tunnel-to-asa --region europe-west1 \
  --format="yaml(peerIp,localTrafficSelector,remoteTrafficSelector,ikeVersion,sharedSecret)"

在第一次删除之前,把这些值写进工单。下面的重建之所以可行,只是因为你能够用一处刻意的差异把同一个对象重新建出来。

一侧拒绝协商的算法

Cloud VPN 不像传统对端那样从一组 IKEv1 算法里挑选,它期望的对端配置是固定的:加密用 aes-cbc-128,完整性和 PRF 都用 sha1-96,Diffie-Hellman 第 2 组,阶段 1 为 36,600 秒,阶段 2 为 10,800 秒。ASA 的策略必须提供完全相同的一组。只要匹配的那条也在列表里,ASA 上多一条提案并无害处。

IKEv2 给双方更多余地,但规则保持同样的形状:启用 PFS,选择隧道支持的 DH 组,并把提案列表控制得足够短,让不匹配一眼可见。在 Cloud VPN 上使用 ASA 对端还意味着静态路由,所以受保护的网段必须提前规划并逐条列出,而不是交给 BGP。

从别的厂商模板里抄来的生命周期,是这里常见的错误拐点。Google 把这些值作为必需的对端设置公布出来,所以照它设置;更短的值不会被向上协商到 ASA 想要的水平。

删除、重建,并清掉旧状态

删隧道,不要删网关,并记下 Cloud VPN 给替代隧道分配的名字,因为名字是分配而不是复用的。用记录好的值和相同的对端地址重建它,然后把匹配的提案加进 ASA 的策略列表。

在 ASA 改完之后、读结果之前,清掉安全关联。ASA 可能一直提供旧策略,直到当前 SA 过期,所以正确的配置会在整个旧生命周期内显得是坏的,而观察者会得出重建失败的结论,其实它还没开始:

clear crypto ikev2 sa
clear crypto ipsec sa

先确认阶段 1 起来,再看阶段 2。阶段 1 不通时,是提案或预共享密钥错了,做选择器的修改改变不了这一点。

选择器互为镜像,最后由计数器裁决

阶段 2 只有在两端对受保护地址达成一致时才工作,而且这种一致是镜像关系,不是共享关系。Google 的本地选择器必须匹配 ASA 称为远端的选择器,Google 的远端选择器必须匹配 ASA 称为本地的那个。一侧是 0.0.0.0/0、另一侧是单个子网的隧道能通过阶段 1,随后又以同样的主错误在阶段 2 失败。任何一侧都无法把对方的列表改宽。

对于基于策略的选择器,把每一对网段都列出来,并把清单留在工单里。以后在本地新增的子网需要两端都改,因为 ASA 上新增路由并不会扩大选择器,结果就是隧道虽然起来了,却只对第一天存在的网段放行流量。

最后用一个主机到主机的流来验证,并读取两侧的字节计数器。ASA 上在涨、Google 上不动的计数器,通常意味着回包从另一个接口出去,或者选择器没有覆盖回程网段。把算法、生命周期、选择器和新的隧道名都记下来,因为下一次提案变更还是要重复这次重建,而这些值能让它变成一件短活。

相关文章