保护 Ollama 服务器:身份验证、反向代理、 exposition
当 Ollama 守护进程可从本机以外访问时,安全防护就是必须采取的措施。互联网上有成千上万个实例毫无访问控制,任何发现它们的人都能免费使用其 GPU 计算资源,有时后果还要严重得多。本指南介绍如何检查服务的暴露情况、通过反向代理为 API 添加身份验证、加密流量,以及如何以妥当的方式开放远程访问。
#为什么保护 Ollama 的安全刻不容缓
Ollama 没有任何原生身份验证机制。守护进程只负责监听和处理请求,仅此而已:它假定只有本机上受信任的客户端会与它通信。只要服务仅通过 http://localhost:11434 访问,这种设计就成立。一旦修改环境变量,使服务可以通过网络访问,问题就会出现——连接远程界面或另一台机器时,经常会这样操作。
将 OLLAMA_HOST 设置为 0.0.0.0 将使守护进程监听所有网络接口。如果防火墙未阻止端口 11434,API 将对局域网开放,若设备拥有公网 IP 或路由器端口转发,则可能对整个互联网开放。无需密码、无需令牌:任何人都可以发送请求、下载或删除您的模型,并使用您的 GPU。
#Ollama API 实际暴露的内容
在工作场所部署本地 AI:GDPR、AI 法案、多用户架构、成本、供管理层参考的说明材料。
- 在线空间,终身可用
- PDF + 文件
- 30 天内退款
在采取任何保护措施之前,必须先了解攻击面的范围。Ollama API 不只是一个聊天端点:它是一套完整的管理 API,不区分权限级别。匿名客户端拥有与您完全相同的权限。
- /api/generate et /api/chat
- 文本生成。可任意占用您的 GPU 资源,并接触所有传入的提示词——因此也可能接触您自己的应用注入的敏感数据。
- /api/tags
- 列出所有已安装的模型。攻击者可立即得知您部署了哪些模型,包括任何内部微调版本。
- /api/pull
- 可从任意注册表下载模型。第三方可能耗尽您的磁盘空间或安装被植入恶意内容的模型。
- /api/delete
- 删除模型。在无需身份验证的情况下可能造成数据丢失。
- /api/create et /api/push
- 根据 Modelfile 创建模型,并推送到模型仓库。实例可能被完全劫持。
- /v1/*
- 同一端口上的 OpenAI 兼容层。同样没有访问控制,任何标准 OpenAI 客户端都可使用。
#确认您的 Ollama 是否已暴露
先如实检查当前状况。目标是确认守护进程监听哪些网络接口,以及能否从外部访问该端口。共做三项检查,按从本机到外部的顺序进行。
首先,检查进程监听的地址。监听127.0.0.1表示正常;监听0.0.0.0或特定网络IP则说明服务可接受远程连接。
接下来,从同一网络中的另一台设备进行测试。将 IP_DU_SERVEUR 替换为运行 Ollama 的设备的本地地址。如果命令返回模型列表,说明该实例可通过网络访问——在可信局域网中,这可以接受,但绝不能在未设置访问过滤的情况下将其开放到互联网。
最后,检查服务是否暴露在公网。如果您的机器有公网 IP,或已启用端口转发,请在 Shodan 或 Censys 等联网设备搜索引擎上搜索该机器。按端口 11434 和 Ollama 服务标识进行简单查询,即可判断您的实例是否已被索引。您也可以直接测试您的公网 IP。
#步骤 1——恢复 localhost 监听
第一项措施,也是往往唯一需要的措施,是让 Ollama 恢复默认行为:仅监听本地回环地址。如果随后要在前面部署反向代理,就没有理由直接暴露 Ollama 的端口。代理会在本地与 Ollama 通信,外部则只与代理通信。
在 Linux 上,Ollama 作为 systemd 服务运行。OLLAMA_HOST 变量通过服务覆盖配置设置,因此软件包更新后,这项设置仍会保留。
- 01编辑服务的覆盖配置打开 ollama 服务的 systemd 覆盖编辑器。这会创建一个独立的 drop-in 文件,而不会修改原始服务文件。
- 02强制仅在本机监听请将 OLLAMA_HOST 设置为 127.0.0.1:11434。此时服务端将拒绝来自网络的任何连接。
- 03重新加载并重启重新加载systemd配置并重启服务以应用变量。
- 04确认请再次通过ss -tlnp | grep 11434确认:地址应为127.0.0.1,而非0.0.0.0
#步骤 2 — 通过反向代理添加身份验证
由于 Ollama 本身不支持身份验证,这项职责由部署在它前面的反向代理承担。代理要求提供登录标识、检查流量,然后将请求转发给本地的 Ollama。有两种成熟方案:Caddy(配置简单、自动处理 TLS)和 nginx(应用广泛、文档非常丰富)。
#选项 A——Caddy(因简单易用而推荐)
Caddy 通过 Let's Encrypt 自动管理 TLS,并可通过几行代码配置基本身份验证。首先生成密码的哈希值,然后在 Caddyfile 中引用该哈希值。切勿以明文形式存储密码。
只要有一个指向您公网 IP 的域名,并开放 80/443 端口,Caddy 就会自动获取并续期 TLS 证书。客户端必须在每次请求中通过 Authorization 请求头提供身份标识。
#选项 B — nginx
nginx 需要一个用 htpasswd 生成的独立密码文件,然后需要一个 server 块来执行身份验证并将请求转发给 Ollama。这种配置更冗长,但应用十分广泛,尤其是在 nginx 已经为其他服务提供支持的情况下。
#步骤3 — 加密流量(TLS)
基本身份验证会传输经 base64 编码的用户标识:没有 TLS 时,它几乎以明文形式传输,很容易被截获。因此,只要访问范围超出 localhost,传输加密就不是可选项。根据您是否拥有公共域名,可分为两种情况。
- 公网域名 + 端口 80/443
- 通过 Caddy(自动)获取 Let's Encrypt 证书,或为 nginx 使用 certbot。证书受信任,浏览器不会显示警告,并会自动续期。
- 没有公共域名的内部网络
- 自签名证书或内部证书颁发机构(mkcert)。客户端需要信任该证书,但局域网内的流量仍会加密传输。
- 通过VPN访问
- VPN 隧道已对所有流量进行加密。TLS 仍建议作为纵深防御措施,但由于外部人员无法访问代理,因此其重要性降低。
#第 4 步 —— 安全远程访问:VPN 和 Tailscale
最重要的问题:您真的需要将 Ollama 暴露在互联网上吗?在绝大多数情况下,不需要。您希望从自己的设备访问,而不是从开放网络访问。一个私有网络(VPN)能完全满足这一需求,且永远不会公开暴露端口。
Tailscale 是最简单的选择:它在您的机器之间建立加密的网状网络(WireGuard),并提供稳定的私有 IP 地址。此时,Ollama 仅监听 Tailscale 接口,只有在您的 tailnet 中通过身份验证的设备才能连接它。无需端口转发,也不暴露任何公网 IP 地址。
- 01在服务器上安装 Tailscale安装客户端并连接设备到您的Tailnet。设备将获得一个100.x.y.z的私有IP地址,仅能从已认证的其他设备访问。
- 02将 Ollama 绑定到 Tailscale 网络接口请将OLLAMA_HOST设置为机器的Tailscale IP地址(或保持127.0.0.1,并通过Tailscale Serve暴露服务)。该端口仅在tailnet内可访问。
- 03在您的客户端设备上安装 Tailscale您的其他设备接入同一个 tailnet,并通过 Ollama 的 IP 地址 100.x.y.z 访问它;无论您身在何处,都无需在路由器上开放任何端口。
- 04检查隔离性从 tailnet 之外的外部网络访问时,该端口应完全无法连接。这是预期行为。
如果您坚持使用传统 VPN,自托管 WireGuard 可以实现相同效果,并提供更多控制权:搭建隧道,将 Ollama 绑定到 wg0 接口,端口便不会暴露在互联网上。选择 Tailscale 还是直接使用 WireGuard,主要取决于您如何权衡简单易用与对基础设施的完全自主控制。
#进一步加强网络安全
除了代理和 VPN 之外,一些纵深防御措施能在配置错误时减轻损失。核心原则是:绝不依赖单一防护层。
- 严格的防火墙规则
- 禁止所有接口(除 loopback 和 VPN)的 11434 端口入站。使用 ufw:默认拒绝 11434,仅允许来自 Tailscale/WireGuard 子网的访问。
- 不要设置端口转发
- 切勿在光猫/路由器上创建 11434 端口的端口转发。如果您有一个“用于测试”的转发,请删除它:这是导致实例暴露的第一大原因。
- 请求速率限制
- 在反向代理上配置请求速率限制,以减轻可能发生的滥用,即使用户已通过身份验证也要如此(nginx limit_req、Caddy rate_limit)。
- 强密码与轮换
- 基本认证的安全性完全取决于密码强度。请使用长密码,并在客户端设备被攻破时更换密码。
- 日志记录
- 启用代理的访问日志,以发现异常访问尝试。正常运行的实例只会收到您的请求。
#故障排除
- 通过代理访问时出现 403 Forbidden
- Ollama 拒绝 Host 头部。请在代理端强制设置 Host 为 localhost:11434,或设置 OLLAMA_ORIGINS 以允许您的域名。
- 流式输出停滞或一次性返回
- 代理会缓冲响应。关闭缓冲(在nginx中设置proxy_buffering off),并增加读取超时时间,以适应长时间的生成过程。
- curl fonctionne mais pas depuis une autre machine
- Ollama 仍在 127.0.0.1 上监听,而代理位于其他位置,或防火墙阻止了代理的 443 端口。请检查 ss -tlnp 和 ufw 规则。
- Let's Encrypt证书申请失败
- 为了完成 HTTP-01 验证,端口 80 必须可以从互联网访问,且域名必须指向正确的 IP 地址。请检查 DNS 配置和端口 80 的开放情况。
- Tailscale:Ollama 在 tailnet 中不可达
- 未配置 tailscale serve 时,Ollama 监听的是 127.0.0.1。可以通过 OLLAMA_HOST 将监听地址绑定到 100.x IP,也可以通过 tailscale serve 11434 对外提供访问。
- 修复后仍能在 Shodan 上查到
- 索引刷新需要时间。请先亲自从外部网络确认端口已经关闭;索引随后会更新。
#深入了解
保障访问安全只是其中一个方面。以下指南在本指南的基础上,进一步介绍部署与合规:
- 在内部网上为团队部署 AI 聊天机器人
- 这种安全加固的典型应用场景是:将支持多用户的 Ollama + Open WebUI 部署在带身份验证的反向代理后面。
- 使用 Docker Compose 在生产环境中部署 LLM
- 完整的 Ollama + Traefik 技术栈,从设计之初就已考虑反向代理和网络隔离。
- 本地 LLM 与 GDPR:企业隐私数据合规
- 法规层面的对应问题:未受控的对外暴露也会带来个人数据泄露风险,需要对此加以记录。
有反馈、发现了错误,或想补充说明?请告诉我们,让这份指南对每个人都更有帮助。