高级 13 分钟安全

保护 Ollama 服务器:身份验证、反向代理、 exposition

当 Ollama 守护进程可从本机以外访问时,安全防护就是必须采取的措施。互联网上有成千上万个实例毫无访问控制,任何发现它们的人都能免费使用其 GPU 计算资源,有时后果还要严重得多。本指南介绍如何检查服务的暴露情况、通过反向代理为 API 添加身份验证、加密流量,以及如何以妥当的方式开放远程访问。

作者: Mohamed Meguedmi·更新于 2026-07-30·已在 Windows、macOS 和 Linux 上测试

#为什么保护 Ollama 的安全刻不容缓

Ollama 没有任何原生身份验证机制。守护进程只负责监听和处理请求,仅此而已:它假定只有本机上受信任的客户端会与它通信。只要服务仅通过 http://localhost:11434 访问,这种设计就成立。一旦修改环境变量,使服务可以通过网络访问,问题就会出现——连接远程界面或另一台机器时,经常会这样操作。

将 OLLAMA_HOST 设置为 0.0.0.0 将使守护进程监听所有网络接口。如果防火墙未阻止端口 11434,API 将对局域网开放,若设备拥有公网 IP 或路由器端口转发,则可能对整个互联网开放。无需密码、无需令牌:任何人都可以发送请求、下载或删除您的模型,并使用您的 GPU。

!
具体风险
打开一个 Ollama 实例,意味着将 GPU 计算资源提供给未知用户(用于生成恶意内容或在您的 IP 地址下进行响应挖掘),并存在潜在泄露风险:您发送的提示词以及本地部署的微调模型将变得可被第三方查看和操作。

#Ollama API 实际暴露的内容

企业本地 AI 套件

在工作场所部署本地 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 客户端都可使用。
i
不支持细粒度权限控制
Ollama 不了解用户或角色的概念,没有只读模式。唯一的安全边界是网络:要么可以访问端口,要么不能。因此,整个策略都取决于哪些主体有权访问 11434 端口。

#确认您的 Ollama 是否已暴露

先如实检查当前状况。目标是确认守护进程监听哪些网络接口,以及能否从外部访问该端口。共做三项检查,按从本机到外部的顺序进行。

首先,检查进程监听的地址。监听127.0.0.1表示正常;监听0.0.0.0或特定网络IP则说明服务可接受远程连接。

终端 — 检查监听套接字
# Voir sur quelle interface Ollama écoute (Linux)
ss -tlnp | grep 11434

# Alternative si ss n'est pas disponible
sudo lsof -i :11434

# Vérifier la variable qui contrôle l'écoute
systemctl show ollama --property=Environment 2>/dev/null | grep -i host
echo $OLLAMA_HOST

接下来,从同一网络中的另一台设备进行测试。将 IP_DU_SERVEUR 替换为运行 Ollama 的设备的本地地址。如果命令返回模型列表,说明该实例可通过网络访问——在可信局域网中,这可以接受,但绝不能在未设置访问过滤的情况下将其开放到互联网。

终端 — 从另一台机器测试
# Depuis un autre poste du réseau local
curl http://IP_DU_SERVEUR:11434/api/tags

# Réponse = liste JSON des modèles => l'instance répond aux tiers

最后,检查服务是否暴露在公网。如果您的机器有公网 IP,或已启用端口转发,请在 Shodan 或 Censys 等联网设备搜索引擎上搜索该机器。按端口 11434 和 Ollama 服务标识进行简单查询,即可判断您的实例是否已被索引。您也可以直接测试您的公网 IP。

终端 — 检查公开访问状态
# Récupérer votre IP publique
curl -s https://api.ipify.org; echo

# Tester si le port 11434 répond depuis internet (depuis un réseau externe,
# ex. partage 4G du téléphone, pas depuis le LAN)
curl http://VOTRE_IP_PUBLIQUE:11434/api/tags
→
Shodan 搜索
在 shodan.io 上,查询 product:"Ollama" 或 port:11434 "Ollama is running" 可列出公开暴露的实例。请搜索您的 IP 地址,确认您的实例未被列出。存在漏洞的实例就是这样被批量发现的。

#步骤 1——恢复 localhost 监听

第一项措施,也是往往唯一需要的措施,是让 Ollama 恢复默认行为:仅监听本地回环地址。如果随后要在前面部署反向代理,就没有理由直接暴露 Ollama 的端口。代理会在本地与 Ollama 通信,外部则只与代理通信。

