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

介绍

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

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

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

前提条件

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

此外,你应该熟悉IPTables。 审查 How the Iptables Firewall Works 在你继续之前。

步骤 1 – 安装 StrongSwan

首先,我们将安装 StrongSwan,一个开源的IPsec大门,我们将其配置为我们的VPN服务器,我们还将安装StrongSwan EAP插件,允许客户端的密码身份验证,而不是基于证书的身份验证。

执行以下命令来安装这些组件:

1sudo apt-get install strongswan strongswan-plugin-eap-mschapv2 moreutils iptables-persistent

<$>[注] :在安装iptables-persistent时,安装程序将询问是否要保存当前的IPv4和IPv6规则。

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

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

一个 IKEv2 服务器需要一个证书来识别自己给客户端. 为了帮助我们创建所需的证书,StrongSwan 提供了一个工具来生成证书权威和服务器证书。

1mkdir vpn-certs
2cd vpn-certs

现在我们有一个目录来存储一切,让我们生成我们的 root 密钥,这将是一个 4096 位 RSA 密钥,它将被用来签署我们的 root 证书权威,所以很重要的是,我们也通过确保只有 root 用户才能读取它来保护这个密钥。

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

1ipsec pki --gen --type rsa --size 4096 --outform pem > server-root-key.pem
2chmod 600 server-root-key.pem

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

1ipsec pki --self --ca --lifetime 3650 \
2--in server-root-key.pem \
3--type rsa --dn "C=US, O=VPN Server, CN=VPN Server Root CA" \
4--outform pem > server-root-ca.pem

您可以更改 distinguished name (DN) 值,例如国家、组织和常用名称,如果您想要的话,将其更改为另一个值。

后来,我们将将根证书(‘server-root-ca.pem’)复制到我们的客户端设备,以便他们在连接时可以验证服务器的真实性。

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

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

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

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

1ipsec pki --gen --type rsa --size 4096 --outform pem > vpn-server-key.pem

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

1ipsec pki --pub --in vpn-server-key.pem \
2--type rsa | ipsec pki --issue --lifetime 1825 \
3--cacert server-root-ca.pem \
4--cakey server-root-key.pem \
5--dn "C=US, O=VPN Server, CN=server_name_or_ip" \
6--san server_name_or_ip \
7--flag serverAuth --flag ikeIntermediate \
8--outform pem > vpn-server-cert.pem

将证书复制到允许 StrongSwan 读取证书的路径:

1sudo cp ./vpn-server-cert.pem /etc/ipsec.d/certs/vpn-server-cert.pem
2sudo cp ./vpn-server-key.pem /etc/ipsec.d/private/vpn-server-key.pem

最后,保护密钥,以便它们只能被 root用户读取。

1sudo chown root /etc/ipsec.d/private/vpn-server-key.pem
2sudo chgrp root /etc/ipsec.d/private/vpn-server-key.pem
3sudo chmod 600 /etc/ipsec.d/private/vpn-server-key.pem

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

步骤 4 – 配置 StrongSwan

我们已经创建了我们需要的所有证书,所以是时候自己配置 StrongSwan了。

StrongSwan有一个默认配置文件,但在我们做出任何更改之前,让我们先备份它,以便在某种情况下我们有一个参考文件:

1sudo cp /etc/ipsec.conf /etc/ipsec.conf.original

示例文件相当长,所以为了防止错误配置,我们将清除默认配置文件,并从零写下我们自己的配置。

1echo '' | sudo tee /etc/ipsec.conf

然后在文本编辑器中打开文件:

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]
2conn ikev2-vpn
3  auto=add
4  compress=no
5  type=tunnel
6  keyexchange=ikev2
7  fragmentation=yes
8  forceencaps=yes

接下来,我们将告诉 StrongSwan VPN 使用哪些加密算法。

1[label /etc/ipsec.conf]
2  ike=aes256-sha1-modp1024,3des-sha1-modp1024!
3  esp=aes256-sha1,3des-sha1!

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

1[label /etc/ipsec.conf]
2  dpdaction=clear
3  dpddelay=300s
4  rekey=no

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

1[label /etc/ipsec.conf]
2  left=%any
3  leftid=@server_name_or_ip
4  leftcert=/etc/ipsec.d/certs/vpn-server-cert.pem
5  leftsendcert=always
6  leftsubnet=0.0.0.0/0

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

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

1leftid=111.111.111.111

美元

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

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

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

