Usar Ollama desde otro ordenador o desde el móvil, sin exponerlo

Por MV2 de Munim, Inc. Comprobado el 12 de octubre de 2026 con las preguntas frecuentes de Ollama, el código fuente del servidor de Ollama (server/routes.go), la documentación de Tailscale Serve, la página HTTPS using Tailscale de Open WebUI y la documentación del servidor de LM Studio. Solo para sus propias máquinas. Esta página se tradujo con IA del original en inglés; si hay diferencias, prevalece el original.

El consejo habitual es «defina OLLAMA_HOST=0.0.0.0» (o active Settings → Expose Ollama to the network en la aplicación de macOS y Windows). Funciona, pero la API de Ollama no tiene inicio de sesión, así que también permite que cualquier dispositivo de esa red use sus modelos, los descargue y los borre, y llegue a los endpoints donde están los CVE de Ollama de este año (en inglés). Si alguna vez el puerto se reenvía en el router, eso significa todo internet. Elija la opción más restringida que le sirva:

QuiereUseQuién más puede llegar a Ollama
Un portátil suyo, de vez en cuandoA. Túnel SSHNadie. No se abre nada nuevo.
Chatear desde el móvil, en casa o fueraB. Open WebUI a través de Tailscale ServeSolo su tailnet, y solo a través del inicio de sesión de Open WebUI. Ollama se queda en localhost.
Aplicaciones en otros dispositivos que hablan con la API de Ollama (herramientas de otro PC, n8n, una app del móvil)C. Ollama en su tailnetLos dispositivos de su tailnet
Otras máquinas de la misma red domésticaD. Red local más una regla de cortafuegosCualquier dispositivo de esa red, sin inicio de sesión

No haga esto: reenviar el puerto 11434 en el router; usar tailscale funnel, ngrok o cloudflared con Ollama sin el control de acceso del proveedor (los tres lo publican en internet); ni definir OLLAMA_ORIGINS=* «para que funcione». Esto último cambia qué sitios web pueden llamarlo, no qué dispositivos (vea la comprobación del navegador (en inglés)).

A. Túnel SSH: un portátil, nada que abrir

Deje Ollama en su valor por defecto 127.0.0.1:11434 en la máquina con GPU. Desde el portátil:

ssh -N -L 11434:127.0.0.1:11434 you@gpu-box

Mientras se ejecuta, http://127.0.0.1:11434 en el portátil es el Ollama de la máquina con GPU, así que ollama list, Open WebUI y todo lo que use localhost por defecto funciona sin más. Pruébelo con curl http://127.0.0.1:11434/api/version. Si el portátil tiene su propio Ollama en 11434, reenvíe otro puerto (-L 11435:127.0.0.1:11434) y apunte los clientes a él, por ejemplo OLLAMA_HOST=127.0.0.1:11435 ollama list.

(En el comando, sustituya you@gpu-box por su usuario y el nombre de la máquina con GPU.) La máquina con GPU necesita un servidor SSH: en Linux suele estar ya activo; en macOS, active Ajustes del Sistema → General → Compartir → Sesión remota; en Windows, añada la característica opcional «Servidor OpenSSH». El cliente ssh viene incluido en Windows 10/11, macOS y Linux. Así también se supera la comprobación de Host de Ollama (vea más abajo), porque la petición va dirigida a 127.0.0.1.

B. Desde el móvil: Open WebUI a través de Tailscale Serve

Para chatear desde el móvil, ponga el móvil en una red privada con el servidor y acceda a Open WebUI, no a Ollama. Ollama nunca sale de localhost, y las cuentas de Open WebUI siguen siendo la puerta de entrada.

  1. Instale Tailscale en el servidor y en el móvil e inicie sesión con la misma cuenta en ambos.
  2. Mantenga Open WebUI en localhost. En Docker: -p 127.0.0.1:3000:8080 (en Compose: ports: [ "127.0.0.1:3000:8080" ]), con Ollama accesible en OLLAMA_BASE_URL como antes.
  3. En el servidor:
    tailscale serve --bg 3000
    tailscale serve status
    El estado muestra su dirección, https://<machine>.<tailnet>.ts.net (con el nombre de su máquina y de su tailnet). Tailscale Serve necesita que los certificados HTTPS estén activados en su tailnet; si no lo están, la primera ejecución le lleva a una página de consentimiento. --bg hace que siga funcionando tras reiniciar.
  4. Indique a Open WebUI su dirección, como dice su página de Tailscale: WEBUI_URL=https://<machine>.<tailnet>.ts.net y CORS_ALLOW_ORIGIN=https://<machine>.<tailnet>.ts.net. Vuelva a crear el contenedor. (Por qué importan, y los ajustes de cookies y de clave secreta: Open WebUI behind a proxy (en inglés).)
  5. En el móvil, abra esa dirección e inicie sesión. Con «Añadir a pantalla de inicio» se convierte en un icono de app. La documentación de Open WebUI indica que funciones del navegador como las llamadas de voz necesitan HTTPS, y Serve se lo da.

