介绍
虚拟私人网络,或VPN,允许您安全地加密流量,因为它通过不受信任的网络,如咖啡店,会议或机场。
IKEv2,或Internet Key Exchange v2,是一个协议,允许服务器和客户端之间的直接IPsec隧道。在IKEV2VPN实现中,IKEV2为网络流量提供加密。
在本教程中,您将使用 StrongSwan在 Ubuntu 16.04 服务器上设置 IKEv2 VPN 服务器,并从 Windows、iOS 和 macOS 客户端连接到它。
前提条件
要完成本教程,您将需要:
- 一个 Ubuntu 16.04 服务器,具有多个 CPU,配置如下 Ubuntu 16.04 初始服务器设置指南,包括一个 sudo 非 root 用户和防火墙。
此外,你应该熟悉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 连接
首先,按照以下步骤导入根证书:
- 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,您将连接。
从 iOS 连接
要在 iOS 设备上配置 VPN 连接,请遵循以下步骤:
- 发送给自己一封带有根证书的电子邮件.
- 在 iOS 设备上打开电子邮件,然后点击附带的证书文件,然后点击 Install,然后输入您的密码。 安装后,点击 Done.
- 点击 Settings, General, VPN,然后点击 Add VPN Configuration。 这将带来 VPN 连接配置屏幕。
- 点击 Type,选择 IKEv2。
- 在 Description字段中,输入 VPN 连接的简称。 这可能是任何你喜欢的。
- 在 **服务器和 远程 ID字段中,输入
从 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。
连接故障
如果无法导入证书,请确保文件具有.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)。