Docker 容器化 aTrust 绕过企业 DLP 管控方案
才疏学浅,若有不对之处烦请指正
前言
公司电脑预装了 360 终端安全管理系统,其中的 DLP(数据防泄漏)模块会监控 Windows 进程的外发行为。而访问公司内网需要安装 aTrust(零信任安全接入网关,功能类似 VPN),结果就是想往 GitHub 拉或推个代码,直接弹窗”禁止外发”。
奇怪的是,360 一直都在,之前没装 aTrust 的时候 git pull/push 完全正常。装了 aTrust 之后才开始拦截,而且卸载 aTrust 后问题依旧。研究了一下发现:360 的 DLP 策略是由公司后台统一下发的,aTrust 连接公司网络时会触发策略同步,把最新的 DLP 拦截规则推送到本机的 360 上。一旦规则落地,就跟 aTrust 本身没关系了——360 独立执行拦截,卸载 aTrust 不会清除已下发的策略。
最恶心的是,这个 DLP 模块有内核级自我保护:管理员权限杀不掉进程、卸载需要密码、禁用启动项后重启照样跑。常规手段根本搞不定。
重装系统 + Docker 内启动 aTrust。重装后不再安装本机 aTrust 客户端,不加域(防止域策略自动推送 360 DLP 规则)。公司内网访问全部通过 Docker 容器内的 aTrust 代理解决——容器内的 DLP 只能监控容器内部,管不到宿主机。GitHub 推送走宿主机直连,互不干扰。
参考链接
1. 环境
- 操作系统:Windows 10 专业版 (Build 19045)
- 公司 VPN:深信服 aTrust(零信任安全接入网关)
- 终端管控:360 终端安全管理系统(公司系统预装,重装系统后仍存在)
- 拦截对象:Windows 上的
git.exe进程的所有外发操作 - 影响范围:所有往外部仓库(GitHub、GitLab 等非公司地址)的 push 操作
2. 排查过程
2.1 第一反应:走代理绕过?
既然 DLP 拦的是网络外发,那让 git 走加密代理出去,DLP 是不是就识别不到目标了?
1 | git config --global http.https://github.com.proxy socks5://127.0.0.1:7890 |
结果:照样拦截。太天真了😅
DLP 不是通过监控网络目标来判断的,而是进程级监控——直接盯着 git.exe 这个进程,不管你流量走哪条路、加不加密,只要是 git.exe 发起的外发操作,一律拦截。
2.2 第二反应:杀掉 DLP 进程?
既然你监控我,那我把你干掉你了不就行了?
1 | tasklist | findstr /i "sangfor aTrust" |
尝试管理员权限强杀:
1 | taskkill /F /IM aTrustAgent.exe |
连管理员都杀不掉,有内核级自我保护。好好好,这么玩是吧🙃
2.3 第三反应:卸载 aTrust?
杀不掉那我卸载总行了吧?
控制面板卸载 → 弹出”请输入卸载密码”。什么密码?装的时候也没设密码啊!需要联系管理员获取——算了算了。
用 Geek Uninstaller 强删文件 → 重启后进程照样跑。
360 终端安全管理系统注册了内核驱动,删文件不影响已加载的驱动,重启后自动恢复。真没招了
2.4 关键发现:WSL 里的 git 不受监控
换个思路——既然 Windows 上的 git.exe 被进程级监控,那 WSL 里的 Linux 版 git 呢?毕竟那是 Linux 进程,360 你管得着吗?
1 | wsl -d Ubuntu -- bash -c "cd /mnt/d/MyCode/JuneBlog && git push" |
结果:推送成功!360 没有拦截! 🎉
360 DLP 只监控 Windows 进程,WSL 内部的 Linux 进程不在其监控范围内。
这验证了一个关键假设:只要操作不在 Windows 宿主机的进程空间里执行,DLP 就管不到。Docker 容器同理—。
3. 方案设计
3.1 核心思路
graph LR
subgraph Host_Windows [宿主机: Windows]
direction LR
Client_Apps["客户端应用<br/>(浏览器 / git.exe)"]
Clash_Proxy{"Clash 代理<br/>(规则模式)"}
External_Net["外部互联网<br/>(GitHub 等)"]
subgraph Docker_Container [Docker 隔离容器]
direction TB
Socks_Server["Socks5 服务端<br/>(127.0.0.1:1080)"]
ATrust_DLP["aTrust 客户端 + 360 DLP"]
Internal_Tunnel["公司内网<br/>(VPN 隧道)"]
Socks_Server --> ATrust_DLP --> Internal_Tunnel
end
end
%% 流量路径
Client_Apps --> Clash_Proxy
Clash_Proxy -- "外网域名" --> External_Net
Clash_Proxy -- "公司域名" --> Socks_Server
%% 样式美化
style Host_Windows fill:#fdfdfd,stroke:#333,stroke-width:2px
style Docker_Container fill:#e3f2fd,stroke:#1565c0,stroke-width:2px
style Clash_Proxy fill:#fff9c4,stroke:#fbc02d,stroke-width:2px
style ATrust_DLP fill:#ffebee,stroke:#c62828
style Client_Apps fill:#e8f5e9,stroke:#2e7d32
style External_Net fill:#f5f5f5,stroke:#9e9e9e
style Internal_Tunnel fill:#e1f5fe,stroke:#0288d1
3.2 流量路径
| 操作 | 路径 |
|---|---|
| git push GitHub | 宿主机 git → Clash → 外网(DLP 管不到) |
| git pull git.company.com | 宿主机 git → Clash → 容器 aTrust 代理 → 公司内网 |
| 浏览器访问公司内网 | 浏览器 → Clash → 容器 aTrust 代理 → 公司内网 |
| 浏览器访问外网 | 浏览器 → Clash → 正常代理规则 |
4. 实施步骤
4.1 前置条件
- Docker Desktop 已安装并运行
- Clash Verge 已安装,规则模式,允许局域网连接(Allow LAN)开启,端口 7890
4.2 启动 aTrust 容器
1 | docker run --rm -d --device /dev/net/tun --cap-add NET_ADMIN ^ |
参数说明:
| 参数 | 作用 |
|---|---|
-d |
后台运行 |
--device /dev/net/tun |
VPN 隧道需要 TUN 设备 |
--cap-add NET_ADMIN |
网络管理权限 |
-v ecdata:/root |
持久化 aTrust 登录数据 |
-p 127.0.0.1:1080:1080 |
暴露 socks5 代理 |
-p 127.0.0.1:5901:5901 |
VNC 端口(登录用) |
HTTP_PROXY 等 |
让容器通过宿主机 Clash 出网 |
host.docker.internal |
Docker Desktop 中容器访问宿主机的特殊域名 |
4.3 VNC 登录 aTrust
- RealVNC Viewer 连接
127.0.0.1:5901,密码123456 - 在 VNC 界面中登录 aTrust(公司 VPN 账号密码)
- 看到 “Online Connected” 后关闭 VNC,容器后台继续运行
4.4 配置 Clash 全局扩展脚本
1 | function main(config) { |
atrust.company.com(VPN 服务器地址)必须走 DIRECT。如果它也走 aTrust 代理,就会形成死循环:容器要连 VPN 服务器 → 流量被 Clash 转到容器自己的代理 → 代理还没建立 → 永远连不上。
4.5 配置 Git 代理
1 | # 公司仓库走容器 aTrust 代理 |
5. 踩坑记录
5.1 360 DLP 杀不掉也卸不掉(最终只能重装系统)
试了所有能想到的办法,全部失败:
taskkill /F→ 拒绝访问(内核级保护)- 卸载 → 需要密码(我又不是管理员)
- Geek Uninstaller 强删文件 → 重启后进程照样跑
- 禁用启动项 → 无效,服务级自启
- 安全模式下删除 → 内核驱动已加载,文件被锁定
- 注册表清理 → 驱动注册项有 ACL 保护,改不了
所有常规手段均无效,最终只能重装系统。 360 终端安全管理系统的内核驱动有完整的自我保护链:进程保护 + 文件保护 + 注册表保护 + 服务自恢复。除非拿到管理员下发的卸载密码,否则在 Windows 运行状态下无法移除。有亿点流氓啊😭
重装系统,不装 aTrust 客户端,不加域。 重装后公司内网访问通过 Docker 容器里的 aTrust 代理解决。如果公司通过域策略自动推送这些软件,就不加域。
5.2 Docker Desktop 安装报 “Server service” 未启用
安装 Docker Desktop 4.72.0 时弹窗:Installation failed. One prerequisite is not fulfilled. Docker Desktop requires the Server service to be enabled.
Windows 的 LanmanServer 服务被禁用了(可能是精简系统时关掉的)。在管理员 PowerShell 中执行:
1 | # 注意:PowerShell 里 sc 是 Set-Content 的别名,必须用 sc.exe |
启用后重新运行安装程序即可通过。
5.3 Docker Desktop 启动报 “WSL needs updating”
Docker Desktop 安装成功后首次启动,提示 WSL 版本过旧。
1 | wsl --update |
如果网络拉不下来:
1 | wsl --update --web-download |
更新完在 Docker Desktop 界面点 Try Again,等左下角变成 “Engine running” 即可。
5.4 Clash Verge 局域网连接未开启
容器启动后连不上宿主机 Clash,host.docker.internal:7890 拒绝连接。
确认 Clash Verge 的局域网连接(Allow LAN)已开启,否则容器通过 host.docker.internal 访问不到 Clash。
5.5 WSL 里 git push 报代理连接失败
Windows git 配置了 proxy=socks5://127.0.0.1:7890,WSL 里的 git 继承了这个配置,但 WSL 内部 127.0.0.1 指向的是 WSL 自己,不是 Windows 宿主机。
推送时临时清除代理:
1 | git -c http.proxy="" -c https.proxy="" push |
或者配置 WSL 的 git 代理指向宿主机 IP(通过
/etc/resolv.conf 中的 nameserver 地址)。
5.6 git clone 公司仓库报 SSL_ERROR_SYSCALL
容器代理正常(curl -x socks5://127.0.0.1:1080 能访问公司 GitLab),但 git clone 报错:
1 | unable to access 'https://git.company.com/xxx/xxx.git/': |
原因:流量经过容器 aTrust VPN 代理后,公司网关可能对 HTTPS 做了 SSL inspection(证书替换),git 的 OpenSSL 不信任被替换的证书,SSL 握手失败。
针对公司仓库关闭 SSL 验证(不影响 GitHub 等其他仓库):
1 | git config --global http.https://git.company.com/.sslVerify false |
6. 备用方案:WSL 里操作 git
如果重装系统后 360 又被推送回来(域策略自动部署),Windows 的 git.exe 往非公司地址推送还是会被拦(公司仓库的操作不受影响,DLP 只拦外发)。这时候用 WSL 里的 git 来推 GitHub,360 管不到 Linux 进程:
1 | # 安装 Ubuntu |
日常使用:
1 | # 推送 GitHub(WSL 里的 git 不受 DLP 监控) |
这个方案只需要在推/拉外部仓库时手动切到 WSL 操作,公司仓库的日常开发继续用 Windows 的 git 和 IDE 即可,不受影响。
7. 总结
根因链
1 | 公司部署 aTrust + 360 终端安全管理系统 |
经验教训
- 企业 DLP 是进程级监控,不是网络级。走代理、改 DNS、加密隧道都绕不过,只有让操作发生在 DLP 监控范围之外(容器/WSL)才行。
- Docker 容器是天然的隔离沙箱。不仅隔离了文件系统和网络,也隔离了终端管控软件的监控范围。
- Clash 分流 + 容器代理是一个通用模式。任何需要”部分流量走 VPN、部分流量不走”的场景都可以用这个架构。
- 防回环是关键。VPN 服务器地址必须走 DIRECT,否则容器永远连不上 VPN。
管不了 DLP,就把 VPN 关进笼子里🐳——容器内连公司网,容器外自由呼吸。




