在目前的 VPN 环境里,访问内网必须使用 aTrust。麻烦的是,aTrust 默认会通过 TUN 模式接管网络,而且没法直接关闭。一旦打开,就像开启了一个“沉浸式内网模式”:内网是能进了,但原本的外网代理基本也一起失效。

折腾了一圈之后,我目前找到的最好办法是:把 aTrust 放进 Docker 容器,让它只负责提供内网代理,再通过 Clash Verge 做规则分流。 整套方案不算特别简单,但配置一次之后,内网和外网基本就可以和平共处了。

参考核心项目:docker-easyconnect/docker-easyconnect

整体思路

整个方案可以拆成三步:

  1. 在 Docker 中运行 aTrust,让 VPN 只影响容器内部网络。
  2. 将容器中的 SOCKS5 / HTTP 代理暴露到本机,例如 127.0.0.1:1080
  3. 在 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;
}

这段脚本做了三件事:

  1. 新增一个名为 aTrust-Docker 的 SOCKS5 节点,指向本机的 127.0.0.1:1080
  2. 新建一个名为 aTrust 的代理组。
  3. 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,让它帮你扩展。