macOS使用OrbStack容器化aTrust,并与 Clash TUN 共存
公司代码仓库必须通过 aTrust 访问,但 macOS 原生安装 aTrust 体验很差。
主要痛点:
- 退出 aTrust 后,
aTrust Agent仍可能在后台活跃。 - aTrust 没有很好适配 Apple 芯片,需要通过 Rosetta 转译运行。
- aTrust 和 Clash / FlClash TUN 都会接管网络,二者无法稳定共存。
解决思路是:不要让 aTrust 直接运行在 macOS 宿主机上,而是把它放进 Docker 容器里。
容器负责连接公司内网,并在本机暴露代理端口。Clash / FlClash 继续负责宿主机的流量接管,只把公司内网 IP 分流到容器代理。
1. 创建目录
bash
mkdir -p ~/.config/atrust
cd ~/.confi/atrust2. 创建 docker-compose.yml
yaml
services:
atrust:
image: hagb/docker-atrust:latest
container_name: atrust
# [新增] 特权模式:解决路由表报错和网络不稳定的关键
privileged: true
restart: unless-stopped
devices:
- /dev/net/tun
# 虽然有了 privileged,保留 cap_add 也没坏处
cap_add:
- NET_ADMIN
ports:
# SOCKS5 端口:Clash 将通过这个端口连接内网
- "1080:1080"
# VNC 端口
# - "5901:5901"
- "5901:8080"
# HTTP 端口备用,这里可以注释掉或留着
- "8888:8888"
environment:
- PASSWORD=123456
- URLWIN=1
- USE_NOVNC=1
volumes:
- ./data:/root
sysctls:
- net.ipv4.conf.default.route_localnet=13. 启动容器
bash
docker compose up -d如果镜像拉取较慢,可以先执行:
bash
docker pull hagb/docker-atrust:latest4. 打开 noVNC 登录 aTrust
浏览器打开:
plain
http://127.0.0.1:8080输入 docker-compose.yml 里的 PASSWORD。
进入容器桌面后,登录公司 aTrust。
登录成功后,浏览器页面可以关掉,容器会继续在后台保持连接。
5. Clash 配置处理函数
javascript
function main(config) {
// ================= 配置区域 =================
// 主力代理组名称,当前函数里其实没用到,保留即可
const MAIN_GROUP_NAME = "🚀 节点选择";
// 公司内网代理名称
const COMPANY_PROXY_NAME = "🏢 公司内网";
// 公司内网代理
const COMPANY_PROXY = {
name: COMPANY_PROXY_NAME,
type: "socks5",
server: "127.0.0.1",
port: 1080,
// 如果你的 socks5 没有账号密码,建议删掉 password
// 如果有账号密码,应该同时写 username 和 password
// username: "xxx",
password: "123456",
udp: true
};
// 必须走公司内网代理的目标地址
const COMPANY_RULES = [
// GitLab
`IP-CIDR,10.239.36.1/32,${COMPANY_PROXY_NAME},no-resolve`,
// 如果公司还有 172.26.160.xxx 这一段内网服务,填这个
`IP-CIDR,172.26.160.0/24,${COMPANY_PROXY_NAME},no-resolve`,
// 如果你确认 172.26.160.x 到 172.26.175.x 都是公司内网服务,
// 可以用下面这一条替代上面的 172.26.160.0/24
// `IP-CIDR,172.26.160.0/20,${COMPANY_PROXY_NAME},no-resolve`,
];
if (!config.proxies) config.proxies = [];
// 避免重复添加同名代理
config.proxies = config.proxies.filter(
proxy => proxy.name !== COMPANY_PROXY_NAME
);
// 添加公司代理
config.proxies.unshift(COMPANY_PROXY);
if (!config.rules) config.rules = [];
// 避免重复添加同样规则
const oldRules = config.rules.filter(
rule => !COMPANY_RULES.includes(rule)
);
// 公司规则放最前面,优先级最高
config.rules = [...COMPANY_RULES, ...oldRules];
return config;
}这里要注意:
PASSWORD 是 noVNC 密码,不是 SOCKS5 密码,所以 Clash 节点里不要写 password。
规则匹配的是访问目标 IP,不是 Mac 当前拿到的本机 IP。
就把它当成规则目标。本机 IP 不是访问目标,Clash 规则应该写 GitLab、接口服务器、制品库、内网后台等目标地址。