如何在Ubuntu 18.04上使用StrongSwan设置IKEv2 VPN服务器

虚拟专用网络(VPN)允许您在通过不受信任的网络(例如咖啡店,会议或机场的网络)时安全地加密流量。 IKEv2,或Internet Key Exchange v2,是...

介绍

虚拟专用网络(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客户端连接到该服务器。

先决条件

要完成本教程,您需要:

第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记录守护程序状态以进行调试并允许重复连接。 将这些行添加到文件中:

/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 OpenVPN
sudo ufw enable

现在,添加规则以允许UDP流量到标准IPSec端口500和4500:

sudo ufw allow 500,4500/udp

接下来,我们将打开一个UFW的配置文件,为路由和转发IPSec数据包添加一些低级策略。 在我们开始之前,我们需要找到服务器上的哪个网络接口用于Internet访问。 通过查询与默认路由关联的接口,我们可以找到:

ip route | grep default

您的公共界面应该使用“dev”一词。 例如,此结果显示名为eth0的接口,其突出显示如下:

default 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 (Encapsulating Security Payload)流量,以便VPN客户端能够连接。 ESP为我们的VPN数据包提供了额外的安全性,因为它们正在遍历不受信任的网络。

完成后,保存并关闭文件。

在我们重新启动防火墙之前,我们将更改一些网络内核参数以允许从一个接口路由到另一个接口。 打开UFW的内核参数配置文件:

sudo nano /etc/ufw/sysctl.conf

我们需要在这里配置一些东西:

  • 首先,我们将启用IPv4数据包转发。
  • 我们将禁用路径MTU发现以防止数据包碎片问题。
  • 我们也不会接受ICMP重定向,也不会发送ICMP重定向来防止中间人攻击。

您需要对文件所做的更改在以下代码中突出显示:

/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

您将看到类似于此的输出:

-----BEGIN CERTIFICATE-----
MIIFQjCCAyqgAwIBAgIIFkQGvkH4ej0wDQYJKoZIhvcNAQEMBQAwPzELMAkGA1UE

. . .

EwbVLOXcNduWK2TPbk/+82GRMtjftran6hKbpKGghBVDPVFGFT6Z0OfubpkQ9RsQ
BayqOb/Q
-----END CERTIFICATE-----

将此输出复制到您的计算机,包括-----BEGIN CERTIFICATE----------END CERTIFICATE-----行,并将其保存到具有可识别名称的文件中,例如ca-cert.pem 确保您创建的文件具有.pem扩展名。

或者, 使用SFTP将文件传输到您的计算机

ca-cert.pem文件下载到计算机后,即可设置与VPN的连接。

从Windows连接

首先,按照以下步骤导入根证书:

  1. WINDOWS+R打开“ 运行”对话框,然后输入mmc.exe以启动Windows管理控制台。
  2. 从“ 文件”菜单中,导航到“ 添加或删除管理单元” ,从可用管理单元列表中选择“ 证书 ”,然后单击“ 添加”
  3. 我们希望VPN可以与任何用户一起使用,因此选择“ 计算机帐户”并单击“ 下一步”
  4. 我们在本地计算机上配置内容,因此选择“ 本地计算机” ,然后单击“ 完成”
  5. Console Root节点下,展开Certificates(Local Computer)条目,展开Trusted Root Certification Authorities ,然后选择Certificates条目:
    证书视图

  6. 从“ 操作”菜单中,选择“ 所有任务”并单击“ 导入”以显示“证书导入向导”。 单击“ 下一步”以移过介绍。

  7. 在“ 要导入文件”屏幕上,按“ 浏览”按钮,然后选择已保存的证书文件。 然后单击下一步

  8. 确保将“ 证书存储”设置为“ 受信任的根证书颁发机构” ,然后单击“ 下一步”

  9. 单击“ 完成”以导入证书。

然后使用以下步骤配置VPN:

  1. 启动“ 控制面板” ,然后导航到“ 网络和共享中心”
  2. 单击“ 设置新连接或网络” ,然后选择“ 连接到工作区”
  3. 选择使用我的Internet连接(VPN)
  4. 输入VPN服务器详细信息。 Internet地址字段中输入服务器的域名或IP地址,然后使用描述VPN连接的内容填写目标名称 然后单击“完成”

您的新VPN连接将显示在网络列表下。 选择VPN,然后单击“ 连接” 系统将提示您输入用户名和密码。 输入它们,单击“ 确定” ,即可连接。

从macOS连接

请按照以下步骤导入证书:

  1. 双击证书文件。 Keychain Access将弹出一个对话框,显示“Keychain Access正在尝试修改系统密钥链。请输入密码以允许此操作。”
  2. 输入您的密码,然后单击“ 修改钥匙串”
  3. 双击新导入的VPN证书。 这会打开一个小属性窗口,您可以在其中指定信任级别。 IP安全(IPSec)设置始终信任 ,系统将再次提示您输入密码。 输入密码后,此设置会自动保存。

既然证书很重要且值得信任,请使用以下步骤配置VPN连接:

  1. 转到系统偏好设置,然后选择网络
  2. 单击网络列表左下方的小“加号”按钮。
  3. 在出现的弹出窗口中,将Interface Interface设置为VPN ,将VPN Type设置为IKEv2 ,并为连接命名。
  4. 在“ 服务器远程ID”字段中,输入服务器的域名或IP地址。 本地ID留空。
  5. 单击“ 身份验证设置” ,选择“ 用户名” ,然后输入您为VPN用户配置的用户名和密码。 然后单击确定

最后,单击“ 连接”以连接到VPN。 您现在应该连接到VPN。

从Ubuntu连接

要从Ubuntu计算机进行连接,您可以设置和管理StrongSwan作为服务,或者每次要连接时使用一次性命令。 两者均提供说明。

管理StrongSwan即服务

  1. 更新本地包缓存: sudo apt update
  2. 安装StrongSwan和相关软件sudo apt install strongswan libcharon-extra-plugins
  3. 将CA证书复制到/etc/ipsec.d/cacerts目录: sudo cp /tmp/ca-cert.pem /etc/ipsec.d/cacerts
  4. 禁用StrongSwan以便VPN不会自动启动: sudo systemctl disable --now strongswan
  5. /etc/ipsec.secrets文件中配置您的VPN用户名和密码: your_username : EAP "your_password"
  6. 编辑/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

使用简单客户端进行一次性连接

  1. 更新本地包缓存: sudo apt update
  2. 安装charon-cmd及相关软件sudo apt install charon-cmd libcharon-extra-plugins
  3. 移至复制CA证书的目录: cd <^>/path/to/ca-cert.pem
  4. 使用服务器的CA证书,VPN服务器的IP地址以及您配置的用户名使用charon-cmd连接到VPN服务器: sudo charon-cmd --cert ca-cert.pem --host vpn_domain_or_IP --identity your_username
  5. 出现提示时,提供VPN用户的密码。

您现在应该连接到VPN。 要断开连接,请按CTRL+C并等待连接关闭。

从iOS连接

要在iOS设备上配置VPN连接,请按照下列步骤操作:

  1. 给自己发送附有根证书的电子邮件。
  2. 打开iOS设备上的电子邮件,然后点击附加的证书文件,然后点击安装并输入您的密码。 安装完成后 ,点按“完成”
  3. 转到设置常规VPN,然后点击添加VPN配置 这将打开VPN连接配置屏幕。
  4. 点击Type并选择IKEv2
  5. 在“ 描述”字段中,输入VPN连接的短名称。 这可能是你喜欢的任何东西。
  6. 在“ 服务器远程ID”字段中,输入服务器的域名或IP地址。 本地ID”字段可以留空。
  7. 在“ 身份验证”部分输入您的用户名和密码,然后点击“完成”
  8. 选择刚刚创建的VPN连接,点击页面顶部的开关,即可连接。

从Android连接

请按照以下步骤导入证书:

  1. 发送附有CA证书的电子邮件。 将CA证书保存到下载文件夹。
  2. 从Play商店下载StrongSwan VPN客户端
  3. 打开应用程序。 点击右上角的“更多”图标 (三个点图标),然后选择CA证书
  4. 再次点击右上角的“更多”图标 选择导入证书
  5. 浏览到下载文件夹中的CA证书文件,然后选择它以将其导入应用程序。

现在证书已导入StrongSwan应用程序,您可以使用以下步骤配置VPN连接:

  1. 在应用程序中,点击顶部的ADD VPN PROFILE
  2. 使用您的VPN服务器的域名或公共IP地址填写服务器。
  3. 确保选择IKEv2 EAP(用户名/密码)作为VPN类型。
  4. 使用您在服务器上定义的凭据填写用户名密码
  5. 取消选择CA证书”部分中的“ 自动 选择” ,然后单击“ 选择CA证书”
  6. 点击屏幕顶部的IMPORTED选项卡,选择您导入的CA(如果您之前未更改“DN”,则将其命名为“VPN root CA”)。
  7. 如果您愿意,请使用更具描述性的名称填写个人资料名称(可选)

如果要连接到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关于在线隐私的本指南感兴趣。