在目前的 VPN 环境里,访问内网必须使用 aTrust。麻烦的是,aTrust 默认会通过 TUN 模式接管网络,而且没法直接关闭。一旦打开,就像开启了一个“沉浸式内网模式”:内网是能进了,但原本的外网代理基本也一起失效。
折腾了一圈之后,我目前找到的最好办法是:把 aTrust 放进 Docker 容器,让它只负责提供内网代理,再通过 Clash Verge 做规则分流。 整套方案不算特别简单,但配置一次之后,内网和外网基本就可以和平共处了。
参考核心项目:docker-easyconnect/docker-easyconnect
整体思路
整个方案可以拆成三步:
- 在 Docker 中运行 aTrust,让 VPN 只影响容器内部网络。
- 将容器中的 SOCKS5 / HTTP 代理暴露到本机,例如
127.0.0.1:1080。 - 在 Clash Verge 中加入一个
aTrust节点,只把需要访问内网的流量转发给这个节点,其余流量继续走原来的代理。
对于浏览器里的 HTTP / HTTPS 流量,这样已经够用了;如果还需要 SSH 之类不直接走普通 HTTP 代理的流量,最后再开启 Clash Verge 的 TUN 模式即可。
安装 Docker Desktop
首先安装并启动 Docker Desktop。
如果你使用的是 macOS 或 Linux,可以直接跳到后面的 aTrust 容器部分。
如果是 Windows,还需要先准备好 WSL。
Windows 安装 WSL
先尝试直接安装
用管理员身份打开 PowerShell 或终端,执行:
wsl --install
如果能够正常安装,那当然是最省事的情况。安装完成后重启,然后继续后面的步骤即可。
不过,我这里遇到的问题是直接返回:
已禁止(403)。
如果你也碰到类似情况,可以绕过 wsl --install,手动把 WSL 组件和安装包补齐。
手动启用 WSL 组件
先在管理员 PowerShell 中执行:
dism /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
然后继续启用虚拟机平台:
dism /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
如果一切正常,应该能看到类似:
The operation completed successfully.
然后重启 Windows:
shutdown /r /t 0
手动安装 WSL
重启后,打开 Microsoft 官方的 WSL Releases 页面,下载最新的 x64 .msixbundle 安装包。
文件名通常类似:
Microsoft.WSL_2.x.x.x_x64.msixbundle
下载完成后,可以在 PowerShell 中手动安装:
Add-AppxPackage .\Microsoft.WSL_*.msixbundle
例如:安装包在默认的 Downloads 目录,可以先进入目录:
cd $HOME\Downloads
Add-AppxPackage .\Microsoft.WSL_*.msixbundle
最后检查一下 WSL 是否已经正常工作:
wsl --version
我这里的输出类似:
PS C:\Users\TealCloud> wsl --version
WSL 版本: 2.7.11.0
内核版本: 6.18.33.2-2
WSLg 版本: 1.0.73.2
MSRDC 版本: 1.2.7214
Direct3D 版本: 1.611.1-81528511
DXCore 版本: 10.0.26100.1-240331-1435.ge-release
Windows: 10.0.26200.8875
到这里,Windows 端的准备工作基本就完成了。
在 Docker 中运行 aTrust
先拉取已经配置好的 aTrust 镜像:
docker pull hagb/docker-atrust:latest
然后启动容器:
docker run --rm \
--device /dev/net/tun \
--cap-add NET_ADMIN \
-ti \
-e PASSWORD=xxxx \
-e URLWIN=1 \
-v $HOME/.atrust-data:/root \
-p 127.0.0.1:5901:5901 \
-p 127.0.0.1:1080:1080 \
-p 127.0.0.1:8888:8888 \
-p 127.0.0.1:54631:54631 \
--sysctl net.ipv4.conf.default.route_localnet=1 \
hagb/docker-atrust
这里的 PASSWORD=xxxx 是后面连接 VNC 时使用的密码,可以自行修改。
正常启动之后,大概会看到类似下面的输出:

