https://github.com/hwdsl2/setup-ipsec-vpn/blob/master/docs/ikev2-howto-zh.md 导言 现代操作系统(比如 Windows 7 和更新版本)支持 IKEv2 协议标准。因特网密钥交换(英语:Internet Key Exchange,简称 IKE 或 IKEv2)是一种网络协议,归属于 IPsec 协议族之下,用以创建安全关联 (Security Association, SA)。与 IKE 版本 1 相比较,IKEv2 的 功能改进 包括比如通过 MOBIKE 实现 Standard Mobility 支持,以及更高的可靠性。 Libreswan 支持通过使用 RSA 签名算法的 X.509 Machine Certificates 来对 IKEv2 客户端进行身份验证。该方法无需 IPsec PSK, 用户名或密码。它可以用于以下系统: Windows 7, 8.x 和 10 OS X (macOS) iOS (iPhone/iPad) Android 4.x 和更新版本(使用 strongSwan VPN 客户端) Linux 在按照本指南操作之后,你将可以选择三种模式中的任意一种连接到 VPN:IKEv2,以及已有的 IPsec/L2TP 和 IPsec/XAuth ("Cisco IPsec") 模式。 使用辅助脚本 重要: 在继续之前,你应该已经成功地 搭建自己的 VPN 服务器,并且(可选但推荐)升级 Libreswan。Docker 用户请看 这里。 使用这个辅助脚本来自动地在 VPN 服务器上配置 IKEv2: sudo bash /opt/src/ikev2.sh --auto 该 脚本 必须使用 bash 而不是 sh 运行。以上命令使用自动模式和默认选项运行辅助脚本。如果你想要自定义 IKEv2 安装选项,请在运行脚本时去掉 --auto 参数。在完成之后,请转到 配置 IKEv2 VPN 客户端。 配置 IKEv2 VPN 客户端 其他语言版本: English, 简体中文. 注: 客户端配置文件的密码可以在 IKEv2 辅助脚本的输出中找到。如果你想要添加或者导出 IKEv2 客户端,只需重新运行辅助脚本。使用参数 -h 显示使用信息。 Windows 7, 8.x 和 10 OS X (macOS) iOS (iPhone/iPad) Android Linux Windows 7, 8.x 和 10 将生成的 .p12 文件安全地传送到你的计算机,然后导入到 "计算机账户" 证书存储。要导入 .p12 文件,打开 提升权限命令提示符 并运行以下命令: # 导入 .p12 文件(换成你自己的值) certutil -f -importpfx ".p12文件的位置和名称" NoExport 另外,你也可以手动导入 .p12 文件。详细步骤请看 这里。在导入证书后,你必须确保将客户端证书放在 "个人 -> 证书" 目录中,并且将 CA 证书放在 "受信任的根证书颁发机构 -> 证书" 目录中。 注: Ubuntu 18.04 用户在尝试导入 .p12 文件时可能会遇到错误 "输入的密码不正确"。参见 故障排除。 在 Windows 计算机上添加一个新的 IKEv2 VPN 连接。对于 Windows 8.x 和 10,推荐从命令提示符运行以下命令创建 VPN 连接,以达到更佳的安全性和性能。Windows 7 不支持这些命令,你可以手动创建 VPN 连接(见下面)。 # 创建 VPN 连接(将服务器地址换成你自己的值) powershell -command "Add-VpnConnection -ServerAddress '你的 VPN 服务器 IP(或者域名)' -Name 'My IKEv2 VPN' -TunnelType IKEv2 -AuthenticationMethod MachineCertificate -EncryptionLevel Required -PassThru" # 设置 IPsec 参数 powershell -command "Set-VpnConnectionIPsecConfiguration -ConnectionName 'My IKEv2 VPN' -AuthenticationTransformConstants GCMAES128 -CipherTransformConstants GCMAES128 -EncryptionMethod AES256 -IntegrityCheckMethod SHA256 -PfsGroup None -DHGroup Group14 -PassThru -Force" 另外,你也可以手动创建 VPN 连接。详细步骤请看 这里。如果你在配置 IKEv2 时指定了服务器的域名(而不是 IP 地址),则必须在 Internet地址 字段中输入该域名。 (此步骤为必须,如果你手动创建了 VPN 连接)为 IKEv2 启用更强的加密算法,通过修改一次注册表来实现。请下载并导入下面的 .reg 文件,或者打开提升权限命令提示符并运行以下命令。更多信息请看 这里。 适用于 Windows 7, 8.x 和 10 (下载 .reg 文件) REG ADD HKLM\SYSTEM\CurrentControlSet\Services\RasMan\Parameters /v NegotiateDH2048_AES256 /t REG_DWORD /d 0x1 /f 要连接到 VPN:单击系统托盘中的无线/网络图标,选择新的 VPN 连接,然后单击 连接。连接成功后,你可以到 这里 检测你的 IP 地址,应该显示为你的 VPN 服务器 IP。 如果在连接过程中遇到错误,请参见 故障排除。 OS X (macOS) 首先,将生成的 .mobileconfig 文件安全地传送到你的 Mac,然后双击并按提示操作,以导入为 macOS 配置描述文件。在完成之后,检查并确保 "IKEv2 VPN" 显示在系统偏好设置 -> 描述文件中。 要连接到 VPN: 打开系统偏好设置并转到网络部分。 选择与 你的 VPN 服务器 IP(或者域名)对应的 VPN 连接。 选中 在菜单栏中显示 VPN 状态 复选框。 单击 连接。 (可选功能)你可以选择启用 VPN On Demand(按需连接) ,该功能在使用 Wi-Fi 网络时自动建立 VPN 连接。要启用它,选中 VPN 连接的 按需连接 复选框,然后单击 应用。 如果你手动配置 IKEv2 而不是使用辅助脚本,点这里查看步骤。 连接成功后,你可以到 这里 检测你的 IP 地址,应该显示为你的 VPN 服务器 IP。 如果在连接过程中遇到错误,请参见 故障排除。 iOS 首先,将生成的 .mobileconfig 文件安全地传送到你的 iOS 设备,并且导入为 iOS 配置描述文件。要传送文件,你可以使用: AirDrop(隔空投送),或者 使用 iTunes 的 "文件共享" 功能上传到设备,然后打开 iOS 设备上的 "文件" 应用程序,将上传的文件移动到 "On My iPhone" 目录下。然后单击它并到 "设置" 应用程序中导入,或者 将文件放在一个你的安全的托管网站上,然后在 Mobile Safari 中下载并导入它们。 在完成之后,检查并确保 "IKEv2 VPN" 显示在设置 -> 通用 -> 描述文件中。 要连接到 VPN: 进入设置 -> 通用 -> VPN。 选择与 你的 VPN 服务器 IP(或者域名)对应的 VPN 连接。 启用 VPN 连接。 (可选功能)你可以选择启用 VPN On Demand(按需连接) ,该功能在使用 Wi-Fi 网络时自动建立 VPN 连接。要启用它,单击 VPN 连接右边的 "i" 图标,然后启用 按需连接。 如果你手动配置 IKEv2 而不是使用辅助脚本,点这里查看步骤。 连接成功后,你可以到 这里 检测你的 IP 地址,应该显示为你的 VPN 服务器 IP。 如果在连接过程中遇到错误,请参见 故障排除。 Android 将生成的 .sswan 文件安全地传送到你的 Android 设备。 从 Google Play 安装 strongSwan VPN 客户端。 启动 strongSwan VPN 客户端。 单击右上角的 "更多选项" 菜单,然后单击 导入VPN配置。 选择你从服务器传送过来的 .sswan 文件。 注: 要查找 .sswan 文件,单击左上角的抽拉式菜单,然后浏览到你保存文件的目录。 在 "导入VPN配置" 屏幕上,单击 从VPN配置导入证书,并按提示操作。 在 "选择证书" 屏幕上,选择新的客户端证书并单击 选择。 单击 导入。 单击新的 VPN 配置文件以开始连接。 如果你的设备运行 Android 6.0 或更早版本,点这里查看额外的步骤。 (可选功能)你可以选择启用 Android 上的 "始终开启的 VPN" 功能。启动 设置 应用程序,进入 网络和互联网 -> 高级 -> VPN,单击 "strongSwan VPN 客户端" 右边的设置图标,然后启用 始终开启的 VPN 以及 屏蔽未使用 VPN 的所有连接 选项。 如果你手动配置 IKEv2 而不是使用辅助脚本,点这里查看步骤。 连接成功后,你可以到 这里 检测你的 IP 地址,应该显示为你的 VPN 服务器 IP。 如果在连接过程中遇到错误,请参见 故障排除。 Linux 在配置 Linux 客户端之前,你必须更改 VPN 服务器上的以下设置:编辑服务器上的 /etc/ipsec.d/ikev2.conf。在 conn ikev2-cp 小节的末尾添加 authby=rsa-sha1,开头必须空两格。保存文件并运行 service ipsec restart。 要配置你的 Linux 计算机以作为客户端连接到 IKEv2,首先安装 NetworkManager 的 strongSwan 插件: # Ubuntu and Debian sudo apt-get update sudo apt-get install network-manager-strongswan # Arch Linux sudo pacman -Syu # 升级所有软件包 sudo pacman -S networkmanager-strongswan # Fedora sudo yum install NetworkManager-strongswan-gnome # CentOS sudo yum install epel-release sudo yum --enablerepo=epel install NetworkManager-strongswan-gnome 下一步,将生成的 .p12 文件安全地从 VPN 服务器传送到你的 Linux 计算机。然后提取 CA 证书,客户端证书和私钥。将下面示例中的 vpnclient.p12 换成你的 .p12 文件名。 # 示例:提取 CA 证书,客户端证书和私钥。在完成后可以删除 .p12 文件。 # 注:你将需要输入 import password,它可以在 IKEv2 辅助脚本的输出中找到。 openssl pkcs12 -in vpnclient.p12 -cacerts -nokeys -out ikev2vpnca.cer openssl pkcs12 -in vpnclient.p12 -clcerts -nokeys -out vpnclient.cer openssl pkcs12 -in vpnclient.p12 -nocerts -nodes -out vpnclient.key rm vpnclient.p12 # (重要)保护证书和私钥文件 # 注:这一步是可选的,但强烈推荐。 sudo chown root.root ikev2vpnca.cer vpnclient.cer vpnclient.key sudo chmod 600 ikev2vpnca.cer vpnclient.cer vpnclient.key 然后你可以创建并启用 VPN 连接: 进入 Settings -> Network -> VPN。单击 + 按钮。 选择 IPsec/IKEv2 (strongswan)。 在 Name 字段中输入任意内容。 在 Gateway (Server) 部分的 Address 字段中输入 你的 VPN 服务器 IP(或者域名)。 为 Certificate 字段选择 ikev2vpnca.cer 文件。 在 Client 部分的 Authentication 下拉菜单选择 Certificate(/private key)。 在 Certificate 下拉菜单(如果存在)选择 Certificate/private key。 为 Certificate (file) 字段选择 vpnclient.cer 文件。 为 Private key 字段选择 vpnclient.key 文件。 在 Options 部分,选中 Request an inner IP address 复选框。 在 Cipher proposals (Algorithms) 部分,选中 Enable custom proposals 复选框。 保持 IKE 字段空白。 在 ESP 字段中输入 aes128gcm16. 单击 Add 保存 VPN 连接信息。 启用 VPN 连接。 连接成功后,你可以到 这里 检测你的 IP 地址,应该显示为你的 VPN 服务器 IP。 如果在连接过程中遇到错误,请参见 故障排除。 管理客户端证书 列出已有的客户端 如果要列出已有的 IKEv2 客户端的名称,运行 辅助脚本 并添加 --listclients 选项。使用参数 -h 显示使用信息。 添加一个客户端证书 如果要为更多的 IKEv2 客户端生成证书,只需重新运行 辅助脚本。或者你可以看 这一小节 的第 4 步。 导出一个已有的客户端的配置 在默认情况下,IKEv2 辅助脚本 在运行后会导出客户端配置。如果之后你想要为一个已有的客户端导出配置,重新运行辅助脚本并选择适当的选项。 删除一个客户端证书 重要: 从 IPsec 数据库中删除一个客户端证书 并不能 阻止 VPN 客户端使用该证书连接!对于此用例,你 必须 吊销该客户端证书,而不是删除证书。 首先,请阅读上面的重要说明。然后点这里查看详情。 吊销一个客户端证书 在某些情况下,你可能需要吊销一个之前生成的 VPN 客户端证书。这可以通过 crlutil 实现。下面举例说明,这些命令必须用 root 账户运行。 检查证书数据库,并且找到想要吊销的客户端证书的昵称。 certutil -L -d sql:/etc/ipsec.d Certificate Nickname Trust Attributes SSL,S/MIME,JAR/XPI IKEv2 VPN CA CTu,u,u ($PUBLIC_IP) u,u,u vpnclient-to-revoke u,u,u 在这个例子中,我们将要吊销昵称为 vpnclient-to-revoke 的客户端证书。它是由 IKEv2 VPN CA 签发的。 找到该客户端证书的序列号。 certutil -L -d sql:/etc/ipsec.d -n "vpnclient-to-revoke" Certificate: Data: Version: 3 (0x2) Serial Number: 00:cd:69:ff:74 ... ... 根据上面的输出,我们知道该序列号为十六进制的 CD69FF74,也就是十进制的 3446275956。它将在以下步骤中使用。 创建一个新的证书吊销列表 (CRL)。该步骤对于每个 CA 只需运行一次。 if ! crlutil -L -d sql:/etc/ipsec.d -n "IKEv2 VPN CA" 2>/dev/null; then crlutil -G -d sql:/etc/ipsec.d -n "IKEv2 VPN CA" -c /dev/null fi CRL Info: : Version: 2 (0x1) Signature Algorithm: PKCS #1 SHA-256 With RSA Encryption Issuer: "O=IKEv2 VPN,CN=IKEv2 VPN CA" This Update: Sat Jun 06 22:00:00 2020 CRL Extensions: 将你想要吊销的客户端证书添加到 CRL。在这里我们指定该证书的(十进制)序列号,以及吊销时间(UTC时间,格式:GeneralizedTime (YYYYMMDDhhmmssZ))。 crlutil -M -d sql:/etc/ipsec.d -n "IKEv2 VPN CA" <> /etc/ipsec.conf echo 'include /etc/ipsec.d/*.conf' >> /etc/ipsec.conf fi 注: 如果你在上面的第一步指定了服务器的域名(而不是 IP 地址),则必须将以下命令中的 leftid=$PUBLIC_IP 换成 leftid=@$PUBLIC_IP。 cat > /etc/ipsec.d/ikev2.conf <> /etc/ipsec.d/ikev2.conf <> /etc/ipsec.d/ikev2.conf <> /etc/ipsec.d/ikev2.conf < Is this a critical extension [y/N]? N 生成 VPN 服务器证书: 注: 如果你在上面的第一步指定了服务器的域名(而不是 IP 地址),则必须将以下命令中的 --extSAN "ip:$PUBLIC_IP,dns:$PUBLIC_IP" 换成 --extSAN "dns:$PUBLIC_IP"。 certutil -z <(head -c 1024 /dev/urandom) \ -S -c "IKEv2 VPN CA" -n "$PUBLIC_IP" \ -s "O=IKEv2 VPN,CN=$PUBLIC_IP" \ -k rsa -g 3072 -v 120 \ -d sql:/etc/ipsec.d -t ",," \ --keyUsage digitalSignature,keyEncipherment \ --extKeyUsage serverAuth \ --extSAN "ip:$PUBLIC_IP,dns:$PUBLIC_IP" Generating key. This may take a few moments... 生成客户端证书,然后导出 .p12 文件,该文件包含客户端证书,私钥以及 CA 证书。 注: 你可以重复本步骤来为更多的客户端生成证书,但必须将所有的 vpnclient 换成比如 vpnclient2,等等。如需同时连接多个客户端,则必须为每个客户端生成唯一的证书。 生成客户端证书: certutil -z <(head -c 1024 /dev/urandom) \ -S -c "IKEv2 VPN CA" -n "vpnclient" \ -s "O=IKEv2 VPN,CN=vpnclient" \ -k rsa -g 3072 -v 120 \ -d sql:/etc/ipsec.d -t ",," \ --keyUsage digitalSignature,keyEncipherment \ --extKeyUsage serverAuth,clientAuth -8 "vpnclient" Generating key. This may take a few moments... 导出 .p12 文件: pk12util -d sql:/etc/ipsec.d -n "vpnclient" -o vpnclient.p12 Enter password for PKCS12 file: Re-enter password: pk12util: PKCS12 EXPORT SUCCESSFUL 指定一个安全的密码以保护导出的 .p12 文件(在导入到 iOS 或 macOS 设备时,该密码不能为空)。 (适用于 iOS 客户端) 导出 CA 证书到 ikev2vpnca.cer: certutil -L -d sql:/etc/ipsec.d -n "IKEv2 VPN CA" -a -o ikev2vpnca.cer 证书数据库现在应该包含以下内容: certutil -L -d sql:/etc/ipsec.d Certificate Nickname Trust Attributes SSL,S/MIME,JAR/XPI IKEv2 VPN CA CTu,u,u ($PUBLIC_IP) u,u,u vpnclient u,u,u 注: 如需显示证书内容,可使用 certutil -L -d sql:/etc/ipsec.d -n "Nickname"。要吊销一个客户端证书,请转到这一节。关于 certutil 的其它用法参见 这里。 (重要)重启 IPsec 服务: service ipsec restart 在继续之前,你必须重启 IPsec 服务。VPN 服务器上的 IKEv2 配置到此已完成。下一步:配置 VPN 客户端。 故障排除 其他语言版本: English, 简体中文. 在导入客户端配置文件时提示密码不正确 如果你忘记了客户端配置文件的密码,可以重新 导出 IKEv2 客户端的配置。 Ubuntu 18.04 用户在尝试将生成的 .p12 文件导入到 Windows 时可能会遇到错误 "输入的密码不正确"。这是由 NSS 中的一个问题导致的。更多信息请看 这里。在 2021-01-21 已更新 IKEv2 辅助脚本以自动应用以下解决方法。 Ubuntu 18.04 上的 NSS 问题的解决方法 IKEv2 在一小时后断开连接 如果 IKEv2 连接在一小时(60 分钟)后自动断开,可以这样解决:编辑 VPN 服务器上的 /etc/ipsec.d/ikev2.conf(如果不存在,编辑 /etc/ipsec.conf)。在 conn ikev2-cp 一节的末尾添加以下行,开头必须空两格: ikelifetime=24h salifetime=24h 保存修改并运行 service ipsec restart。该解决方案已在 2021-01-20 添加到辅助脚本。 无法同时连接多个 IKEv2 客户端 如果要同时连接多个客户端,则必须为每个客户端 生成唯一的证书。 如果你无法同时连接同一个 NAT (比如家用路由器)后面的多个 IKEv2 客户端,可以这样解决:编辑 VPN 服务器上的 /etc/ipsec.d/ikev2.conf,找到这一行 leftid=@ 并去掉 @,也就是说将它替换为 leftid=。保存修改并运行 service ipsec restart。如果 leftid 是一个域名则不受影响,不要应用这个解决方案。该解决方案已在 2021-02-01 添加到辅助脚本。 其它已知问题 Windows 自带的 VPN 客户端可能不支持 IKEv2 fragmentation(该功能需要 Windows 10 v1803 或更新版本)。在有些网络上,这可能会导致连接错误或其它连接问题。你可以尝试换用 IPsec/L2TP 或 IPsec/XAuth 模式。 如果你使用 strongSwan Android VPN 客户端,则必须将服务器上的 Libreswan 升级到版本 3.26 或以上。 更多故障排除信息 要查看更多故障排除信息,请看 这里。 移除 IKEv2 如果你想要从 VPN 服务器移除 IKEv2,但是保留 IPsec/L2TP 和 IPsec/XAuth ("Cisco IPsec") 模式(如果已安装),请重新运行 辅助脚本 并选择 "Remove IKEv2" 选项。请注意,这将删除所有的 IKEv2 配置(包括证书和密钥),并且不可撤销! 另外,你也可以手动移除 IKEv2。点这里查看步骤。