介绍
虚拟专用网络或VPN允许您在通过不受信任的网络(例如咖啡店,会议或机场)时对流量进行安全加密。
IKEv2或Internet密钥交换v2是允许在服务器和客户端之间的直接IPSec隧道的协议。 在IKEv2 VPN实施中,IPSec为网络流量提供加密。 IKEv2在新平台(OS X 10.11+,iOS 9.1+和Windows 10)上自然支持,无需其他应用程序,它可以非常顺利地处理客户端打嗝。
在本教程中,您将在Ubuntu 16.04服务器上使用StrongSwan设置IKEv2 VPN服务器,并从Windows,iOS和macOS客户端连接到该服务器。
先决条件
要完成本教程,您需要:
- 一个具有多个CPU的Ubuntu 16.04服务器, 按照Ubuntu 16.04初始服务器设置指南进行配置 ,包括sudo非root用户和防火墙。
此外,您应该熟悉IPTables。 在继续之前,回顾Iptables防火墙的工作原理 。
第1步 - 安装StrongSwan
首先,我们将安装StrongSwan,一个开源的IPSec守护进程,我们将配置为我们的VPN服务器。 我们还将安装StrongSwan EAP插件,它允许客户端的密码身份验证,而不是基于证书的身份验证。 我们需要创建一些特殊的防火墙规则作为配置的一部分,所以我们还将安装一个实用工具,让我们使新的防火墙规则持久化。
执行以下命令安装这些组件:
sudo apt-get install strongswan strongswan-plugin-eap-mschapv2 moreutils iptables-persistent
注意 :在安装iptables-persistent
时,安装程序将询问是否保存当前的IPv4和IPv6规则。 由于我们希望任何以前的防火墙配置保持不变,我们将在两个提示中选择yes。
现在,一切安装,让我们继续创建我们的证书:
第2步 - 创建证书颁发机构
IKEv2服务器需要一个证书来向客户端标识自己。 为了帮助我们创建所需的证书,StrongSwan附带了一个用于生成证书颁发机构和服务器证书的实用程序。 首先,让我们创建一个目录来存储我们将要处理的所有内容。
mkdir vpn-certs
cd vpn-certs
现在我们有一个目录来存储一切,让我们生成我们的根键。 这将是一个4096位的RSA密钥,将用于签署我们的根证书颁发机构,所以非常重要的是,我们也通过确保只有root用户可以读取它来保护这个密钥。
执行这些命令以生成和保护密钥:
ipsec pki --gen --type rsa --size 4096 --outform pem > server-root-key.pem
chmod 600 server-root-key.pem
现在我们有一个键,我们可以继续创建我们的根证书颁发机构,使用密钥签署根证书:
ipsec pki --self --ca --lifetime 3650 \
--in server-root-key.pem \
--type rsa --dn "C=US, O=VPN Server, CN=VPN Server Root CA" \
--outform pem > server-root-ca.pem
您可以将专有名称 (DN)值(例如国家/地区,组织和公用名称)更改为其他值(如果需要)。 这里的通用名称只是指标,所以你甚至可以做一些事情。
稍后,我们将根证书( server-root-ca.pem
)复制到我们的客户端设备,以便他们在连接时验证服务器的真实性。
现在,我们的根证书颁发机构启动并运行,我们可以创建VPN服务器将使用的证书。
第3步 - 为VPN Cerver生成证书
我们现在将为VPN服务器创建一个证书和密钥。 此证书将允许客户端验证服务器的真实性。
首先,使用以下命令为VPN服务器创建私钥:
ipsec pki --gen --type rsa --size 4096 --outform pem > vpn-server-key.pem
然后使用您在上一步中创建的证书颁发机构的密钥创建并签名VPN服务器证书。 执行以下命令,但将公用名称(CN)和主题备用名称(SAN)字段更改为VPN服务器的DNS名称或IP地址:
ipsec pki --pub --in vpn-server-key.pem \
--type rsa | ipsec pki --issue --lifetime 1825 \
--cacert server-root-ca.pem \
--cakey server-root-key.pem \
--dn "C=US, O=VPN Server, CN=server_name_or_ip" \
--san server_name_or_ip \
--flag serverAuth --flag ikeIntermediate \
--outform pem > vpn-server-cert.pem
将证书复制到将允许StrongSwan读取证书的路径:
sudo cp ./vpn-server-cert.pem /etc/ipsec.d/certs/vpn-server-cert.pem
sudo cp ./vpn-server-key.pem /etc/ipsec.d/private/vpn-server-key.pem
最后,确保密钥,以便它们只能由root用户读取。
sudo chown root /etc/ipsec.d/private/vpn-server-key.pem
sudo chgrp root /etc/ipsec.d/private/vpn-server-key.pem
sudo chmod 600 /etc/ipsec.d/private/vpn-server-key.pem
在此步骤中,我们创建了一个证书对,用于保护客户端和服务器之间的通信。 我们还使用我们的根密钥签署了证书,因此客户端将能够验证VPN服务器的真实性。 现在我们已准备好所有证书,我们将继续配置软件。
第4步 - 配置StrongSwan
我们已经创建了所有我们需要的证书,因此是时候配置StrongSwan本身了。
StrongSwan有一个默认配置文件,但在我们进行任何更改之前,让我们先备份它,以便我们有一个参考文件,以防万一出现问题:
sudo cp /etc/ipsec.conf /etc/ipsec.conf.original
示例文件相当长,为了防止配置错误,我们将清除默认配置文件,并从头开始编写自己的配置。 首先,清除原来的配置:
echo '' | sudo tee /etc/ipsec.conf
然后在文本编辑器中打开文件:
sudo nano /etc/ipsec.conf
首先,我们将告诉StrongSwan将守护程序状态记录下来,以便进行调试并允许重复连接。 将以下行添加到文件:
config setup
charondebug="ike 1, knl 1, cfg 0"
uniqueids=no
然后,我们将为我们的VPN创建一个配置部分。 我们还将告诉StrongSwan创建IKEv2 VPN隧道,并在启动时自动加载此配置节。 将以下行附加到文件:
conn ikev2-vpn
auto=add
compress=no
type=tunnel
keyexchange=ikev2
fragmentation=yes
forceencaps=yes
接下来,我们将告诉StrongSwan哪些加密算法用于VPN。 附加以下行:
ike=aes256-sha1-modp1024,3des-sha1-modp1024!
esp=aes256-sha1,3des-sha1!
我们还将配置死对等体检测以清除任何“悬挂”连接,以防客户端意外断开连接。 添加以下行:
dpdaction=clear
dpddelay=300s
rekey=no
然后我们将配置服务器(左侧)IPSec参数。 将其添加到文件:
left=%any
leftid=@server_name_or_ip
leftcert=/etc/ipsec.d/certs/vpn-server-cert.pem
leftsendcert=always
leftsubnet=0.0.0.0/0
注意 :配置服务器ID( leftid
)时,如果您的VPN服务器将由域名标识,则只包括@
字符:
leftid=@vpn.example.com
如果服务器将通过其IP地址标识,只需将IP地址放入:
leftid=111.111.111.111
然后我们配置客户端(右侧)IPSec参数,如要使用的私有IP地址范围和DNS服务器:
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在客户端连接时要求客户端提供用户凭据:
eap_identity=%identity
配置文件应如下所示:
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
ike=aes256-sha1-modp1024,3des-sha1-modp1024!
esp=aes256-sha1,3des-sha1!
dpdaction=clear
dpddelay=300s
rekey=no
left=%any
leftid=@server_name_or_ip
leftcert=/etc/ipsec.d/certs/vpn-server-cert.pem
leftsendcert=always
leftsubnet=0.0.0.0/0
right=%any
rightid=%any
rightauth=eap-mschapv2
rightdns=8.8.8.8,8.8.4.4
rightsourceip=10.10.10.0/24
rightsendcert=never
eap_identity=%identity
保存并关闭文件后,您已验证您已配置如图所示。
现在我们已经配置了VPN参数,让我们继续创建一个帐户,以便我们的用户可以连接到服务器。
第5步 - 配置VPN验证
我们的VPN服务器现在配置为接受客户端连接,但是我们没有配置任何凭据,因此我们需要在一个名为ipsec.secrets
的特殊配置文件中ipsec.secrets
一些东西:
- 我们需要告诉StrongSwan在哪里找到我们的服务器证书的私钥,以便服务器能够加密和解密数据。
- 我们还需要设置一个允许连接到VPN的用户列表。
让我们打开secret文件进行编辑:
sudo nano /etc/ipsec.secrets
首先,我们将告诉StrongSwan在哪里找到我们的私钥。
server_name_or_ip : RSA "/etc/ipsec.d/private/vpn-server-key.pem"
然后我们将创建用户凭据。 您可以组成任何您喜欢的用户名或密码组合,但我们必须告诉StrongSwan允许此用户从任何地方连接:
your_username %any% : EAP "your_password"
保存并关闭文件。 现在我们已经完成了VPN参数的工作,我们将重新加载VPN服务,以便应用我们的配置:
sudo ipsec reload
现在VPN服务器已经完全配置了服务器选项和用户凭证,现在是时候进行配置最重要的部分:防火墙。
第6步 - 配置防火墙和内核IP转发
现在我们已经配置了VPN服务器,我们需要配置防火墙转发和允许VPN流量通过。 我们将使用IPTables。
首先,如果您设置了它,请禁用UFW,因为它可能与我们需要配置的规则冲突:
sudo ufw disable
然后删除由UFW创建的任何剩余的防火墙规则:
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -F
iptables -Z
为了防止我们被锁定在SSH会话之外,我们将接受已经被接受的连接。 我们还将打开端口22
(或您配置的任何端口)以便将来SSH连接到服务器。 执行这些命令:
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
我们还需要接受本地环回接口上的连接:
sudo iptables -A INPUT -i lo -j ACCEPT
然后我们将告诉IPTables接受IPSec连接:
sudo iptables -A INPUT -p udp --dport 500 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 4500 -j ACCEPT
接下来,我们将告诉IPTables转发ESP (封装安全有效载荷)流量,以便VPN客户端能够连接。 ESP为我们的VPN数据包提供了额外的安全性,因为它们遍历不受信任的网络:
sudo iptables -A FORWARD --match policy --pol ipsec --dir in --proto esp -s 10.10.10.10/24 -j ACCEPT
sudo iptables -A FORWARD --match policy --pol ipsec --dir out --proto esp -d 10.10.10.10/24 -j ACCEPT
我们的VPN服务器将作为VPN客户端和互联网之间的网关。 由于VPN服务器将只有一个公共IP地址,我们将需要配置伪装,以允许服务器代表客户端从互联网请求数据; 这将允许流量从VPN客户端流到互联网,反之亦然:
sudo iptables -t nat -A POSTROUTING -s 10.10.10.10/24 -o eth0 -m policy --pol ipsec --dir out -j ACCEPT
sudo iptables -t nat -A POSTROUTING -s 10.10.10.10/24 -o eth0 -j MASQUERADE
为了防止一些客户端上的IP分片分片,我们将告诉IPTables通过调整分组的最大分段大小来减小分组的大小。 这可以防止某些VPN客户端出现问题。
sudo 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
为了更好的安全性,我们会丢弃与我们配置的规则不匹配的所有其他内容:
sudo iptables -A INPUT -j DROP
sudo iptables -A FORWARD -j DROP
现在我们将使防火墙配置持久化,以便所有配置工作不会在重新启动时被擦除:
sudo netfilter-persistent save
sudo netfilter-persistent reload
最后,我们将在服务器上启用数据包转发。 数据包转发使我们的服务器能够将数据从一个IP地址“路由”到另一个。 基本上,我们使我们的服务器像路由器。
编辑文件/etc/sysctl.conf
:
sudo nano /etc/sysctl.conf
我们需要在这里配置一些东西:
- 首先,我们将启用IPv4数据包转发。
- 我们将禁用路径MTU发现以防止数据包分段问题。
- 我们也不会接受ICMP重定向,也不会发送ICMP重定向来防止中间人攻击。
您需要对文件所做的更改在以下代码中突出显示:
. . .
# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1
. . .
# Do not accept ICMP redirects (prevent MITM attacks)
net.ipv4.conf.all.accept_redirects = 0
# Do not send ICMP redirects (we are not a router)
net.ipv4.conf.all.send_redirects = 0
. . .
net.ipv4.ip_no_pmtu_disc = 1
进行这些更改,保存文件,然后退出编辑器。 然后重新启动服务器:
sudo reboot
您将在重新启动时断开与服务器的连接,但这是预期的。 服务器重新启动后,以sudo非root用户身份登录服务器。 您已准备好测试客户端上的连接。
第7步 - 在Windows,iOS和macOS上测试VPN连接
现在你有一切设置,是时候尝试了。 首先,您需要复制创建的根证书,并将其安装在将连接到VPN的客户端设备上。 最简单的方法是登录到您的服务器并执行此命令以显示证书文件的内容:
cat ~/vpn-certs/server-root-ca.pem
您将看到类似于以下的输出:
Output-----BEGIN CERTIFICATE-----
MIIFQjCCAyqgAwIBAgIIFkQGvkH4ej0wDQYJKoZIhvcNAQEMBQAwPzELMAkGA1UE
. . .
EwbVLOXcNduWK2TPbk/+82GRMtjftran6hKbpKGghBVDPVFGFT6Z0OfubpkQ9RsQ
BayqOb/Q
-----END CERTIFICATE-----
将此输出复制到您的计算机,包括-----BEGIN CERTIFICATE-----
和-----END CERTIFICATE-----
行,并将其保存到具有可识别名称的文件,例如vpn_root_certificate.pem
。 确保您创建的文件具有.pem
扩展名。
或者, 使用SFTP将文件传输到计算机 。
将vpn_root_certificate.pem
文件下载到计算机后,可以设置与VPN的连接。
从Windows连接
首先,通过执行以下步骤导入根证书:
- 按
WINDOWS+R
调出运行对话框,然后输入mmc.exe
启动Windows管理控制台。 - 从文件菜单中,导航到添加或删除管理单元 ,从可用管理单元列表中选择证书 ,然后单击添加 。
- 我们希望VPN与任何用户一起使用,因此选择计算机帐户 ,然后单击下一步 。
- 我们正在本地计算机上配置内容,因此选择本地计算机 ,然后单击完成 。
在“ 控制台根节点 ”下,展开“ 证书(本地计算机)”条目,展开“受信任的根证书颁发机构” ,然后选择“ 证书”条目:
从操作菜单中,选择所有任务 ,然后单击导入以显示证书导入向导。 单击下一步以移动介绍。
在“要导入的文件”屏幕上,按浏览按钮,然后选择已保存的证书文件。 然后单击下一步 。
确保证书存储设置为“ 受信任的根证书颁发机构” ,然后单击“ 下一步” 。
单击“完成”导入证书。
然后通过以下步骤配置VPN:
- 启动控制面板 ,然后导航到网络和共享中心 。
- 单击设置新连接或网络 ,然后选择连接到工作区 。
- 选择使用我的Internet连接(VPN) 。
- 输入VPN服务器详细信息。 在Internet地址字段中输入服务器的域名或IP地址,然后在目标名称中填写描述您的VPN连接的内容。 然后单击完成 。
您的新VPN连接将显示在网络列表下。 选择VPN,然后单击连接 。 系统将提示您输入用户名和密码。 键入它们,单击确定 ,您将被连接。
从iOS连接
要在iOS设备上配置VPN连接,请按照下列步骤操作:
- 向您发送附有根证书的电子邮件。
- 打开您的iOS设备上的电子邮件,然后点击附加的证书文件,然后点击安装并输入您的密码。 安装完成后 ,点击完成 。
- 转到设置 , 常规 , VPN ,然后点击添加VPN配置 。 这将打开VPN连接配置屏幕。
- 点击类型并选择IKEv2 。
- 在描述字段中,输入VPN连接的短名称。 这可以是任何你喜欢的。
- 在“ 服务器和远程ID”字段中,输入服务器的域名或IP地址。 本地ID字段可以留空。
- 在“ 身份验证”部分中输入用户名和密码,然后点击完成 。
- 选择您刚刚创建的VPN连接,点击页面顶部的开关,您将被连接。
从macOS连接
请按照以下步骤导入证书:
- 双击证书文件。 Keychain Access将弹出一个对话框,说“钥匙串访问正在尝试修改系统钥匙串。输入您的密码以允许。
- 输入您的密码,然后单击修改钥匙串
- 双击新导入的VPN证书。 这将打开一个小属性窗口,您可以在其中指定信任级别。 将IP安全(IPSec)设置为始终信任 ,并且将再次提示您输入密码。 此设置在输入密码后自动保存。
现在证书是重要和可信的,配置VPN连接与这些步骤:
- 转到系统偏好设置并选择网络 。
- 点击网络列表左下方的小“加号”按钮。
- 在出现的弹出窗口中,将接口设置为VPN ,将VPN类型设置为IKEv2 ,并为连接提供名称。
- 在“ 服务器和远程ID”字段中,输入服务器的域名或IP地址。 将本地ID留空。
- 单击认证设置 ,选择用户名 ,并输入您为您的VPN用户配置的用户名和密码。 然后单击“确定” 。
最后,点击Connect连接到VPN。 您现在应该连接到VPN。
连接疑难解答
如果无法导入证书,请确保文件具有.pem
扩展名,而不是.pem.txt
。
如果无法连接到VPN,请检查您使用的服务器名称或IP地址。 服务器的域名或IP地址必须与创建证书时配置为公用名(CN)的名称相匹配。 如果它们不匹配,VPN连接将不工作。 如果您使用vpn.example.com的CN设置vpn.example.com
,则在输入VPN服务器详细信息时必须使用vpn.example.com
。 仔细检查用于生成证书的命令以及创建VPN连接时使用的值。
最后,仔细检查VPN配置,以确保如果您使用域名, leftid
值配置了@
符号:
leftid=@vpn.example.com
如果您使用的是IP地址,请确保省略@
符号。
结论
在本教程中,您构建了一个使用IKEv2协议的VPN服务器。 现在你可以放心,无论你在哪里,你的在线活动将保持安全!
要添加或删除用户,只需再次查看第5步。 每行代表一个用户,因此添加或删除用户与编辑文件一样简单。
从这里,您可能想要查看设置日志文件分析器,因为StrongSwan将其日志转储到syslog中。 本教程如何在VPS上安装和使用Logwatch Log Analyzer和Reporter有关设置的更多信息。
您也可能对EFF关于在线隐私的指南感兴趣 。