轻量、可配置的 SSH wrapper,用于在 AnyConnect / OpenConnect 网络前自动处理 VPN 可达性、分流和远程端口映射。
Lightweight, configurable SSH tooling for AnyConnect-compatible and OpenConnect-based networks, with automatic VPN recovery, split tunneling, and optional reverse port forwarding.
这个仓库最初来自一套面向 ECNU 场景的自用脚本,但已经移除了学校域名、认证组、个人账号、私有主机和端口等默认值。现在它的定位是一个通用模板:只要你的环境兼容 Cisco AnyConnect 网关,且本地使用 openconnect,就可以按需改成自己的版本。
Originally built for a campus workflow, this repository has been sanitized for public use. It no longer ships with school-specific domains, auth groups, usernames, hosts, or ports, and is intended to be adapted to any environment that uses an AnyConnect-compatible gateway with the openconnect client.
- Auto-check VPN reachability before running
ssh - Recover connectivity by restarting a systemd service or calling the VPN script directly
- Keep split tunneling intact with
vpn-sliceoruvx - Optionally run a systemd timer that only restarts VPN after repeated failed checks
- Optionally expose a local proxy or service to the remote machine with
ssh -R - Store all environment-specific values outside the repository
bin/
ecnu-ssh
connect-campus-server.sh
ecnu-openconnect-keepalive.sh
examples/
ecnu-connect-campus-server.env.example
ecnu-ssh.env.example
ssh_config.example
systemd/
ecnu-openconnect.service
ecnu-openconnect-keepalive.service
ecnu-openconnect-keepalive.timer
install.sh
建议运行环境:
- Linux
bashsshsudoip(通常来自iproute2)openconnectvpn-slice或uvx- 可选:
systemd
复制示例配置:
mkdir -p ~/.config
cp examples/ecnu-connect-campus-server.env.example ~/.config/ecnu-connect-campus-server.env然后编辑 ~/.config/ecnu-connect-campus-server.env,至少填好这些字段:
VPN_USERVPN_ROUTESTARGET_HOSTTARGET_PORTTARGET_SSH_USER
VPN_ROUTES 必须替换成你实际需要通过 VPN 访问的网段。
如果你希望直接执行 ecnu-ssh 而不是每次都传主机名,可以把示例片段合并到 ~/.ssh/config:
cat examples/ssh_config.example >> ~/.ssh/config然后按你的实际主机信息修改 HostName、User 和 Port。
如果你希望 ecnu-ssh 在未传目标主机时自动使用一个默认别名,可以复制:
cp examples/ecnu-ssh.env.example ~/.config/ecnu-ssh.env然后把 DEFAULT_HOST 改成你在 ~/.ssh/config 里定义的 host。
sudo ./install.sh只安装脚本时,上面的命令就够了。
如果你还想一并安装 systemd 单元:
sudo INSTALL_SYSTEMD=1 ./install.sh
sudo systemctl daemon-reload如果你还希望启用周期 keepalive timer,再执行:
sudo systemctl enable --now ecnu-openconnect-keepalive.timerconnect-campus-server.sh connect
connect-campus-server.sh status
connect-campus-server.sh verify
connect-campus-server.sh disconnectecnu-ssh ecnu-target
ecnu-ssh -L 8080:127.0.0.1:8080 ecnu-target
ecnu-ssh --proxy ecnu-target如果你已经在 ~/.config/ecnu-ssh.env 里设置了 DEFAULT_HOST,也可以直接运行:
ecnu-ssh
ecnu-ssh --proxyecnu-ssh --proxy 会向远端追加一个反向端口映射:
远端 PROXY_REMOTE_PORT -> 本地 PROXY_LOCAL_HOST:PROXY_LOCAL_PORT
默认是:
远端 7890 -> 本地 127.0.0.1:7890
适合把本机代理服务临时暴露给远端会话使用。
常用变量:
VPN_HOST: VPN 网关地址,必须配置VPN_USER: VPN 用户名,必须配置VPN_AUTHGROUP: 可选认证组;部分 AnyConnect 网关需要VPN_ROUTES: 需要走 VPN 的 CIDR 列表,必须配置TARGET_HOST: 目标主机;verify和ssh需要TARGET_PORT: 目标端口,默认22TARGET_SSH_USER: SSH 用户,默认当前系统用户VPN_PASSWORD: 可选;未设置时会静默提示输入CONFIG_FILE: 配置文件路径,默认~/.config/ecnu-connect-campus-server.env
常用变量:
WRAPPER_CONFIG_FILE: 配置文件路径,默认~/.config/ecnu-ssh.envCONNECT_SCRIPT: VPN 脚本路径,默认/usr/local/bin/connect-campus-server.shVPN_SERVICE: systemd 服务名,默认ecnu-openconnect.serviceDEFAULT_HOST: 默认 SSH host;未设置时必须显式传目标PROXY_LOCAL_HOST: 反向映射到本地的地址,默认127.0.0.1PROXY_LOCAL_PORT: 本地端口,默认7890PROXY_REMOTE_PORT: 远端端口,默认7890
仓库内提供了这些示例单元文件:
systemd/ecnu-openconnect.servicesystemd/ecnu-openconnect-keepalive.servicesystemd/ecnu-openconnect-keepalive.timer
默认假设配置文件位于:
/etc/ecnu-ssh/connect-campus-server.env
你可以先复制示例:
sudo mkdir -p /etc/ecnu-ssh
sudo cp examples/ecnu-connect-campus-server.env.example /etc/ecnu-ssh/connect-campus-server.env
sudo chmod 600 /etc/ecnu-ssh/connect-campus-server.envecnu-openconnect-keepalive.timer 默认每约 2 分钟触发一次巡检。
对应的 ecnu-openconnect-keepalive.service 不会直接拿 connect-campus-server.sh verify 作为判定,而是通过 ecnu-openconnect-keepalive.sh 用 ping 轻探测目标主机,并记录连续失败次数:
FAIL_THRESHOLD=2时,第一次失败只记数- 连续第二次失败才执行
systemctl restart ecnu-openconnect.service - 一旦
ping恢复成功,会清空失败计数 - 默认探测目标来自
CONFIG_FILE里的TARGET_HOST;如果需要单独指定,可额外设置PROBE_HOST
默认参数写在 unit 文件里:
FAIL_THRESHOLD=2STATE_DIR=/run/ecnu-openconnect-keepalivePING_COUNT=1PING_TIMEOUT=1
如果你想调阈值,建议通过 systemd drop-in 覆盖环境变量,而不是直接修改仓库文件。
- 不要把真实的
VPN_USER、VPN_PASSWORD、主机地址、端口提交到仓库。 - 如果要把
VPN_PASSWORD写入配置文件,至少确保文件权限为600。 install.sh只会安装示例配置,不会覆盖你现有的真实配置文件。
基础静态检查:
bash -n bin/ecnu-ssh
bash -n bin/connect-campus-server.sh
bash -n bin/ecnu-openconnect-keepalive.sh如果系统装了 shellcheck,建议再跑一遍:
shellcheck bin/ecnu-ssh bin/connect-campus-server.sh bin/ecnu-openconnect-keepalive.sh install.shMIT,见 LICENSE。