在 Linux 上,Ollama 作为 systemd 服务运行。OLLAMA_HOST 变量通过服务覆盖配置设置,因此软件包更新后,这项设置仍会保留。

  1. 01
    编辑服务的覆盖配置
    打开 ollama 服务的 systemd 覆盖编辑器。这会创建一个独立的 drop-in 文件,而不会修改原始服务文件。
  2. 02
    强制仅在本机监听
    请将 OLLAMA_HOST 设置为 127.0.0.1:11434。此时服务端将拒绝来自网络的任何连接。
  3. 03
    重新加载并重启
    重新加载systemd配置并重启服务以应用变量。
  4. 04
    确认
    请再次通过ss -tlnp | grep 11434确认:地址应为127.0.0.1,而非0.0.0.0
终端 — 强制本地监听(systemd)
# Ouvre un éditeur pour un drop-in override
sudo systemctl edit ollama
文件 — override.conf
[Service]
Environment="OLLAMA_HOST=127.0.0.1:11434"
终端 — 应用并验证
sudo systemctl daemon-reload
sudo systemctl restart ollama

# L'écoute doit revenir sur 127.0.0.1
ss -tlnp | grep 11434
i
Docker和macOS
在容器中运行时,不要使用 -p 11434:11434 发布端口(这会使端口在所有网络接口上开放):请使用 -p 127.0.0.1:11434:11434;更好的做法是让端口仅在 Docker 网络内部可用,只通过反向代理容器对外暴露。在 macOS 上,通过 launchctl setenv 设置环境变量 OLLAMA_HOST,然后重新启动应用。

#步骤 2 — 通过反向代理添加身份验证

由于 Ollama 本身不支持身份验证,这项职责由部署在它前面的反向代理承担。代理要求提供登录标识、检查流量,然后将请求转发给本地的 Ollama。有两种成熟方案:Caddy(配置简单、自动处理 TLS)和 nginx(应用广泛、文档非常丰富)。

#选项 A——Caddy(因简单易用而推荐)

Caddy 通过 Let's Encrypt 自动管理 TLS,并可通过几行代码配置基本身份验证。首先生成密码的哈希值,然后在 Caddyfile 中引用该哈希值。切勿以明文形式存储密码。

终端 — 生成密码哈希值
# Génère un hash bcrypt à coller dans le Caddyfile
caddy hash-password --plaintext 'VotreMotDePasseFort'
文件 — Caddyfile
ollama.mondomaine.fr {
    # Authentification basique (utilisateur : admin)
    basic_auth {
        admin $2a$14$le_hash_genere_ci_dessus
    }

    # Relais vers Ollama en local
    reverse_proxy 127.0.0.1:11434
}

只要有一个指向您公网 IP 的域名,并开放 80/443 端口,Caddy 就会自动获取并续期 TLS 证书。客户端必须在每次请求中通过 Authorization 请求头提供身份标识。

终端 — 调用受保护的 API
# L'accès nécessite désormais des identifiants
curl -u admin:VotreMotDePasseFort https://ollama.mondomaine.fr/api/tags

#选项 B — nginx

nginx 需要一个用 htpasswd 生成的独立密码文件,然后需要一个 server 块来执行身份验证并将请求转发给 Ollama。这种配置更冗长,但应用十分广泛,尤其是在 nginx 已经为其他服务提供支持的情况下。

终端 — 创建凭证文件
# Paquet apache2-utils (Debian/Ubuntu) ou httpd-tools (Fedora)
sudo htpasswd -c /etc/nginx/.ollama_htpasswd admin
文件 — /etc/nginx/sites-available/ollama
server {
    listen 443 ssl;
    server_name ollama.mondomaine.fr;

    ssl_certificate     /etc/letsencrypt/live/ollama.mondomaine.fr/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/ollama.mondomaine.fr/privkey.pem;

    location / {
        auth_basic           "Ollama";
        auth_basic_user_file /etc/nginx/.ollama_htpasswd;

        proxy_pass http://127.0.0.1:11434;
        proxy_set_header Host localhost:11434;

        # Le streaming des tokens ne doit pas être bufferisé
        proxy_buffering off;
        proxy_read_timeout 600s;
    }
}
!
必须设置Host请求头
Ollama 默认会拒绝 Host 头部不为 localhost 的请求(防止 DNS 重绑定攻击)。若通过反向代理使用,请设置 proxy_set_header Host localhost:11434(Nginx)或等效配置,否则将收到 403 错误。

#步骤3 — 加密流量(TLS)

基本身份验证会传输经 base64 编码的用户标识:没有 TLS 时,它几乎以明文形式传输,很容易被截获。因此,只要访问范围超出 localhost,传输加密就不是可选项。根据您是否拥有公共域名,可分为两种情况。

