Cover Image Source: Source
相关链接:
访问远程容器内的 Ollama 服务
DeepSeek-R1 问世之后,我打算自己用 Ollama 部署一个 DeepSeek-R1 的 32B 蒸馏版玩玩,手上能用的算力资源只有部署在实验室服务器上的 docker 容器。刚开始上手时,我打算使用 Chatbox 连接远程的 Ollama 服务,却发现容器部署的时候没有设置端口映射,因此不能远程直接访问 Ollama 服务监听的 localhost:11434 端口,只能作罢,改用 ssh 直接访问容器进行使用。
一段时间后我突然想到:为什么不直接使用ssh的端口转发功能呢?想毕,直接上手尝试,果然可行,遂记录下使用方法。
SSH 端口转发介绍
以下内容由 deepseek-r1:32b 生成:
SSH(Secure Shell)不仅用于安全地登录远程服务器,还可以通过端口转发功能在不同的网络之间传输数据。这在需要访问被防火墙保护的内部服务或从外部访问本地服务时非常有用。
1.
ssh -L(本地端口转发)功能描述:
-L是“Local”(本地)的缩写,用于将本地计算机的一个端口上的流量通过 SSH 连接转发到远程服务器,然后进一步转发到目标地址和端口。- 这种方式适用于访问位于远程网络内部、无法直接从外部访问的服务。
语法:
Terminal window ssh -L [本地端口]:[目标地址]:[目标端口] 用户名@远程服务器工作流程:
- 本地机器监听指定的本地端口(如 8080)。
- 当有流量通过该端口发送到 SSH 客户端时,SSH 将这些数据加密并转发到
远程服务器。- 远程服务器接收到请求后,将数据解密并转发到
[目标地址]:[目标端口]。示例: 假设你希望通过本地机器访问公司内部的 Web 服务(运行在服务器
internal-web的 80 端口),而该服务仅对公司内部网络开放。你可以这样做:Terminal window ssh -L 8080:internal-web:80 用户名@example.com
- 这样,当你访问本地的
localhost:8080时,实际连接的是example.com的 SSH 服务器,然后被转发到internal-web:80。2.
ssh -R(远程端口转发)功能描述:
-R是“Remote”(远程)的缩写,允许远程服务器上的一个端口接收到的数据通过 SSH 连接转发到本地机器或其他目标地址和端口。- 这种方式适用于从外部访问本地服务,例如让朋友连接你的本地开发环境。
语法:
Terminal window ssh -R [远程端口]:[目标地址]:[目标端口] 用户名@远程服务器工作流程:
- 远程服务器监听指定的远程端口(如 2222)。
- 当有流量通过该端口发送到 SSH 服务器时,SSH 将这些数据加密并转发到本地机器或其他目标地址和端口。
示例: 假设你想让朋友能够连接你本地运行的一个服务(如 SSH 服务在本地的 22 端口),你可以这样做:
Terminal window ssh -R 2222:localhost:22 用户名@example.com
- 这样,当有人连接到
example.com的 2222 端口时,数据会被转发到你的本地机器的 22 端口。3. 区别与应用场景
特性 -L(本地端口转发)-R(远程端口转发)数据流向 本地 → 远程服务器 → 目标地址 远程服务器 → 本地或其他目标地址 常见用途 访问内部网络服务,如公司内部 Web 应用 允许外部访问本地服务,如开发环境 注意事项
- 权限问题: 确保 SSH 服务器允许端口转发。默认情况下,一些服务器可能禁用了
-R转发以防止潜在的安全风险。- 目标地址可达性: 在
-L中,目标地址必须是远程服务器能够访问的;在-R中,目标地址可以是本地或其他网络中的机器。通过合理使用
ssh -L和ssh -R,你可以在复杂的网络环境中安全地访问所需的服务。
可以看出利用 ssh -L 指令可以将本地计算机的端口上的端口流量转发到远程服务器的目标端口上,因此考虑将本地的 11434 端口转发到 labserver (远程容器的 Host Name)的 11434 端口,命令如下:
ssh -L 11434:localhost:11434 labserver运行之后在 Chatbox 中成功访问远程容器中的 Ollama 服务。
访问远程容器上的 Open WebUI 服务
成功访问 ollama 服务,我想到:能否使用 Open WebUI 来调用 Ollama 服务上的模型呢?这里存在两种方案:
- 在本地部署 Open WebUI,连接远程的 Ollama 服务
- 在远程容器上同时部署 Open WebUI 和 Ollama
为了能够在多台电脑上使用 Open WebUI,我选择第二种方案。我在远程容器上用 pip 安装了 Open WebUI,服务运行在 localhost:8080 端口上。由于 Open WebUI 和 Ollama 在同一容器中,因此使用 ssh 时不再需要转发 11434 端口。命令如下:
ssh -L 8080:localhost:8080 labserver联网搜索
成功访问远程容器上的 Open WebUI 服务后,我又遇到了新的困难。使用联网搜索功能时,远程容器无法访问许多网页,导致联网搜索功能失效。由于本地个人电脑可以启动网络代理访问这些网页,因此考虑使用 ssh -R 命令来反向转发流量。假设个人电脑上的网络代理为 127.0.0.1:7897,在远程服务器上运行如下命令:
export https_proxy=http://127.0.0.1:7890export http_proxy=http://127.0.0.1:7890export all_proxy=socks5://127.0.0.1:7890并在同一终端中启动 Open WebUI 服务。接着在本地服务器上运行:
ssh -R labserver:7890:localhost:7897 -L 8080:localhost:8080 labserver然而打开网页后发现 Open WebUI 无法找到 Ollama 上的模型了。略加思索发现由于远程服务器的网络流量转发到个人电脑上了,而个人电脑的 localhost:11434 端口并没有运行 Ollama 服务,因此只要将流量转发回去就行了。新的命令如下:
ssh -R labserver:7890:localhost:7897 -L 8080:localhost:8080 -L 11434:localhost:11434 labserver成功访问!
如果想要后台挂起,可以使用如下命令:
ssh -fN -R labserver:7890:localhost:7897 -L 8080:localhost:8080 -L 11434:localhost:11434 labserver