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

介绍

A virtual private network, or VPN, allows you to securely encrypt traffic as it travels through untrusted networks, such as those at the coffee shop, a conference, or an airport.

Internet Key Exchange v2,简称IKEv2,是一种允许服务器和客户端直接进行IPSec隧道连接的协议。在IKEv2 VPN实现中,IPSec为网络流量提供加密。IKEv2在某些平台上(OS X 10.11+、iOS 9.1+和Windows 10)具有原生支持,无需额外的应用程序,并且可以很好地处理客户端的中断。

在本教程中,您将使用StrongSwan在Ubuntu 22.04服务器上设置一个IKEv2 VPN服务器。然后,您将学习如何使用Windows、macOS、Ubuntu、iOS和Android客户端连接到它。

先决条件

完成本教程,您将需要:

步骤1 — 安装 StrongSwan

首先,您将安装 StrongSwan,这是一个开源的 IPSec 守护程序,您将配置它作为您的 VPN 服务器。您还将安装公钥基础设施(PKI)组件,以便您可以创建一个证书颁发机构(CA)来为您的基础设施提供凭据。

首先更新本地软件包缓存:

  1. sudo apt update

然后输入以下命令安装软件:

  1. 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中的一些目录匹配,最终您将把所有创建的项目移动到那里:

  1. mkdir -p ~/pki/{cacerts,certs,private}

然后,锁定权限,以防止其他用户看到我们的私有文件:

  1. chmod 700 ~/pki

现在,您有了一个存储所有内容的目录结构,您可以生成一个根密钥。这将是一个用于签署根证书颁发机构证书的4096位RSA密钥。

执行以下命令来生成密钥:

  1. pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/ca-key.pem

之后,您可以继续创建您的根证书颁发机构,使用刚刚生成的密钥来签署根证书:

  1. pki --self --ca --lifetime 3650 --in ~/pki/private/ca-key.pem \
  2. --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 服务器创建私钥:

  1. pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/server-key.pem

现在,使用您在上一步中创建的证书授权机构密钥创建并签署 VPN 服务器证书。执行以下命令,但将“通用名称(CN)”和“主题备用名称(SAN)”字段更改为您的 VPN 服务器的 DNS 名称或 IP 地址:

  1. pki --pub --in ~/pki/private/server-key.pem --type rsa \
  2. | pki --issue --lifetime 1825 \
  3. --cacert ~/pki/cacerts/ca-cert.pem \
  4. --cakey ~/pki/private/ca-key.pem \
  5. --dn "CN=server_domain_or_IP" --san server_domain_or_IP \
  6. --flag serverAuth --flag ikeIntermediate --outform pem \
  7. > ~/pki/certs/server-cert.pem

注意:如果您使用的是 IP 地址而不是 DNS 名称,则需要指定多个 --san 条目。在前一个命令块中指定区分名称(--dn ...)的行将需要修改,添加额外条目如下所示:

--dn "CN=IP 地址" --san @IP 地址 --san IP 地址 \

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

--flag serverAuth 选项用于指示证书将在加密隧道建立之前明确用于服务器身份验证。 --flag ikeIntermediate 选项用于支持较旧的 macOS 客户端。