看着是一堆乱码,但是不用怀疑,到这里容器其实已经跑起来了。
通过 VNC 登录 aTrust
接下来需要通过 VNC 连接到容器里的图形界面。
连接信息如下:
地址:127.0.0.1
端口:5901
密码:xxxx
如果本机没有 VNC 客户端,可以安装 TigerVNC Viewer。Windows 可以下载 tigervnc64-1.16.2.exe 并安装。打开 TigerVNC Viewer 后输入:
127.0.0.1:5901
然后输入启动 Docker 时通过 -e PASSWORD=xxxx 设置的密码。如果直接复制了我上面的命令,那么密码就是 xxxx。
成功连接后,应该就能看到 aTrust 的登录窗口:

填写服务器地址:
https://atrust.shu.edu.cn
随后点击 Log In。

之后 VNC 窗口上方会弹出一个登录网址。点击 Copy,把地址复制到本机浏览器中打开并完成登录。
登录完成后,VNC 中会变成类似下面的状态:

到这里,aTrust 容器已经可以访问内网了。
测试容器暴露的代理
启动参数里已经把两个常用代理端口映射到了本机:
127.0.0.1:1080:SOCKS5 代理127.0.0.1:8888:HTTP 代理
可以先用 curl.exe 测试一下 SOCKS5 是否可用:
curl.exe --socks5 127.0.0.1:1080 https://ipinfo.io
正常情况下应该能拿到类似的返回:
{
"ip": "xxx.xxx.xxx.xxx",
"country": "..."
}
如果这里能够正常请求,说明本机已经可以通过 Docker 中的 aTrust 代理访问网络了。接下来要做的,就是只把真正需要访问内网的流量送进去。
在 Clash Verge 中配置规则分流
我的目标很简单:
内网流量走 aTrust,其他流量继续走原来的代理。
打开 Clash Verge → 订阅 → 全局扩展脚本:

将默认的占位代码替换为下面这段脚本并保存:
function main(config) {
config.proxies = config.proxies || [];
config.proxies.push({
name: "aTrust-Docker",
type: "socks5",
server: "127.0.0.1",
port: 1080
});
config["proxy-groups"].push({
name: "aTrust",
type: "select",
proxies: [
"aTrust-Docker"
]
});
config.rules.unshift(
"IP-CIDR,58.199.0.0/16,aTrust,no-resolve"
);
return config;
}
这段脚本做了三件事:
- 新增一个名为
aTrust-Docker的 SOCKS5 节点,指向本机的127.0.0.1:1080。 - 新建一个名为
aTrust的代理组。 - 将
58.199.0.0/16这段 IP 的流量优先交给aTrust代理组处理。
保存以后,进入 Clash Verge 的代理页面,最下面应该可以看到刚刚添加的 aTrust:

到这里,HTTP / HTTPS 场景下的内外网分流基本已经完成。
SSH 访问内网:开启 TUN 模式
最后还有一个小坑。
普通代理主要处理的是应用主动走代理的流量,而我们真正想用的 SSH 并不会天然去走上面的 HTTP / SOCKS5 配置。因此,如果需要让 SSH 等连接也命中 Clash 的分流规则,还需要开启 TUN,也就是虚拟网卡模式。
如果之前没有安装过相关服务,可以先点击 Clash Verge 里的小扳手完成安装,然后开启:

完成之后,就可以直接通过 SSH 访问对应的内网地址了:

写在最后
这个方案的核心其实很简单:不要让 aTrust 直接接管宿主机的全部网络,而是把它关进 Docker,只把它当成一个“内网代理节点”来使用。
这样一来,aTrust 负责连学校内网,Clash Verge 负责决定哪些流量应该送给 aTrust,原来的外网代理则基本不受影响。
上面的规则目前只写了:
58.199.0.0/16
如果还有其他内网网段需要访问,只需要继续修改全局扩展脚本中的规则即可。规则一多不想自己手写的话,也可以直接把现有脚本和目标网段丢给 GPT,让它帮你扩展。