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

介绍

虚拟私人网络,或VPN,允许您安全地加密流量,因为它通过不受信任的网络,如咖啡店,会议或机场。

IKEv2,或Internet Key Exchange v2,是一个协议,允许服务器和客户端之间的直接IPsec隧道。在IKEV2VPN实现中,IKEV2为网络流量提供加密。

在本教程中,您将使用 StrongSwan在 Ubuntu 18.04 服务器上设置 IKEv2 VPN 服务器,并从 Windows, macOS, Ubuntu, iOS 和 Android 客户端连接到它。

前提条件

要完成本教程,您将需要:

步骤 1 – 安装 StrongSwan

首先,我们将安装 StrongSwan,一个开源的IPsec示威器,我们将其配置为我们的VPN服务器,我们还将安装公共密钥基础设施组件,以便我们可以创建一个证书权限来为我们的基础设施提供凭证。

更新本地包缓存并通过键入安装软件:

1sudo apt update
2sudo apt install strongswan strongswan-pki

现在一切已经安装了,让我们继续创建我们的证书。

步骤 2 – 创建证书授权机构

一个 IKEv2 服务器需要一个证书来识别自己给客户端。 为了帮助我们创建所需的证书,‘strongswan-pki’ 套件配备了生成证书权限和服务器证书的实用工具。 首先,让我们创建几个目录来存储我们正在工作的所有资产。 目录结构匹配了 `/etc/ipsec.d 中的某些目录,我们最终将移动我们创建的所有项目。 我们将锁定权限,以便我们的私人文件无法被其他用户看到:

1mkdir -p ~/pki/{cacerts,certs,private}
2chmod 700 ~/pki

现在我们有一个目录结构来存储一切,我们可以生成一个根密钥,这将是一个4096位的RSA密钥,将被用来签署我们的根证书权威。

执行这些命令来生成密钥:

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

现在我们有一个密钥,我们可以继续创建我们的根证书权威,使用密钥来签署根证书:

1ipsec 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

如果您愿意,您可以将 distinguished name (DN) 值更改为其他东西。 这里的常见名称只是指标,因此它不必匹配您的基础设施中的任何东西。

现在我们已经获得了我们的根证书权限,我们可以创建一个VPN服务器将使用的证书。

步骤 3 – 生成VPN服务器的证书

我们现在将为VPN服务器创建一个证书和密钥,该证书将允许客户端使用我们刚刚生成的CA证书来验证服务器的真实性。

首先,用以下命令创建VPN服务器的私钥:

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

现在,使用您在上一个步骤中创建的证书权限密钥创建并签署VPN服务器证书,执行以下命令,但将共同名称(CN)和主体替换名称(SAN)字段更改为VPN服务器的DNS名称或IP地址:

1ipsec pki --pub --in ~/pki/private/server-key.pem --type rsa \
2    | ipsec 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

现在我们已经生成了 StrongSwan 需要的所有 TLS/SSL 文件,我们可以通过键入在 /etc/ipsec.d 目录中的位置移动文件:

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

在此步骤中,我们创建了一对证书对,将用于确保客户端和服务器之间的通信。我们还使用CA密钥签署了证书,因此客户端将能够使用CA证书验证VPN服务器的真实性。

步骤 4 – 配置 StrongSwan

StrongSwan有一个默认配置文件,有一些例子,但我们将不得不自己做大部分的配置。

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

创建并打开一个新的空白配置文件,键入:

1sudo nano /etc/ipsec.conf

首先,我们会告诉 StrongSwan 登录 DAEMON 状态来调试并允许重复连接。

1[label /etc/ipsec.conf]
2config setup
3    charondebug="ike 1, knl 1, cfg 0"
4    uniqueids=no

我们还会告诉 StrongSwan创建 IKEv2 VPN 隧道,并在启动时自动加载此配置部分。

1[label /etc/ipsec.conf]
2. . .
3conn ikev2-vpn
4    auto=add
5    compress=no
6    type=tunnel
7    keyexchange=ikev2
8    fragmentation=yes
9    forceencaps=yes

我们还将配置死亡对象检测以清除任何危险连接,如果客户端意外断开连接。

1[label /etc/ipsec.conf]
2. . .
3conn ikev2-vpn
4    . . .
5    dpdaction=clear
6    dpddelay=300s
7    rekey=no

然后,我们将配置服务器(左)侧的IPsec参数。

1[label /etc/ipsec.conf]
2. . .
3conn ikev2-vpn
4    . . .
5    left=%any
6    leftid=@server_domain_or_IP
7    leftcert=server-cert.pem
8    leftsendcert=always
9    leftsubnet=0.0.0.0/0

<$>[注意] 注意:在配置服务器ID(‘leftid’)时,只需将您的VPN服务器标识为域名时,只需包含@字符:

如果服务器将被其IP地址识别,只需输入IP地址:

1leftid=203.0.113.7

美元

接下来,我们可以配置客户端(右侧)IPsec参数,如私人IP地址范围和DNS服务器使用:

 1[label /etc/ipsec.conf]
 2. . .
 3conn ikev2-vpn
 4    . . .
 5    right=%any
 6    rightid=%any
 7    rightauth=eap-mschapv2
 8    rightsourceip=10.10.10.0/24
 9    rightdns=8.8.8.8,8.8.4.4
10    rightsendcert=never

最后,我们会告诉StrongSwan在连接时请求客户端提供用户身份证件:

1[label /etc/ipsec.conf]
2. . .
3conn ikev2-vpn
4    . . .
5    eap_identity=%identity

配置文件应该是这样的:

 1[label /etc/ipsec.conf]
 2config setup
 3    charondebug="ike 1, knl 1, cfg 0"
 4    uniqueids=no
 5
 6conn ikev2-vpn
 7    auto=add
 8    compress=no
 9    type=tunnel
10    keyexchange=ikev2
11    fragmentation=yes
12    forceencaps=yes
13    dpdaction=clear
14    dpddelay=300s
15    rekey=no
16    left=%any
17    leftid=@server_domain_or_IP
18    leftcert=server-cert.pem
19    leftsendcert=always
20    leftsubnet=0.0.0.0/0
21    right=%any
22    rightid=%any
23    rightauth=eap-mschapv2
24    rightsourceip=10.10.10.0/24
25    rightdns=8.8.8.8,8.8.4.4
26    rightsendcert=never
27    eap_identity=%identity

保存并关闭文件,一旦您确认您已按所示配置了东西。

现在我们已经配置了VPN参数,让我们继续创建一个帐户,以便我们的用户可以连接到服务器。

步骤 5 – 配置 VPN 身份验证

我们的VPN服务器现在已配置为接受客户端连接,但我们还没有配置任何身份证件,我们需要在一个名为ipsec.secrets的特殊配置文件中配置几件事:

  • 我们需要告诉StrongSwan在哪里找到我们的服务器证书的私钥,这样服务器就可以对客户端进行身份验证。
  • 我们还需要设置一个允许连接到VPN的用户列表。

让我们打开秘密文件来编辑:

1sudo nano /etc/ipsec.secrets

首先,我们会告诉 StrongSwan 在哪里找到我们的私钥:

1[label /etc/ipsec.secrets]
2: RSA "server-key.pem"

然后,我们将定义用户身份证,您可以创建您喜欢的任何用户名或密码组合:

1[label /etc/ipsec.secrets]
2your_username : EAP "your_password"

现在我们已经完成了VPN参数的工作,我们将重新启动VPN服务,以便应用我们的配置:

1sudo systemctl restart strongswan

现在,VPN服务器已经完全配置了服务器选项和用户凭证,现在是时候开始配置最重要的部分了:防火墙。

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

随着 StrongSwan 配置完成,我们需要配置防火墙来传输并允许 VPN 流量。

如果你遵循前提教程,你应该有一个非常基本的UFW防火墙启用. 如果你还没有配置UFW,你可以创建一个基线配置,并通过键入启用它:

1sudo ufw allow OpenSSH
2sudo ufw enable

现在,添加一个规则来允许UDP流量到标准的IPsec端口,500和4500:

1sudo ufw allow 500,4500/udp

接下来,我们将打开UFW的配置文件之一,添加一些向导和转发IPsec包的低级别策略. 在我们做之前,我们需要找出我们服务器上的哪个网络接口用于访问互联网。

1ip route | grep default

例如,此结果显示了名为「eth0」的界面,该界面如下所示:

1[secondary_label Output]
2default via 203.0.113.7 dev eth0 proto static

当您有公共网络接口时,请在文本编辑器中打开 /etc/ufw/before.rules 文件:

1sudo nano /etc/ufw/before.rules

靠近文件的顶部(在*过滤器行前),添加以下配置块:

 1[label /etc/ufw/before.rules]
 2*nat
 3-A POSTROUTING -s 10.10.10.0/24 -o eth0 -m policy --pol ipsec --dir out -j ACCEPT
 4-A POSTROUTING -s 10.10.10.0/24 -o eth0 -j MASQUERADE
 5COMMIT
 6
 7*mangle
 8-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
 9COMMIT
10
11*filter
12:ufw-before-input - [0:0]
13:ufw-before-output - [0:0]
14:ufw-before-forward - [0:0]
15:ufw-not-local - [0:0]
16. . .

在上面的配置中,更改eth0的每个实例,以匹配您发现的界面名称与ip route*nat线条创建规则,以便防火墙能够正确地路由和操纵VPN客户端和互联网之间的流量。

接下来,在*过滤器和链定义行之后,再添加一个配置块:

 1[label /etc/ufw/before.rules]
 2. . .
 3*filter
 4:ufw-before-input - [0:0]
 5:ufw-before-output - [0:0]
 6:ufw-before-forward - [0:0]
 7:ufw-not-local - [0:0]
 8
 9-A ufw-before-forward --match policy --pol ipsec --dir in --proto esp -s 10.10.10.0/24 -j ACCEPT
10-A ufw-before-forward --match policy --pol ipsec --dir out --proto esp -d 10.10.10.0/24 -j ACCEPT

这些线路告诉防火墙传输 ESP (包装安全负载)的流量,以便VPN客户端能够连接。

完成后,保存并关闭文件。

在重新启动防火墙之前,我们将更改一些网络内核参数,以允许从一个接口向另一个接口进行路由。

1sudo nano /etc/ufw/sysctl.conf

我们需要在这里配置一些东西:

  • 首先,我们将启用 IPv4 数据包转发。
  • 我们将禁用 Path MTU 发现以防止数据包碎片问题。
  • 我们也不会接受 ICMP 重定向,也不会发送 ICMP 重定向以防止 中间人攻击。

您需要对文件进行的更改在以下代码中突出显示:

 1[label /etc/ufw/sysctl.conf]
 2
 3. . .
 4
 5# Enable forwarding
 6# Uncomment the following line
 7net/ipv4/ip_forward=1
 8
 9. . .
10
11# Do not accept ICMP redirects (prevent MITM attacks)
12# Ensure the following line is set
13net/ipv4/conf/all/accept_redirects=0
14
15# Do not send ICMP redirects (we are not a router)
16# Add the following lines
17net/ipv4/conf/all/send_redirects=0
18net/ipv4/ip_no_pmtu_disc=1

完成后保存文件. UFW 将在下次开始时应用这些更改。

现在,我们可以通过禁用和重新启用防火墙来启用所有我们的更改:

1sudo ufw disable
2sudo ufw enable

您将被要求确认进程. 键入Y,以在新设置中再次启用 UFW。

步骤 7 – 在 Windows、iOS 和 macOS 上测试 VPN 连接

现在你已经设置了一切,是时候试试了,首先,你需要复制你创建的CA证书,并将其安装在你的客户端设备(设备)上,这将连接到VPN。

1cat /etc/ipsec.d/cacerts/ca-cert.pem

你会看到类似于此的输出:

1[secondary_label Output]
2-----BEGIN CERTIFICATE-----
3MIIFQjCCAyqgAwIBAgIIFkQGvkH4ej0wDQYJKoZIhvcNAQEMBQAwPzELMAkGA1UE
4
5. . .
6
7EwbVLOXcNduWK2TPbk/+82GRMtjftran6hKbpKGghBVDPVFGFT6Z0OfubpkQ9RsQ
8BayqOb/Q
9-----END CERTIFICATE-----

将此输出复制到您的计算机,包括 -----BEGIN CERTIFICATE----------END CERTIFICATE----- 行,并将其保存到具有可识别的名称的文件中,例如 ca-cert.pem

或者,使用 SFTP 将文件传输到您的计算机(https://andsky.com/tech/tutorials/how-to-use-sftp-to-securely-transfer-files-with-a-remote-server)。

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

从 Windows 连接

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

  1. Press WINDOWS+R to bring up the Run dialog, and enter mmc.exe to launch the Windows Management Console.
  2. From the File menu, navigate to Add or Remove Snap-in, select Certificates from the list of available snap-ins, and click Add.
  3. We want the VPN to work with any user, so select Computer Account and click Next.
  4. We're configuring things on the local computer, so select Local Computer, then click Finish.
  5. Under the Console Root node, expand the Certificates (Local Computer) entry, expand Trusted Root Certification Authorities, and then select the Certificates entry: Certificates view
  6. From the Action menu, select All Tasks and click Import to display the Certificate Import Wizard. Click Next to move past the introduction.
  7. On the File to Import screen, press the Browse button and select the certificate file that you've saved. Then click Next.
  8. Ensure that the Certificate Store is set to Trusted Root Certification Authorities, and click Next.
  9. Click Finish to import the certificate.

然后用这些步骤配置VPN:

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

您的新 VPN 连接将在网络列表下可见。 选择 VPN 并点击 连接. 您将被提示输入您的用户名和密码。 输入它们,点击 OK,您将连接。

从 macOS 连接

按照以下步骤导入证书:

  1. 双击证书文件. Keychain Access将出现一个对话框,表示Keychain Access正在尝试修改系统密钥链。 输入您的密码以允许此项操作
  2. 输入您的密码,然后点击 Modify Keychain
  3. 双击新进口的VPN证书。 这会带来一个小型属性窗口,您可以指定信任级别。 设置 **IP Security(IPSec)**到 Always Trust,您将被要求再次使用您的密码。 输入密码后,此设置会自动保存。

现在证书很重要和值得信赖,请按照以下步骤配置VPN连接:

  1. 进入 系统偏好选项,选择 网络.
  2. 点击网络列表的左下角的小按钮。
  3. 在出现的弹出窗口中,设置 InterfaceVPN,设置 VPN 类型IKEv2,并给连接一个名称。
  4. 服务器远程 ID 字段中,输入服务器的域名或 IP 地址。 留下 本地 ID 空白。
  5. 点击 身份验证设置,选择 用户名,然后输入您为您的 VPN 用户配置的用户名和密码。 然后点击 **OK.

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

从 Ubuntu 连接

要从 Ubuntu 机器连接,您可以设置和管理 StrongSwan 作为一个服务,或者每次想要连接时使用一次性命令。

管理 StrongSwan 作为服务

  1. 更新本地包缓存: sudo apt update
  2. 安装 StrongSwan 和相关软件 sudo apt install strongswan libcharon-extra-plugins
  3. 复制 CA 证书到 /etc/ipsec.d/cacerts 目录: sudo cp /tmp/ca-cert.pem /etc/ipsec.d/cacerts
  4. 禁用 StrongSwan 以便 VPN 不会自动启动: sudo systemlct disable --now strongswan
  5. 配置您的 VPN 用户名密码并在 /et/cipsec.secrets.d 文件中: `your_username : EAP "
 1[label /etc/ipsec.conf]
 2config setup
 3
 4conn ikev2-rw
 5    right=server_domain_or_IP
 6    # This should match the `leftid` value on your server's configuration
 7    rightid=server_domain_or_IP
 8    rightsubnet=0.0.0.0/0
 9    rightauth=pubkey
