我校 VPN 使用深信服(Sangfor)提供的解决方案,各平台都有客户端,速度尚可。但是深信服窥探用户隐私的恶名由来已久,再加上其 PC 端难以卸载的流氓软件习气,我实在不想在主力笔记本上安装这个毒瘤软件。

学校的网络不仅会封锁端口,更有安全级别严格的实验室不允许在集群上安装 Wireguard 一众软件,这个校园 VPN 是不用不行。于是就想到将 Sangfor 禁锢在 Docker 中,按需连接代理流量。

本文基于 Hagb/docker-easyconnect: 使深信服(Sangfor)开发的非自由的代理软件 EasyConnect 运行在 docker 中,并提供 socks5 服务 (github.com) 这一开源项目。

我的主力开发环境是 Windows 10 + WSL,对于其他的平台,只要能支持 Docker 应当就可以使用这个项目。

安装 WSL 和 Docker

安装 WSL 和 Docker 的教程不再赘述,请参阅:

安装 WSL | Microsoft Docs

Docker Desktop WSL 2 backend | Docker Documentation

设置 Docker 内的客户端

仓库开发者维护了几个版本的 Sangfor 客户端,并有带图形界面和纯命令行界面可选。一般情形下的需求都可以用纯命令行解决。

这里以我校的 VPN 设置为例:

touch ~/.easyconn
docker run --device /dev/net/tun --cap-add NET_ADMIN -v $HOME/.easyconn:/root/.easyconn -it -p 127.0.0.1:1080:1080 -p 127.0.0.1:8888:8888 -e IPTABLES_LEGACY=1 -e EC_VER=7.6.3 -e CLI_OPTS="-d vpn.uestc.edu.cn -u USERNAME -p PASSWORD" hagb/docker-easyconnect:cli

下面对命令进行解释:

  • 第一行,我们在当前用户的 $HOME 目录下创建了一个配置文件,用来保存登录信息。
  • 第二行,我们启动了一个 EasyConnect 命令行版 Docker 容器:

    • --device /dev/net/tun --cap-add NET_ADMIN 创建了虚拟网络设备;
    • -it 返回一个交互式终端,用来显示信息;
    • -v 指定挂载卷,我们将当前用户 $HOME$ 目录下的配置文件映射到容器内,实现登录信息的持久化;
    • -p 指定容器的端口映射,可以根据实际情况更改端口号。其中 1080 是 Socks5 代理端口,8888 是 HTTP 代理端口;
    • -e EC_VER 设置容器内环境变量 EC_VER 的值,指定 Sangfor 的版本,最好和服务端一致;
    • -e CLI_OPTS 设置容器内环境变量 CLI_OPTS 的值,指定运行 Sangfor 时的参数。这里的 -d 指定 VPN 地址,-u 指定用户名,-p 指定用户的密码。这些信息应当和直接下载 Sangfor 客户端使用时填写的内容一致;
    • -e IPTABLES_LEGACY=1 使用旧式的 iptables 命令,主要目的是和 WSL 保持兼容。在部分发行版的 WSL 版本上,缺少了这个环境变量会使得 VPN 不能正常运行。

具体的参数设置请参考:docker-easyconnect/usage.md at master · Hagb/docker-easyconnect (github.com)

在 Windows 上按需使用

我使用校园 VPN 的场景目前仅限于 SSH 回校内主机和使用 VPN 浏览某些网站(例如知网),所以这里只介绍一下如何配置 SSH 的代理和浏览器的代理。

代理 SSH

如果单纯使用 SSH 命令:

ssh -o ProxyCommand='nc -x 127.0.0.1:1080 %h %p' user@host

这里借助了 netcat 实现通过代理 SSH 到远程服务器,详情参见:ssh over socks5:通过socks5 proxy来连接ssh服务器 (ieevee.com)

如果使用集成的终端软件,一般都有直接填写代理服务器的位置,以 MobaXterm 为例子:

集成 SSH 软件设置代理
集成 SSH 软件设置代理

代理浏览器

这里就必须提到 Proxy SwitchyOmega - 轻松快捷的管理和切换多个代理设置 (proxy-switchyomega.com)

只要设置好代理即可实现通过 Docker 内的 Easyconnet 访问网页:

SwitchyOmega
SwitchyOmega