一台服务器,让全公司访问 ChatGPT / Claude / Gemini / Cursor 等 AI 服务。 客户端零域名配置——只设一次全局 PAC,走哪、怎么走全部由服务端 clash(mihomo) 决定。
- 网关引擎:mihomo(clash.meta 内核), 直接读取你现成的 clash 节点 YAML,无需转换。
- 路由规则:用
rule-providers远程规则集(每天自动更新), AI 站清单无需人肉维护、不会漏。 - 智能分流:AI 站 → 固定出口 IP(防封号);其他海外站 → 轮询换 IP; 国内 → 直连;广告/恶意 → 拦截。
- 管理员维护、员工无感:加/删节点、更新规则都在服务端,员工什么都不用配。
📖 要一步步部署?看 DEPLOY.md(前置条件 → 部署 → 验证 → 接入 → 维护 → 排错)。
客户端(系统全局 PAC) ──全部流量──► mihomo 网关(rule-providers 全权判定)
├─ Private → 直连
├─ Block → 拦截(广告/恶意)
├─ AI 全集(自动更新)→ AI-FIXED 固定出口 IP
├─ China / GEOIP CN → 直连
└─ 其余(海外) → GEN-ROTATE 轮询换 IP
│
└─► 机场节点池(ss/vmess/… 由你的 clash.yaml 提供)
把现成的 clash 节点 YAML 原样拷进来(不用改格式、不用转换):
cp /你的/clash订阅.yaml ./nodes/clash.yaml # 通用/全量节点池
cp nodes/ai.example.yaml ./nodes/ai.yaml # AI 专用节点池(必需)
# 然后编辑 nodes/ai.yaml,把要【专门给 AI 用】的节点粘进去(任意机场/命名)
nodes/clash.yaml供普通海外站轮询用;nodes/ai.yaml是 AI 专用出口池 (AI 站固定出口 IP 就从这里挑)。两个文件都必须存在,否则 mihomo 起不来。 mihomo 只读文件里的proxies:段,多余字段忽略。真实文件已被.gitignore忽略。
cp .env.example .env
# 编辑 .env,GATEWAY_ADDR 改成服务器内网 IP/主机名,例如:
# GATEWAY_ADDR=10.0.0.8:10800 或 gateway.corp.example.com:10800docker compose up -d| 服务 | 地址 | 用途 |
|---|---|---|
| 代理入口 | GATEWAY:10800(http + socks5,mixed-port) |
PAC 指向它 / CLI 用它 |
| PAC 文件 | http://GATEWAY:19000/proxy.pac |
员工系统全局代理指向它 |
| 管理 API | 127.0.0.1:9090(仅本机) |
热重载、看节点健康 |
改 nodes/clash.yaml 后热重载,无需重启:
./scripts/reload-nodes.sh
curl -s http://127.0.0.1:9090/providers/proxies/airport | jq # 看节点健康部署后建议跑一次验证,确认各组 filter 命中(尤其 AI 组锁美国后非空)、出口 IP 确为美国:
./scripts/verify.sh # 默认 API 127.0.0.1:9090、网关 127.0.0.1:10800
# 或单看某个组筛出的节点:
curl -s http://127.0.0.1:9090/proxies/AI-FIXED | jq '.all'config.yaml 用远程规则集判定路由,每天自动更新,新 AI 站自动纳入、无需手改:
AI(category-ai-!cn) + ChatGPT/Claude/Gemini/Copilot/Grok/Perplexity →AI-FIXEDChina/GEOIP,CN→ 直连;Private→ 直连;Block→ 拦截- 其余海外 →
GEN-ROTATE - 内联兜底:核心 AI 站(openai/anthropic/claude/chatgpt/cursor/grok/gemini…)硬编码在 规则最前,即使远程规则集拉取失败,也绝不会掉进轮询而封号。
- 依赖:网关需能访问
gh-proxy.com镜像拉取规则集。
池策略(config.yaml 的 proxy-groups):
AI-FIXED:consistent-hashing,用 AI 专用池ai_airport(nodes/ai.yaml) → 每个 AI 站固定出口 IP ★ 默认 AI 走这个GEN-ROTATE:round-robin,用全量池airport(nodes/clash.yaml) → 轮询换 IP ★ 其他海外站AI-STICKY:sticky-sessions,用 AI 专用池 → 会话粘连(多人共享网关时的 AI 备选,见下)
加 AI 节点:往 nodes/ai.yaml 粘一段即可,无需命名约定、无需改 config。
use: 可填多个 provider,如 use: [ai_airport, airport] 表示两个池合并。
AI-FIXED vs AI-STICKY 怎么选:
- 少量用户 / 每站固定一个出口 IP → 用默认
AI-FIXED(同一 AI 站所有请求走同一 IP)。 - 多用户共享网关、各自有 AI 账号 → 建议改用
AI-STICKY:它按「用户+目标」粘连, 让不同用户分散到不同出口 IP且各自会话内 IP 稳定,避免"同一 IP 下多个账号登录"被风控。 - 切换方法:把
config.yaml的 rules 里所有AI-FIXED改成AI-STICKY(含内联兜底那几条)。
PAC 的 DIRECT 兜底(www/proxy.pac.template):
- 保留
; DIRECT→ 网关不可达时直连(不断网);删掉 → 网关挂了直接失败。
所有 GUI 应用(浏览器、Claude 桌面版、Cursor 等遵循系统代理的 app)只需设置系统全局 PAC,
不配置任何域名,走哪全由服务端 clash 决定。把下面的 GATEWAY 换成管理员给的网关地址。
# 开启(Wi-Fi 有线请换成 Ethernet)
networksetup -setautoproxyurl "Wi-Fi" "http://GATEWAY:19000/proxy.pac"
# 关闭
networksetup -setautoproxystate "Wi-Fi" off或用脚本:./scripts/macos-proxy-on.sh http://GATEWAY:19000/proxy.pac Wi-Fi / ./scripts/macos-proxy-off.sh Wi-Fi
# 开启
Set-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings" `
-Name AutoConfigURL -Value "http://GATEWAY:19000/proxy.pac"
# 关闭
Remove-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings" -Name AutoConfigURL或用脚本:.\scripts\windows-proxy-on.ps1 -PacUrl "http://GATEWAY:19000/proxy.pac" / .\scripts\windows-proxy-off.ps1
多数 Electron 桌面 app(Claude 桌面版、Cursor)遵循系统代理,设完即生效;个别 app 需重启。
CLI 工具不读系统 PAC,只读环境变量。仍然零域名配置(全部流量交给网关,clash 决定):
export HTTP_PROXY=http://GATEWAY:10800
export HTTPS_PROXY=http://GATEWAY:10800辅助脚本:./scripts/claude-code-setup.sh http://GATEWAY:10800(打印含 ~/.claude/settings.json 的多种配置方式)。
仓库另有 Chrome 插件 chatgpt-block-bypass,走选择式域名逻辑 (只代理内置清单里的 AI 域名),适合不想设系统全局代理、只想在浏览器里用的场景。 它与本文的全局 PAC 是两条独立路径,二选一即可,无需同时用。
因为已有 clash 格式节点:mihomo 原生读取 clash YAML,零转换;proxy-group 天然就是节点池
(fallback/load-balance/url-test),健康检查与 rule-providers 内建。gost 需把 ss/vmess/vless/trojan
逐一转成自有格式,脆弱且多余。内网无认证的共享网关场景,mihomo 的 allow-lan 完全够用。
ai-proxy-gateway/
├─ docker-compose.yml # mihomo(网关) + nginx(PAC 服务)
├─ config.yaml # mihomo:读 clash 节点 + rule-providers 规则集 + 分流组
├─ .env.example # GATEWAY_ADDR 网关地址
├─ nodes/
│ ├─ clash.example.yaml # 节点格式示例
│ └─ clash.yaml # ← 你的真实节点(gitignore)
├─ www/
│ ├─ proxy.pac.template # 全局 PAC 模板(envsubst 注入网关地址)
│ └─ nginx.conf # PAC 静态服务
└─ scripts/
├─ macos-proxy-on/off.sh
├─ macos-proxy-manual-on/off.sh # 手动全局代理(桌面 app 不认 PAC 时用)
├─ windows-proxy-on/off.ps1
├─ claude-code-setup.sh # CLI env 配置
├─ verify.sh # 部署后验证:节点池/各组 filter 命中/出口 IP 地区
├─ logs.sh # 看网关日志,支持关键字过滤:./scripts/logs.sh claude
├─ apply.sh # 改 config.yaml 后热加载生效(无停机)
└─ reload-nodes.sh # 改节点后热重载 + 即时健康检查