需要的是这样的:
将静态 1:1 NAT 后面的 Fortigate 设备连接到 Internet 和 Google Cloud Platform (GCP) VPN 网关。
简化 ASCII 图:
LOCAL_LAN ---- Fortigate ----- Fiber modem ---- Internet ---- GCP VPN Gateway ----- GCP_VPC
光纤调制解调器正在对 Fortigate 进行 NAT 1:1,该调制解调器上调用 DMZ 模式。
我遵循了以下几条指示:
如何在 GCP 上创建到外部网关的 VPN - 我是用例 #3,因为我在 Fortigate 上只有一个公共 IP https://cloud.google.com/network-connectivity/docs/vpn/how-to/creating-ha-vpn#gcloud_4
与 Fortinet 的互操作性 - 我没有 2 个静态 IP,Fortigate 上的每个接口一个 https://cloud.google.com/community/tutorials/using-ha-vpn-with-fortigate
IKE v1 的结果:
第 1 阶段已协商完毕,问题是第 2 阶段从未启动。Google 的故障排除指南:
https://cloud.google.com/network-connectivity/docs/vpn/support/troubleshooting
说:您必须将对等 ID 定义为公共 IP,才能启动隧道。
奇怪的是,我已经在 FortiGate Phase 1 localid 参数上定义了公共 IP,并且它被正确发送到 GCP VPN 网关。
这是 GCP 日志上确认的事件,如下所示!
{
insertId: "5abgbbg2313tdw"
labels: {1}
logName: "projects/my-project-name-xxxxx/logs/cloud.googleapis.com%2Fipsec_events"
receiveTimestamp: "2021-09-01T21:14:46.610751733Z"
resource: {2}
severity: "DEBUG"
**textPayload: "IDir '201.110.XXX.240' does not match to '201.110.XXX.240'"**
timestamp: "2021-09-01T21:14:46.592461252Z"
}
但问题是,GCP 端从未协商过第 2 阶段,并且隧道被删除。为了便于记录,以下是 Fortigate 的 ike 调试日志中的输出:
ike 0:gcp00-0:10752: processed INITIAL-CONTACT
ike 0:gcp00-0: schedule auto-negotiate
ike 0:gcp00-0:10752: no pending Quick-Mode negotiations
[...]
ike 0:gcp00-0:10751: recv ISAKMP SA delete 14cb5d60541aaaaa/d405bbbbf6d06acb
然后在 GCP 日志上匹配 ISAKMP 断开连接:
{
insertId: "5abgbbg2313tdx"
labels: {1}
logName: "projects/my-project-name-xxxxx/logs/cloud.googleapis.com%2Fipsec_events"
receiveTimestamp: "2021-09-01T21:14:46.610751733Z"
resource: {2}
severity: "NOTICE"
textPayload: "deleting IKE_SA vpn_201.110.XXX.240[2662] between 35.242.XXX.165[35.242.XXX.165]...201.110.XXX.240[%any]"
timestamp: "2021-09-01T21:14:46.592502955Z"
}
协商将陷入无限循环,停留在这种状态。
使用 IKE v2 进行测试。
我也在 IKE v2 上尝试过,结果非常相似。隧道从未建立,唯一的区别是在 FGT 端我无法将公共 IP 发送到 GCP VPN 网关。我尝试修改 IKEv2 上的 localid、local-gw 和 eap 参数,但没有成功。从 GPC 角度看,日志是 AUTHENTICATION_FAILED。PSK 身份验证已完成,但由于对等方从未被正确识别,因此它从未建立。如果我将 FGT 上的 local-gw 参数定义为 Fortigate 前面的调制解调器的公共 IP,则协商本身根本无法完成。原因:在 FGT phase1-interface gw 上建立此参数时,Fortigate 将发送具有 local-gw 定义 IP 的 SOURCE IP 的数据包。由于此 IP 对调制解调器无效,因此数据包永远不会发送出去。
值得注意的是,我创建了 2 个隧道,一个在 ike v1 上,另一个在 ike v2 上进行测试。因此,以下隧道上的 IP 不同:以下是来自 GCP 控制台的证据日志:
{
insertId: "134hqnjg23gnfib"
labels: {1}
logName: "projects/my-project-name-xxxxx/logs/cloud.googleapis.com%2Fipsec_events"
receiveTimestamp: "2021-09-01T21:52:39.566968571Z"
resource: {2}
severity: "DEBUG"
textPayload: "looking for peer configs matching 35.220.XXX.31[%any]...201.110.XXX.240[201.110.XXX.240]"
timestamp: "2021-09-01T21:52:39.552310603Z"
}
{
insertId: "134hqnjg23gnfia"
labels: {1}
logName: "projects/my-project-xxxxxx/logs/cloud.googleapis.com%2Fipsec_events"
receiveTimestamp: "2021-09-01T21:52:39.566968571Z"
resource: {2}
severity: "DEBUG"
textPayload: "parsed IKE_AUTH request 1 [ IDi N(INIT_CONTACT) AUTH N(MSG_ID_SYN_SUP) SA TSi TSr ]"
timestamp: "2021-09-01T21:52:39.552287263Z"
}
问题
有人知道为什么在 ike v1 上即使 IP 正确,GCP VPN 网关也拒绝建立隧道(阶段 2)吗?
有人知道如何在 Fortigate 的第 1 阶段定义中设置 IKE v2 IDi 或 IDr 吗?
有人见过这个问题吗?有什么建议吗?
答案1
好吧,回答我自己的问题。内容如下:
在 FortiOS 7.0.1 上,当 ForiGate 位于 NAT 设备后面进行 1:1 NAT 时,没有记录或明确的方法来定义 FortiGate 上第一阶段定义的 IDi 或 IDr,以便 GCP 接受它来设置隧道。
在 FGT 和 GCP VPN 网关之间建立 VPN 隧道的唯一方法是让 FortiGate 将公共 IP 直接分配给连接到 GCP VPN 的接口。
这样,您就可以将“本地网关”IP 定义为 FGT 第 1 阶段定义中的接口、公网 IP。这样,隧道协商就完成了,VPN 就可以正常工作了。
总之,当 FGT 位于 NAT 设备后面时,请勿尝试设置 FGT 到 GCP VPN 隧道。它根本行不通!
这是使用 FortiOS 7.0.1 连接到 GCP VPN 冗余网关进行测试的,FortiGate 上有一个公共 IP,GCP VPN 端有两个 IP,使用 IKE v2。IKE v1 未经测试。