本页内容

  • 前提条件
  • 第 1 步 - 配置网络与防火墙
  • 第 2 步 - 安装 SSL
  • 第 3 步 - 安装 strongSwan
  • 第 4 步 - 通过 Windows 连接
  • 第 5 步 - 通过 macOS 连接
  • 第 6 步 - 通过 Android 连接
  • 第 7 步 - 通过 iOS 连接
  • 结语

如果你正在寻找客户端到站点的 VPN 方案,那么你可能会更倾向于选择 IKEv2 EAP 方案,而非 OpenVPN 或 Wireguard。如果你经常在外奔波,且需要一种无需下载客户端或密钥便能轻松连接的 VPN 方案,这种方案会非常有用。strongSwan 是一款开源的跨平台基于 IPsec 的 VPN,在此类场景下能派上用场。它可以提供基于 X.509 证书的身份验证,或是安全的 IKEv2 EAP 用户身份验证。

在本教程中,你将学习如何在 Rocky Linux 9 服务器上,使用 strongSwan 配合 EAP-MSCHAPv2 身份验证以及 Let's Encrypt SSL 证书来搭建 IKEv2 IPSec VPN。你还将学习如何使用 Windows、macOS、Linux 和 Android 客户端连接到该 VPN。

前提条件

  • 一台运行 Rocky Linux 9 的服务器。根据你连接的用户数量,你可能需要升级服务器的配置。
  • 一个具有 sudo 权限的非 root 用户。
  • 一个完整的域名(FQDN),例如 vpn.example.com。
  • 确保所有内容都已更新。$ sudo dnf update
  • 系统需要安装的一些软件包。$ sudo dnf install wget curl nano unzip yum-utils -y 其中部分软件包可能已安装在你的系统中。

一台运行 Rocky Linux 9 的服务器。根据你连接的用户数量,你可能需要升级服务器的配置。

一个具有 sudo 权限的非 root 用户。

一个完整的域名(FQDN),例如 vpn.example.com。

确保所有内容都已更新。

$ sudo dnf update

系统需要安装的一些软件包。

$ sudo dnf install wget curl nano unzip yum-utils -y

其中部分软件包可能已安装在你的系统中。

第 1 步 - 配置网络与防火墙

在内核选项中启用 IP 数据包转发。

$ echo "net.ipv4.ip_forward=1" | sudo tee /etc/sysctl.conf
$ sudo sysctl -p 

将 IPsec 服务添加到 Firewalld 防火墙。

$ sudo firewall-cmd --permanent --add-service=ipsec

我们还需要 HTTP 和 HTTPS 端口正常工作,将其开放。

$ sudo firewall-cmd --permanent --add-service=http
$ sudo firewall-cmd --permanent --add-service=https

允许 NAT 数据包转发,即 IP 伪装(IP masquerade)。

$ sudo firewall-cmd --permanent --add-masquerade

重新加载防火墙以使更改生效。

$ sudo firewall-cmd --reload

第 2 步 - 安装 SSL

我们需要安装 Certbot 来生成 SSL 证书。

我们将使用 Snapd 软件包安装器来完成。由于 Rocky Linux 默认未附带它,因此需要安装 Snapd 安装器。它需要 EPEL 软件仓库才能正常工作。

$ sudo dnf install -y epel-release

安装 Snapd。

$ sudo dnf install -y snapd

启用并启动 Snap 服务。

$ sudo systemctl enable snapd --now

安装 Snap core 软件包,并确保你的 Snapd 版本是最新的。

$ sudo snap install core && sudo snap refresh core

为 Snapd 创建必要的链接。

$ sudo ln -s /var/lib/snapd/snap /snap
$ echo 'export PATH=$PATH:/var/lib/snapd/snap/bin' | sudo tee -a /etc/profile.d/snapd.sh

执行以下命令来安装 Certbot。

$ sudo snap install --classic certbot

使用以下命令,通过创建到 /usr/bin 目录的符号链接,确保 Certbot 命令可以运行。

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

验证安装。

$ certbot --version
certbot 2.3.0

运行以下命令来生成 SSL 证书。

$ sudo certbot --key-type rsa certonly --standalone --agree-tos --no-eff-email --preferred-challenges http -m 
[email protected]
 -d vpn.example.com

上述命令会将证书下载到服务器上的 /etc/letsencrypt/live/vpn.example.com 目录。

要检查 SSL 续期是否正常工作,请对该流程进行一次试运行(dry run)。

$ sudo certbot renew --dry-run

如果没有看到任何错误,说明一切就绪。你的证书将自动续期。

第 3 步 - 安装 strongSwan

strongSwan 的安装需要 EPEL 软件仓库,但由于我们已在之前的步骤中安装过,因此可以跳过。使用以下命令安装 strongSwan。

$ sudo dnf install strongswan

在 /etc/strongswan/swanctl 目录中为证书创建符号链接。

$ sudo ln -s /etc/letsencrypt/live/vpn.example.com/fullchain.pem /etc/strongswan/swanctl/x509
$ sudo ln -s /etc/letsencrypt/live/vpn.example.com/privkey.pem /etc/strongswan/swanctl/private
$ sudo ln -s /etc/letsencrypt/live/vpn.example.com/chain.pem /etc/strongswan/swanctl/x509ca

