文章介绍:VyOS 1.4/1.5 部署 OpenConnect 客户端指南
📌 背景与痛点
VyOS 官方默认仅支持 OpenConnect Server,未集成 OpenConnect Client。许多人在尝试通过将 .so 动态库直接复制到系统的 /usr/lib/ 并执行 ldconfig 来安装 OpenConnect 时,常常会导致 VyOS 核心路由引擎 FRR/Zebra 崩溃(报错:zebra is not running),导致系统丢失除了直连路由以外的所有路由。
本方案的核心优点:
- 零系统污染:利用
LD_LIBRARY_PATH局部劫持依赖库,绝对不触碰系统的/usr/lib/,保证全局 FRR/Zebra 路由引擎 100% 稳定。 - 镜像升级/重启不丢失:利用 VyOS 的持久化目录
/config存储程序与配置,结合vyos-postconfig-bootup.script实现开机自动挂载服务。 - 高可用守护:通过 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.so、libpthread.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 int 和 show ip route。若 tun0 接口自动恢复且内网路由正常,即宣告部署完美成功!