你在 Windows 上的同事导入一个 FortiGate 向导配置,一分钟就上线了。你在 Ubuntu 上装同一个厂商包,找 IPsec 选项卡,结果只找到一个会打开 SSL VPN 门户的客户端。由此得出的结论通常错两次:网关没有拒绝你,Linux 版本也没有坏。Fortinet 发布这个客户端时只带 SSL VPN 支持,所以移动 IPsec 配置无处安放,只能到会说 IKEv1 的地方重建。

先弄清楚你拿到的到底是哪个协议

一旦不再把厂商客户端当作参考实现,这次重建就是机械性的工作。

FortiGate 同时发布 SSL VPN 和 IPsec,而交接邮件很少说明给你的是哪一个。门户 URL 加浏览器式登录页意味着 SSL VPN,在 Linux 上答案是 openfortivpn,而不是下面的字段对应表。组标识符加预共享密钥意味着移动 IPsec,这正是 vpnc 和 strongSwan 处理的场景。

在这里弄错,是 Linux 尝试在第一个阶段完成前就失败的最常见原因:客户端在向 HTTPS 门户提供 IKEv1,或者反过来。安装任何东西之前,先让管理员书面确认协议名称。

四个凭据走在四个不同的字段里

password 一词在大多数交接中出现两次,含义却不同。预共享密钥认证的是对端本身,是管理员从网关配置里读出的机器机密。你的账户密码则是另一份凭据,证明那个对端背后是哪个具体的人。

另外两个值更容易被漏掉。组标识符是向导写进 IPsec 组对象的字符串,0 是合法取值,不是空字段。提议覆盖每个阶段的加密、哈希和 Diffie-Hellman 组,外加 PFS 设置,其中每一项都必须与网关一致。连接在阶段 1 失败时,出错的几乎总是这四项之一,所以要分开记录,而不是全塞进一个对话框。

每个 vpnc 字段该填什么

把客户端和编辑器前端一起装上,然后新建一个 VPNC 连接:

sudo apt install vpnc network-manager-vpnc network-manager-vpnc-gnome

网关填 FortiGate 的公网地址,组名要精确等于网关上的标识符,包括裸露的零。Group password 填预共享密钥,用户名和密码填你的账户,令牌按网关期望的方式追加。在高级对话框里,选择提议中列出的 Diffie-Hellman 组,把 PFS 对齐到同一个组,客户端位于家用路由器后面时开启 NAT 穿透,并把死对端检测与网关保持一致。

组名是最容易被跳过的字段,因为它看起来可选,而默认的零又像个占位符。留空发送,客户端发出的标识符就与网关校验的不一样。如果配置仍然失败,请把高级取值与能用的 Windows 客户端对比,而不是与另一个站点的论坛帖子对比。

同一份配置改写给 strongSwan

对这些取值来说,strongSwan 是更好的长期容器,因为配置就是一个可以审阅和留存的文本文件:

conn office-fw
    keyexchange=ikev1
    aggressive=yes
    left=%any
    leftauth=psk
    leftauth2=xauth
    xauth_identity=YOUR_USER
    right=GATEWAY_ADDRESS
    rightauth=psk
    rightsubnet=OFFICE_SUBNET
    ike=aes128-sha1-modp1536!
    esp=aes128-sha1-modp1536!

先读代码块之前的提议行,因为末尾的感叹号会改变它们的含义:它把这一条提议固定下来,并去掉客户端原本会提供的其他备选。只配置了一对变换的网关会拒绝以列表开头的客户端,所以正是这个固定动作让协商变成匹配。算法名称要从可用的网关配置里原样抄来,再把占位符换成你自己的值。

两行认证并不多余。PSK 证明对端,XAuth 块证明用户,去掉任何一行都会留下一个网关无法完成的阶段。

改下一个字段之前,先把失败读明白

从症状往回推,而不是把对话框再乱试一遍。IKE SA 起来了却没有分配到地址,说明用户认证交换失败或根本没执行,所以要检查账户和令牌处理。永远走不完的阶段 1 指向提议、组标识符或积极模式,而每一项都要和网关比对,不能只和 Windows 客户端比对。

隧道建立后每隔几分钟就断,是两端对死对端检测的看法不一致;要和网关的计时器对齐,而不是到处关掉 keepalive。隧道建立了但办公室主机仍不可达,通常意味着推送的子网从未进入本地路由表,第三方客户端可能不会自己去做这件事。

完成后把可用的取值交还给网关负责人:协议、组标识符、预共享密钥、提议、PFS 以及 DPD 的决定。下一台 Linux 机器就只需几分钟而不是一整晚,也没人需要重新发现组名原来是零。

相关文章