公网暴露 Ollama 端口存在风险?使用 OneApi 聚合你的模型调用
本文最后更新于 2025年3月4日 早上
Ollama是一个强大的本地大语言模型运行框架,它让用户能够在本地设备上轻松运行和管理各种大语言模型。然而,Ollama 默认端口服务没有鉴权功能,暴露在公网上的端口存在一定的风险,任何人都可以访问这些端口并调用模型;更不用说,早起版本的 Ollama 还存在 CVE-2024-39720、CVE-2024-39721等高危漏洞。
为了解决这个问题,我们可以使用 OneApi 来聚合你的模型调用,实现类似于 OpenAI 一样的鉴权体验。
当然,你也可以使用 Nginx 去反向代理 Ollama 端口;但是我个人认为,还是 OneApi优雅,也方便数据统计。
OneApi
OneApi 是一个开源的 API 聚合平台,它可以将多个 API 聚合到一个统一的接口上,实现 API 的统一管理、鉴权、调用等功能。项目的地址:
举个例子,你同时有 DeepSeek 官方 API Keys 和 OpenAI API Keys,你就可以使用 OneApi 来聚合这两个 API Keys,实现统一的鉴权调用。
当然,对于 Ollama 来说,你可以设置 Ollama 的 Serve 服务,仅允许你部署 OneApi 的服务器 IP 来访问,进而,使用 OneApi 来保护你的 Ollama 端口和服务。
部署思路
首先,我们需要一台 Linux 服务器,并且安装了 Docker。之后使用 Docker 部署我们的 OneApi,最好用 OneApi 聚合 Ollama 服务,输出 API Key。
操作的流程图如下:
graph LR
A[直接请求 Ollama] -->|端口未开放/拒绝| B((❌))
C[用户请求] -->|携带 API Key| D{OneApi 鉴权}
D -->|鉴权成功| E[OneApi 内部扭转]
D -->|鉴权失败| F((❌))
E -->|内部访问| G[Ollama 服务]
G -->|返回响应| E
E -->|响应结果| C
style A fill:#fdd,stroke:#333,stroke-width:2px
style B fill:#f99,stroke:#333,stroke-width:2px
style C fill:#bbf,stroke:#333,stroke-width:2px
style D fill:#dfd,stroke:#333,stroke-width:2px
style E fill:#ddf,stroke:#333,stroke-width:2px
style F fill:#f99,stroke:#333,stroke-width:2px
style G fill:#ff9,stroke:#333,stroke-width:2px
开发者爱好群
制作教程不易,寻找教程也不易,找到志同道合的小伙伴更是知音难觅。
- 开发者爱好群: 👉 如果你对云服务器、CDN、云数据库和Linux等云计算感兴趣,亦或者喜欢编程、设计、产品、运营等领域,欢迎加入我们的开发者爱好群,一起交流学习(目前可能就我一个人?🤔,毕竟才刚刚创建~)。

当然,也欢迎在B站或YouTube上关注我们:
- Bilibili: https://space.bilibili.com/355567627
- YouTube: https://www.youtube.com/@mintimate/featured
更多:
部署 OneApi
部署 OneApi 非常简单,首先需要一台服务器,我这里使用腾讯云的轻量应用服务器,使用的是 Debian 系统镜像:
建议新买的服务器,更新一下软件包管理器:
1 |
|
部署 Docker
如果你的服务器没有安装 Docker,那么需要先安装 Docker;如果你使用的是腾讯云的服务器,腾讯云服务器内网有 Docker 镜像源,可以直接拉取镜像。参考:
比如,我是 Debian 系统,那么拉取镜像的命令如下:
1 |
|
需要注意,如果你是大陆服务器,建议配置 Docker 仓库源,参考:
配置如下:
1 |
|
你可以使用docker info
查看配置的结果:
哈哈,告诉大家一个小技巧: 如果你使用的是腾讯云服务器,那么你可以直接问腾讯云的智能客服,你就可以得到答案:
不单是智能客服,人工客服也很热情,可以随时咨询,也很专业,我有时候也会问一下产品的具体功能,赞一个。
拉取镜像
最简单的方法,就是拉取 OneApi 的镜像:
1 |
|
解释一下特殊参数:
-p 3000:3000
- 端口映射,将主机的 3000 端口映射到容器内的 3000 端口- 格式为
主机端口:容器端口
- 格式为
-e TZ=Asia/Shanghai
- 设置环境变量- TZ 是时区设置
- Asia/Shanghai 表示使用上海时区
-v /dockerData/one-api:/data
- 数据卷挂载- 将主机的
/dockerData/one-api
目录挂载到容器内的/data
目录
- 将主机的
需要注意,和官方的有点不同。因为我习惯把 Docker 持久化的文件,放到
/dockerData
目录下。其他部署方法,你可以查看官方文档,并根据自己的喜好进行修改。
Nginx 反向代理
OneApi 默认端口是 3000,我们可以通过 Nginx 反向代理,将 3000 端口映射到 80 端口或者 443,这样,参考 Nginx 的配置:
1 |
|
最后,重启 Nginx 服务,使用浏览器访问:
获取 API Key
举个例子,我这里有一个腾讯云高性能应用服务器部署的 DeepSeek 70B 蒸馏版本模型:
它的底层同样是 Ollama 拉取的,只不过默认端口不是 11434
:
这个时候,我们可以在防火墙内,仅允许你部署 OneApi 的服务器访问 DeepSeek 70B 蒸馏版本模型:
之后,我们在 OneApi 的控制台,先添加渠道:
需要注意,在代理
添加的,就是我们 Ollama 的 IP + 端口,比如http://199.999.999.9999:6399
。
之后,测试一下:
最后,我们在令牌
添加一个令牌,就可以获得我们的 API Key 了:
调用 API 效果
最后,我们获得的 API Key,可能是这样的: sk-Qz8hTDDIjd9TP5LO55E7D687B81a488cA12b95D148909c00
看着是不是很熟悉?
没错,和 OpenAI 是一样的,调用方法也是一样的。
如果你的 OneApi 的域名是:https://example.com
,那么调用的地址是: https://example.com/api/v1
。
用 Python 调用:
1 |
|
END
OneApi 的部署,到这里就结束了。如果你想了解更多,可以参考官方文档:https://github.com/justsong/one-api。
最后,如果你觉得本篇教程对你有帮助,欢迎加入我们的开发者交流群: 812198734 ,一起交流学习,共同进步。