如何在GitHub Actions中通过AnyConnect VPN连接VM
GitHub Actions 接入带二次验证的AnyConnect VPN 解决方案
核心思路
使用兼容Cisco AnyConnect协议的开源客户端openconnect,在GitHub Actions的Ubuntu runner中完成VPN拨号,支持传入二次验证凭据,拨号完成后即可正常通过SSH访问目标VM。
前置配置
- 提前将所有敏感信息存入对应GitHub仓库的「Settings - Secrets and variables - Actions - Secrets」中,避免明文泄露,需要存储的信息包括:
- VPN服务地址、VPN登录用户名、VPN主密码
- 二次验证的TOTP密钥(如果使用谷歌验证器类的动态验证码)
- 目标VM的IP、SSH登录用户名、SSH密码/私钥
Workflow 具体实现步骤
1. 安装依赖包
GitHub提供的Ubuntu默认runner中没有预装VPN相关工具,首先执行安装:
- name: 安装VPN与TOTP依赖 run: | sudo apt update sudo apt install -y openconnect oathtool
2. 生成二次验证动态码
如果你的二次验证是TOTP类型的动态验证码,用oathtool生成当前有效验证码:
- name: 生成TOTP动态验证码 id: generate_totp run: echo "totp_code=$(oathtool --totp -b ${{ secrets.VPN_TOTP_SECRET }})" >> $GITHUB_OUTPUT
3. 后台建立VPN连接
通过管道将主密码和二次验证码传入openconnect,后台运行避免阻塞后续步骤:
- name: 连接AnyConnect VPN run: | echo -e "${{ secrets.VPN_PASSWORD }}\n${{ steps.generate_totp.outputs.totp_code }}" | sudo openconnect ${{ secrets.VPN_ADDRESS }} --user=${{ secrets.VPN_USERNAME }} --passwd-on-stdin --no-dtls --background sleep 15 # 等待VPN链路建立完成,可根据实际情况调整等待时长
如果连接时提示证书不可信,可以在openconnect命令末尾添加--no-cert-check参数跳过证书校验(生产环境建议提前导入VPN根证书,避免跳过校验带来的安全风险)。
4. 验证链路连通性
拨号完成后先验证到VM的链路是否正常:
- name: 测试到VM的连通性 run: ping -c 4 ${{ secrets.VM_INTERNAL_IP }}
5. 执行SSH操作
确认连通后即可正常用sshpass连接VM执行对应操作:
- name: 通过SSH访问VM run: | sudo apt install -y sshpass sshpass -p ${{ secrets.VM_SSH_PASSWORD }} ssh -o StrictHostKeyChecking=no ${{ secrets.VM_SSH_USER }}@${{ secrets.VM_INTERNAL_IP }} "此处替换为你需要在VM上执行的命令"
特殊情况说明
- 如果你的VPN二次验证是短信验证码、硬件令牌等无法通过TOTP生成的类型,此方案无法直接使用,可联系VPN管理员申请将GitHub Actions的公网IP段加入VPN白名单,或者申请专用的无二次验证的VPN账号用于CI流程
- Workflow执行结束前可以主动执行
sudo killall openconnect断开VPN连接,避免资源占用
内容的提问来源于stack exchange,提问作者akif farooq
相关产品推荐
相关产品推荐

