You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 02:30:01