GCP HA VPN 拒绝 FortiGate:本地 ID 类型不匹配
Google 不只看预共享密钥,也比对 FortiGate 声明的身份。FQDN 型本地 ID 会在该检查中失败,日志却仍写着认证。
来自 Google Cloud HA VPN 的 AUTHENTICATION_FAILED 通常把人送回预共享密钥,而密钥往往是对的。隧道卡在阶段 1,因为 Google 还比对另一样东西:对端在 IKE 交换中声明的身份。在 FortiGate 上,这个身份可能在无人改动地址的情况下改变类型。密钥重新输入两次之后,就把日志读作身份不匹配。
一次失败,两项检查
IKE 分两步验证对端。预共享密钥证明两端持有同一个秘密,声明身份则告诉响应方对端自称是谁。Google 会用配置好的对端来核对该身份。若不加干预,FortiGate 会发送由出接口推导出的地址型身份,比较便悄然通过。
两步在日志里落进同一个桶,这也解释了那个熟悉的循环:在有人读身份载荷之前,密钥已经被重敲四次。
FortiGate 在身份载荷里放了什么
问题始于有人为了两边一致而设置本地 ID。较新的 FortiOS 构建会把该身份标记为完全限定域名,即使填入的值是带点的地址。于是 Google 在期待地址时收到 FQDN 身份,并拒绝会话。消息里没有说明哪一半失败,报告便被读成认证失败。
开启 IKE 调试复现一次,读取防火墙实际发出的身份载荷。
在同一轮里确认三项便宜事实:两端使用的 IKE 版本、包含不可见尾部字符的确切密钥,以及 Google 期望的对端地址。它们回答的是不同问题,密钥一致并不能说明身份。
各个选项及其代价
每条出路修的是不同层,而且没有一条适用于所有部署。
| Option | When it works | What it costs |
|---|---|---|
| Set an address identity on the firewall | Your firmware lets you choose the type | Behaviour you must retest per release |
| Put a public address on the negotiating interface | The firewall can hold a routable address | Not possible behind NAT |
| Terminate on a peer that accepts your identity | Another endpoint validates what you produce | A topology change |
在固件允许选择类型并保留取值的地方,直接在防火墙上改正身份是最干净的答案。该字段在部分构建中存在,在另一些构建中会把类型填错,所以要测试自己的版本,而不是相信发布说明。
在协商接口上配置可路由的公网地址是文档化的绕行方案,因为默认身份随后就与 Google 的期望一致,无需任何覆盖。如果防火墙根本能持有这样的地址,多数部署最终都落在这里。
在对端上终结并验证你产出的内容,属于拓扑变更。请把它当作设计决策,而不是描述更友好的绕行方案。
当 NAT 去掉一个选项
在 NAT 之后,公网地址这条出路消失,剩下的取决于你无法控制的固件行为。这里才是需要有意选择的地方:升级、迁移对端,还是接受另一个云端点。这是三笔不同的预算,随手选一个,临时绕行就会变成架构。把选择和理由写在隧道旁边。
在解读任何内容之前,先确认 Google 一侧的隧道状态,以及 IKE 不是在途中被直接丢弃。被丢弃的包会超时,而不会产生拒绝。
在它还能工作时记录什么
记下隧道最后一次建立时生效的身份类型、取值、固件版本和对端地址。固件更新可能再次改变默认值,下一次失败看起来就会像密钥不匹配。把身份与密钥、对端地址存在一起,下一个人就能从便宜的检查开始。
这份记录也是下一次升级之后判断绕行是否仍然必要的唯一办法。