10    leftsourceip=%config
11    leftid=username
12    leftauth=eap-mschapv2
13    eap_identity=%identity
14    auto=start

要连接到VPN,请键入:

1sudo systemctl start strongswan

要再次关闭,键入:

1sudo systemctl stop strongswan

使用单独连接的简单客户端

  1. 更新您的本地包缓存: sudo apt update
  2. 安装 charon-cmd 和相关软件 sudo apt install charon-cmd libcharon-extra-plugins
  3. 移动到您复制 CA 证书的目录: cd /path/to/ca-cert.pem
  4. 使用服务器的 CA 证书, VPN 服务器的 IP 地址和您配置的用户名连接到 VPN 服务器的 charon-cmd

您现在应该连接到VPN。 要切断连接,请按CTRL+C,等待连接关闭。

从 iOS 连接

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

  1. 发送给自己一封带有根证书的电子邮件.
  2. 在 iOS 设备上打开电子邮件,然后点击附带的证书文件,然后点击 Install,然后输入您的密码。 安装后,点击 Done.
  3. 点击 Settings, General, VPN,然后点击 Add VPN Configuration。 这将带来 VPN 连接配置屏幕。
  4. 点击 Type,选择 IKEv2
  5. Description字段中,输入 VPN 连接的简称。 这可能是任何你喜欢的。
  6. 在 **服务器和 远程 ID字段中,输入

