文章介绍:VyOS 1.4/1.5 部署 OpenConnect 客户端指南

📌 背景与痛点

VyOS 官方默认仅支持 OpenConnect Server,未集成 OpenConnect Client。许多人在尝试通过将 .so 动态库直接复制到系统的 /usr/lib/ 并执行 ldconfig 来安装 OpenConnect 时,常常会导致 VyOS 核心路由引擎 FRR/Zebra 崩溃(报错:zebra is not running),导致系统丢失除了直连路由以外的所有路由。

本方案的核心优点:

  1. 零系统污染:利用 LD_LIBRARY_PATH 局部劫持依赖库,绝对不触碰系统的 /usr/lib/,保证全局 FRR/Zebra 路由引擎 100% 稳定。
  2. 镜像升级/重启不丢失:利用 VyOS 的持久化目录 /config 存储程序与配置,结合 vyos-postconfig-bootup.script 实现开机自动挂载服务。
  3. 高可用守护:通过 Systemd 进程守护 + Restart=always 实现掉线自动重连。

🛠️ 第一阶段:在 Docker 环境中制作“绿色便携包”

为了确保依赖库的二进制兼容性,推荐在与 VyOS 底层相同/相近的发行版(Debian 12 Bookworm)中打包。

⚠️ 提示:本阶段在你的 Linux 开发机/编译机 上的 Docker 中运行,不要直接在 VyOS 本地运行。

1. 启动干净的 Debian 12 容器

mkdir -p ~/openconnect-build && cd ~/openconnect-build
sudo docker run -it --rm -v $(pwd):/workspace debian:bookworm bash

2. 在容器内安装 OpenConnect 与打包工具

apt-get update
apt-get install -y openconnect vpnc-scripts binutils

3. 创建绿色便携版目录结构

mkdir -p /workspace/openconnect-portable/{bin,lib,etc}

4. 提取主程序与路由配置脚本

cp /usr/sbin/openconnect /workspace/openconnect-portable/bin/
cp /usr/share/vpnc-scripts/vpnc-script /workspace/openconnect-portable/etc/
chmod +x /workspace/openconnect-portable/etc/vpnc-script

5. 提取核心依赖库(剔除底层 libc 基础库)

使用 ldd 分析并提取依赖库,主动排除 glibc 核心库(如 libc.solibpthread.so 等),避免与宿主机内核 C 库冲突:

ldd /usr/sbin/openconnect | grep "=> /" | awk '{print $3}' | grep -v -E "libc.so|libdl.so|libpthread.so|libm.so|ld-linux" | xargs -I '{}' cp -v '{}' /workspace/openconnect-portable/lib/

6. 打包便携包并退出容器

cd /workspace
tar -czvf openconnect-portable.tar.gz openconnect-portable
exit

此时你将在本地生成 openconnect-portable.tar.gz 压缩包。


🚀 第二阶段:部署至 VyOS 持久化目录

openconnect-portable.tar.gz 传输到 VyOS 路由器中(如上传至 /tmp/ 目录)。

⚠️ 重要提示:VyOS 的临时系统目录(如 /etc/usr)在重启或镜像升级后会被覆盖。所有自定义软件及配置文件必须存放在 /config/ 持久化目录下。

1. 解压便携包至 /config/user-data/

进入 VyOS 终端:

mkdir -p /config/user-data
cd /config/user-data
tar -xzvf /tmp/openconnect-portable.tar.gz

2. 创建隔离环境启动脚本

创建 run-oc.sh 脚本,显式设置环境变量,强制令 OpenConnect 仅加载它专属的依赖库:

vi /config/user-data/openconnect-portable/run-oc.sh

写入以下内容:

#!/bin/bash
# 声明当前便携包所在目录
BASE_DIR="/config/user-data/openconnect-portable"

# 优先加载隔离的 lib 库,绝对不污染全局系统环境变量
export LD_LIBRARY_PATH="${BASE_DIR}/lib"

# 启动 OpenConnect 并使用局域内的 vpnc-script
exec ${BASE_DIR}/bin/openconnect --script=${BASE_DIR}/etc/vpnc-script "$@"

赋予执行权限:

chmod +x /config/user-data/openconnect-portable/run-oc.sh

3. 保存 VPN 认证密码

echo "你的VPN密码" > /config/user-data/openconnect-portable/password.txt
chmod 600 /config/user-data/openconnect-portable/password.txt

⚙️ 第三阶段:配置 Systemd 服务

为了让 OpenConnect 以服务形式运行并在断线时自动重连,我们为其配置 Systemd 服务文件。

1. 获取证书指纹

openssl s\_client -connect 拨号地址 | openssl x509 -pubkey | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64

2. 创建服务配置文件

vi /config/user-data/openconnect-portable/openconnect.service

写入以下内容(请根据实际情况替换证书指纹、账号、用户组与拨号地址):

[Unit]
Description=AnyConnect VPN via Portable openconnect
After=network.target

[Service]
Type=simple
ExecStart=/bin/sh -c 'cat /config/user-data/openconnect-portable/password.txt | /config/user-data/openconnect-portable/run-oc.sh \
  --protocol=anyconnect \
  --servercert pin-sha256:证书指纹 \
  --user=你的账号 \
  --authgroup=你的用户组 \
  --passwd-on-stdin \
  拨号服务器'

ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

🔄 第四阶段:配置 VyOS 开机自启与挂载

VyOS 每次系统启动时会重新初始化 /etc/systemd/system/ 目录。我们需要利用 VyOS 官方提供的 postconfig-bootup 挂载脚本,在系统启动后自动挂载并注册服务。

1. 编辑 VyOS Bootup 挂载脚本

vi /config/scripts/vyos-postconfig-bootup.script

exit 0 之前追加以下三行代码:

#!/bin/sh
# This script is executed at boot time after VyOS configuration is fully applied.

# 1. 创建服务软链接到 systemd 目录
ln -sf /config/user-data/openconnect-portable/openconnect.service /etc/systemd/system/openconnect.service

# 2. 重新加载 systemd 并启动服务
systemctl daemon-reload
systemctl start openconnect.service
systemctl enable openconnect.service

exit 0

2. 确保挂载脚本具备执行权限

chmod +x /config/scripts/vyos-postconfig-bootup.script

🧪 第五阶段:首次运行测试与重启验证

1. 手动挂载并拉起服务

无需重启,直接在终端中手动调用挂载脚本中的命令进行首次测试:

sudo ln -sf /config/user-data/openconnect-portable/openconnect.service /etc/systemd/system/openconnect.service
sudo systemctl daemon-reload
sudo systemctl start openconnect.service

2. 验证运行状态

运行以下命令检查 VPN 建立状态:

# 1. 查看服务状态与拨号日志
sudo systemctl status openconnect.service

# 2. 检查 tun0 网卡是否已拉起并获取 IP
show int

# 3. 检查系统路由表(确认 Zebra 路由引擎运行正常)
show ip route

成功标志

  • show int 中出现 tun0 网卡,状态为 u/u
  • show ip route 中能正常看到 K 标记(Kernel Route)的 VPN 内网路由。
  • 没有 出现 zebra is not running 报错。

3. 重启服务器测试持久化

验证无误后,执行系统重启:

sudo reboot

系统重启完成后重新登录,再次运行 show intshow ip route。若 tun0 接口自动恢复且内网路由正常,即宣告部署完美成功!