开发/2026/03/24

从零开始写一个本地代理网关

By SuLin4 MIN READ

今天开了一个新坑。

起因是 Trae 这个编辑器,功能上真的不错,代码补全、对话、上下文理解都做得挺到位的,体验不比 Cursor 差。但有一个致命的问题——自定义模型的 BaseURL 锁死了。看到设置里有"自定义模型"的选项我还挺开心,以为能随便接中转,结果根本改不了地址,连本地跑的 Ollama 都得走云端。

这不是拴着遛狗吗。

想了一下,既然它非要连 api.openai.com,那我就在本地把这个域名的流量劫持掉,转发到我自己的地址不就行了?改 hosts 是一种方案,但太粗暴了。开全局 VPN 更不行,日常上网全污染。

所以我打算做一个更精细的方案:本地透明代理网关。只针对特定进程生效,不碰系统全局网络。

技术选型纠结了一会。本来想用 Python 或者 Node 快速糊一个,但想到这东西需要做证书管理、进程注入、系统托盘,性能和体积都很重要,最后选了 Go + Wails。Go 天生适合做网络层的活,Wails 用 Web 前端写 GUI 但编译出来是纯原生二进制,没有 Electron 那一坨 Runtime。

核心思路确定了:

  1. 运行时在内存里生成一个自签名的 Root CA
  2. 把这个 CA 装进系统信任列表
  3. 启动本地代理服务器,对 api.openai.com 的请求做 MITM 解包
  4. 把请求的目标地址替换成用户填的中转地址
  5. 通过环境变量注入的方式,只让目标编辑器走代理

第五步是关键。我不想改系统全局代理,那样太脏了。我的方案是:通过 TraeProxy 来"拉起"编辑器进程,在启动的时候把 HTTPS_PROXY 环境变量塞进去,这样只有这个子进程会走代理通道,别的程序完全不受影响。关掉 TraeProxy,一切恢复原样。

今天把基础架构搭起来了,Go 这边 MITM 代理跑通了,前端也用 Vue 搓了个简单的界面。证书生成和安装倒是没费太多事,Go 的 crypto/x509 标准库就够用。比较头疼的是 Windows 下怎么隐藏启动子进程时弹出的命令行黑框——最后用 syscall.SysProcAttr 里的 HideWindow flag 解决了,但调试的时候对着一闪而过的黑框骂了半天。

明天打算把 Anthropic 的支持也加上,api.anthropic.com 的请求格式和 OpenAI 不太一样,得单独处理。

然后就是鉴权。虽然是免费工具,但不加鉴权的话迟早会被滥用。打算接 LinuxDo 的 OAuth,社区的人用起来方便,也能控制一下分发范围。

第一个版本争取两天内发出来。

留言板

加载中...