Windows 自带一个可由 PowerShell 端到端控制的 IKEv2 客户端,因此可用的隧道既不需要图形界面,也不需要第三方软件。几乎所有失败都来自三个地方:证书落在哪里、路由前缀怎么写、所选 EAP 方法期望什么。请按这个顺序处理,因为每一处都能在下一步开始前检查,而较晚出现的错误会掩盖较早的错误。

计算机证书隧道存在的意义就是在任何人登录之前启动,这也是身份通常必须放在计算机存储而不是用户存储的原因。

先处理证书,再处理隧道

重要的是两次导入。客户端身份通过 Import-PfxCertificate 进入 Cert:\LocalMachine\My,签发 CA 通过 Import-Certificate 进入 Cert:\LocalMachine\Root。单张叶证书证明不了任何链,所以跳过第二次导入,验证就没有依据。除存在之外,私钥必须已附加,并且必须允许计算机帐户读取它。Get-ChildItem Cert:\LocalMachine\My 列出已经到达的内容;比较指纹而不是主题,因为几乎相同的主题很常见。

部署前先检查扩展密钥用法。IKEv2 计算机身份通常要求客户端身份验证,而对端必须信任签发它的 CA。用户存储中的身份对计算机上下文连接而言并不存在。

创建配置文件及其路由

Add-VpnConnection -Name "Office IKEv2" -ServerAddress vpn.example.com -TunnelType Ikev2 -EncryptionLevel Required -AuthenticationMethod MachineCertificate -AllUserConnection 写入配置文件。-AllUserConnection 开关把它发布到全局电话簿,适合共享机或由服务管理的机器;单用户则可以去掉。你传入的任何地址都必须 与服务器证书中的 DNS 名称一致,否则失败会在隧道已经建立之后才出现。随后用 Add-VpnConnectionRoute 逐条添加前缀,且只添加设计真正需要的。

IPv6 有一个怪处:Windows 拒绝把 ::/0 当作 VPN 路由,因此 ::/1 与 8000::/1 合起来才覆盖同一段地址空间。为前缀做路由也不会在远端防火墙上授予任何权限,所以前缀清单和防火墙策略仍是两份分开的文档。

凭据属于对应的身份验证方法

计算机证书配置完全不需要用户机密,而 EAP-MSCHAPv2 配置则需要。后一种情况下 VPNCredentialsHelper 模块提供 Set-VpnConnectionUsernamePassword,而它要求明文:$cred.Password 是 SecureString,所以先用 GetNetworkCredential().Password 解开。不仅要在起草它所用的工作站上安装该模块,凡是要运行该命令的地方都要安装。EAP-TLS 或自定义方法根本不用这个 cmdlet,而是改为接收 EAP 配置 XML。

rasdial "Office IKEv2" 从 shell 发起连接,这是在前台而不是在事件日志中查看结果的最快方式。

已连接的隧道不能证明什么

已连接状态只覆盖 IKE 交换和身份验证环节,仅此而已。DNS 行为、通往私有主机的路径以及远端防火墙都仍未得到证明。请向外逐层排查:隧道适配器,然后查私有地址的路由,再用一个你有权使用的服务。第一个失败的观察结果会指出该查哪一层。

修改配置文件时,先用 Remove-VpnConnection -Name "Office IKEv2" -Force 删除上一个,再重新创建;否则旧设置和旧路由会在编辑后残留。如果仍然连不上,把配置文件中记录的指纹与存储中现存的指纹作比较,因为 Windows 可能仍引用着一个在主题未变的情况下已被替换的身份。

把指纹、EAP 方法和路由清单与配置文件放在一起。它们合起来能解释后续大部分出错情况。

相关文章