SD-WAN技术详解之strongswan组件

摘要

strongSwan 是一个跨平台的 IPsec 开源项目,提供了一套完整的 IPsec 实现方案以保证服务端和客户端之间的加密和认证。本文分别介绍了 strongswan 在 Linux 和 Windows 平台的安装方法以及常见问题,并参考官方文档,尝试建立不同机器间的 IPsec 连接。

编译安装

Linux

Linux 系统下编译安装 strongswan 较为简单,本文选择 Debian 系统作为测试系统,首先安装依赖:

1
apt install libudev-dev libsystemd-dev libpam0g-dev build-essential pkg-config

strongswan 的很多密码学算法依赖 OpenSSL 库中的实现,尽管 Linux 平台下通常自带 OpenSSL ,但通常自带的因缺乏一些库而使 strongswan 会编译失败,所以这里还是建议重新编译安装 OpenSSL 最新版本。可以在 openssl 官方项目地址下载对应的源码包,本文选择 openssl-3.2.0-alpha2.tar.gz 版本。在 MSYS2 安装目录下创建 SourceCode 目录,将 openssl-3.2.0-alpha2.tar.gz 解压至 SourceCode 目录下,之后便可以在 MSYS2 命令行中通过 /SourceCode/openssl-3.2.0-alpha2 来访问该目录。 然后进入到 MSYS2 的 UCRT64 命令行环境中的解压目录对 OpenSSL 进行编译安装,整体过程非常简单,只需要按顺序执行以下命令:

1
2
3
./Configure --prefix=/usr/local/openssl
make
make install

安装完成后即可在 /usr/local/openssl 目录下看见对应程序:

https://cdn.jsdelivr.net/gh/wefantasy/FileCloud/img/sd-wan_technology_review_strongswan-2023-10-18-15-59-52.png
安装 openssl

其次,从 strongswan 官网下载源码包并解压,本文选择 strongswan-5.9.11.tar.gz 版本:

1
2
3
wget https://download.strongswan.org/strongswan-5.9.11.tar.gz
tar -xvzf strongswan-5.9.11.tar.gz
cd strongswan-5.9.11

然后,根据所需模板编译源码包并安装至本机:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
CFLAGS="-I/usr/local/openssl/include" \
LDFLAGS="-L/usr/local/openssl/lib64" \
./configure  --enable-eap-identity --enable-eap-md5 --enable-eap-mschapv2 \
--enable-eap-tls --enable-eap-ttls --enable-eap-peap --enable-eap-tnc \
--enable-eap-dynamic --enable-eap-radius --enable-xauth-eap --enable-xauth-pam \
--enable-dhcp  --enable-openssl --enable-addrblock --enable-unity \
--enable-certexpire --enable-radattr --disable-gmp --enable-kernel-libipsec \
--enable-systemd --enable-swanctl --disable-charon --disable-stroke \
--prefix=/usr/local/strongswan --sysconfdir=/etc --with-systemdsystemunitdir=/lib/systemd/system
make
make install

/etc/bash.bashrc 中加入环境变量:

1
2
3
4
5
OPENSSL_HOME=/usr/local/openssl
OPENSSL_PATH=$OPENSSL_HOME/bin:$OPENSSL_HOME/include:$OPENSSL_HOME/lib64
STRONGSWAN_HOME=/usr/local/strongswan
STRONGSWAN_PATH=$STRONGSWAN_HOME/bin:$STRONGSWAN_HOME/lib/bin:$STRONGSWAN_HOME/lib/ipsec:$STRONGSWAN_HOME/sbin
export PATH=$OPENSSL_PATH:$STRONGSWAN_PATH:$PATH

最后,更新环境变量并启动 strongswan 守护进程并查看状态:

1
2
3
4
source /etc/bash.bashrc
systemctl enable strongswan
systemctl start strongswan
swanctl --stat

可自行将/usr/local/strongswan/sbin加入环境变量,如果启动成功则可以看到如下信息:

https://cdn.jsdelivr.net/gh/wefantasy/FileCloud/img/sd-wan_technology_review_strongswan-2023-10-18-17-51-54.png
strongswan 检查

Windows

编译 Windows 版的 strongswan 软件主要有两种方法:在 Linux 系统跨平台编译 Windows 版本、在 Windows 系统集成 Linux 开发环境编译 Windows 版本。经过两天实践发现,前者除了需要跨平台配置 strongswan 本身编译参数外,还需要编译其依赖库 OpenSSL 等的 Windows 版本(**编译为 Linux 软件需要依赖 .so ,编译为 Windows 软件需要依赖 .dll),相比之下后者更容易实现且稳定。

安装 MSYS2

MSYS2 是集成了 pacman 和 Mingw-w64 的 Cygwin 升级版,提供了在 Windows 下使用 bash shell、configure、make、make install 等 Linux 开发工具链的渠道,是 MSYS 的一个升级版,准确的说与MSYS最大的区别是移植了 Arch Linux 的软件包管理系统 Pacman(其实是与Cygwin的区别)。

MSYS2 官网下载对应的可执行安装包并安装,本文选择 msys2-x86_64-20230718.exe 版本。MSYS2 安装完成后,你可以看到同时安装了六个子程序:

