如何在Ubuntu20.04上使用StrongSwan设置IKEv2VPN服务器

来自菜鸟教程
跳转至:导航、​搜索

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

介绍

虚拟专用网络或 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 客户端连接到它。

先决条件

要完成本教程,您需要:

第 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 的服务器部分时,您会遇到指向连接的 leftright 两侧的设置。 使用 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 + XY,然后按 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 端口 5004500

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 + XY,然后按 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 扩展名。

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

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

从 Windows 连接

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

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


使用图形工具配置 Windows

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

  1. WINDOWS+R 弹出 Run 对话框,输入 mmc.exe 启动 Windows 管理控制台。
  2. File 菜单,导航到 Add or Remove Snap-in,从可用管理单元列表中选择 Certificates,然后单击 Add[ X156X]。
  3. 我们希望 VPN 可以与任何用户一起使用,因此选择 计算机帐户 并单击 下一步
  4. 我们在本地计算机上配置东西,所以选择本地计算机,然后单击完成
  5. Console Root节点下,展开Certificates (Local Computer)条目,展开Trusted Root Certification Authorities,然后选择Certificates入口:
  6. Action 菜单中,选择 All Tasks 并单击 Import 以显示证书导入向导。 点击 Next 跳过介绍。
  7. File to Import 屏幕上,按 Browse 按钮,确保将文件类型从“X.509 Certificate (.cer;.crt) ”到“所有文件(.)”,然后选择您保存的ca-cert.pem文件。 然后单击下一步
  8. 确保 Certificate Store 设置为 Trusted Root Certification Authorities,然后单击 Next
  9. 点击完成导入证书。

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

  1. 启动控制面板,然后导航到网络和共享中心
  2. 单击设置新的连接或网络,然后选择连接到工作场所
  3. 选择使用我的互联网连接(VPN)
  4. 输入 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 连接

请按照以下步骤导入证书:

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

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

  1. 转到系统偏好设置并选择网络
  2. 单击网络列表左下角的小“加号”按钮。
  3. 在出现的弹出窗口中,将 Interface 设置为 VPN,将 VPN Type 设置为 IKEv2,并为连接命名。
  4. ServerRemote ID 字段中,输入服务器的域名或 IP 地址。 将 本地 ID 留空。
  5. 点击 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 连接,请执行以下步骤:

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

从安卓连接

请按照以下步骤导入证书:

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

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

  1. 在应用程序中,点击顶部的 ADD VPN PROFILE
  2. 使用您的 VPN 服务器的域名或公共 IP 地址填写 Server
  3. 确保选择 IKEv2 EAP(用户名/密码) 作为 VPN 类型。
  4. 使用您在服务器上定义的凭据填写 UsernamePassword
  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 服务器详细信息时,您 必须 使用 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 服务器。 您了解了控制服务器和客户端上连接的 leftright 端的指令。 您还配置了 Windows、macOS、iOS、Android 或 Linux 客户端以连接到 VPN。

要添加或删除用户,请再次跳到第 5 步。 /etc/ipsec.secrets 中的每一行都是针对一个用户的,因此添加或删除用户,或者更改密码只需要编辑文件。

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