如何在Ubuntu20.04上使用StrongSwan设置IKEv2VPN服务器
本教程的先前版本由 Justin Ellingwood 和 Namo 编写
介绍
虚拟专用网络或 VPN 允许您在流量通过不受信任的网络(例如咖啡店、会议或机场的网络)时安全地加密流量。
Internet 密钥交换 v2 或 IKEv2 是一种允许在服务器和客户端之间进行直接 IPSec 隧道的协议。 在 IKEv2 VPN 实施中,IPSec 为网络流量提供加密。 IKEv2 在某些平台(OS X 10.11+、iOS 9.1+ 和 Windows 10)上得到原生支持,无需额外的应用程序,它可以非常顺利地处理客户端故障。
在本教程中,您将在 Ubuntu 20.04 服务器上使用 StrongSwan 设置 IKEv2 VPN 服务器。 然后,您将学习如何使用 Windows、macOS、Ubuntu、iOS 和 Android 客户端连接到它。
先决条件
要完成本教程,您需要:
- 一台按照Ubuntu 20.04初始服务器设置指南配置的Ubuntu 20.04服务器,包括
sudo
非root用户和防火墙。
第 1 步 — 安装 StrongSwan
首先,我们将安装 StrongSwan,这是一个开源 IPSec 守护程序,我们将其配置为我们的 VPN 服务器。 我们还将安装公钥基础设施 (PKI) 组件,以便我们可以创建证书颁发机构 (CA) 来为我们的基础设施提供凭据。
首先更新本地包缓存:
sudo apt update
然后输入以下命令安装软件:
sudo apt install strongswan strongswan-pki libcharon-extra-plugins libcharon-extauth-plugins libstrongswan-extra-plugins
附加的 libcharon-extauth-plugins
包用于确保各种客户端可以使用共享的用户名和密码向您的服务器进行身份验证。 包含 libstrongswan-extra-plugins
包,因此 Strongswan 支持使用 Curve25519
加密套件的椭圆曲线密码套件。
现在一切都安装好了,让我们继续创建我们的证书。
第 2 步 — 创建证书颁发机构
IKEv2 服务器需要证书来向客户端标识自己。 为了帮助创建所需的证书,strongswan-pki
软件包附带了一个名为 pki
的实用程序,用于生成证书颁发机构和服务器证书。
首先,让我们创建几个目录来存储我们将要处理的所有资产。 目录结构与 /etc/ipsec.d
中的一些目录匹配,我们最终将在其中移动我们创建的所有项目:
mkdir -p ~/pki/{cacerts,certs,private}
然后锁定权限,让其他用户看不到我们的私有文件:
chmod 700 ~/pki
现在我们有了一个目录结构来存储所有内容,我们可以生成一个根密钥。 这将是一个 4096 位的 RSA 密钥,用于签署我们的根证书颁发机构。
执行以下命令以生成密钥:
pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/ca-key.pem
之后,我们可以继续创建我们的根证书颁发机构,使用我们刚刚生成的密钥来签署根证书:
pki --self --ca --lifetime 3650 --in ~/pki/private/ca-key.pem \ --type rsa --dn "CN=VPN root CA" --outform pem > ~/pki/cacerts/ca-cert.pem
--lifetime 3650
标志用于确保证书颁发机构的根证书有效期为 10 年。 授权的根证书通常不会更改,因为它必须重新分配给依赖它的每个服务器和客户端,因此 10 年是一个安全的默认到期值。
如果您愿意,可以将 可分辨名称 (DN) 值更改为其他值。 此处的通用名称(CN 字段)只是指示符,因此它不必与您的基础架构中的任何内容相匹配。
现在我们已经启动并运行了根证书颁发机构,我们可以创建 VPN 服务器将使用的证书。
第 3 步 — 为 VPN 服务器生成证书
我们现在将为 VPN 服务器创建证书和密钥。 该证书将允许客户端使用我们刚刚生成的 CA 证书来验证服务器的真实性。
首先,使用以下命令为 VPN 服务器创建一个私钥:
pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/server-key.pem
现在,使用您在上一步中创建的证书颁发机构的密钥创建并签署 VPN 服务器证书。 执行以下命令,但将 Common Name (CN) 和 Subject Alternate Name (SAN) 字段更改为您的 VPN 服务器的 DNS 名称或 IP 地址:
pki --pub --in ~/pki/private/server-key.pem --type rsa \ | pki --issue --lifetime 1825 \ --cacert ~/pki/cacerts/ca-cert.pem \ --cakey ~/pki/private/ca-key.pem \ --dn "CN=server_domain_or_IP" --san server_domain_or_IP \ --flag serverAuth --flag ikeIntermediate --outform pem \ > ~/pki/certs/server-cert.pem
注意:如果您使用IP地址而不是DNS名称,则需要指定多个--san
条目。 上一个命令块中指定专有名称 (--dn ...
) 的行将需要使用额外的条目进行修改,如以下摘录行:
--dn "CN=IP address" --san @IP_address --san IP_address \
这个额外的 --san @IP_address
条目的原因是某些客户端在验证其身份时会检查 TLS 证书是否同时具有服务器的 DNS 条目和 IP 地址条目。
--flag serverAuth
选项用于指示证书将在建立加密隧道之前显式用于服务器身份验证。 --flag ikeIntermediate
选项用于支持较旧的 macOS 客户端。
现在我们已经生成了 StrongSwan 需要的所有 TLS/SSL 文件,我们可以通过键入以下命令将文件移动到 /etc/ipsec.d
目录中的适当位置:
sudo cp -r ~/pki/* /etc/ipsec.d/
在这一步中,我们创建了一个证书对,用于保护客户端和服务器之间的通信。 我们还使用 CA 密钥对证书进行了签名,因此客户端将能够使用 CA 证书验证 VPN 服务器的真实性。 准备好所有这些证书后,我们将继续配置软件。
第 4 步 — 配置 StrongSwan
StrongSwan 有一个带有一些示例的默认配置文件,但我们必须自己完成大部分配置。 让我们在从头开始之前备份文件以供参考:
sudo mv /etc/ipsec.conf{,.original}
使用您喜欢的文本编辑器创建并打开一个新的空白配置文件。 在这里,我们将使用 nano
:
sudo nano /etc/ipsec.conf
注意:当您通过本节配置 VPN 的服务器部分时,您会遇到指向连接的 left 和 right 两侧的设置。 使用 IPSec VPN 时,按照惯例,left 一侧是指您正在配置的本地系统,在这种情况下是服务器。 这些设置中的右侧指令将引用远程客户端,例如电话和其他计算机。
当您在本教程后面继续配置客户端时,客户端配置文件将使用各种 left 指令引用自己,而服务器将使用 right 侧术语来引用。
首先,我们将告诉 StrongSwan 记录守护程序状态以进行调试并允许重复连接。 将这些行添加到文件中:
/etc/ipsec.conf
config setup charondebug="ike 1, knl 1, cfg 0" uniqueids=no
然后,我们将为我们的 VPN 创建一个配置部分。 我们还将告诉 StrongSwan 创建 IKEv2 VPN 隧道并在启动时自动加载此配置部分。 将以下行附加到文件中:
/etc/ipsec.conf
. . . conn ikev2-vpn auto=add compress=no type=tunnel keyexchange=ikev2 fragmentation=yes forceencaps=yes
我们还将配置死点检测以清除任何“悬空”连接,以防客户端意外断开连接。 添加这些行:
/etc/ipsec.conf
. . . conn ikev2-vpn . . . dpdaction=clear dpddelay=300s rekey=no
接下来,我们将配置服务器的“左侧”IPSec 参数。 以下每个参数可确保将服务器配置为接受来自客户端的连接并正确识别自己。 一旦您熟悉了它们是什么以及使用它们的原因,您将把这些设置中的每一个添加到 /etc/ipsec.conf
文件中:
left=%any
%any
值确保服务器将使用网络接口接收传入连接,以便与客户端进行后续通信。 例如,如果您通过专用网络连接客户端,则服务器将使用专用 IP 地址接收其余连接的流量。leftid=@server_domain_or_IP
此选项控制服务器呈现给客户端的名称。 当与下一个选项leftcert
结合使用时,leftid
选项可确保服务器的配置名称与包含在公共证书中的专有名称 (DN) 匹配。leftcert=server-cert.pem
此选项是您在步骤 3 中配置的服务器的公共证书的路径。 没有它,服务器将无法与客户端进行身份验证,也无法完成 IKEv2 设置的协商。leftsendcert=always
always
值确保任何连接到服务器的客户端将始终收到服务器公共证书的副本,作为初始连接设置的一部分。leftsubnet=0.0.0.0/0
您将添加的最后一个“左侧”选项告诉客户端服务器后面可访问的子网。 在这种情况下,0.0.0.0/0
用于表示整个 IPv4 地址集,这意味着服务器将告诉客户端默认情况下通过 VPN 发送所有流量。
现在您已经熟悉了每个相关的“左侧”选项,请将它们全部添加到文件中,如下所示:
/etc/ipsec.conf
. . . conn ikev2-vpn . . . left=%any leftid=@server_domain_or_IP leftcert=server-cert.pem leftsendcert=always leftsubnet=0.0.0.0/0
注意:在配置服务器ID(leftid
)时,如果您的VPN服务器将通过域名识别,则只包括@
字符:
/etc/ipsec.conf
. . . leftid=@vpn.example.com . . .
如果服务器将通过其 IP 地址来识别,只需将 IP 地址放入:
/etc/ipsec.conf
. . . leftid=your_server_ip . . .
接下来,我们可以配置客户端的“右侧”IPSec 参数。 以下每个参数都告诉服务器如何接受来自客户端的连接,客户端应如何向服务器进行身份验证,以及客户端将使用的私有 IP 地址范围和 DNS 服务器。 一旦您熟悉了它们是什么以及使用它们的原因,请将这些设置中的每一个添加到 /etc/ipsec.conf
文件中:
right=%any
连接的right
端的%any
选项指示服务器接受来自任何远程客户端的传入连接。rightid=%any
此选项确保在建立加密隧道之前,服务器不会拒绝来自提供身份的客户端的连接。rightauth=eap-mschapv2
此选项配置客户端将用于对服务器进行身份验证的身份验证方法。eap-mschapv2
用于广泛的兼容性,以支持 Windows、macOS 和 Android 设备等客户端。rightsourceip=10.10.10.0/24
此选项指示服务器从指定的10.10.10.0/24
IP 池中为客户端分配私有 IP 地址。rightdns=8.8.8.8,8.8.4.4
这些 IP 地址是 Google 的公共 DNS 解析器。 它们可以更改为使用其他公共解析器、VPN 服务器的解析器或客户端可以访问的任何其他解析器。rightsendcert=never
此选项指示服务器客户端不需要发送证书来验证自己。
现在您已经熟悉了 VPN 所需的“右侧”选项,将以下行添加到 /etc/ipsec.conf
:
/etc/ipsec.conf
. . . conn ikev2-vpn . . . right=%any rightid=%any rightauth=eap-mschapv2 rightsourceip=10.10.10.0/24 rightdns=8.8.8.8,8.8.4.4 rightsendcert=never
现在我们将告诉 StrongSwan 在连接时向客户端询问用户凭据:
/etc/ipsec.conf
. . . conn ikev2-vpn . . . eap_identity=%identity
最后,添加以下行以支持 Linux、Windows、macOS、iOS 和 Android 客户端。 这些行指定 StrongSwan 将允许不同客户端使用的各种密钥交换、散列、身份验证和加密算法(通常称为 Cipher Suites):
/etc/ipsec.conf
. . . conn ikev2-vpn . . . ike=chacha20poly1305-sha512-curve25519-prfsha512,aes256gcm16-sha384-prfsha384-ecp384,aes256-sha1-modp1024,aes128-sha1-modp1024,3des-sha1-modp1024! esp=chacha20poly1305-sha512,aes256gcm16-ecp384,aes256-sha256,aes256-sha1,3des-sha1!
每个受支持的密码套件都用逗号与其他密码套件隔开。 例如 chacha20poly1305-sha512-curve25519-prfsha512
是一个套件,而 aes256gcm16-sha384-prfsha384-ecp384
是另一个套件。 选择此处列出的密码套件是为了确保在 Windows、macOS、iOS、Android 和 Linux 客户端之间实现最广泛的兼容性。
完整的配置文件应如下所示:
/etc/ipsec.conf
config setup charondebug="ike 1, knl 1, cfg 0" uniqueids=no conn ikev2-vpn auto=add compress=no type=tunnel keyexchange=ikev2 fragmentation=yes forceencaps=yes dpdaction=clear dpddelay=300s rekey=no left=%any leftid=@server_domain_or_IP leftcert=server-cert.pem leftsendcert=always leftsubnet=0.0.0.0/0 right=%any rightid=%any rightauth=eap-mschapv2 rightsourceip=10.10.10.0/24 rightdns=8.8.8.8,8.8.4.4 rightsendcert=never eap_identity=%identity ike=chacha20poly1305-sha512-curve25519-prfsha512,aes256gcm16-sha384-prfsha384-ecp384,aes256-sha1-modp1024,aes128-sha1-modp1024,3des-sha1-modp1024! esp=chacha20poly1305-sha512,aes256gcm16-ecp384,aes256-sha256,aes256-sha1,3des-sha1!
确认已正确添加每一行后,保存并关闭文件。 如果您使用 nano
,请按 CTRL + X
、Y
,然后按 ENTER
。
现在我们已经配置了 VPN 参数,让我们继续创建一个帐户,以便我们的用户可以连接到服务器。
第 5 步 — 配置 VPN 身份验证
我们的 VPN 服务器现在配置为接受客户端连接,但我们还没有配置任何凭据。 我们需要在一个名为 ipsec.secrets
的特殊配置文件中配置一些东西:
- 我们需要告诉 StrongSwan 在哪里可以找到我们的服务器证书的私钥,以便服务器能够向客户端进行身份验证。
- 我们还需要设置允许连接到 VPN 的用户列表。
让我们打开秘密文件进行编辑:
sudo nano /etc/ipsec.secrets
首先,我们将告诉 StrongSwan 在哪里可以找到我们的私钥以及如何解析它。
/etc/ipsec.secrets
: RSA "server-key.pem"
确保该行以 :
字符开头,并且在其后有一个空格,以便整行显示为 : RSA "server-key.pem"
。
然后,我们将定义用户凭据。 您可以组成您喜欢的任何用户名或密码组合:
/etc/ipsec.secrets
your_username : EAP "your_password"
保存并关闭文件。 现在我们已经完成了 VPN 参数的处理,我们将重新启动 VPN 服务,以便应用我们的配置:
sudo systemctl restart strongswan-starter
现在 VPN 服务器已经完全配置了服务器选项和用户凭据,是时候继续配置最重要的部分了:防火墙。
第 6 步 — 配置防火墙和内核 IP 转发
完成 StrongSwan 配置后,我们需要配置防火墙以允许 VPN 流量通过并转发它。
如果您遵循先决条件初始服务器设置教程,则应该启用 UFW 防火墙。 如果您尚未配置 UFW,则应首先添加一条规则以允许 SSH 连接通过防火墙,以便在启用 UFW 时不会关闭当前会话:
sudo ufw allow OpenSSH
然后通过键入以下命令启用防火墙:
sudo ufw enable
然后,添加一条规则以允许 UDP 流量到标准 IPSec 端口 500
和 4500
:
sudo ufw allow 500,4500/udp
接下来,我们将打开一个 UFW 的配置文件,添加一些用于路由和转发 IPSec 数据包的低级策略。 但是,在我们这样做之前,我们需要找到我们服务器上的哪个网络接口用于互联网访问。 通过查询与默认路由关联的设备找到该接口:
ip route show default
您的公共界面应遵循“开发”一词。 例如,此结果显示名为 eth0
的接口,在以下示例中突出显示:
Outputdefault via your_server_ip dev eth0 proto static
当你有你的公共网络接口时,在你的文本编辑器中打开 /etc/ufw/before.rules
文件。 此文件中的规则在其他常用输入和输出规则之前添加到防火墙。 它们用于配置网络地址转换 (NAT),以便服务器可以正确路由与客户端和 Internet 之间的连接。
sudo nano /etc/ufw/before.rules
在文件顶部附近(在 *filter
行之前),添加以下配置块。 更改上述配置中 eth0
的每个实例,以匹配您使用 ip route
找到的接口名称。 *nat
行创建规则,以便防火墙可以正确路由和操纵 VPN 客户端和 Internet 之间的流量。 *mangle
行调整最大数据包段大小以防止某些 VPN 客户端出现潜在问题:
/etc/ufw/before.rules
*nat -A POSTROUTING -s 10.10.10.0/24 -o eth0 -m policy --pol ipsec --dir out -j ACCEPT -A POSTROUTING -s 10.10.10.0/24 -o eth0 -j MASQUERADE COMMIT *mangle -A FORWARD --match policy --pol ipsec --dir in -s 10.10.10.0/24 -o eth0 -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1361:1536 -j TCPMSS --set-mss 1360 COMMIT *filter :ufw-before-input - [0:0] :ufw-before-output - [0:0] :ufw-before-forward - [0:0] :ufw-not-local - [0:0] . . .
接下来,在 *filter
和链定义行之后,再添加一个配置块:
/etc/ufw/before.rules
. . . *filter :ufw-before-input - [0:0] :ufw-before-output - [0:0] :ufw-before-forward - [0:0] :ufw-not-local - [0:0] -A ufw-before-forward --match policy --pol ipsec --dir in --proto esp -s 10.10.10.0/24 -j ACCEPT -A ufw-before-forward --match policy --pol ipsec --dir out --proto esp -d 10.10.10.0/24 -j ACCEPT
这些行告诉防火墙转发 ESP(封装安全负载)流量,以便 VPN 客户端能够连接。 ESP 为我们的 VPN 数据包提供额外的安全性,因为它们正在穿越不受信任的网络。
完成后,在确认已正确添加每一行后,保存并关闭文件。 如果您使用 nano
,请按 CTRL + X
、Y
,然后按 ENTER
。
在重新启动防火墙之前,我们将更改一些网络内核参数以允许从一个接口路由到另一个接口。 控制这些设置的文件称为 /etc/ufw/sysctl.conf
。 我们需要在文件中配置一些东西。
首先需要打开 IPv4 数据包转发,以便流量可以在 VPN 和服务器上面向公众的网络接口之间移动。 接下来,我们将禁用路径 MTU 发现以防止数据包碎片问题。 最后,我们不会接受 ICMP 重定向,也不会发送 ICMP 重定向来防止 man-in-the-middle 攻击。
使用 nano
或您喜欢的文本编辑器打开 UFW 的内核参数配置文件:
sudo nano /etc/ufw/sysctl.conf
现在在文件末尾添加以下 net/ipv4/ip_forward=1
设置以启用接口之间的转发数据包:
/etc/ufw/sysctl.conf
. . . net/ipv4/ip_forward=1
Next 通过在文件末尾添加以下行来阻止发送和接收 ICMP 重定向数据包:
/etc/ufw/sysctl.conf
. . . net/ipv4/conf/all/accept_redirects=0 net/ipv4/conf/all/send_redirects=0
最后,通过将此行添加到文件末尾来关闭 Path MTU 发现:
/etc/ufw/sysctl.conf
. . . net/ipv4/ip_no_pmtu_disc=1
完成后保存文件。 现在我们可以通过禁用和重新启用防火墙来启用我们的所有更改,因为 UFW 会在它重新启动时应用这些设置:
sudo ufw disable sudo ufw enable
系统将提示您确认该过程。 键入 Y
以使用新设置再次启用 UFW。
第 7 步 — 在 Windows、macOS、Ubuntu、iOS 和 Android 上测试 VPN 连接
现在您已经完成了所有设置,是时候尝试一下了。 首先,您需要复制您创建的 CA 证书并将其安装在将连接到 VPN 的客户端设备上。 最简单的方法是登录到您的服务器并输出证书文件的内容:
cat /etc/ipsec.d/cacerts/ca-cert.pem
您将看到与此类似的输出:
Output-----BEGIN CERTIFICATE----- MIIFNDCCAxygAwIBAgIIHCsidG5mXzgwDQYJKoZIhvcNAQEMBQAwODELMAkGA1UE . . . H2YUdz8XNHrJHvMQKWFpi0rlEcMs+MSXPFWE3Q7UbaZJ/h8wpSldSUbQRUlphExJ dJ4PX+MUJO/vjG1/ie6Kh25xbBAc3qNq8siiJZDwrg6vjEK7eiZ1rA== -----END CERTIFICATE-----
将此输出复制到您的计算机,包括 -----BEGIN CERTIFICATE-----
和 -----END CERTIFICATE-----
行,并将其保存到具有可识别名称的文件中,例如 ca-cert.pem
。 确保您创建的文件具有 .pem
扩展名。
将 ca-cert.pem
文件下载到您的计算机后,您可以设置与 VPN 的连接。
从 Windows 连接
有多种方法可以导入根证书并将 Windows 配置为连接到 VPN。 第一种方法对每个步骤都使用图形工具。 第二种方法使用 PowerShell 命令,可以编写脚本并对其进行修改以适合您的 VPN 配置。
注意: 这些说明已经在运行版本 1903 和 1909 的 Windows 10 安装上进行了测试。
使用图形工具配置 Windows
首先,按照以下步骤导入根证书:
- 按
WINDOWS+R
弹出 Run 对话框,输入mmc.exe
启动 Windows 管理控制台。 - 从 File 菜单,导航到 Add or Remove Snap-in,从可用管理单元列表中选择 Certificates,然后单击 Add[ X156X]。
- 我们希望 VPN 可以与任何用户一起使用,因此选择 计算机帐户 并单击 下一步 。
- 我们在本地计算机上配置东西,所以选择本地计算机,然后单击完成。
- 在Console Root节点下,展开Certificates (Local Computer)条目,展开Trusted Root Certification Authorities,然后选择Certificates入口:
- 从 Action 菜单中,选择 All Tasks 并单击 Import 以显示证书导入向导。 点击 Next 跳过介绍。
- 在 File to Import 屏幕上,按 Browse 按钮,确保将文件类型从“X.509 Certificate (.cer;.crt) ”到“所有文件(.)”,然后选择您保存的
ca-cert.pem
文件。 然后单击下一步。 - 确保 Certificate Store 设置为 Trusted Root Certification Authorities,然后单击 Next。
- 点击完成导入证书。
然后使用以下步骤配置 VPN:
- 启动控制面板,然后导航到网络和共享中心。
- 单击设置新的连接或网络,然后选择连接到工作场所。
- 选择使用我的互联网连接(VPN)。
- 输入 VPN 服务器详细信息。 在Internet地址字段中输入服务器的域名或IP地址,然后在目标名称中填写描述您的VPN连接的内容。 然后单击完成。
使用 PowerShell 配置 Windows
要使用 PowerShell 导入根 CA 证书,请首先以管理员权限打开 PowerShell 提示符。 为此,请右键单击开始菜单图标并选择 Windows PowerShell (Admin)
。 您也可以以管理员身份打开命令提示符并键入 powershell
。
接下来,我们将使用 Import-Certificate
PowerShell cmdlet 导入证书。 在以下命令中,第一个 -CertStoreLocation
参数将确保将证书导入计算机的 受信任的根证书颁发机构 存储,以便所有程序和用户都能够验证 VPN 服务器的证书. -FilePath
参数应指向您复制证书的位置。 在以下示例中,路径为 C:\Users\sammy\Documents\ca-cert.pem
。 确保编辑命令以匹配您使用的位置。
Import-Certificate ` -CertStoreLocation cert:\LocalMachine\Root\ ` -FilePath C:\users\sammy\Documents\ca-cert.pem
该命令将输出如下内容:
Output PSParentPath: Microsoft.PowerShell.Security\Certificate::LocalMachine\Root Thumbprint Subject ---------- ------- DB00813B4087E9367861E8463A60CEA0ADC5F002 CN=VPN root CA
现在要使用 PowerShell 配置 VPN,请运行以下命令。 在 -ServerAddress
行中替换您的服务器的 DNS 名称或 IP 地址。 各种标志将确保使用与您在 /etc/ipsec.conf
中设置的选项匹配的适当安全参数正确配置 Windows。
Add-VpnConnection -Name "VPN Connection" ` -ServerAddress "server_domain_or_IP" ` -TunnelType "IKEv2" ` -AuthenticationMethod "EAP" ` -EncryptionLevel "Maximum" ` -RememberCredential `
如果命令成功,则不会有任何输出。 要确认 VPN 配置正确,请使用 Get-VPNConnection
cmdlet:
Get-VpnConnection -Name "VPN Connection"
您将收到如下输出:
OutputName : VPN Connection ServerAddress : your_server_ip AllUserConnection : False Guid : {B055A1AB-175C-4028-B4A8-D34309A2B20E} TunnelType : Ikev2 AuthenticationMethod : {Eap} EncryptionLevel : Maximum L2tpIPsecAuth : UseWinlogonCredential : False EapConfigXmlStream : #document ConnectionStatus : Disconnected RememberCredential : True SplitTunneling : False DnsSuffix : IdleDisconnectSeconds : 0
默认情况下,Windows 选择较旧和较慢的算法。 运行 Set-VpnConnectionIPsecConfiguration
cmdlet 以升级 Windows 将用于 IKEv2 密钥交换的加密参数,并加密数据包:
Set-VpnConnectionIPsecConfiguration -Name "VPN Connection" ` -AuthenticationTransformConstants GCMAES256 ` -CipherTransformConstants GCMAES256 ` -DHGroup ECP384 ` -IntegrityCheckMethod SHA384 ` -PfsGroup ECP384 ` -EncryptionMethod GCMAES256
注意:如果您想删除 VPN 连接并使用不同的选项重新配置它,您可以运行 Remove-VpnConnection
cmdlet。
Remove-VpnConnection -Name "VPN Connection" -Force
-Force
标志将跳过提示您确认删除。 如果您尝试使用此命令将其删除,则必须断开与 VPN 的连接。
连接到 VPN
导入证书并使用任一方法配置 VPN 后,您的新 VPN 连接将显示在网络列表下。 选择 VPN 并单击 连接 。 系统将提示您输入用户名和密码。 输入它们,单击OK,您将被连接。
从 macOS 连接
请按照以下步骤导入证书:
- 双击证书文件。 钥匙串访问将弹出一个对话框,显示“钥匙串访问正在尝试修改系统钥匙串。 输入您的密码以允许此操作。”
- 输入您的密码,然后点击修改钥匙串
- 双击新导入的 VPN 证书。 这会打开一个小的属性窗口,您可以在其中指定信任级别。 将 IP Security (IPSec) 设置为 Always Trust,系统将再次提示您输入密码。 此设置在输入密码后自动保存。
现在证书已导入并受信任,请使用以下步骤配置 VPN 连接:
- 转到系统偏好设置并选择网络。
- 单击网络列表左下角的小“加号”按钮。
- 在出现的弹出窗口中,将 Interface 设置为 VPN,将 VPN Type 设置为 IKEv2,并为连接命名。
- 在 Server 和 Remote ID 字段中,输入服务器的域名或 IP 地址。 将 本地 ID 留空。
- 点击 Authentication Settings,选择 Username,然后输入您为 VPN 用户配置的用户名和密码。 然后单击确定。
最后点击Connect连接VPN。 您现在应该连接到 VPN。
从 Ubuntu 连接
要从 Ubuntu 机器连接,您可以将 StrongSwan 作为服务设置和管理,或者在每次连接时使用一次性命令。 两者都提供了说明。
将 StrongSwan 管理为服务
要将 StrongSwan 作为服务进行管理,您需要执行以下配置步骤。
首先,使用 apt
更新本地包缓存
sudo apt update
接下来,安装 StrongSwan 和认证所需的插件:
sudo apt install strongswan libcharon-extra-plugins
现在您需要一份位于 /etc/ipsec.d/cacerts
目录中的 CA 证书副本,以便您的客户端可以验证服务器的身份。 运行以下命令将 ca-cert.pem
文件复制到位:
sudo cp /tmp/ca-cert.pem /etc/ipsec.d/cacerts
为确保 VPN 仅按需运行,请使用 systemctl
禁用 StrongSwan 自动运行:
sudo systemctl disable --now strongswan-starter
接下来配置您将用于对 VPN 服务器进行身份验证的用户名和密码。 使用 nano 或您喜欢的编辑器编辑 /etc/ipsec.secrets
:
sudo nano /etc/ipsec.secrets
添加以下行,编辑突出显示的用户名和密码值以匹配您在服务器上配置的值:
/etc/ipsec.secrets
your_username : EAP "your_password"
最后,编辑 /etc/ipsec.conf
文件以配置您的客户端以匹配服务器的配置:
/etc/ipsec.conf
config setup conn ikev2-rw right=server_domain_or_IP # This should match the `leftid` value on your server's configuration rightid=server_domain_or_IP rightsubnet=0.0.0.0/0 rightauth=pubkey leftsourceip=%config leftid=username leftauth=eap-mschapv2 eap_identity=%identity auto=start
要连接到 VPN,请键入:
sudo systemctl start strongswan-starter
要再次断开连接,请键入:
sudo systemctl stop strongswan-starter
使用 charon-cmd
客户端进行一次性连接
要将 StrongSwan 作为服务进行管理,您需要执行以下配置步骤。
首先,使用 apt
更新本地包缓存
sudo apt update
接下来,安装 StrongSwan 和认证所需的插件:
sudo apt install strongswan libcharon-extra-plugins
现在您需要一份位于 /etc/ipsec.d/cacerts
目录中的 CA 证书副本,以便您的客户端可以验证服务器的身份。 运行以下命令将 ca-cert.pem
文件复制到位:
sudo cp /tmp/ca-cert.pem /etc/ipsec.d/cacerts
此时,您可以使用服务器的 CA 证书、VPN 服务器的 IP 地址和您配置的用户名通过 charon-cmd
连接到 VPN 服务器。
每当您想连接到 VPN 时,请运行以下命令:
sudo charon-cmd --cert ca-cert.pem --host vpn_domain_or_IP --identity your_username
出现提示时,提供 VPN 用户的密码,您将连接到 VPN。 要断开连接,请在终端中按 CTRL+C
并等待连接关闭。
从 iOS 连接
要在 iOS 设备上配置 VPN 连接,请执行以下步骤:
- 向自己发送一封附有根证书的电子邮件。
- 在您的 iOS 设备上打开电子邮件并点击附件中的证书文件,然后点击 Install 并输入您的密码。 安装后,点击 完成 。
- 转到 设置、常规、VPN并点击添加VPN配置。 这将打开 VPN 连接配置屏幕。
- 点击 Type 并选择 IKEv2。
- 在 Description 字段中,输入 VPN 连接的短名称。 这可以是你喜欢的任何东西。
- 在 Server 和 Remote ID 字段中,输入服务器的域名或 IP 地址。 本地 ID 字段可以留空。
- 在 Authentication 部分输入您的用户名和密码,然后点击 Done。
- 选择您刚刚创建的 VPN 连接,点击页面顶部的开关,您将被连接。
从安卓连接
请按照以下步骤导入证书:
- 向自己发送一封附有 CA 证书的电子邮件。 将 CA 证书保存到您的下载文件夹。
- 从 Play 商店下载 StrongSwan VPN 客户端。
- 打开应用程序。 点击“更多”图标( . . . ) 在右上角并选择 CA 证书 .
- 点击“更多”图标( . . . ) 再次出现在右上角。 选择导入证书。
- 浏览到下载文件夹中的 CA 证书文件并选择它以将其导入应用程序。
现在证书已导入 StrongSwan 应用程序,您可以通过以下步骤配置 VPN 连接:
- 在应用程序中,点击顶部的 ADD VPN PROFILE。
- 使用您的 VPN 服务器的域名或公共 IP 地址填写 Server。
- 确保选择 IKEv2 EAP(用户名/密码) 作为 VPN 类型。
- 使用您在服务器上定义的凭据填写 Username 和 Password。
- 在CA证书部分取消选择自动选择,然后单击选择CA证书。
- 点击屏幕顶部的 IMPORTED 选项卡并选择您导入的 CA(如果您之前没有更改“DN”,它将被命名为“VPN root CA”)。
- 如果您愿意,请使用更具描述性的名称填写 配置文件名称(可选)。
当您希望连接到 VPN 时,请单击您刚刚在 StrongSwan 应用程序中创建的配置文件。
连接故障排除
如果您无法导入证书,请确保文件具有 .pem
扩展名,而不是 .pem.txt
。
如果您无法连接到 VPN,请检查您使用的服务器名称或 IP 地址。 服务器的域名或 IP 地址必须与您在创建证书时配置的公用名 (CN) 匹配。 如果它们不匹配,VPN 连接将无法工作。 例如,如果您设置了 CN 为 vpn.example.com
的证书,则在输入 VPN 服务器详细信息时,您 必须 使用 vpn.example.com
。 仔细检查您用于生成证书的命令,以及您在创建 VPN 连接时使用的值。
最后,再次检查 VPN 配置,确保 leftid
值配置为使用 @
符号(如果您使用的是域名):
/etc/ipsec.conf
leftid=@vpn.example.com
如果您使用 IP 地址,请确保省略 @
符号。 还要确保在生成 server-cert.pem
文件时包含 --san @IP_address
和 --san IP_address
标志。
结论
在本教程中,您已经构建了一个使用 IKEv2 协议的 VPN 服务器。 您了解了控制服务器和客户端上连接的 left
和 right
端的指令。 您还配置了 Windows、macOS、iOS、Android 或 Linux 客户端以连接到 VPN。
要添加或删除用户,请再次跳到第 5 步。 /etc/ipsec.secrets
中的每一行都是针对一个用户的,因此添加或删除用户,或者更改密码只需要编辑文件。
现在,您可以放心,无论您走到哪里,使用您用来访问互联网的任何设备,您的在线活动都将保持安全。