目录
[解决 Open WebUI 访问宿主机 Ollama API "连接超时/卡住"的终极指南](#解决 Open WebUI 访问宿主机 Ollama API “连接超时/卡住”的终极指南)
[1. 现象描述:明明 IP 对了,为什么还是不通?](#1. 现象描述:明明 IP 对了,为什么还是不通?)
[2. 深度排查:为什么 ufw allow 没用?](#2. 深度排查:为什么 ufw allow 没用?)
[A. Docker 自定义网桥的"陌生感"](#A. Docker 自定义网桥的“陌生感”)
[B. UFW 对转发流量(FORWARD)的默认拦截](#B. UFW 对转发流量(FORWARD)的默认拦截)
[C. 反向路径过滤(rp_filter)](#C. 反向路径过滤(rp_filter))
[3. 最佳实践:不关防火墙的精准解决方案](#3. 最佳实践:不关防火墙的精准解决方案)
[第一步:找出容器真实的网关 IP](#第一步:找出容器真实的网关 IP)
[4. 终极自检清单](#4. 终极自检清单)
[5. 总结](#5. 总结)
解决 Open WebUI 访问宿主机 Ollama API "连接超时/卡住"的终极指南
在部署私有化 AI 平台时,Open WebUI + Ollama 是最常见的组合。然而,许多开发者在 Ubuntu 22.04 上通过 Docker 部署 Open WebUI 时,经常会遇到一个令人抓狂的问题:配置了 OLLAMA_BASE_URL,但容器内始终无法连接宿主机的 Ollama API,请求像掉进了黑洞一样"卡住"(Timeout)。
本文将带你深度剖析这一现象背后的防火墙逻辑、网络隔离及内核安全机制。
1. 现象描述:明明 IP 对了,为什么还是不通?
当你尝试在 Open WebUI 容器内通过 curl 访问宿主机 Ollama 服务时:
Bash
# 假设宿主机在网桥中的 IP 是 172.21.0.1
curl -I http://172.21.0.1:11434/api/tags
终端没有任何返回,一直处于光标闪烁状态,直到几分钟后提示 Connection timed out。而一旦执行 sudo ufw disable 关闭防火墙,连接瞬间秒通。
2. 深度排查:为什么 ufw allow 没用?
大部分人的第一反应是执行 sudo ufw allow 11434。但在 Docker 环境下,这通常不够,原因有三:
A. Docker 自定义网桥的"陌生感"
Docker Compose 默认会为项目创建一个独立的网桥(如 br-6a67...),而不是使用默认的 docker0。如果你只针对 docker0 设置规则,流量在自定义网桥入口就会被拦截。
B. UFW 对转发流量(FORWARD)的默认拦截
这是最核心的原因。当 UFW 开启时,它会将 Linux 内核的默认转发策略(FORWARD)设为 DROP。
容器访问宿主机 IP,在内核眼中是一次路由转发行为。即便你允许了"入站(INPUT)",包在"转发(FORWARD)"阶段就已经被杀掉了。
C. 反向路径过滤(rp_filter)
Ubuntu 22.04 内核开启了严格的反向路径校验。如果内核认为一个回程包的路径"不对称"(从虚拟网桥进来,从物理网卡回),会为了安全直接丢包。
3. 最佳实践:不关防火墙的精准解决方案
为了平衡安全与便捷,我们不建议关闭防火墙,也不建议修改复杂的系统规则文件(如 before.rules)。请使用以下三步精准配置:
第一步:找出容器真实的网关 IP
在宿主机执行:
Bash
docker inspect openwebui --format '{{json .NetworkSettings.Networks}}'
查看 Gateway 地址(例如 172.21.0.1)。
第二步:使用"接口通配符"精准放行
由于 Docker 的网桥 ID 是随机生成的,我们使用 br-+ 来匹配所有以 br- 开头的虚拟网桥,并放行整个 Docker 私有网段(172.16.0.0/12)。
在宿主机执行:
Bash
# 1. 允许来自 Docker 网桥的入站流量
sudo ufw allow in on br-+ from 172.16.0.0/12
# 2. 允许网桥流量转发(解决"卡住"问题的核心)
sudo ufw route allow in on br-+ from 172.16.0.0/12
# 3. 针对 Ollama 端口精准放行
sudo ufw allow from 172.16.0.0/12 to any port 11434 proto tcp
第三步:调整内核路径校验(防止静默丢包)
执行以下命令,将内核的反向路径过滤改为"松散模式":
Bash
sudo sysctl -w net.ipv4.conf.all.rp_filter=2
sudo sysctl -w net.ipv4.conf.default.rp_filter=2
4. 终极自检清单
如果配置后依然不通,请检查以下三项:
-
Ollama 监听地址:
确保宿主机的 Ollama 监听在
0.0.0.0而不是127.0.0.1。检查命令:
netstat -lnpt | grep 11434 -
Ollama 环境变量:
如果跨网段访问,Ollama 需要设置
OLLAMA_ORIGINS=*否则会拒绝连接。修改方法:
sudo systemctl edit ollama.service填入Environment="OLLAMA_ORIGINS=*"。 -
规则优先级:
执行
sudo ufw status numbered。确保没有DENY规则排在你的ALLOW规则前面。
5. 总结
在 Docker 环境下处理网络通信,"网段对齐"和 "转发权限"是关键。通过 br-+ 通配符和 ufw route allow 命令,我们可以在保持 Ubuntu 系统高度安全的前提下,优雅地解决 Open WebUI 与宿主机服务的通信瓶颈。