本文转载自boke.hackerdream.xyz,作者晴天,发布于 2026-06-01。
在公司开发,你可能遇到过一个经典困境:
- 访问公司内网,必须开 Windows 版 aTrust(公司 VPN 客户端)
- 使用 Google Antigravity / Cursor AI / 外网服务,必须开 Clash 的TUN 模式
- 两者同时开——路由表冲突,内网或外网只能活一个
这不是配置错误,而是底层机制决定的。两个 VPN 级网络组件都在抢系统路由表,必然有一个被打败。
这篇文章给出一个经过生产验证的方案:把 aTrust 塞进 Docker,只暴露代理端口;宿主机用 Clash TUN 统一流量分流。内外网并行,互不干扰。
一、整体架构
┌─────────────────────────────────────────────────────────────┐
│ Windows 宿主机 │
│ │
│ 浏览器 ──► ZeroOmega ──► SOCKS5 127.0.0.1:1080 ──┐ │
│ Antigravity / 外网 ──► Clash TUN ──► 机场节点 │ │
│ 内网 IP(非浏览器)──► Clash 规则 ──► 公司内网 ────┤ │
│ ▼ │
│ Docker (WSL2) │
│ hagb/docker-atrust │
│ aTrust VPN → 公司内网 │
└─────────────────────────────────────────────────────────────┘核心思路就一句话:把抢路由表的对手变成合作者。aTrust 不再碰宿主机路由表,它只在容器里建 VPN,然后通过代理端口把内网流量送出来。
二、环境准备
2.1 软件清单
2.2 拉取 aTrust 镜像
国内 Docker Hub 访问不稳定,建议用华为云镜像加速:
wsl -d Ubuntu -u root -e bash -lc "docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/hagb/docker-atrust:latest && docker tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/hagb/docker-atrust:latest hagb/docker-atrust:latest"镜像hagb/docker-atrust是一个封装了 aTrust Linux 版 + VNC + SOCKS5/HTTP 代理的容器。
三、首次部署
3.1 docker-compose 配置
创建atrust-docker/目录,编写docker-compose.yml:
version: "3"
services:
atrust:
image: hagb/docker-atrust:latest
container_name: atrust
privileged: true
devices:
- /dev/net/tun:/dev/net/tun
ports:
- "5901:5901" # VNC 端口
- "1080:1080" # SOCKS5 代理
- "8888:8888" # HTTP 代理
environment:
- PASSWORD=123456 # VNC 密码,按需修改
volumes:
- ./data:/root/.config # 持久化登录状态
restart: unless-stopped关键点:
- privileged: true+/dev/net/tun:容器内需要创建 TUN 设备建 VPN
- ./data持久化:aTrust 登录状态保存在这里,不用每次重新登录
3.2 启动容器
wsl -d Ubuntu -u root -e bash -lc "service docker start; cd /mnt/d/changjuyi/aerovisionlink/atrust-docker && docker compose up -d"或者写成start-atrust.bat放在桌面,双击即可。
3.3 VNC 登录 aTrust
打开 TightVNC Viewer:
在 VNC 窗口中完成:公司门户地址、账号、密码、手机验证码。
登录成功后,容器内的 aTrust 就建好了到公司内网的 VPN 隧道。
3.4 验证代理是否可用
# SOCKS5(日常推荐)
curl.exe -x socks5://127.0.0.1:1080 -s -o NUL -w "socks5: %{http_code} time:%{time_total}s\n" --max-time 15 http://10.43.95.81:8181/
# HTTP(1080 卡死时临时用)
curl.exe -x http://127.0.0.1:8888 -s -o NUL -w "http: %{http_code} time:%{time_total}s\n" --max-time 15 http://10.43.95.81:8181/期望结果:200,SOCKS5 耗时通常< 2 秒。
3.5 卸载 Windows 原生 aTrust
重要:不要与 Docker 版同时运行。Windows 原生 aTrust 会抢路由表,直接破坏整个方案。
控制面板 → 卸载 aTrust。
四、Clash Verge 配置
4.1 必备设置
4.2 Merge 配置(核心)
路径:配置 → 你的订阅 → 合并(Merge)
mode: rule
prepend-proxies:
- name: 公司内网
type: socks5
server: 127.0.0.1
port: 1080
udp: true
prepend-rules:
- IP-CIDR,10.0.0.0/8,公司内网
- IP-CIDR,172.16.0.0/12,公司内网
- IP-CIDR,192.168.0.0/16,公司内网
delete-rules:
- GEOSITE,private,DIRECT
- IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
- IP-CIDR,172.16.0.0/12,DIRECT,no-resolve
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
tun:
enable: true
stack: mixed
auto-route: true
auto-detect-interface: true
strict-route: true三个关键操作:
4.3 脚本覆写(Script,可选但推荐)
Clash Verge Rev 支持 JavaScript 脚本覆写配置。作用是:
- 强制mode: rule
- 注入「公司内网」SOCKS5 节点
- 删除10.x → DIRECT冲突规则
- 内网 Sniffer 跳过
修改后需要:重新加载配置或重启内核。
4.4 常见 Clash 错误
五、ZeroOmega 配置(浏览器内网路由)
为什么需要 ZeroOmega?因为浏览器访问内网系统(如 OA、Jira、内部 API 文档)时,走 Clash 会多一层代理开销,且 Clash 日志里会暴露内网 IP。ZeroOmega 让浏览器内网流量直接到 Docker 的1080,更快、更干净。
5.1 新建「公司内网」情景
5.2 SOCKS5 vs HTTP:选哪个?
HTTP 模式走的是容器内的 tinyproxy,大量并发 API 请求时会排队阻塞。SOCKS5 走 danted,性能更好但偶发挂死。
5.3 auto switch 规则(可选)
注意:访问纯 IP内网(如http://10.43.95.81:8181/)时,10.*规则不一定生效。建议直接手动切换到「公司内网」。
5.4 验证是否走 ZeroOmega
浏览器 F12 → Network → 任选内网请求:
- 远程地址应为127.0.0.1:1080或127.0.0.1:8888
- Via头含tinyproxy表示经 Docker HTTP;SOCKS5 无 Via 也正常
- Clash 日志里搜不到内网 IP → 说明浏览器未走 Clash,符合预期
六、分工一览
七、每次开机流程
1. start-atrust.bat → 启动 Docker 容器
2. VNC 127.0.0.1::5901 → 若 aTrust 未连接则重新登录
3. 打开 Clash Verge → 规则模式 + TUN 开启
4. 配置 → 重新加载 → 若改过 Merge
5. ZeroOmega → 公司内网 → 访问内网系统
6. 开发 Antigravity → 靠 Clash TUN,无需改 Omega自检命令
# 容器是否在运行
wsl -d Ubuntu -u root -e docker ps --filter name=atrust
# 内网代理是否可达
curl.exe -x socks5://127.0.0.1:1080 -s -o NUL -w "%{http_code}\n" http://10.43.95.81:8181/八、故障排查
8.1 内网完全打不开
排查顺序:
8.2 页面卡 1-2 分钟(SOCKS5 挂死)
danted SOCKS5 偶发挂死:
wsl -d Ubuntu -u root -e bash -lc "cd /mnt/d/changjuyi/aerovisionlink/atrust-docker && docker compose restart"临时方案:把 ZeroOmega 改为HTTP 8888打开页面,接口仍建议用 1080。
8.3 接口每个 10-12 秒
- 若走8888 HTTP:改回SOCKS5 1080
- F12 看是否123+ 请求、是否勾选了停用缓存
- 检查前端是否有重复请求(如getInfoNew被反复调用)
8.4 Clash 日志解读
8.5 内核通信错误
- Merge 配置勿用proxies:,必须用prepend-proxies
- 设置 →重启内核
九、安全与注意事项
十、总结
- 问题:aTrust 和 Clash TUN 同时开,抢路由表,内外网二选一
- 方案:aTrust 容器化 → Docker 内建 VPN → 暴露 SOCKS5 代理 → Clash 规则分流 + ZeroOmega 浏览器路由
- 效果:内网走 1080,外网走机场,互不干扰
- 关键配置:prepend-proxies注入节点、delete-rules清除冲突、规则模式(非全局)
- 日常流程:启动容器 → VNC 登录 → Clash TUN → ZeroOmega 切换
与其让两个 VPN 抢路由表,不如让一个退到容器里做代理。架构上的一个转身,换来的是每天的流畅开发。
原文:Docker 跑 aTrust + Clash TUN:Windows 上内网外网同时在线的终极方案· 作者:晴天 · 许可协议:CC BY-NC-SA 4.0