openconnect Linux客户端安装 以及开机自启和登录

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。

相关推荐
知已难寻2 小时前
Docker 入门:容器技术与 Docker 基础
java·运维·服务器·docker·云原生·容器
默|笙2 小时前
【Linux网络】网络层协议 IP(1)理解报头、网段划分
linux·网络·tcp/ip
修己xj5 小时前
nslookup 使用指南:两种模式与常用查询技巧
linux
唠玖馆7 小时前
文件系统详解
linux·文件系统·ext2
GeW7 小时前
当Linux内核开始“确定性”,制造高端化才有了底层语法
linux
星恒随风9 小时前
MySQL 从零入门(三):表的约束详解
linux·服务器·数据库·笔记·mysql
Alluxio9 小时前
Alluxio + OCI:为 AI 工作负载实现亚毫秒访问延迟与可扩展吞吐
运维·数据库·人工智能·分布式·缓存·ai·语言模型
StarsGreen11 小时前
libva在intel平台上的前端流程简介
linux
坤坤子吖14 小时前
Linux网络编程:自定义应用层协议与 JSON 序列化
linux·服务器·网络·c++·笔记·json
Sayai14 小时前
Neo4j 图数据质量检查实战:环路检测、孤立节点与连通分量,两条 Cypher 引出的数据体检清单(含变长路径性能陷阱)
运维·neo4j·图数据库·数据质量·cypher