乐于分享
好东西不私藏

从零自建一个 AI 安全学习智能体:Docker + 内网穿透 + 网关聚合 + 主机加固全记录

从零自建一个 AI 安全学习智能体:Docker + 内网穿透 + 网关聚合 + 主机加固全记录
一个退役兵 + 大专在读的真实折腾记录。全程命令自己敲、坑自己踩、错自己排。 这篇不是教程搬运,是一份带着体温的实操手记——包括我撞墙的每一处。

一、为什么不直接用 App

市面上的 AI 对话 App 很多,但我想要的是一个完全属于自己的、随地能用、不绑定任何厂商客户端的 AI——手机浏览器、电脑浏览器,打开就是我定制好的「作战模式」。
更重要的私心:我的方向是 AI 安全 / 网络安全。自己把这套东西从一台空服务器搭起来,本身就是一次完整的网络安全实战——Linux、Docker、内网穿透、API 网关、主机加固,一条龙全都要碰。搭工具的过程,就是练基本功的过程。
所以目标定死:
自托管,网页访问,手机电脑通用
后端走国产大模型,国内直连、合规、便宜
全程自己动手,把每个坑变成笔记

二、技术选型(以及我没选什么)

最终这套组合:
手机 / 电脑浏览器
│(Tailscale 私网,全程加密)
腾讯云轻量服务器(公网只开 22 端口)
├─ Open WebUI   ← 网页界面,固化「作战智能体」人设
└─ new-api      ← API 网关,统一管理我的多个 key
DeepSeek(国内直连,做大脑)
界面:Open WebUI
——自托管 ChatGPT 式界面的事实标准,Docker 一键起,支持把一整段系统提示词固化成自定义模型。
大脑:DeepSeek
——国产、境内服务、国内服务器直连又快又合规,价格极低,跑规划/拆解/写笔记完全够用。
网关:new-api
——把我的多个 API key 聚合到一处,对外只暴露一个地址一个令牌。
访问:Tailscale
——在我的服务器、手机、电脑间拉一条 WireGuard 私网,公网根本扫不到我的服务
我特意没选的:海外服务器 + 翻墙中转。当时确实动过「买个海外服务器搭中转聚合境外模型」的念头,但想清楚了:自用场景下 DeepSeek 已经够用;倒卖/共享境外 API 额度普遍违反服务条款、封号是常态;网上现成的「一键中转」镜像更是 key 窃取和挖矿木马的重灾区。这对一个想走安全技术路线的人来说,是岔路不是捷径。砍掉。

三、部署实录(含每一处踩坑)

1. 装 Docker

腾讯云 Ubuntu 镜像其实预装过 Docker,所以跑安装脚本时弹出 docker command appears to already exist 的警告——别慌,那是脚本给你 20 秒反悔时间,等它走完即可。顺手用阿里云加速脚本安装,再配上镜像加速。
坑点 1:系统更新时弹出紫色配置框,问 sshd_config 用新版还是旧版。一律选keep the local version——保留服务商那份能正常登录的配置,别让默认版把你的登录方式覆盖掉,否则可能再也连不进去。

2. 拉 Open WebUI 镜像——本次最硬的一关

Open WebUI 的镜像在 ghcr.io,国内直接拉卡了 20 多分钟纹丝不动。这不是网慢,是 ghcr 在国内访问极差。挨个换源:
docker.1ms.run/open-webui/...
→ 404,路径规则不对
docker.m.daocloud.io/ghcr.io/...
→ 规则变了,被当成 docker.io 找,失败
ghcr.nju.edu.cn/open-webui/open-webui:main
南京大学镜像站,一路 Pull complete 全绿,成功!
拉下来后用 docker tag 改回标准名 ghcr.io/open-webui/open-webui:main,compose 就认了。

教训:国内拉 ghcr 镜像就是挨个试源的活,南大那个 ghcr.nju.edu.cn 目前最稳,记下来。

3. 端口冲突——被自己半年前的容器绊了一跤