从 Android 连接

按照以下步骤导入证书:

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

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

  1. 在应用程序中,点击 ADD VPN PROFILE在顶部。
  2. 填写您的 VPN 服务器的域名或公共 IP 地址的 服务器
  3. 确保 **IKEv2 EAP (用户名/密码)**被选为 VPN 类型。
  4. 填写您在服务器上定义的 用户名密码的凭证。
  5. CA 证书部分中删除 自动选择,然后点击 选择 CA 证书
  6. 点击屏幕顶部的 IMPORTED卡并选择您进口的 CA(如果您没有更早更改DN的话,它将被命名为VPN root CA。 _M

当你想连接到VPN时,点击你刚刚在StrongSwan应用程序中创建的个人资料。

连接故障

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

如果您无法连接到VPN,请检查您所使用的服务器名称或IP地址。服务器的域名或IP地址必须与您在创建证书时配置为通用名称(CN)的内容相匹配。如果它们不匹配,VPN连接将不起作用。如果您设置了具有vpn.example.com的CN的证书,您必须在输入VPN服务器的详细信息时使用vpn.example.com

最后,双重检查VPN配置,以确保您使用域名时配置lefttid值与@符号:

如果您正在使用 IP 地址,请确保@符号被省略。

结论

在本教程中,您已经构建了一个使用IKEv2协议的VPN服务器,现在您可以放心您的在线活动将保持安全,无论您去哪里!

要添加或删除用户,只需再次查看步骤 5 每行为一个用户,因此添加或删除用户就像编辑文件一样简单。

从这里,你可能想看看设置一个日志文件分析器,因为StrongSwan将其日志丢入syslog。

您可能还感兴趣的是 EFF 关于在线隐私的此指南(https://www.eff.org/wp/effs-top-12-ways-protect-your-online-privacy)。

Published At
Categories with 技术
comments powered by Disqus