Pruébelo: desactive el wifi del móvil y recargue: debería seguir funcionando con datos móviles. Un dispositivo que no esté en su tailnet no debería cargar la dirección en absoluto. Si el registro está abierto en Open WebUI, ciérrelo (ENABLE_SIGNUP=False) después de crear sus cuentas. Para deshacerlo: tailscale serve reset.

No use tailscale funnel. Funnel hace pública en internet la misma dirección. La documentación de Open WebUI lo advierte, y teniendo en cuenta los avisos de seguridad de Open WebUI de septiembre (en inglés), una tailnet privada es la opción por defecto más segura.

C. La propia API de Ollama en su tailnet

Algunos clientes necesitan la API directa: Ollama en otro PC, n8n o un script en otro servidor, apps del móvil que se conectan directamente a una URL de Ollama.

Por qué tailscale serve 11434 devuelve 403

El paso obvio, poner tailscale serve delante de un Ollama que solo escucha en localhost, recibe 403 Forbidden en cada petición. No es culpa de Tailscale. Cuando Ollama escucha en una dirección de loopback, su allowedHostsMiddleware comprueba la cabecera Host de la petición. Solo acepta localhost, el nombre de host de la propia máquina, nombres que terminan en .localhost, .local o .internal, y las IP de loopback, privadas o de interfaces locales. Esa comprobación protege frente al DNS rebinding desde sitios web. Serve transmite <machine>.<tailnet>.ts.net, que no está en la lista. Puede verlo en el propio servidor: curl http://127.0.0.1:11434/api/version responde, mientras que curl -H "Host: gpu-box.example.ts.net" http://127.0.0.1:11434/api/version recibe 403. Cuando Ollama escucha en una dirección que no es de loopback, se salta esta comprobación.

Solución 1 (cualquier sistema): vincular Ollama solo a la dirección de Tailscale

  1. Obtenga la dirección IPv4 del servidor en la tailnet: tailscale ip -4 (por ejemplo 100.101.102.103).
  2. Defina OLLAMA_HOST=100.101.102.103:11434 como describen las preguntas frecuentes de Ollama. Linux: sudo systemctl edit ollama.service, añada Environment="OLLAMA_HOST=100.101.102.103:11434" bajo [Service] y después sudo systemctl daemon-reload && sudo systemctl restart ollama. Aplicación de macOS: launchctl setenv OLLAMA_HOST "100.101.102.103:11434" y luego cierre y vuelva a abrir Ollama. Windows: cierre Ollama, defina OLLAMA_HOST en «Editar las variables de entorno de esta cuenta» y después inícielo desde el menú Inicio. Deje desactivado el interruptor «Expose Ollama to the network» de la aplicación.
  3. Compruebe en qué escucha realmente (Linux ss -tlnp | grep 11434, macOS lsof -nP -iTCP:11434 -sTCP:LISTEN, Windows netstat -ano | findstr :11434). Debe ver la dirección 100.x, no 0.0.0.0 ni *.
  4. Los clientes usan http://100.101.102.103:11434, o el nombre MagicDNS de la máquina, como http://gpu-box:11434. Para la CLI de Ollama en otro ordenador: OLLAMA_HOST=http://gpu-box:11434 ollama list.