docker compose up 报 port 3000 already allocated。一查 docker ps,发现有个跑了 5 周的 new-api 容器正占着 3000——是我自己之前装来统一管 key 的网关,忘得一干二净。
这件事本身就是个安全告警:我的服务器上有个我都不记得的服务,还对公网开着 3000 端口。
处理方式:不动 new-api(它有用),把 Open WebUI 改到 3001,两者和平共处。一行 sed 改掉 compose 里的端口即可。

4. Tailscale 内网穿透

安装顺利。两个小坑:
坑点:命令粘连
。复制粘贴时两行黏在一起,变成 tailscale upsudo tailscale up,报 unknown subcommand: upsudo。重新干净地敲一遍 sudo tailscale up 就好。
执行后会吐一个 login.tailscale.com/a/xxx 授权链接,浏览器打开登录授权,终端显示 Success,再 tailscale ip -4 拿到 100.x.x.x 私网地址。
坑点:手机连不上,电脑能连。电脑能开说明服务器没问题,问题在手机端 Tailscale——要么开关没真正切到 Connected,要么登录的账号和电脑不是同一个。对齐账号、打开开关,手机立刻就进来了。

5. 主机加固——这步最不能省

收尾去看腾讯云防火墙,整整 8 条放行规则:3000(IPv4+IPv6)、80、443、22、3389(TCP+UDP)、Ping。
其中那两条 3000,意味着我那个管着多个 API key 的 new-api 网关,正裸奔在全网扫描之下——一旦被扫到,key 被盗刷是分分钟的事。
动手砍:
删两条 3000(堵住 new-api 公网暴露)
删 80 / 443(没跑网站)
删两条 3389(我是 Ubuntu,根本没有 Windows 远程桌面)
只留 22(SSH)+ Ping
砍完,公网地址 :3000、:3001 全部打不开了——这正是对的。所有服务退回 Tailscale 私网,公网只剩一个 SSH 口。攻击面从一大片缩成一个点。

安全纪律补一刀:整个过程里我好几次差点把登录链接、API key 原样贴出来。token、key、授权链接,贴出去之前先打码,这是肌肉记忆,不是洁癖。

6. 接后端 + 固化人设

new-api 里加 DeepSeek 渠道、出一个对外令牌(sk-xxx)
Open WebUI 外部连接填 new-api 的私网地址 + 那个令牌,模型列表里出现 deepseek-v4-pro / flash
工作空间新建模型「龙渊作战智能体」,把我那套系统提示词(优先级、输出铁律、四个指令模板、命理双视角约束)粘进去固化
针对 DeepSeek 优化人设的三点:把指令输出模板直接写死进 prompt(它对"触发即套模板"的遵循不如顶级闭源稳);给命理视角加"仅作辅助、不替代现实决策"的硬约束;显式写入"侦测到跑题先点明再拉回"的反偏离机制。
验收:发一句「给我今日计划」,它严格按 7 个字段输出,主题自动落到 AI 安全(提示注入)——遵循稳,上线。

四、复盘:我到底练到了什么

这一条龙覆盖的技能栈:
Linux / Shell
:SSH、用户与 sudo、配置文件、systemd 服务
Docker
:镜像、容器、compose、镜像加速源、端口映射
网络
:内网穿透原理、WireGuard、私网与公网隔离
API 网关
:多 key 聚合、OpenAI 兼容协议
主机加固
:最小化攻击面、防火墙规则审计
Prompt 工程
:针对具体模型重写系统提示词
而真正值钱的,不是"我装好了一个工具",而是上面那一串自己撞出来的坑和自己排掉的错。教程谁都能抄,踩坑记录才是第一手的东西。

五、写在最后

工具搭好只是开始,不是终点。它给我的第一条今日计划就是"提示注入攻击实战"——接下来该用它去产出 writeup、去打靶场、去把学的东西写出来,而不是停在"我又搭了个新装备"的满足感里。
囤工具不是成长,输出才是。