介绍
虚拟专用网络(VPN)允许您在通过不受信任的网络(例如咖啡店,会议或机场的网络)时安全地加密流量。
IKEv2或Internet Key Exchange 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 600 ~/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记录守护程序状态以进行调试并允许重复连接。 将这些行添加到文件中:
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
我们还将配置死对等检测以清除任何“悬空”连接,以防客户端意外断开连接。 添加以下行:
. . .
conn ikev2-vpn
. . .
dpdaction=clear
dpddelay=300s
rekey=no
然后,我们将配置服务器(左)侧IPSec参数。 将其添加到文件中:
. . .
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服务器:
. . .
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在连接时询问客户端的用户凭据:
. . .
conn ikev2-vpn
. . .
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
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在哪里可以找到我们的私钥:
: RSA "server-key.pem"
然后,我们将定义用户凭据。 您可以组成您喜欢的任何用户名或密码组合:
your_username : EAP "your_password"
保存并关闭文件。 现在我们已经完成了VPN参数的使用,我们将重新启动VPN服务,以便应用我们的配置:
sudo systemctl restart strongswan
现在VPN服务器已完全配置了服务器选项和用户凭据,现在是时候继续配置最重要的部分:防火墙。
第6步 - 配置防火墙和内核IP转发
在StrongSwan配置完成后,我们需要配置防火墙以转发并允许VPN流量通过。
如果您遵循先决条件教程,则应启用非常基本的UFW防火墙。 如果您尚未配置UFW,则可以通过键入以下内容来创建基准配置并启用它:
sudo ufw allow OpenVPN
sudo ufw enable
现在,添加规则以允许UDP流量到标准IPSec端口500和4500:
sudo ufw allow 500,4500/udp
接下来,我们将打开一个UFW的配置文件,为路由和转发IPSec数据包添加一些低级策略。 在我们开始之前,我们需要找到服务器上的哪个网络接口用于Internet访问。 通过查询与默认路由关联的接口,我们可以找到:
ip route | grep default
您的公共界面应该使用“dev”一词。 例如,此结果显示名为eth0
的接口,其突出显示如下:
Outputdefault via 203.0.113.7 dev eth0 proto static
当您拥有公共网络接口时,在文本编辑器中打开/etc/ufw/before.rules
文件:
sudo nano /etc/ufw/before.rules
在文件顶部附近(在*filter
行之前),添加以下配置块:
*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
和链定义行之后,再添加一个配置块:
. . .
*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 (Encapsulating Security Payload)流量,以便VPN客户端能够连接。 ESP为我们的VPN数据包提供了额外的安全性,因为它们正在遍历不受信任的网络。
完成后,保存并关闭文件。
在我们重新启动防火墙之前,我们将更改一些网络内核参数以允许从一个接口路由到另一个接口。 打开UFW的内核参数配置文件:
sudo nano /etc/ufw/sysctl.conf
我们需要在这里配置一些东西:
- 首先,我们将启用IPv4数据包转发。
- 我们将禁用路径MTU发现以防止数据包碎片问题。
- 我们也不会接受ICMP重定向,也不会发送ICMP重定向来防止中间人攻击。
您需要对文件所做的更改在以下代码中突出显示:
. . .
# 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
扩展名。
或者, 使用SFTP将文件传输到您的计算机 。
将ca-cert.pem
文件下载到计算机后,即可设置与VPN的连接。
从Windows连接
首先,按照以下步骤导入根证书:
- 按
WINDOWS+R
打开“ 运行”对话框,然后输入mmc.exe
以启动Windows管理控制台。 - 从“ 文件”菜单中,导航到“ 添加或删除管理单元” ,从可用管理单元列表中选择“ 证书 ”,然后单击“ 添加” 。
- 我们希望VPN可以与任何用户一起使用,因此选择“ 计算机帐户”并单击“ 下一步”
- 我们在本地计算机上配置内容,因此选择“ 本地计算机” ,然后单击“ 完成” 。
在Console Root节点下,展开Certificates(Local Computer)条目,展开Trusted Root Certification Authorities ,然后选择Certificates条目:
从“ 操作”菜单中,选择“ 所有任务”并单击“ 导入”以显示“证书导入向导”。 单击“ 下一步”以移过介绍。
在“ 要导入的文件”屏幕上,按“ 浏览”按钮,然后选择已保存的证书文件。 然后单击下一步 。
确保将“ 证书存储”设置为“ 受信任的根证书颁发机构” ,然后单击“ 下一步” 。
单击“ 完成”以导入证书。
然后使用以下步骤配置VPN:
- 启动“ 控制面板” ,然后导航到“ 网络和共享中心” 。
- 单击“ 设置新连接或网络” ,然后选择“ 连接到工作区” 。
- 选择使用我的Internet连接(VPN) 。
- 输入VPN服务器详细信息。 在Internet地址字段中输入服务器的域名或IP地址,然后使用描述VPN连接的内容填写目标名称 。 然后单击“完成” 。
您的新VPN连接将显示在网络列表下。 选择VPN,然后单击“ 连接” 。 系统将提示您输入用户名和密码。 输入它们,单击“ 确定” ,即可连接。
从macOS连接
请按照以下步骤导入证书:
- 双击证书文件。 Keychain Access将弹出一个对话框,显示“Keychain Access正在尝试修改系统密钥链。请输入密码以允许此操作。”
- 输入您的密码,然后单击“ 修改钥匙串”
- 双击新导入的VPN证书。 这会打开一个小属性窗口,您可以在其中指定信任级别。 将IP安全(IPSec)设置为始终信任 ,系统将再次提示您输入密码。 输入密码后,此设置会自动保存。
既然证书很重要且值得信任,请使用以下步骤配置VPN连接:
- 转到系统偏好设置,然后选择网络 。
- 单击网络列表左下方的小“加号”按钮。
- 在出现的弹出窗口中,将Interface Interface设置为VPN ,将VPN Type设置为IKEv2 ,并为连接命名。
- 在“ 服务器和远程ID”字段中,输入服务器的域名或IP地址。 将本地ID留空。
- 单击“ 身份验证设置” ,选择“ 用户名” ,然后输入您为VPN用户配置的用户名和密码。 然后单击确定 。
最后,单击“ 连接”以连接到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
文件以定义配置。
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设备上的电子邮件,然后点击附加的证书文件,然后点击安装并输入您的密码。 安装完成后 ,点按“完成” 。
- 转到设置 , 常规 , VPN,然后点击添加VPN配置 。 这将打开VPN连接配置屏幕。
- 点击Type并选择IKEv2 。
- 在“ 描述”字段中,输入VPN连接的短名称。 这可能是你喜欢的任何东西。
- 在“ 服务器和远程ID”字段中,输入服务器的域名或IP地址。 “ 本地ID”字段可以留空。
- 在“ 身份验证”部分输入您的用户名和密码,然后点击“完成” 。
- 选择刚刚创建的VPN连接,点击页面顶部的开关,即可连接。
从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”)。
- 如果您愿意,请使用更具描述性的名称填写个人资料名称(可选) 。
如果要连接到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中。 如何在VPS上安装和使用Logwatch Log Analyzer和Reporter教程提供了有关设置它的更多信息。
您可能也对EFF关于在线隐私的本指南感兴趣。