目标

在 Windows 上不装官方深信服 EasyConnect 客户端,通过 EZ4Connect 以本地 SOCKS5/HTTP 代理访问校园内网。官方客户端的痛点:写注册表、劫持系统代理、卸载残留;EZ4Connect 是绿色便携、代理端口化、可接 Clash。

背景判断(先做这两件事)

  1. 确认学校服务端是 EasyConnect 还是 aTrust:

    • Web 登录端点 /por/login_psw.csp 存在 → EasyConnect(aTrust 没有此路径);
    • 根页面含 selectline 智能选路 JS、注释带 luyi 20120223 → 老款 SSL VPN 网关,即 EasyConnect。
  2. 拿到 VPN 网关地址 + 端口:即浏览器登录页域名,如 webvpn.zwu.edu.cn,端口默认 443。

两条技术路线

路线代表项目优点代价
协议重实现(免官方二进制)chenx-dust/EZ4Connect(GUI)/ Mythologyli/zju-connect(CLI)零依赖、绿色、不污染系统服务端升级协议可能临时失效
容器化隔离(跑官方客户端)docker-easyconnect/docker-easyconnect兼容性最稳(就是官方客户端)需装 Docker Desktop;Windows 上体验靠 Tauri 壳(xyanmi/quick-easyconnect-proxy)

普通用户首选 EZ4Connect;连不上或学校有定制服务端时退回 docker-easyconnect。

安装步骤

  1. GitHub Releases 下载:chenx-dust/EZ4Connect → EZ4Connect-vX.X.X-windows-x64.zip(绿色便携,内含 EZ4Connect.exe + 内置 zju-connect.exe + wintun.dll)。
  2. 解压到固定目录(如 C:\Users\18086\AppData\Local\Programs\EZ4Connect),主程序直接放在该目录下,建桌面快捷方式。
  3. 双击启动 → 配置向导:服务器 webvpn.xxx.edu.cn、端口 443、账号密码、协议选 EasyConnect。

关键坑:Windows 保留端口区间

EZ4Connect 默认监听 11080(SOCKS5) / 11081(HTTP)。装有 Hyper-V/WSL2/Docker 的机器会动态保留一段 TCP 端口区间,端口落进保留区间会 bind 失败:

panic: SOCKS5 listen failed: listen tcp 127.0.0.1:11080: bind: An attempt was made to access a socket in a way forbidden by its access permissions.

排查 + 修复:

netsh interface ipv4 show excludedportrange protocol=tcp   # 看保留区间
# 改 C:\Users\18086\AppData\Local\EZ4Connect\config.ini 的 [ZJUConnect]
SOCKS5Port=1080
HTTPPort=1081

详见 Windows TCP 保留端口区间导致监听绑定失败 (Windows Excluded Port Range Bind Failure)。

验证

  • 连接成功标志:日志出现 VPN client started、拿到内网 IP、SOCKS5 server listening / HTTP server listening。
  • 本地代理端口:SOCKS5 127.0.0.1:1080,HTTP 127.0.0.1:1081。
  • 命令行测连通:

    curl -x socks5h://127.0.0.1:1080 http://<内网地址>

接 Clash / Mihomo

在 Clash 出站里加一个 SOCKS5 节点指向 127.0.0.1:1080,规则让内网域名/网段走该节点、其余直连或走机场,实现"内网专用 + 全局代理互不干扰"。

常见失败点

  • bind 报 access forbidden → 端口落在 Windows 保留区间,换端口。
  • 登录阶段报认证错误 → 协议选错(EasyConnect vs aTrust);或需图形验证码 / 短信验证(EZ4Connect 已支持处理)。
  • 服务端协议升级后连不上 → 更新 zju-connect / EZ4Connect 到新版本;长期失效则退回 docker-easyconnect。
  • LoginDomain / AuthType(如 hitcas/cas)是 EZ4Connect 从 HITsz 继承的默认值,认证走通了就别乱改。

安全提示

config.ini 中密码是 base64 明文存储,非加密,注意别把这个文件外传。

Linux 无头服务器部署与自动化守护 (Headless Server Daemon Setup)