https://cdn.jsdelivr.net/gh/wefantasy/FileCloud/img/202310181511959.png
MSYS2 子程序

上述不同的子程序相当于 Anaconda 中不同的 Python 环境,它们之间的差异主要是环境变量、默认编译器/链接器、体系结构、使用的系统库等,通常使用 UCRT64 即可。MSYS2 使用 pacman 作为包管理工具,安装完成后建议先升级和更新本地包:

1
2
3
pacman -Sy  #更新本地包数据
pacman -S --needed filesystem msys2-runtime bash libreadline libiconv libarchive libgpgme libcurl pacman ncurses libintl #升级核心包
pacman -Su #升级其他包

其次,建议安装 MinGW 相关工具链以减少构建故障:

1
2
3
4
pacman -S mingw-w64-x86_64-toolchain
pacman -S mingw-w64-i686-toolchain
pacman -S base-devel
pacman -S vim

安装 OpenSSL

strongswan 的很多密码学算法依赖 OpenSSL 库中的实现,在 Linux 平台下通常自带 OpenSSL 因而不需要额外操作,但在 Windows 平台下则需要手动编译安装(OpenSSL 官方不提供 Windows)。

可以在 openssl 官方项目地址下载对应的源码包,本文选择 openssl-3.2.0-alpha2.tar.gz 版本。在 MSYS2 安装目录下创建 SourceCode 目录,将 openssl-3.2.0-alpha2.tar.gz 解压至 SourceCode 目录下,之后便可以在 MSYS2 命令行中通过 /SourceCode/openssl-3.2.0-alpha2 来访问该目录。

然后进入到 MSYS2 的 UCRT64 命令行环境中的解压目录对 OpenSSL 进行编译安装,整体过程非常简单,只需要按顺序执行以下命令:

1
2
3
./Configure --prefix=/usr/local/openssl
make
make install

安装完成后即可在 /usr/local/openssl 目录下看见对应程序:

https://cdn.jsdelivr.net/gh/wefantasy/FileCloud/img/sd-wan_technology_review_strongswan-2023-10-18-15-59-52.png
安装 openssl

安装 strongswan

在官网中 strongSwan on Windows 可见,strongswan 本身对 Windows 只提供有限的支持,这也导致了并没有方便的 Windows 程序,只能自己编译安装。本文选择与 Linux 平台一致的 strongswan-5.9.11.tar.gz 版本源码包,将其解压至 MSYS2 安装目录的 SourceCode 目录下。

然后进入到 MSYS2 的 UCRT64 命令行环境中的解压目录对 strongswan 进行编译安装,按顺序执行以下命令:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
CFLAGS="-g -O2 -Wall -Wno-pointer-sign -Wno-format-security \
        -Wno-format -mno-ms-bitfields \
        -I/usr/local/openssl/include" \
LDFLAGS="-L/usr/local/openssl/lib64" \
./configure --disable-defaults --enable-monolithic --enable-static \
--enable-svc --enable-ikev2 --enable-ikev1  \
--enable-nonce --enable-pem --enable-pkcs1 \
--enable-x509 --enable-openssl --enable-socket-win \
--enable-kernel-wfp --enable-kernel-iph --enable-pubkey \
--enable-swanctl --with-swanctldir=swanctl \
--enable-eap-identity --enable-eap-tls --enable-eap-ttls --enable-eap-tnc \
--with-strongswan-conf=strongswan.conf --prefix=/usr/local/strongswan
make
make install

其中,CFLAGSLDFLAGS 必须指向 OpenSSL 的对应目录,不出意外的话即安装成功:

https://cdn.jsdelivr.net/gh/wefantasy/FileCloud/img/sd-wan_technology_review_strongswan-2023-10-18-17-35-09.png
strongswan

出意外的话就是出意外了,一个可能的原因是 --enable 了不支持的模块,Windows 下所有 strongswan 可用组件在 strongSwan on Windows 下都有说明,非必要不建议额外添加其它未说明可用的组件。

连接测试

未完待续

Q&A

  • Q: No package ’libsystemd-daemon’ found
    A: sudo apt-get install libsystemd-dev

  • Q:checking for systemd system unit directory… configure: error: not found (try –with-systemdsystemunitdir) A:configure 添加参数 –with-systemdsystemunitdir=/lib/systemd/system

  • Q: charon.vici: connect: no such file or directory A: 检查 strongswan 安装,并启动守护进程 sudo systemctl enable strongswan sudo systemctl start strongswan swanctl –stat

  • Q: configure: error: OpenSSL libcrypto not found
    A: 究极大坑,windows 下需要编译 openssl 为对应系统的 dll ,并通过 CFLAGS 和 LDFLAGS 指定对应位置。Linux 重新手动编译按照 OpenSSL

  • Q:configure: error: Python is required to resolve plugin constructors statically A:pacman -S python

  • Q:The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. A:apt install pkg-config

  • Q:fatal error: netinet/in.h: No such file or directory A:去掉 configure 中 –enable-dhcp

  • Q:kernel_libipsec_router.c:323:45: error: ‘F_SETFL’ undeclared (first use in this function) A:去掉 configure 中 –enable-kernel-libipsec

  • Q:.refptr.kernel_libipsec_plugin_create]+0x0): undefined reference to `kernel_libipsec_plugin_create’ A:

参考