如何在Ubuntu18.04上使用StrongSwan设置IKEv2VPN服务器
介绍
虚拟专用网络或 VPN 允许您在流量通过不受信任的网络(例如咖啡店、会议或机场的网络)时安全地加密流量。
IKEv2 或 Internet 密钥交换 v2 是一种允许服务器和客户端之间直接 IPSec 隧道的协议。 在 IKEv2 VPN 实施中,IPSec 为网络流量提供加密。 IKEv2 在某些平台(OS X 10.11+、iOS 9.1+ 和 Windows 10)上得到原生支持,无需额外的应用程序,它可以非常顺利地处理客户端故障。
在本教程中,您将在 Ubuntu 18.04 服务器上使用 StrongSwan 设置 IKEv2 VPN 服务器,并从 Windows、macOS、Ubuntu、iOS 和 Android 客户端连接到它。
先决条件
要完成本教程,您需要:
- 一台按照Ubuntu 18.04初始服务器设置指南配置的Ubuntu 18.04服务器,包括
sudo
非root用户和防火墙。
第 1 步 — 安装 StrongSwan
首先,我们将安装 StrongSwan,这是一个开源 IPSec 守护程序,我们将其配置为我们的 VPN 服务器。 我们还将安装公钥基础设施组件,以便我们可以创建证书颁发机构来为我们的基础设施提供凭据。
通过键入以下内容更新本地包缓存并安装软件:
sudo apt update sudo apt install strongswan strongswan-pki
现在一切都安装好了,让我们继续创建我们的证书。
第 2 步 — 创建证书颁发机构
IKEv2 服务器需要证书来向客户端标识自己。 为了帮助我们创建所需的证书,strongswan-pki
软件包附带了一个实用程序来生成证书颁发机构和服务器证书。 首先,让我们创建几个目录来存储我们将要处理的所有资产。 目录结构与 /etc/ipsec.d
中的一些目录匹配,我们最终将在其中移动我们创建的所有项目。 我们将锁定权限,以便其他用户无法看到我们的私人文件:
mkdir -p ~/pki/{cacerts,certs,private} chmod 700 ~/pki
现在我们有了一个目录结构来存储所有内容,我们可以生成一个根密钥。 这将是一个 4096 位的 RSA 密钥,用于签署我们的根证书颁发机构。
执行以下命令以生成密钥:
ipsec pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/ca-key.pem
现在我们有了密钥,我们可以继续创建根证书颁发机构,使用密钥签署根证书:
ipsec 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
如果您愿意,可以将 可分辨名称 (DN) 值更改为其他值。 这里的通用名称只是指标,因此它不必与您的基础设施中的任何内容相匹配。
现在我们已经启动并运行了根证书颁发机构,我们可以创建 VPN 服务器将使用的证书。
第 3 步 — 为 VPN 服务器生成证书
我们现在将为 VPN 服务器创建证书和密钥。 该证书将允许客户端使用我们刚刚生成的 CA 证书来验证服务器的真实性。
首先,使用以下命令为 VPN 服务器创建一个私钥:
ipsec pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/server-key.pem
现在,使用您在上一步中创建的证书颁发机构的密钥创建并签署 VPN 服务器证书。 执行以下命令,但将 Common Name (CN) 和 Subject Alternate Name (SAN) 字段更改为您的 VPN 服务器的 DNS 名称或 IP 地址:
ipsec pki --pub --in ~/pki/private/server-key.pem --type rsa \ | ipsec 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
现在我们已经生成了 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}
通过键入以下内容创建并打开一个新的空白配置文件:
sudo nano /etc/ipsec.conf
首先,我们将告诉 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
. . . 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服务器将通过域名识别,则只包括@
字符:
leftid=@vpn.example.com
如果服务器将通过其 IP 地址来识别,只需将 IP 地址放入:
leftid=203.0.113.7
接下来,我们可以配置客户端(右侧)IPSec 参数,例如要使用的私有 IP 地址范围和 DNS 服务器:
/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
配置文件应如下所示:
/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
确认您已按所示配置内容后,保存并关闭文件。
现在我们已经配置了 VPN 参数,让我们继续创建一个帐户,以便我们的用户可以连接到服务器。
第 5 步 — 配置 VPN 身份验证
我们的 VPN 服务器现在配置为接受客户端连接,但我们还没有配置任何凭据。 我们需要在一个名为 ipsec.secrets
的特殊配置文件中配置一些东西:
- 我们需要告诉 StrongSwan 在哪里可以找到我们的服务器证书的私钥,以便服务器能够向客户端进行身份验证。
- 我们还需要设置允许连接到 VPN 的用户列表。
让我们打开秘密文件进行编辑:
sudo nano /etc/ipsec.secrets
首先,我们将告诉 StrongSwan 在哪里可以找到我们的私钥:
/etc/ipsec.secrets
: RSA "server-key.pem"
然后,我们将定义用户凭据。 您可以组成您喜欢的任何用户名或密码组合:
/etc/ipsec.secrets
your_username : EAP "your_password"
保存并关闭文件。 现在我们已经完成了 VPN 参数的处理,我们将重新启动 VPN 服务,以便应用我们的配置:
sudo systemctl restart strongswan
现在 VPN 服务器已经完全配置了服务器选项和用户凭据,是时候继续配置最重要的部分了:防火墙。
第 6 步 — 配置防火墙和内核 IP 转发
完成 StrongSwan 配置后,我们需要配置防火墙以转发和允许 VPN 流量通过。
如果您遵循了先决条件教程,您应该启用了一个非常基本的 UFW 防火墙。 如果您尚未配置 UFW,您可以创建基线配置并通过键入以下内容启用它:
sudo ufw allow OpenSSH sudo ufw enable
现在,添加一条规则以允许标准 IPSec 端口 500 和 4500 的 UDP 流量:
sudo ufw allow 500,4500/udp
接下来,我们将打开一个 UFW 的配置文件,添加一些用于路由和转发 IPSec 数据包的低级策略。 在我们这样做之前,我们需要找到我们服务器上的哪个网络接口用于互联网访问。 我们可以通过查询与默认路由关联的接口发现:
ip route | grep default
您的公共界面应遵循“开发”一词。 例如,这个结果显示了名为 eth0
的接口,它在下面突出显示:
Outputdefault via 203.0.113.7 dev eth0 proto static
当你有你的公共网络接口时,在你的文本编辑器中打开 /etc/ufw/before.rules
文件:
sudo nano /etc/ufw/before.rules
在文件顶部附近(在 *filter
行之前),添加以下配置块:
/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] . . .
更改上述配置中 eth0
的每个实例,以匹配您使用 ip route
找到的接口名称。 *nat
行创建规则,以便防火墙可以正确路由和操纵 VPN 客户端和 Internet 之间的流量。 *mangle
行调整最大数据包段大小,以防止某些 VPN 客户端出现潜在问题。
接下来,在 *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 数据包提供额外的安全性,因为它们正在穿越不受信任的网络。
完成后,保存并关闭文件。
在重新启动防火墙之前,我们将更改一些网络内核参数以允许从一个接口路由到另一个接口。 打开UFW的内核参数配置文件:
sudo nano /etc/ufw/sysctl.conf
我们需要在这里配置一些东西:
- 首先,我们将启用 IPv4 数据包转发。
- 我们将禁用路径 MTU 发现以防止数据包碎片问题。
- 我们也不会接受 ICMP 重定向,也不会发送 ICMP 重定向来防止 man-in-the-middle 攻击。
您需要对文件进行的更改在以下代码中突出显示:
/etc/ufw/sysctl.conf
. . . # Enable forwarding # Uncomment the following line net/ipv4/ip_forward=1 . . . # Do not accept ICMP redirects (prevent MITM attacks) # Ensure the following line is set net/ipv4/conf/all/accept_redirects=0 # Do not send ICMP redirects (we are not a router) # Add the following lines net/ipv4/conf/all/send_redirects=0 net/ipv4/ip_no_pmtu_disc=1
完成后保存文件。 UFW 将在下次启动时应用这些更改。
现在,我们可以通过禁用和重新启用防火墙来启用所有更改:
sudo ufw disable sudo ufw enable
系统将提示您确认该过程。 键入 Y
以使用新设置再次启用 UFW。
第 7 步 – 在 Windows、iOS 和 macOS 上测试 VPN 连接
现在您已经完成了所有设置,是时候尝试一下了。 首先,您需要复制您创建的 CA 证书并将其安装在将连接到 VPN 的客户端设备上。 最简单的方法是登录到您的服务器并输出证书文件的内容:
cat /etc/ipsec.d/cacerts/ca-cert.pem
您将看到与此类似的输出:
Output-----BEGIN CERTIFICATE----- MIIFQjCCAyqgAwIBAgIIFkQGvkH4ej0wDQYJKoZIhvcNAQEMBQAwPzELMAkGA1UE . . . EwbVLOXcNduWK2TPbk/+82GRMtjftran6hKbpKGghBVDPVFGFT6Z0OfubpkQ9RsQ BayqOb/Q -----END CERTIFICATE-----
将此输出复制到您的计算机,包括 -----BEGIN CERTIFICATE-----
和 -----END CERTIFICATE-----
行,并将其保存到具有可识别名称的文件中,例如 ca-cert.pem
。 确保您创建的文件具有 .pem
扩展名。
将 ca-cert.pem
文件下载到您的计算机后,您可以设置与 VPN 的连接。
从 Windows 连接
首先,按照以下步骤导入根证书:
- 按
WINDOWS+R
弹出 Run 对话框,输入mmc.exe
启动 Windows 管理控制台。 - 从 File 菜单,导航到 Add or Remove Snap-in,从可用管理单元列表中选择 Certificates,然后单击 Add[ X156X]。
- 我们希望 VPN 可以与任何用户一起使用,因此选择 计算机帐户 并单击 下一步 。
- 我们在本地计算机上配置东西,所以选择本地计算机,然后单击完成。
- 在Console Root节点下,展开Certificates (Local Computer)条目,展开Trusted Root Certification Authorities,然后选择Certificates入口:
- 从 Action 菜单中,选择 All Tasks 并单击 Import 以显示证书导入向导。 点击 Next 跳过介绍。
- 在 File to Import 屏幕上,按 Browse 按钮并选择已保存的证书文件。 然后单击下一步。
- 确保 Certificate Store 设置为 Trusted Root Certification Authorities,然后单击 Next。
- 点击完成导入证书。
然后使用以下步骤配置 VPN:
- 启动控制面板,然后导航到网络和共享中心。
- 单击设置新的连接或网络,然后选择连接到工作场所。
- 选择使用我的互联网连接(VPN)。
- 输入 VPN 服务器详细信息。 在Internet地址字段中输入服务器的域名或IP地址,然后在目标名称中填写描述您的VPN连接的内容。 然后单击完成。
您的新 VPN 连接将显示在网络列表下。 选择 VPN 并单击 连接 。 系统将提示您输入用户名和密码。 输入它们,单击OK,您将被连接。
从 macOS 连接
请按照以下步骤导入证书:
- 双击证书文件。 钥匙串访问将弹出一个对话框,显示“钥匙串访问正在尝试修改系统钥匙串。 输入您的密码以允许此操作。”
- 输入您的密码,然后点击修改钥匙串
- 双击新导入的 VPN 证书。 这会打开一个小的属性窗口,您可以在其中指定信任级别。 将 IP Security (IPSec) 设置为 Always Trust,系统将再次提示您输入密码。 此设置在输入密码后自动保存。
既然证书很重要且受信任,请使用以下步骤配置 VPN 连接:
- 转到系统偏好设置并选择网络。
- 单击网络列表左下角的小“加号”按钮。
- 在出现的弹出窗口中,将 Interface 设置为 VPN,将 VPN 类型 设置为 IKEv2,并为连接命名。
- 在 Server 和 Remote ID 字段中,输入服务器的域名或 IP 地址。 将 本地 ID 留空。
- 点击 Authentication Settings,选择 Username,然后输入您为 VPN 用户配置的用户名和密码。 然后单击确定。
最后点击Connect连接VPN。 您现在应该连接到 VPN。
从 Ubuntu 连接
要从 Ubuntu 机器连接,您可以将 StrongSwan 作为服务设置和管理,或者在每次连接时使用一次性命令。 两者都提供了说明。
将 StrongSwan 管理为服务
- 更新本地包缓存:
sudo apt update
- 安装 StrongSwan 及相关软件
sudo apt install strongswan libcharon-extra-plugins
- 将CA证书复制到
/etc/ipsec.d/cacerts
目录:sudo cp /tmp/ca-cert.pem /etc/ipsec.d/cacerts
- 禁用 StrongSwan,使 VPN 不会自动启动:
sudo systemctl disable --now strongswan
- 在
/etc/ipsec.secrets
文件中配置您的 VPN 用户名和密码: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
要再次断开连接,请键入:
sudo systemctl stop strongswan
使用简单客户端进行一次性连接
- 更新本地包缓存:
sudo apt update
- 安装
charon-cmd
及相关软件sudo apt install charon-cmd libcharon-extra-plugins
- 移动到复制 CA 证书的目录:
cd <^>/path/to/ca-cert.pem
- 使用服务器的 CA 证书、VPN 服务器的 IP 地址和您配置的用户名连接到具有
charon-cmd
的 VPN 服务器:sudo charon-cmd --cert ca-cert.pem --host vpn_domain_or_IP --identity your_username
- 出现提示时,提供 VPN 用户的密码。
您现在应该连接到 VPN。 要断开连接,请按 CTRL+C
并等待连接关闭。
从 iOS 连接
要在 iOS 设备上配置 VPN 连接,请执行以下步骤:
- 向自己发送一封附有根证书的电子邮件。
- 在您的 iOS 设备上打开电子邮件并点击附件中的证书文件,然后点击 Install 并输入您的密码。 安装后,点击 完成 。
- 转到 设置、常规、VPN并点击添加VPN配置。 这将打开 VPN 连接配置屏幕。
- 点击 Type 并选择 IKEv2。
- 在 Description 字段中,输入 VPN 连接的短名称。 这可以是你喜欢的任何东西。
- 在 Server 和 Remote ID 字段中,输入服务器的域名或 IP 地址。 本地 ID 字段可以留空。
- 在 Authentication 部分输入您的用户名和密码,然后点击 Done。
- 选择您刚刚创建的 VPN 连接,点击页面顶部的开关,您将被连接。
从安卓连接
请按照以下步骤导入证书:
- 向自己发送一封附有 CA 证书的电子邮件。 将 CA 证书保存到您的下载文件夹。
- 从 Play 商店下载 StrongSwan VPN 客户端。
- 打开应用程序。 点击右上角的【X8X】“更多”图标【X23X】(三点图标),选择【X88X】CA证书【X107X】。
- 再次点击右上角的【X8X】“更多”图标【X23X】。 选择导入证书。
- 浏览到下载文件夹中的 CA 证书文件并选择它以将其导入应用程序。
现在证书已导入 StrongSwan 应用程序,您可以通过以下步骤配置 VPN 连接:
- 在应用程序中,点击顶部的 ADD VPN PROFILE。
- 使用您的 VPN 服务器的域名或公共 IP 地址填写 Server。
- 确保选择 IKEv2 EAP(用户名/密码) 作为 VPN 类型。
- 使用您在服务器上定义的凭据填写 Username 和 Password。
- 在CA证书部分取消选择自动选择,然后单击选择CA证书。
- 点击屏幕顶部的 IMPORTED 选项卡并选择您导入的 CA(如果您之前没有更改“DN”,它将被命名为“VPN root CA”)。
- 如果您愿意,请使用更具描述性的名称填写 配置文件名称(可选)。
当您希望连接到 VPN 时,请单击您刚刚在 StrongSwan 应用程序中创建的配置文件。
连接故障排除
如果您无法导入证书,请确保文件具有 .pem
扩展名,而不是 .pem.txt
。
如果您无法连接到 VPN,请检查您使用的服务器名称或 IP 地址。 服务器的域名或 IP 地址必须与您在创建证书时配置的公用名 (CN) 匹配。 如果它们不匹配,VPN 连接将无法工作。 如果您使用 vpn.example.com
的 CN 设置证书,您 必须 在输入 VPN 服务器详细信息时使用 vpn.example.com
。 仔细检查您用于生成证书的命令,以及您在创建 VPN 连接时使用的值。
最后,再次检查 VPN 配置,确保 leftid
值配置为使用 @
符号(如果您使用的是域名):
leftid=@vpn.example.com
如果您使用的是 IP 地址,请确保省略 @
符号。
结论
在本教程中,您已经构建了一个使用 IKEv2 协议的 VPN 服务器。 现在您可以放心,无论您走到哪里,您的在线活动都将保持安全!
要添加或删除用户,只需再次查看第 5 步。 每一行都代表一个用户,因此添加或删除用户就像编辑文件一样简单。
从这里开始,您可能需要考虑设置日志文件分析器,因为 StrongSwan 会将其日志转储到 syslog 中。 教程 How To Install and Use Logwatch Log Analyzer and Reporter on a VPS 提供了有关设置的更多信息。
您可能还对 来自 EFF 的关于在线隐私的指南 感兴趣。