在 Linux 服务器(如云主机 tx)上无需 GUI,直接运行底层核心 zju-connect:

  1. 下载安装:从 Mythologyli/zju-connect 下载 zju-connect-linux-amd64.zip,解压至 ~/.local/bin/zju-connect。
  2. 启动命令 (EasyConnect):

    zju-connect \
        -protocol easyconnect \
        -server webvpn.xxx.edu.cn \
        -port 443 \
        -username <账号> \
        -password <密码> \
        -disable-zju-config \
        -skip-domain-resource \
        -remote-dns-server auto \
        -socks-bind 127.0.0.1:1080 \
        -http-bind 127.0.0.1:1081
  3. 配置 systemd 守护 (campus-vpn.service):

    [Unit]
    Description=Campus VPN Gateway (zju-connect)
    After=network.target
    
    [Service]
    Type=simple
    User=ubuntu
    WorkingDirectory=/home/ubuntu/workspace/host/campus-vpn
    ExecStart=/home/ubuntu/workspace/host/campus-vpn/start.sh
    Restart=always
    RestartSec=10
    
    [Install]
    WantedBy=multi-user.target
  4. 资源占用:常驻物理内存仅约 6.4 MB,极轻量。

关键实战坑:CAS 直连与内网系统走代理的精细化分流

若业务系统涉及统一身份认证(CAS 单点登录):

  • 现象:将全局代理设为 VPN 代理端口后,登录 CAS 接口报 Read timed out。
  • 原因:学校 WebVPN 网关专供内网流量转发(如 10.10.x.x),对位于公网边界的 pass.xxx.edu.cn 常常限流或阻断连接。
  • 解法(精细化定向分流):
    在代码中(如 Python requests.Session)只对真实内网域名开启代理:

    session.proxies = {
        "http://jw.zwu.edu.cn": "http://127.0.0.1:1081",
        "https://jw.zwu.edu.cn": "http://127.0.0.1:1081"
    }

    pass.zwu.edu.cn 保持直连公网,确保 CAS 加盐与换票秒级完成。

关键实战坑:域名被判 DIRECT 导致请求挂起(-custom-proxy-domain)

现象:隧道已连通,多数域名访问正常(毫秒级),但个别域名请求挂起约 30 秒后超时(curl 返回 000),HTTP / HTTPS 表现一致。

这类域名的共同点:已被学校收进 aTrust 零信任网关——公网直连会返回 307 并重定向到 atrust.xxx.edu.cn,校外一律进不去。挂了隧道仍不通,则是下面的路由判定问题。

诊断(关键:直接看隧道日志的路由判定行,比任何猜测都直接):

sztz.zwu.edu.cn -> 10.70.50.30
10.70.50.30:443 -> DIRECT      # 判为直连 → 云端没有该内网路由 → 必然超时
jw.zwu.edu.cn   -> 10.10.66.51
10.10.66.51:443 -> VPN         # 走隧道 → 正常

根因:aTrust 会下发一份域名资源清单,只有清单内的域名才走 RVPN。清单外的域名即使解析到内网 IP,也被判 DIRECT。本例中 10.70.50.0/24 恰是 VPN 边缘网段(aTrust 网关 .253、DNS .23/.25),属于"绝不能回环进隧道"的网段,默认直连。

解法:用 -custom-proxy-domain 逐个强制:

zju-connect \
    -protocol easyconnect \
    -server webvpn.xxx.edu.cn \
    ... \
    -custom-proxy-domain sztz.zwu.edu.cn

强制后日志变为 10.70.50.30:443 -> VPN,访问恢复正常(0.07s)。

两种手段的取舍:

手段效果适用
-skip-domain-resource全局忽略域名清单,匹配到的流量都进隧道需覆盖大量内网域名;但会打乱已有的精细分流(如 CAS 直连)
-custom-proxy-domain <域名>只强制指定域名,其余分流不变精确补漏(推荐)

两者不冲突,可叠加。多域名时重复该参数即可;建议用环境变量 + 循环拼参数,便于增删(服务器上的实现是 CUSTOM_PROXY_DOMAINS,逗号分隔)。

另一个易踩的点:aTrust 协议的 auth/cas 登录需要交互式回调 URL(要浏览器配合),无法无头运行;EasyConnect 协议的账号密码登录则是非交互的。所以无头服务器优先用 EasyConnect 协议,aTrust 只在学校彻底停用 EasyConnect 时才考虑。

下次怎么识别:隧道连上了、多数域名正常、个别域名挂起超时 → 别怀疑 DNS 和防火墙,直接 grep 隧道日志里的 -> DIRECT。

适用边界

  • 仅适用深信服 EasyConnect / aTrust 协议的服务端(国内高校/政企常见);
  • 社区逆向项目,非官方,使用自行承担风险;
  • docker-easyconnect 是兼容性兜底方案。

关联


本文归档于个人知识库 · 领域:CS & AI · 模块:04 Project_CS_AI/Network