介绍
虚拟私人网络,或VPN,允许您安全地加密流量,因为它通过不受信任的网络,如咖啡店,会议或机场。
IKEv2,或Internet Key Exchange v2,是一个协议,允许服务器和客户端之间的直接IPsec隧道。在IKEV2VPN实现中,IKEV2为网络流量提供加密。
在本教程中,您将使用 StrongSwan在 Ubuntu 18.04 服务器上设置 IKEv2 VPN 服务器,并从 Windows, macOS, Ubuntu, iOS 和 Android 客户端连接到它。
前提条件
要完成本教程,您将需要:
- 一个 Ubuntu 18.04 服务器配置如下 Ubuntu 18.04 初始服务器设置指南,包括一个非 root 用户和防火墙。
步骤 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 连接
首先,按照以下步骤导入根证书:
- Press
WINDOWS+R
to bring up the Run dialog, and entermmc.exe
to launch the Windows Management Console. - From the File menu, navigate to Add or Remove Snap-in, select Certificates from the list of available snap-ins, and click Add.
- We want the VPN to work with any user, so select Computer Account and click Next.
- We're configuring things on the local computer, so select Local Computer, then click Finish.
- Under the Console Root node, expand the Certificates (Local Computer) entry, expand Trusted Root Certification Authorities, and then select the Certificates entry:
- From the Action menu, select All Tasks and click Import to display the Certificate Import Wizard. Click Next to move past the introduction.
- On the File to Import screen, press the Browse button and select the certificate file that you've saved. Then click Next.
- Ensure that the Certificate Store is set to Trusted Root Certification Authorities, and click Next.
- Click Finish to import the certificate.
然后用这些步骤配置VPN:
- 启动 控制面板,然后导航到 网络和共享中心.
- 点击 设置新连接或网络,然后选择 连接到工作场所.
- 选择 使用我的互联网连接(VPN).
- 输入VPN服务器的详细信息。 输入服务器的域名或IP地址在 互联网地址字段中,然后输入 目的地名称以描述您的VPN连接。
您的新 VPN 连接将在网络列表下可见。 选择 VPN 并点击 连接. 您将被提示输入您的用户名和密码。 输入它们,点击 OK,您将连接。
从 macOS 连接
按照以下步骤导入证书:
- 双击证书文件. Keychain Access将出现一个对话框,表示
Keychain Access正在尝试修改系统密钥链。 输入您的密码以允许此项操作
。 - 输入您的密码,然后点击 Modify Keychain
- 双击新进口的VPN证书。 这会带来一个小型属性窗口,您可以指定信任级别。 设置 **IP Security(IPSec)**到 Always Trust,您将被要求再次使用您的密码。 输入密码后,此设置会自动保存。
现在证书很重要和值得信赖,请按照以下步骤配置VPN连接:
- 进入 系统偏好选项,选择 网络.
- 点击网络列表的左下角的小
加
按钮。 - 在出现的弹出窗口中,设置 Interface 到 VPN,设置 VPN 类型 到 IKEv2,并给连接一个名称。
- 在 服务器 和 远程 ID 字段中,输入服务器的域名或 IP 地址。 留下 本地 ID 空白。
- 点击 身份验证设置,选择 用户名,然后输入您为您的 VPN 用户配置的用户名和密码。 然后点击 **OK.
最后,点击连接
以连接到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 systemlct disable --now strongswan
- 配置您的 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
使用单独连接的简单客户端
- 更新您的本地包缓存:
sudo apt update
- 安装
charon-cmd
和相关软件sudo apt install charon-cmd libcharon-extra-plugins
- 移动到您复制 CA 证书的目录:
cd /path/to/ca-cert.pem
- 使用服务器的 CA 证书, VPN 服务器的 IP 地址和您配置的用户名连接到 VPN 服务器的
charon-cmd
。
您现在应该连接到VPN。 要切断连接,请按CTRL+C
,等待连接关闭。
从 iOS 连接
要在 iOS 设备上配置 VPN 连接,请遵循以下步骤:
- 发送给自己一封带有根证书的电子邮件.
- 在 iOS 设备上打开电子邮件,然后点击附带的证书文件,然后点击 Install,然后输入您的密码。 安装后,点击 Done.
- 点击 Settings, General, VPN,然后点击 Add VPN Configuration。 这将带来 VPN 连接配置屏幕。
- 点击 Type,选择 IKEv2。
- 在 Description字段中,输入 VPN 连接的简称。 这可能是任何你喜欢的。
- 在 **服务器和 远程 ID字段中,输入
从 Android 连接
按照以下步骤导入证书:
- 向您发送附有 CA 证书的电子邮件. 将 CA 证书保存到您的下载文件夹.
- 从 Play 商店下载 StrongSwan VPN 客户端。
- 打开应用程序. 点击右上角的
更多
图标(三点图标)并选择 CA 证书. - 再次点击右上角的
更多
图标. 选择 进口证书. - 在下载文件夹中浏览 CA 证书文件并选择将其导入应用程序。
现在证书已被导入到 StrongSwan 应用程序中,您可以通过以下步骤配置 VPN 连接:
- 在应用程序中,点击 ADD VPN PROFILE在顶部。
- 填写您的 VPN 服务器的域名或公共 IP 地址的 服务器。
- 确保 **IKEv2 EAP (用户名/密码)**被选为 VPN 类型。
- 填写您在服务器上定义的 用户名和 密码的凭证。
- 在 CA 证书部分中删除 自动选择,然后点击 选择 CA 证书。
- 点击屏幕顶部的 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)。