Dos efectos secundarios. (1) localhost:11434 deja de responder en el propio servidor. Apunte también las herramientas locales a la dirección 100.x, por ejemplo OLLAMA_HOST=100.101.102.103:11434 ollama run ..., y la OLLAMA_BASE_URL de Open WebUI en la misma máquina. (2) Si Ollama arranca antes de que Tailscale tenga su dirección, la vinculación falla. La unidad de Linux que escribe el instalador de Ollama tiene Restart=always y RestartSec=3, así que sigue reintentando hasta que se vincula. En macOS y Windows, reinicie Ollama cuando Tailscale esté conectado.

Solución 2 (Linux con ufw): escuchar en todas partes, pero dejar entrar solo a la tailnet

Así localhost:11434 sigue funcionando. Defina OLLAMA_HOST=0.0.0.0:11434 (como arriba) y después:

sudo ufw allow OpenSSH            # first, if you manage this box over SSH
sudo ufw default deny incoming
sudo ufw allow in on tailscale0 to any port 11434 proto tcp
sudo ufw enable
sudo ufw status verbose            # no other rule should allow 11434

(Los comentarios significan: la primera línea va primero si administra esta máquina por SSH; y en el estado ninguna otra regla debería permitir 11434.) Esto cubre Ollama instalado de forma nativa. Si Ollama se ejecuta en Docker con un puerto publicado, ufw no se aplica: Docker escribe sus propias reglas de cortafuegos (vea Docker can't reach Ollama (en inglés)).

En ambos casos: por defecto, cada dispositivo de su tailnet puede llegar a todos los demás. Si ha compartido la máquina con otras personas, o tiene dispositivos en los que confía menos, limite el puerto 11434 a sus propios dispositivos en la política de acceso de la tailnet. Para exigir además una clave a las aplicaciones, ponga delante un proxy con clave Bearer (en inglés).

D. Solo en la misma red doméstica: red local más una regla de cortafuegos

Esto está bien en una red doméstica de confianza. No lo está en el wifi de una oficina, residencia, hotel o cafetería: cualquiera en la red, incluidos los invitados, tiene su Ollama sin inicio de sesión.

  1. Defina OLLAMA_HOST=0.0.0.0:11434 (los pasos son los de la solución 1, con 0.0.0.0) o active «Expose Ollama to the network» en la aplicación. Cierre Ollama por completo y vuelva a abrirlo.
  2. Limite quién puede conectarse:
  3. Nunca añada un reenvío de puerto para 11434 en el router.

Pruébelo: desde otro dispositivo de la red, curl http://<server LAN IP>:11434/api/version (con la IP local del servidor) debería responder. Desde un móvil con datos móviles (wifi desactivado), la misma dirección no debe responder.

LM Studio

LM Studio tiene sus propios interruptores en Developer → Server Settings. Desde la 0.4.0, active Require Authentication antes de Serve on Local Network, cree un token en Manage Tokens solo con los permisos que necesita el cliente, y haga que los clientes envíen Authorization: Bearer <token>. La autenticación está desactivada por defecto. Deje Enable CORS desactivado salvo que una página web lo necesite de verdad (la comprobación del navegador (en inglés) también prueba el puerto 1234). Las opciones A, C y D funcionan igual con el puerto 1234, por ejemplo ssh -N -L 1234:127.0.0.1:1234 you@gpu-box.

Compruebe el resultado

El script gratuito local-ai-checkup señala los puertos de IA de una máquina a los que se puede llegar desde la red, y comprueba su versión de Ollama, OLLAMA_ORIGINS y los puertos publicados de Docker. Solo lee y no envía nada fuera de la máquina. Después, compruebe las versiones con el comprobador de CVE (en inglés). La lista de comprobación para asegurar Ollama está en ¿Está expuesto mi Ollama?

¿Prefiere que se lo revisen?

MV2 de Munim, Inc. ofrece una revisión de IA local de 49 USD para una máquina, o una revisión para oficinas pequeñas de 199 USD para hasta 5 máquinas o un servidor compartido de Ollama u Open WebUI. Recibe un informe escrito de lo que está expuesto, es arriesgado o va lento y qué arreglar primero, con los comandos exactos para su sistema operativo y modelos recomendados que caben en su GPU. El informe está en inglés. Vea un informe de ejemplo (en inglés). Pague 49 USD o pague 199 USD en Stripe y después envíe a munimversion2@gmail.com la salida de python3 local_ai_checkup.py --json, su sistema operativo y para qué lo usa. MV2 nunca pide contraseñas, claves ni acceso remoto.