来自 Google Cloud HA VPN 的 AUTHENTICATION_FAILED 通常把人送回预共享密钥,而密钥往往是对的。隧道卡在阶段 1,因为 Google 还比对另一样东西:对端在 IKE 交换中声明的身份。在 FortiGate 上,这个身份可能在无人改动地址的情况下改变类型。密钥重新输入两次之后,就把日志读作身份不匹配。

一次失败,两项检查

IKE 分两步验证对端。预共享密钥证明两端持有同一个秘密,声明身份则告诉响应方对端自称是谁。Google 会用配置好的对端来核对该身份。若不加干预,FortiGate 会发送由出接口推导出的地址型身份,比较便悄然通过。

两步在日志里落进同一个桶,这也解释了那个熟悉的循环:在有人读身份载荷之前,密钥已经被重敲四次。

FortiGate 在身份载荷里放了什么

问题始于有人为了两边一致而设置本地 ID。较新的 FortiOS 构建会把该身份标记为完全限定域名,即使填入的值是带点的地址。于是 Google 在期待地址时收到 FQDN 身份,并拒绝会话。消息里没有说明哪一半失败,报告便被读成认证失败。

开启 IKE 调试复现一次,读取防火墙实际发出的身份载荷。

在同一轮里确认三项便宜事实:两端使用的 IKE 版本、包含不可见尾部字符的确切密钥,以及 Google 期望的对端地址。它们回答的是不同问题,密钥一致并不能说明身份。

各个选项及其代价

每条出路修的是不同层,而且没有一条适用于所有部署。

OptionWhen it worksWhat it costs
Set an address identity on the firewallYour firmware lets you choose the typeBehaviour you must retest per release
Put a public address on the negotiating interfaceThe firewall can hold a routable addressNot possible behind NAT
Terminate on a peer that accepts your identityAnother endpoint validates what you produceA topology change

在固件允许选择类型并保留取值的地方,直接在防火墙上改正身份是最干净的答案。该字段在部分构建中存在,在另一些构建中会把类型填错,所以要测试自己的版本,而不是相信发布说明。

在协商接口上配置可路由的公网地址是文档化的绕行方案,因为默认身份随后就与 Google 的期望一致,无需任何覆盖。如果防火墙根本能持有这样的地址,多数部署最终都落在这里。

在对端上终结并验证你产出的内容,属于拓扑变更。请把它当作设计决策,而不是描述更友好的绕行方案。

当 NAT 去掉一个选项

在 NAT 之后,公网地址这条出路消失,剩下的取决于你无法控制的固件行为。这里才是需要有意选择的地方:升级、迁移对端,还是接受另一个云端点。这是三笔不同的预算,随手选一个,临时绕行就会变成架构。把选择和理由写在隧道旁边。

在解读任何内容之前,先确认 Google 一侧的隧道状态,以及 IKE 不是在途中被直接丢弃。被丢弃的包会超时,而不会产生拒绝。

在它还能工作时记录什么

记下隧道最后一次建立时生效的身份类型、取值、固件版本和对端地址。固件更新可能再次改变默认值,下一次失败看起来就会像密钥不匹配。把身份与密钥、对端地址存在一起,下一个人就能从便宜的检查开始。

这份记录也是下一次升级之后判断绕行是否仍然必要的唯一办法。

相关文章