1[label /etc/ipsec.conf]
2  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    ike=aes256-sha1-modp1024,3des-sha1-modp1024!
14    esp=aes256-sha1,3des-sha1!
15    dpdaction=clear
16    dpddelay=300s
17    rekey=no
18    left=%any
19    leftid=@server_name_or_ip
20    leftcert=/etc/ipsec.d/certs/vpn-server-cert.pem
21    leftsendcert=always
22    leftsubnet=0.0.0.0/0
23    right=%any
24    rightid=%any
25    rightauth=eap-mschapv2
26    rightdns=8.8.8.8,8.8.4.4
27    rightsourceip=10.10.10.0/24
28    rightsendcert=never
29    eap_identity=%identity

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

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

步骤 5 – 配置 VPN 身份验证

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

  • 我们需要告诉StrongSwan在哪里找到我们的服务器证书的私钥,这样服务器就可以加密和解密数据。

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

1sudo nano /etc/ipsec.secrets

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

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

然后我们会创建用户凭证,你可以创建任何你喜欢的用户名或密码组合,但我们必须告诉StrongSwan允许这个用户从任何地方连接:

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

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

1sudo ipsec reload

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

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

现在我们已经配置了VPN服务器,我们需要配置防火墙来传输并允许VPN流量通过。

首先,如果您已经设置了 UFW,请禁用它,因为它可能与我们需要配置的规则相冲突:

1sudo ufw disable

然后删除由UFW创建的任何剩余的防火墙规则:

1iptables -P INPUT ACCEPT
2iptables -P FORWARD ACCEPT
3iptables -F
4iptables -Z

为了防止我们从 SSH 会话中被锁定出来,我们将接受已经接受的连接,我们还将打开端口 22(或您配置的任何端口)以便未来连接到服务器的 SSH 连接。

1sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
2sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

我们还需要在本地 loopback 界面上接受连接:

1sudo iptables -A INPUT -i lo -j ACCEPT

然后我们会告诉 IPTables 接受 IPSec 连接:

1sudo iptables -A INPUT -p udp --dport 500 -j ACCEPT
2sudo iptables -A INPUT -p udp --dport 4500 -j ACCEPT

接下来,我们会告诉IPTables传输 ESP (封装安全负载)的流量,以便VPN客户端能够连接。

1sudo iptables -A FORWARD --match policy --pol ipsec --dir in  --proto esp -s 10.10.10.10/24 -j ACCEPT
2sudo iptables -A FORWARD --match policy --pol ipsec --dir out --proto esp -d 10.10.10.10/24 -j ACCEPT

我们的VPN服务器将作为VPN客户端和互联网之间的通道,因为VPN服务器将只有一个公共IP地址,我们将需要配置隐藏,以允许服务器代表客户端从互联网请求数据;这将允许流量从VPN客户端流到互联网,反之亦然:

1sudo iptables -t nat -A POSTROUTING -s 10.10.10.10/24 -o eth0 -m policy --pol ipsec --dir out -j ACCEPT
2sudo iptables -t nat -A POSTROUTING -s 10.10.10.10/24 -o eth0 -j MASQUERADE

为了防止某些客户端的 IP 包分裂,我们会告诉 IPTables 通过调整包的最大细分大小来减少包的大小,从而防止一些 VPN 客户端出现问题。

1sudo iptables -t mangle -A FORWARD --match policy --pol ipsec --dir in -s 10.10.10.10/24 -o eth0 -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1361:1536 -j TCPMSS --set-mss 1360

为了提高安全性,我们将放弃不符合我们配置的规则的其他内容:

1sudo iptables -A INPUT -j DROP
2sudo iptables -A FORWARD -j DROP

现在我们将使防火墙配置持久,以便我们所有的配置工作在重新启动时不会被删除:

1sudo netfilter-persistent save
2sudo netfilter-persistent reload

最后,我们将允许在服务器上发送数据包。发送数据包是使我们的服务器能够路由数据从一个IP地址到另一个。

编辑文件 /etc/sysctl.conf:

1sudo nano /etc/sysctl.conf

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

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

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

 1[label /etc/sysctl.conf]
 2
 3. . .
 4
 5# Uncomment the next line to enable packet forwarding for IPv4
 6net.ipv4.ip_forward=1
 7
 8. . .
 9
10# Do not accept ICMP redirects (prevent MITM attacks)
11net.ipv4.conf.all.accept_redirects = 0
12# Do not send ICMP redirects (we are not a router)
13net.ipv4.conf.all.send_redirects = 0
14
15. . .
16
17net.ipv4.ip_no_pmtu_disc = 1

做出这些更改,保存文件,然后退出编辑器,然后重新启动服务器:

1sudo reboot

当服务器重新启动时,您将从服务器中断连接,但这是预期的。服务器重新启动后,您可以作为 sudo 非 root 用户重新登录服务器。

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

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

1cat ~/vpn-certs/server-root-ca.pem

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

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

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

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

一旦您已下载到您的计算机的vpn_root_certificate.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,您将连接。

从 iOS 连接

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

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

从 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。

连接故障

如果无法导入证书,请确保文件具有.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