如何在 Ubuntu 20.04 上使用 StrongSwan 设置 IKEv2 VPN 服务器

本教程的先前版本由Justin EllingwoodNamo编写

介绍

虚拟专用网络或 VPN 允许您在流量通过不受信任的网络(例如咖啡店、会议或机场的网络)时安全地加密流量。

Internet Key Exchange 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 客户端连接到它。

先决条件

要完成本教程,您需要:

步骤 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 服务器证书。执行以下命令,但将通用名称 (CN) 和主题备用名称 (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 \

这个额外条目的原因是一些客户端在验证其身份时会检查 TLS 证书是否同时具有服务器的 DNS 条目和 IP 地址条目。--san @IP_address

--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 的服务器部分时,您将遇到涉及连接左侧右侧的设置。使用 IPSec VPN 时,按照惯例左侧是指您正在配置的本地系统,在本例中是服务器。这些设置中的右侧指令将引用远程客户端,如电话和其他计算机。

当您在本教程后面继续配置客户端时,客户端配置文件将使用各种左侧指令来指代自己,而服务器将使用右侧术语来指代

首先,我们将告诉 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=alwaysalways值确保连接到服务器的任何客户端将始终收到服务器公共证书的副本,作为初始连接设置的一部分。
  • 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连接端%any选项right指示服务器接受来自任何远程客户端的传入连接。
  • rightid=%any 此选项可确保服务器不会在建立加密隧道之前拒绝来自提供身份的客户端的连接。
  • rightauth=eap-mschapv2此选项配置客户端将用于向服务器进行身份验证的身份验证方法。eap-mschapv2此处用于广泛兼容性以支持 Windows、macOS 和 Android 设备等客户端。
  • rightsourceip=10.10.10.0/24此选项指示服务器将专用 IP 地址从指定10.10.10.0/24的 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 将允许不同客户端使用的各种密钥交换、散列、身份验证和加密算法(通常称为密码套件):

/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 数据包的低级策略。但是,在我们执行此操作之前,我们需要找到服务器上的哪个网络接口用于访问 Internet。通过查询默认路由关联的设备找到该接口:

  • ip route show default

您的公共界面应遵循“dev”一词。例如,此结果显示名为 的接口eth0,在以下示例中突出显示:

Output
default 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 重定向以防止中间人攻击。

使用nano或您喜欢的文本编辑器打开 UFW 的内核参数配置文件

  • sudo nano /etc/ufw/sysctl.conf

现在net/ipv4/ip_forward=1在文件末尾添加以下设置以启用在接口之间转发数据包:

/etc/ufw/sysctl.conf
. . .
net/ipv4/ip_forward=1

下一步通过在文件末尾添加以下行来阻止发送和接收 ICMP 重定向数据包:

/etc/ufw/sysctl.conf
. . .
net/ipv4/conf/all/accept_redirects=0
net/ipv4/conf/all/send_redirects=0

最后,通过在文件末尾添加以下行来关闭路径 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扩展名。

或者,使用 SFTP 将文件传输到您的计算机

ca-cert.pem文件下载到您的计算机后,您可以设置与 VPN 的连接。

从 Windows 连接

有多种方法可以导入根证书并配置 Windows 以连接到 VPN。第一种方法为每个步骤使用图形工具。第二种方法使用 PowerShell 命令,可以编写脚本并对其进行修改以适合您的 VPN 配置。

注意:这些说明已经在运行版本 1903 和 1909 的 Windows 10 安装上进行了测试。

使用图形工具配置 Windows

首先,按照以下步骤导入根证书:

  1. WINDOWS+R以调出“运行”对话框,然后按 Entermmc.exe以启动 Windows 管理控制台。
  2. 文件菜单中,导航到添加或删除管理单元从可用管理单元列表中选择证书,然后单击添加
  3. 我们希望 VPN 可以与任何用户一起使用,因此选择“计算机帐户”并单击“下一步”
  4. 我们正在本地计算机上配置内容,因此选择Local Computer,然后单击Finish
  5. Console Root节点下,展开Certificates (Local Computer)条目,展开Trusted Root Certification Authorities,然后选择Certificates条目:
    证书视图

  6. 操作菜单中,选择所有任务并单击导入以显示证书导入向导。单击下一步跳过介绍。

  7. 在“要导入文件”屏幕上,按“浏览”按钮,确保将文件类型从“X.509 证书 ( .cer; .crt)”更改为“所有文件 ( . )”,然后选择ca-cert.pem您拥有文件保存。然后单击下一步

  8. 确保证书存储设置为受信任的根证书颁发机构,然后单击下一步

  9. 单击完成以导入证书。

然后使用以下步骤配置 VPN:

  1. 启动控制面板,然后导航到网络和共享中心
  2. 单击设置新的连接或网络,然后选择连接到工作场所
  3. 选择使用我的 Internet 连接 (VPN)
  4. 输入 VPN 服务器详细信息。Internet 地址字段中输入服务器的域名或 IP 地址,然后使用描述您的 VPN 连接的内容填写目标名称然后点击完成

使用 PowerShell 配置 Windows

要使用 PowerShell 导入根 CA 证书,请首先使用管理员权限打开 PowerShell 提示符。为此,请右键单击“开始”菜单图标并选择Windows PowerShell (Admin)您还可以以管理员身份打开命令提示符并键入powershell.

接下来,我们将使用Import-CertificatePowerShell 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,请运行以下命令。替换你服务器的 DNS 名称或 IP 地址就-ServerAddress行了。各种标志将确保使用与您在 中设置的选项匹配的适当安​​全参数正确配置 Windows /etc/ipsec.conf

  • Add-VpnConnection -Name "VPN Connection" `
  • -ServerAddress "server_domain_or_IP" `
  • -TunnelType "IKEv2" `
  • -AuthenticationMethod "EAP" `
  • -EncryptionLevel "Maximum" `
  • -RememberCredential `

如果命令成功,则不会有任何输出。要确认 VPN 配置正确,请使用Get-VPNConnectioncmdlet:

  • Get-VpnConnection -Name "VPN Connection"

您将收到如下输出:

Output
Name : 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-VpnConnectionIPsecConfigurationcmdlet 以升级 Windows 将用于 IKEv2 密钥交换的加密参数,并加密数据包:

  • Set-VpnConnectionIPsecConfiguration -Name "VPN Connection" `
  • -AuthenticationTransformConstants GCMAES256 `
  • -CipherTransformConstants GCMAES256 `
  • -DHGroup ECP384 `
  • -IntegrityCheckMethod SHA384 `
  • -PfsGroup ECP384 `
  • -EncryptionMethod GCMAES256

注意:如果您想删除 VPN 连接并使用不同的选项重新配置它,您可以运行Remove-VpnConnectioncmdlet。

  • Remove-VpnConnection -Name "VPN Connection" -Force

-Force标志将跳过提示您确认删除。如果您尝试使用此命令将其删除,则必须断开与 VPN 的连接。

连接到 VPN

导入证书并使用任一方法配置 VPN 后,您的新 VPN 连接将显示在网络列表下。选择 VPN 并单击连接系统将提示您输入用户名和密码。输入它们,单击OK,您将被连接。

从 macOS 连接

按照以下步骤导入证书:

  1. 双击证书文件。 Keychain Access将弹出一个对话框,显示“Keychain Access 正在尝试修改系统钥匙串。输入您的密码以允许此操作。”
  2. 输入您的密码,然后单击修改钥匙串
  3. 双击新导入的 VPN 证书。这会打开一个小的属性窗口,您可以在其中指定信任级别。IP 安全 (IPSec) 设置始终信任,系统将再次提示您输入密码。输入密码后,此设置会自动保存。

现在证书已导入并受信任,请使用以下步骤配置 VPN 连接:

  1. 转到系统偏好设置并选择网络
  2. 单击网络列表左下角的小“加号”按钮。
  3. 在出现的弹出窗口中,将Interface设置VPN,将VPN Type设置IKEv2,并为连接命名。
  4. 服务器远程 ID字段中,输入服务器的域名或 IP 地址。本地 ID留空。
  5. 单击Authentication Settings,选择Username,然后输入您为 VPN 用户配置的用户名和密码。然后单击确定

最后,单击“连接”以连接到 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 服务器进行身份验证的用户名和密码。编辑/etc/ipsec.secrets使用nano或您喜欢的编辑器:

  • 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

此时,您可以charon-cmd使用服务器的 CA 证书、VPN 服务器的 IP 地址和您配置的用户名连接到 VPN 服务器

每当您想连接到 VPN 时,运行以下命令:

  • sudo charon-cmd --cert ca-cert.pem --host vpn_domain_or_IP --identity your_username

出现提示时,提供 VPN 用户的密码,您将连接到 VPN。要断开连接,请按CTRL+C终端并等待连接关闭。

从 iOS 连接

要在 iOS 设备上配置 VPN 连接,请执行以下步骤:

  1. 给自己发送一封附有根证书的电子邮件。
  2. 在您的 iOS 设备上打开电子邮件并点击附加的证书文件,然后点击安装并输入您的密码。安装完成后,点击完成
  3. 转到设置常规VPN并点击添加 VPN 配置这将打开 VPN 连接配置屏幕。
  4. 点击类型并选择IKEv2
  5. 描述字段中,输入 VPN 连接的短名称。这可以是你喜欢的任何东西。
  6. 服务器远程 ID字段中,输入服务器的域名或 IP 地址。本地ID字段可以留空。
  7. 身份验证部分输入您的用户名和密码,然后点击完成
  8. 选择您刚刚创建的 VPN 连接,点击页面顶部的开关,您将被连接。

从安卓连接

按照以下步骤导入证书:

  1. 给自己发送一封附有 CA 证书的电子邮件。将 CA 证书保存到您的下载文件夹。
  2. 从 Play 商店下载StrongSwan VPN 客户端
  3. 打开应用程序。点击右上角的“更多”图标 ( ) 并选择CA 证书
  4. 再次点击右上角的“更多”图标 ( )。选择导入证书
  5. 浏览到下载文件夹中的 CA 证书文件,然后选择它以将其导入应用程序。

现在证书已导入到 StrongSwan 应用程序中,您可以通过以下步骤配置 VPN 连接:

  1. 在应用程序中,点击顶部的添加 VPN 配置文件
  2. 填写服务器与VPN服务器的域名或公网IP地址。
  3. 确保选择IKEv2 EAP(用户名/密码)作为 VPN 类型。
  4. 使用您在服务器上定义的凭据填写用户名密码
  5. CA 证书部分取消选择自动选择,然后单击选择 CA 证书
  6. 点击屏幕顶部IMPORTED选项卡并选择您导入的 CA(如果您之前没有更改“DN”,它将被命名为“VPN root CA”)。
  7. 如果您愿意,请使用更具描述性的名称填写个人资料名称(可选)

当您希望连接到 VPN 时,单击您刚刚在 StrongSwan 应用程序中创建的配置文件。

连接故障排除

如果您无法导入证书,请确保文件具有.pem扩展名,而不是.pem.txt.

如果您无法连接到 VPN,请检查您使用的服务器名称或 IP 地址。服务器的域名或 IP 地址必须与您在创建证书时配置为公用名 (CN) 的内容相匹配。如果它们不匹配,则 VPN 连接将无法工作。例如,如果您设置证书使用的CN vpn.example.com,你必须使用vpn.example.com,当你输入VPN服务器的详细信息。仔细检查您用于生成证书的命令,​​以及您在创建 VPN 连接时使用的值。

最后,如果您使用的是域名,请仔细检查 VPN 配置以确保leftid使用@符号配置

/etc/ipsec.conf
    leftid=@vpn.example.com

如果您使用的是 IP 地址,请确保@省略符号。还要确保在生成server-cert.pem文件时同时包含标志。--san @IP_address--san IP_address

结论

在本教程中,您构建了一个使用 IKEv2 协议的 VPN 服务器。您了解了控制的指令leftright服务器和客户端在连接的两侧。您还配置了 Windows、macOS、iOS、Android 或 Linux 客户端以连接到 VPN。

要添加或删除用户,请再次跳至步骤 5。输入的每一行都/etc/ipsec.secrets针对一个用户,因此添加或删除用户或更改密码只需要编辑文件即可。

现在,您可以放心,无论您身在何处,使用任何用于访问互联网的设备,您的在线活动都将保持安全。

觉得文章有用?

点个广告表达一下你的爱意吧 !😁