1. 安装 OpenConnect 客户端
根据你的发行版选择命令:
Debian / Ubuntu:
sudo apt update
sudo apt install openconnect
Fedora:
sudo dnf install openconnect
CentOS / RHEL / Rocky / AlmaLinux (需要先启用 EPEL 仓库):
sudo dnf install epel-release # CentOS 7 使用 yum
sudo dnf install openconnect
如果还需要图形界面管理,可以把 openconnect 换成或额外安装 network-manager-openconnect-gnome(Debian/Ubuntu)或 NetworkManager-openconnect(Fedora/RHEL 系)。
1. 获取服务器证书指纹(用于非交互启动)
systemd 启动时没有人能点"接受证书",所以必须先用 --servercert 固定服务器证书的公钥指纹,否则服务会卡在交互确认上。
echo | openssl s_client -connect vpn.xxx.cn:8443 -servername vpn.xxx.cn 2>/dev/null \
| openssl x509 -pubkey -noout \
| openssl pkey -pubin -outform der \
| openssl dgst -sha256 -binary \
| openssl enc -base64
记下输出的 base64 字符串,稍后拼成 pin-sha256:<上面的字符串>。
如果服务器证书由公共 CA 签发且本机 CA 库完整,理论上不指定
--servercert也能通过系统信任链校验;但加上指纹最稳妥,也能防止中间人替换证书。
2. 手动验证一次连接参数
在做成服务前,先确认组名、用户名、指纹都对:
sudo openconnect https://vpn.xxx.cn:8443 \
--authgroup=ops \
-u user \
--servercert pin-sha256:你上一步得到的字符串
此时会提示输入密码,输入后应能连上。确认无误后按 Ctrl+C 退出,再进入自动化的部分。
3. 存放密码并创建 systemd 服务
存放密码(仅 root 可读):
bash
sudo mkdir -p /etc/openconnect
echo -n '你的VPN密码' | sudo tee /etc/openconnect/password > /dev/null
sudo chmod 600 /etc/openconnect/password
sudo chown root:root /etc/openconnect/password
创建 /etc/systemd/system/openconnect.service:
bash
sudo tee /etc/systemd/system/openconnect.service > /dev/null <<'EOF'
[Unit]
Description=OpenConnect VPN (quickso, group=ops)
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/bin/bash -c '/usr/sbin/openconnect https://vpn.xxx.cn:8443 --authgroup=ops -u user --servercert pin-sha256:你上一步得到的字符串 --passwd-on-stdin < /etc/openconnect/password'
KillSignal=SIGINT
Restart=always
RestartSec=2
[Install]
WantedBy=multi-user.target
EOF
把里面的 你上一步得到的字符串 替换为第 1 步的实际输出。
启用并启动:
bash
sudo systemctl daemon-reload
sudo systemctl enable --now openconnect.service
4. 验证
bash
sudo systemctl status openconnect.service
sudo journalctl -eu openconnect.service --no-pager
连接成功时日志中会出现类似 Connected as lihuan、Continuing in background 的内容。之后每次开机,systemd 都会按上面的参数自动连接,密码从 /etc/openconnect/password 读取。
5. 常见问题
-
日志里一直循环重连 :多半是密码错误、组名不对,或指纹不匹配。先把
Restart=always暂时注释掉,手动执行ExecStart里那条命令观察输出。 -
提示需要额外验证码(MFA/TOTP) :说明服务器在密码之外还要求动态码,仅靠静态密码文件无法完成自动登录,需要引入 TOTP 生成工具配合,配置会复杂不少。
-
openconnect路径不同 :有的发行版在/usr/bin/openconnect,用which openconnect确认后替换ExecStart中的路径。 -
停止服务 :
sudo systemctl stop openconnect.service。由于设了KillSignal=SIGINT,OpenConnect 会正常退出并恢复路由/DNS。