现在您已经生成了 StrongSwan 需要的所有 TLS/SSL 文件,您可以通过键入以下内容将文件移动到 /etc/ipsec.d 目录中:

  1. sudo cp -r ~/pki/* /etc/ipsec.d/

在此步骤中,您已创建了一对证书,用于保护客户端和服务器之间的通信。您还使用 CA 密钥签署了证书,因此客户端将能够使用 CA 证书验证 VPN 服务器的真实性。准备好所有这些证书后,您可以继续配置 SrongSwan。

步骤 4 — 配置 StrongSwan

StrongSwan 具有带有一些示例的默认配置文件,但我们将不得不自己进行大部分配置。让我们先备份文件以供参考,然后从头开始:

  1. sudo mv /etc/ipsec.conf{,.original}

使用您喜欢的文本编辑器创建并打开一个新的空白配置文件。在这里,您将使用 nano:

  1. 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=always always值确保连接到服务器的任何客户端始终会在初始连接设置的一部分中收到服务器的公共证书的副本。
  • leftsubnet=0.0.0.0/0 您将添加的最后一个“left”端选项告知客户端服务器后面可达的子网。在这种情况下,0.0.0.0/0用于表示整个IPv4地址集,这意味着服务器将告诉客户端默认情况下通过VPN发送其所有流量。

现在您已经熟悉了每个相关的“left”端选项,请像这样将它们全部添加到文件中:

/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所需的“right”侧选项,请将以下行添加到/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的用户列表。

让我们打开用于编辑的secrets文件:

  1. 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服务,以应用我们的配置:

  1. sudo systemctl restart strongswan-starter

现在VPN服务器已经完全配置好了,包括服务器选项和用户凭据,是时候转向配置最重要的部分了:防火墙。

步骤 6 — 配置防火墙和内核 IP 转发

StrongSwan 配置完成后,您需要配置防火墙以允许 VPN 流量通过并进行转发。

如果您按照先决条件的初始服务器设置教程操作,应该已经启用了 UFW 防火墙。如果您尚未配置 UFW,请首先添加一条规则以允许 SSH 连接通过防火墙,以免在启用 UFW 时当前会话关闭:

  1. sudo ufw allow OpenSSH

然后输入以下命令启用防火墙:

  1. sudo ufw enable

然后,添加一条规则以允许 UDP 流量通过标准的 IPSec 端口 5004500

  1. sudo ufw allow 500,4500/udp

接下来,您将打开 UFW 的一个配置文件,添加一些用于路由和转发 IPSec 数据包的低级策略。但是,在此之前,您需要查找服务器上用于访问互联网的网络接口。通过查询与默认路由相关联的设备来找到此接口:

  1. ip route show default

您的公共接口应该在“dev”后面。例如,以下结果显示了名为 eth0 的接口,已在以下示例中突出显示:

Output
default via your_server_ip dev eth0 proto static

当您拥有您的公共网络接口时,请在您的文本编辑器中打开/etc/ufw/before.rules文件。此文件中的规则将被添加到防火墙的常规输入和输出规则之前。它们用于配置网络地址转换(NAT),以便服务器可以正确地路由来自客户端和互联网的连接。

  1. sudo nano /etc/ufw/before.rules

在文件顶部附近(在*filter行之前),添加以下配置块。将上述配置中的每个eth0实例更改为与ip route找到的接口名称匹配。*nat行创建规则,以便防火墙可以正确地路由和操作VPN客户端和互联网之间的流量。*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重定向以防止中间人攻击。

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

  1. 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在每次重新启动时都会应用这些设置:

  1. sudo ufw disable
  2. sudo ufw enable

系统将提示您确认此过程。键入Y以使用新设置重新启用UFW。

步骤7 — 在Windows、macOS、Ubuntu、iOS和Android上测试VPN连接

现在您已经设置好了一切,是时候试试了。首先,您需要复制您创建的CA证书并将其安装在将连接到VPN的客户端设备上。最简单的方法是登录到您的服务器并输出证书文件的内容:

  1. 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连接

有多种方法可以导入根证书并配置Windows以连接到VPN。第一种方法使用图形工具进行每一步。第二种方法使用PowerShell命令,这些命令可以被脚本化和修改以适应您的VPN配置。

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

使用图形工具配置Windows

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

  1. WINDOWS+R打开运行对话框,输入mmc.exe以启动Windows管理控制台。

  2. 文件菜单,导航到添加或删除管理单元,从可用管理单元列表中选择证书,然后点击添加

  3. 我们希望VPN与任何用户一起工作,因此选择计算机账户并点击下一步

  4. 我们正在本地计算机上进行配置,因此选择本地计算机,然后点击完成

  5. 控制台根节点下,展开证书(本地计算机)条目,展开受信任的根证书颁发机构,然后选择证书条目:

  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(管理员)。您也可以以管理员身份打开命令提示符并输入powershell

接下来,我们将使用Import-Certificate PowerShell cmdlet导入证书。在下面的命令中,第一个-CertStoreLocation参数将确保证书被导入到计算机的受信任的根证书颁发机构存储中,以便所有程序和用户都能够验证VPN服务器的证书。-FilePath参数应该指向您复制证书的位置。在下面的示例中,路径是C:\Users\sammy\Documents\ca-cert.pem。确保编辑命令以匹配您使用的位置。

  1. Import-Certificate `
  2. -CertStoreLocation cert:\LocalMachine\Root\ `
  3. -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地址。各种标志将确保Windows正确配置了与您在/etc/ipsec.conf中设置的选项相匹配的适当安全参数。

  1. Add-VpnConnection -Name "VPN Connection" `
  2. -ServerAddress "server_domain_or_IP" `
  3. -TunnelType "IKEv2" `
  4. -AuthenticationMethod "EAP" `
  5. -EncryptionLevel "Maximum" `
  6. -RememberCredential `

如果命令成功执行,将不会有任何输出。要确认VPN配置是否正确,请使用Get-VPNConnection命令:

  1. 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-VpnConnectionIPsecConfiguration命令以升级Windows将用于IKEv2密钥交换和加密数据包的加密参数:

  1. Set-VpnConnectionIPsecConfiguration -Name "VPN Connection" `
  2. -AuthenticationTransformConstants GCMAES256 `
  3. -CipherTransformConstants GCMAES256 `
  4. -DHGroup ECP384 `
  5. -IntegrityCheckMethod SHA384 `
  6. -PfsGroup ECP384 `
  7. -EncryptionMethod GCMAES256

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

  1. Remove-VpnConnection -Name "VPN Connection" -Force

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

连接到VPN

一旦您导入了证书并使用任一方法配置了VPN,您的新VPN连接将显示在网络列表中。选择VPN并点击连接。您将被提示输入用户名和密码。输入它们,点击确定,您将连接成功。

从macOS连接

按照以下步骤导入证书:

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

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

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

最后,点击连接以连接到VPN。您现在应该已连接到VPN。

从Ubuntu连接

要从Ubuntu计算机连接,您可以设置和管理StrongSwan作为服务,也可以每次想要连接时使用一次性命令。提供了两种方法的说明。

管理StrongSwan作为服务

要将StrongSwan管理为服务,您需要执行以下配置步骤。

首先,使用apt更新本地软件包缓存

  1. sudo apt update

接下来,安装StrongSwan和所需的身份验证插件:

  1. sudo apt install strongswan libcharon-extra-plugins

现在,您需要将CA证书的副本放入/etc/ipsec.d/cacerts目录,以便您的客户端可以验证服务器的身份。运行以下命令将ca-cert.pem文件复制到指定位置:

  1. sudo cp /tmp/ca-cert.pem /etc/ipsec.d/cacerts

为了确保VPN仅在需要时运行,请使用systemctl禁用StrongSwan的自动运行:

  1. sudo systemctl disable --now strongswan-starter

接下来,配置您将用于对VPN服务器进行身份验证的用户名和密码。使用nano或您偏爱的编辑器编辑/etc/ipsec.secrets

  1. 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
    # 这应该与您服务器配置中的`leftid`值匹配
    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,请键入:

  1. sudo systemctl start strongswan-starter

要断开连接,请再次键入:

  1. sudo systemctl stop strongswan-starter

使用charon-cmd客户端进行一次性连接

要将StrongSwan配置为服务,您需要执行以下配置步骤。

首先,使用apt更新本地软件包缓存。

  1. sudo apt update

接下来,安装StrongSwan及所需的认证插件:

  1. sudo apt install strongswan libcharon-extra-plugins

现在,您需要将CA证书的副本放入/etc/ipsec.d/cacerts目录,以便客户端可以验证服务器的身份。运行以下命令将ca-cert.pem文件复制到相应位置:

  1. sudo cp /tmp/ca-cert.pem /etc/ipsec.d/cacerts

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

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

  1. 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连接,点击页面顶部的开关,您将连接到VPN。

从Android连接

按照以下步骤导入证书:

  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. 点击屏幕顶部的已导入选项卡,选择您导入的CA证书(如果您之前没有更改“DN”,它将被命名为“VPN根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地址--san IP地址标志。

结论

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

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

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

Source:
https://www.digitalocean.com/community/tutorials/how-to-set-up-an-ikev2-vpn-server-with-strongswan-on-ubuntu-22-04