创建一个 strongSwan 配置文件并打开以进行编辑。

$ sudo nano /etc/strongswan/swanctl/conf.d/my_vpn.conf

将以下代码粘贴其中。

connections {
    ikev2-eap-mschapv2 {
        version = 2
        proposals = aes256-sha256-modp4096,aes256-sha256-modp2048,aes256gcm16-sha256-modp1024
        rekey_time = 0s
        pools = pool-ipv4
        fragmentation = yes
        dpd_delay = 30s
        send_cert=always
        unique = never
        local {
            id = vpn.example.com
            certs = fullchain.pem
        }
        remote {
            auth = eap-mschapv2
            eap_id = %any
        }
        children {
            ikev2-eap-mschapv2 {
                local_ts = 0.0.0.0/0
                rekey_time = 0s
                dpd_action = clear
                esp_proposals = aes256-sha256-sha1
            }
        }
    }
}

pools {
    pool-ipv4 {
        addrs = 10.1.1.0/24
        dns = 1.1.1.1, 8.8.8.8
    }
}

secrets {
    eap-User1 {
        id = username1
        secret = "password1"
    }
}

完成后,按 Ctrl + X,并在提示时输入 Y 以保存文件。

如果你希望同时通过 VPN 隧道传输 IPv4 和 IPv6,则需要分配一个 IPv6 地址池、DNS 以及本地子网。请将变量 local_ts、addrs 和 dns 的值替换为以下数值。

local_ts = 0.0.0.0/0,::/0
....
addrs = 10.1.1.0/24,2a00:1450:400c:c05::/112
dns = 8.8.8.8,2001:4860:4860::8888

禁用 OpenSSL 插件,因为 Rocky Linux 9 上的 OpenSSL 不允许使用 SHA-1 的 RSA 签名,这会导致身份验证失败。

$ sudo sed -i "s/load = yes/load = no/" /etc/strongswan/strongswan.d/charon/openssl.conf

启用并启动 strongSwan 服务。

$ sudo systemctl enable strongswan
$ sudo systemctl start strongswan

第 4 步 - 通过 Windows 连接

打开“设置”应用,选择“网络和 Internet”菜单项。选择“VPN”菜单,然后点击“添加 VPN 连接”按钮。

在 Rocky Linux 9 系统上使用 strongSwan 搭建 IKEv2 加密 VPN 服务

点击“保存”按钮,然后选择你添加的 VPN,并点击“连接”按钮以启动 VPN。

在 Rocky Linux 9 系统上使用 strongSwan 搭建 IKEv2 加密 VPN 服务

第 5 步 - 通过 macOS 连接

打开“系统偏好设置”>>“网络”,点击右上角的加号(+)以添加新服务。

在 Rocky Linux 9 系统上使用 strongSwan 搭建 IKEv2 加密 VPN 服务

选择 VPN 作为接口(Interface),IKEv2 作为 VPN 类型,并为你的服务命名。点击“创建”按钮继续。

在 Rocky Linux 9 系统上使用 strongSwan 搭建 IKEv2 加密 VPN 服务

输入你的域名作为“服务器地址”(Server Address)和“远程 ID”(Remote ID)。将“本地 ID”(Local ID)字段留空。点击“身份验证设置”按钮以打开一个新弹窗。

在 Rocky Linux 9 系统上使用 strongSwan 搭建 IKEv2 加密 VPN 服务

选择“用户名”作为身份验证设置,然后输入之前创建的凭据。点击“好”按钮保存设置。点击底部的“应用”按钮保存设置,然后点击“连接”按钮以连接到 VPN。

在 Rocky Linux 9 系统上使用 strongSwan 搭建 IKEv2 加密 VPN 服务

添加完成后,macOS 会在菜单栏为 VPN 创建一个快捷方式。你可以直接从那里连接到 VPN。

第 6 步 - 通过 Android 连接

打开 Android“设置”>>“网络和 Internet”>>“VPN”菜单。点击屏幕右上角的加号(+)以添加 VPN 配置。

在 Rocky Linux 9 系统上使用 strongSwan 搭建 IKEv2 加密 VPN 服务

为连接命名。选择 IKEv2/IPSec MSCHAPv2 作为 VPN 类型。输入你的域名作为服务器地址。任意填写一个字符串作为 IPSec 标识符(IPSec Identifier)。输入你之前设置的用户名和密码。点击“保存”按钮完成。

选择该连接名称并点击“连接”以开始使用 VPN。

第 7 步 - 通过 iOS 连接

打开 iOS 设置,点击“通用”菜单。点击“VPN”菜单,你将看到如下类似的界面。选择 IKEv2 作为 VPN 类型。

在 Rocky Linux 9 系统上使用 strongSwan 搭建 IKEv2 加密 VPN 服务

为你的 VPN 填写描述。输入你的域名作为“服务器”(Server)和“远程 ID”(Remote ID)字段的值。将“本地 ID”(Local ID)字段留空。选择“用户身份验证”为“用户名”,并输入你的凭据。完成后选择“完成”,然后点击开关以连接到 VPN。

结语

到这里,我们在 Rocky Linux 9 服务器上使用 strongSwan 和 Let's Encrypt SSL 搭建 IKEv2 VPN 的教程就结束了。你还使用多种客户端连接到了该 VPN。如果你有任何问题,请在下方评论中留言。