Ollama搭配OneAPI内网穿透公网访问方案
为什么需要这个方案?
很多人在本地跑Ollama加载了Llama、Qwen等大模型,想通过API让外部应用调用。
但本地网络没有公网IP,无法直接访问。
这时就需要内网穿透工具把Ollama的API端口映射到公网。
如果再搭配OneAPI,你还可以统一管理多个模型端点、设置访问密钥和速率限制,更方便暴露给线上服务。
本文使用frp作为内网穿透工具,零基础也能按步骤完成。
搭建前需要准备什么?
- 一台有公网IP的服务器(云服务器或VPS),用于运行frp服务端。
- 一台内网机器(你的本地电脑或NAS),运行Ollama、OneAPI和frp客户端。
- 域名(可选,但推荐)用于配置访问地址,避免每次记IP。
- frp最新版(从GitHub Releases下载),服务端和客户端版本一致。
- 已安装Ollama(官网安装脚本)和OneAPI(GitHub项目)。
详细配置过程:从Ollama到OneAPI再到frp穿透
第一步:确认Ollama和OneAPI正常启动
在内网机器上启动Ollama并拉取模型(比如qwen2.5:7b):
ollama pull qwen2.5:7b
ollama serve
Ollama默认监听 127.0.0.1:11434。
如果要让OneAPI调用,需要改为监听 0.0.0.0。
修改方法:设置环境变量或修改systemd服务文件。
最方便的做法是运行:
# 停止Ollama服务
systemctl stop ollama # 如果通过systemd管理
# 或者直接kill进程
# 然后设置环境变量并重启
OLLAMA_HOST=0.0.0.0 ollama serve &
再用 curl http://127.0.0.1:11434/api/tags 确认可访问。
下一步安装OneAPI。
推荐用Docker:
docker run --name one-api -d --restart always -p 3000:3000 -v /root/one-api:/data justsong/one-api
访问 http://localhost:3000 完成初始化,添加一个渠道,类型选“Ollama”,地址填 http://主机IP:11434(如果不通可填 http://localhost:11434),密钥留空。
然后创建一个令牌备用。
OneAPI默认端口是3000。
第二步:配置frp服务端
将frp上传到公网服务器,解压后编辑 frps.toml:
[common]
bind_port = 7000
vhost_http_port = 8080 # 用于HTTP代理的端口,后续访问用这个端口
# 可选设置token增加安全性
authentication_method = token
token = 你的安全密钥
启动服务端:
./frps -c frps.toml &
确认监听端口正常:ss -tlnp | grep 7000。
第三步:配置frp客户端并暴露OneAPI
在内网机器上传frp客户端,编辑 frpc.toml:
[common]
server_addr = 你的公网IP
server_port = 7000
token = 你的安全密钥
[one-api]
type = http
local_ip = 127.0.0.1
local_port = 3000
custom_domains = oneapi.你的域名.com # 你需将域名解析到公网IP
# 如果不用域名,可以改为 type = tcp,remote_port = 8080,但HTTP请求不方便
启动客户端:
./frpc -c frpc.toml &
如果还要暴露Ollama原始端口(直接绕过OneAPI),可以再加一节:
[ollama]
type = tcp
local_ip = 127.0.0.1
local_port = 11434
remote_port = 11434 # 公网服务器上的端口,注意防火墙放行
第四步:配置防火墙和域名解析
- 公网服务器防火墙开放7000(frp控制端口)、8080(HTTP代理端口)、11434(如果用了tcp穿透)等端口。
- 添加域名解析A记录指向公网IP。
容易踩的坑和解决方法
- Ollama绑定127.0.0.1导致无法被OneAPI访问:一定要设置
OLLAMA_HOST=0.0.0.0。 - frp连接失败:检查公网IP是否写对,token是否一致,防火墙是否放行7000端口。在客户端加
log_file = ./frpc.log查看日志。 - OneAPI接口返回502:说明OneAPI无法连通Ollama,检查Ollama地址是否填错,或者Ollama未绑定0.0.0.0。
- 公网访问超时:可能域名未解析或解析未生效,用
curl -H "Host: oneapi.你的域名.com" http://公网IP:8080测试。 - OneAPI令牌无效:在OneAPI后台重新生成令牌,确认在请求头添加
Authorization: Bearer 你的令牌。
如何验证公网访问是否成功?
本地(或任意一台能联网的机器)执行:
# 通过OneAPI调用模型(域名方式)
curl http://oneapi.你的域名.com:8080/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer 你的OneAPI令牌" \
-d '{"model": "qwen2.5:7b", "messages": [{"role": "user", "content": "你好"}]}'
如果能正常返回JSON结果,说明整个方案成功。
也可以直接在浏览器输入 http://你的域名:8080 打开OneAPI登录页面。
常见问题解答
Q:必须用frp吗?能用其他内网穿透工具吗?
A:可以,比如Ngrok、Natapp、ZeroTier等。但frp自建更稳定,可控性高。
Q:OneAPI的端口只暴露HTTP代理,有没有安全问题?
A:OneAPI本身有令牌校验,建议开启HTTPS(使用frp的HTTPS插件或前置Nginx),并设置强密码。
Q:Ollama需要暴露原始端口吗?
A:不需要,OneAPI作为中间层就够了,更安全。
Q:公网服务器配置最低多少?
A:frp消耗极小,1核1G足够,主要看网络带宽。
如果你正在处理Ollama搭配OneAPI内网穿透公网访问方案,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。