公网域名 + 端口 80/443
通过 Caddy(自动)获取 Let's Encrypt 证书,或为 nginx 使用 certbot。证书受信任,浏览器不会显示警告,并会自动续期。
没有公共域名的内部网络
自签名证书或内部证书颁发机构(mkcert)。客户端需要信任该证书,但局域网内的流量仍会加密传输。
通过VPN访问
VPN 隧道已对所有流量进行加密。TLS 仍建议作为纵深防御措施,但由于外部人员无法访问代理,因此其重要性降低。
终端 — 为 nginx 配置 Let's Encrypt 证书
# Obtenir et installer le certificat, avec renouvellement automatique
sudo certbot --nginx -d ollama.mondomaine.fr

# Tester le renouvellement à blanc
sudo certbot renew --dry-run
→
使用Caddy无需任何配置
如果您使用 Caddy,配置了公网域名并开放了端口,TLS 就已经就绪:Caddy 会自动申请并续期证书,无需人工干预。这是在追求快速、安全部署时优先选择 Caddy 的主要原因。

#第 4 步 —— 安全远程访问:VPN 和 Tailscale

最重要的问题:您真的需要将 Ollama 暴露在互联网上吗?在绝大多数情况下,不需要。您希望从自己的设备访问,而不是从开放网络访问。一个私有网络(VPN)能完全满足这一需求,且永远不会公开暴露端口。

Tailscale 是最简单的选择:它在您的机器之间建立加密的网状网络(WireGuard),并提供稳定的私有 IP 地址。此时,Ollama 仅监听 Tailscale 接口,只有在您的 tailnet 中通过身份验证的设备才能连接它。无需端口转发,也不暴露任何公网 IP 地址。

  1. 01
    在服务器上安装 Tailscale
    安装客户端并连接设备到您的Tailnet。设备将获得一个100.x.y.z的私有IP地址,仅能从已认证的其他设备访问。
  2. 02
    将 Ollama 绑定到 Tailscale 网络接口
    请将OLLAMA_HOST设置为机器的Tailscale IP地址(或保持127.0.0.1,并通过Tailscale Serve暴露服务)。该端口仅在tailnet内可访问。
  3. 03
    在您的客户端设备上安装 Tailscale
    您的其他设备接入同一个 tailnet,并通过 Ollama 的 IP 地址 100.x.y.z 访问它;无论您身在何处,都无需在路由器上开放任何端口。
  4. 04
    检查隔离性
    从 tailnet 之外的外部网络访问时,该端口应完全无法连接。这是预期行为。
终端 — 服务器上运行Tailscale
# Installation (Linux)
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up

# Récupérer l'IP Tailscale de la machine
tailscale ip -4

# Exposer Ollama proprement dans le tailnet (HTTPS + identité tailnet)
tailscale serve --bg 11434
i
Tailscale Serve 也管理 TLS
tailscale serve 会在 Ollama 前端设置一个 TLS 代理,使用对您的 tailnet 域名有效的证书,并将访问权限限制为网络成员。这通常是最简洁的方案:同时提供加密和访问控制,无需手动配置反向代理,也无需向互联网开放端口。

如果您坚持使用传统 VPN,自托管 WireGuard 可以实现相同效果,并提供更多控制权:搭建隧道,将 Ollama 绑定到 wg0 接口,端口便不会暴露在互联网上。选择 Tailscale 还是直接使用 WireGuard,主要取决于您如何权衡简单易用与对基础设施的完全自主控制。

#进一步加强网络安全

除了代理和 VPN 之外,一些纵深防御措施能在配置错误时减轻损失。核心原则是:绝不依赖单一防护层。

严格的防火墙规则
禁止所有接口(除 loopback 和 VPN)的 11434 端口入站。使用 ufw:默认拒绝 11434,仅允许来自 Tailscale/WireGuard 子网的访问。
不要设置端口转发
切勿在光猫/路由器上创建 11434 端口的端口转发。如果您有一个“用于测试”的转发,请删除它:这是导致实例暴露的第一大原因。
请求速率限制
在反向代理上配置请求速率限制,以减轻可能发生的滥用,即使用户已通过身份验证也要如此(nginx limit_req、Caddy rate_limit)。
强密码与轮换
基本认证的安全性完全取决于密码强度。请使用长密码,并在客户端设备被攻破时更换密码。
日志记录
启用代理的访问日志,以发现异常访问尝试。正常运行的实例只会收到您的请求。
终端 — 防火墙 ufw(仅允许VPN)
# Refuser l'accès direct au port depuis le réseau
sudo ufw deny 11434

# N'autoriser que le sous-réseau Tailscale (exemple)
sudo ufw allow from 100.64.0.0/10 to any port 11434

sudo ufw status verbose

#故障排除

通过代理访问时出现 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:企业隐私数据合规
法规层面的对应问题:未受控的对外暴露也会带来个人数据泄露风险,需要对此加以记录。
这份指南对您有帮助吗?

有反馈、发现了错误,或想补充说明?请告诉我们,让这份指南对每个人都更有帮助。