Usar o Ollama de outro computador ou do celular, sem expô-lo

Por MV2 da Munim, Inc. Conferido em 12 de outubro de 2026 com o FAQ do Ollama, o código-fonte do servidor do Ollama (server/routes.go), a documentação do Tailscale Serve, a página HTTPS using Tailscale do Open WebUI e a documentação do servidor do LM Studio. Apenas para as suas próprias máquinas. Esta página foi traduzida com IA a partir do original em inglês; em caso de divergência, vale o original.

O conselho de sempre é "defina OLLAMA_HOST=0.0.0.0" (ou ative Settings → Expose Ollama to the network no app para macOS e Windows). Funciona, mas a API do Ollama não tem login, então isso também deixa qualquer dispositivo daquela rede usar os seus modelos, baixá-los e apagá-los, e chegar aos endpoints onde estão os CVEs do Ollama deste ano (em inglês). Se a porta for redirecionada no roteador algum dia, isso significa a internet inteira. Escolha a opção mais restrita que resolve o seu caso:

Você querUseQuem mais consegue chegar ao Ollama
Um notebook seu, de vez em quandoA. Túnel SSHNinguém. Nada novo é aberto.
Conversar pelo celular, em casa ou foraB. Open WebUI pelo Tailscale ServeSó a sua tailnet, e só pelo login do Open WebUI. O Ollama fica no localhost.
Apps em outros dispositivos que falam com a API do Ollama (ferramentas de outro PC, n8n, um app de celular)C. Ollama na sua tailnetOs dispositivos da sua tailnet
Outras máquinas da mesma rede de casaD. Rede local mais uma regra de firewallQualquer dispositivo daquela rede, sem login

Não faça: redirecionar a porta 11434 no roteador; usar tailscale funnel, ngrok ou cloudflared no Ollama sem o controle de acesso do provedor (os três o publicam na internet); ou definir OLLAMA_ORIGINS=* "para funcionar". Este último muda quais sites podem chamá-lo, não quais dispositivos (veja a verificação no navegador (em inglês)).

A. Túnel SSH: um notebook, nada para abrir

Deixe o Ollama no padrão 127.0.0.1:11434 na máquina com GPU. No notebook:

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

Enquanto isso roda, http://127.0.0.1:11434 no notebook é o Ollama da máquina com GPU, então ollama list, o Open WebUI e tudo o que usa localhost por padrão simplesmente funcionam. Teste com curl http://127.0.0.1:11434/api/version. Se o notebook roda o próprio Ollama na 11434, redirecione outra porta (-L 11435:127.0.0.1:11434) e aponte os clientes para ela, por exemplo OLLAMA_HOST=127.0.0.1:11435 ollama list.

(No comando, troque you@gpu-box pelo seu usuário e pelo nome da máquina com GPU.) A máquina com GPU precisa de um servidor SSH: no Linux ele costuma já estar ativo; no macOS, ative Ajustes do Sistema → Geral → Compartilhamento → Sessão Remota; no Windows, adicione o recurso opcional "Servidor OpenSSH". O cliente ssh já vem no Windows 10/11, no macOS e no Linux. Isso também passa pela verificação de Host do Ollama (veja abaixo), porque a requisição é endereçada a 127.0.0.1.

B. Pelo celular: Open WebUI pelo Tailscale Serve

Para conversar pelo celular, coloque o celular numa rede privada com o servidor e acesse o Open WebUI, não o Ollama. O Ollama nunca sai do localhost, e as contas do Open WebUI continuam sendo a porta de entrada.

  1. Instale o Tailscale no servidor e no celular e entre com a mesma conta nos dois.
  2. Mantenha o Open WebUI no localhost. No Docker: -p 127.0.0.1:3000:8080 (no Compose: ports: [ "127.0.0.1:3000:8080" ]), com o Ollama acessado por OLLAMA_BASE_URL como antes.
  3. No servidor:
    tailscale serve --bg 3000
    tailscale serve status
    O status mostra o seu endereço, https://<machine>.<tailnet>.ts.net (com o nome da sua máquina e da sua tailnet). O Tailscale Serve precisa dos certificados HTTPS ativados na sua tailnet; se estiverem desligados, a primeira execução leva você a uma página de consentimento. --bg mantém tudo rodando depois de reinicializar.
  4. Informe ao Open WebUI o endereço dele, como diz a página de Tailscale do projeto: WEBUI_URL=https://<machine>.<tailnet>.ts.net e CORS_ALLOW_ORIGIN=https://<machine>.<tailnet>.ts.net. Recrie o contêiner. (Por que isso importa, e as configurações de cookie e de chave secreta: Open WebUI behind a proxy (em inglês).)
  5. No celular, abra esse endereço e entre. "Adicionar à Tela de Início" transforma-o num ícone de app. A documentação do Open WebUI observa que recursos do navegador como chamadas de voz precisam de HTTPS, e o Serve fornece isso.

Teste: desligue o Wi-Fi do celular e recarregue: deve continuar funcionando pelos dados móveis. Um dispositivo que não está na sua tailnet não deve nem carregar o endereço. Se os cadastros estiverem abertos no Open WebUI, feche-os (ENABLE_SIGNUP=False) depois de criar as suas contas. Para desfazer: tailscale serve reset.

Não use tailscale funnel. O Funnel torna o mesmo endereço público na internet. A documentação do Open WebUI alerta sobre isso e, considerando os avisos de segurança de setembro do Open WebUI (em inglês), uma tailnet privada é o padrão mais seguro.

C. A própria API do Ollama na sua tailnet

Alguns clientes precisam da API direta: o Ollama em outro PC, o n8n ou um script em outro servidor, apps de celular que se conectam direto a uma URL do Ollama.

Por que tailscale serve 11434 retorna 403

O passo óbvio, colocar tailscale serve na frente de um Ollama que só escuta no localhost, recebe 403 Forbidden em toda requisição. Não é o Tailscale. Quando o Ollama escuta num endereço de loopback, o allowedHostsMiddleware dele verifica o cabeçalho Host da requisição. Ele só aceita localhost, o nome de host da própria máquina, nomes terminados em .localhost, .local ou .internal, e IPs de loopback, privados ou de interfaces locais. Essa verificação protege contra DNS rebinding vindo de sites. O Serve repassa <machine>.<tailnet>.ts.net, que não está na lista. Dá para ver no próprio servidor: curl http://127.0.0.1:11434/api/version responde, enquanto curl -H "Host: gpu-box.example.ts.net" http://127.0.0.1:11434/api/version recebe 403. Quando o Ollama escuta num endereço que não é de loopback, ele pula essa verificação.

Solução 1 (qualquer sistema): vincular o Ollama só ao endereço do Tailscale

  1. Pegue o endereço IPv4 do servidor na tailnet: tailscale ip -4 (por exemplo 100.101.102.103).
  2. Defina OLLAMA_HOST=100.101.102.103:11434 do jeito que o FAQ do Ollama descreve. Linux: sudo systemctl edit ollama.service, adicione Environment="OLLAMA_HOST=100.101.102.103:11434" em [Service] e depois rode sudo systemctl daemon-reload && sudo systemctl restart ollama. App do macOS: launchctl setenv OLLAMA_HOST "100.101.102.103:11434", depois feche e abra o Ollama de novo. Windows: feche o Ollama, defina OLLAMA_HOST em "Editar as variáveis de ambiente para sua conta" e depois inicie-o pelo menu Iniciar. Deixe desligada a opção "Expose Ollama to the network" do app.
  3. Confira onde ele realmente escuta (Linux ss -tlnp | grep 11434, macOS lsof -nP -iTCP:11434 -sTCP:LISTEN, Windows netstat -ano | findstr :11434). O certo é aparecer o endereço 100.x, não 0.0.0.0 nem *.
  4. Os clientes usam http://100.101.102.103:11434, ou o nome MagicDNS da máquina, como http://gpu-box:11434. Para a CLI do Ollama em outro computador: OLLAMA_HOST=http://gpu-box:11434 ollama list.

Dois efeitos colaterais. (1) localhost:11434 para de responder no próprio servidor. Aponte as ferramentas locais também para o endereço 100.x, por exemplo OLLAMA_HOST=100.101.102.103:11434 ollama run ..., e o OLLAMA_BASE_URL do Open WebUI na mesma máquina. (2) Se o Ollama iniciar antes de o Tailscale ter o endereço, o vínculo falha. A unit do Linux que o instalador do Ollama grava tem Restart=always e RestartSec=3, então ele continua tentando até conseguir. No macOS e no Windows, reinicie o Ollama depois que o Tailscale conectar.

Solução 2 (Linux com ufw): escutar em tudo, mas deixar entrar só a tailnet

Assim localhost:11434 continua funcionando. Defina OLLAMA_HOST=0.0.0.0:11434 (como acima) e depois:

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

(Os comentários querem dizer: a primeira linha vem antes se você administra esta máquina por SSH; e no status nenhuma outra regra deve liberar a 11434.) Isso vale para o Ollama instalado de forma nativa. Se o Ollama roda no Docker com uma porta publicada, o ufw não se aplica: o Docker grava as próprias regras de firewall (veja Docker can't reach Ollama (em inglês)).

Nos dois casos: por padrão, todo dispositivo da sua tailnet alcança todos os outros. Se você compartilhou a máquina com outras pessoas, ou tem dispositivos em que confia menos, limite a porta 11434 aos seus próprios dispositivos na política de acesso da tailnet. Para também exigir uma chave dos apps, coloque na frente um proxy com chave Bearer (em inglês).

D. Só na mesma rede de casa: rede local mais uma regra de firewall

Isso é aceitável numa rede doméstica de confiança. Não é no Wi-Fi de escritório, república, hotel ou café: todo mundo na rede, inclusive visitantes, ganha acesso ao seu Ollama sem login.

  1. Defina OLLAMA_HOST=0.0.0.0:11434 (passos como na solução 1, com 0.0.0.0) ou ative "Expose Ollama to the network" no app. Feche o Ollama por completo e abra de novo.
  2. Limite quem pode se conectar:
  3. Nunca crie um redirecionamento de porta para a 11434 no roteador.

Teste: de outro dispositivo da rede, curl http://<server LAN IP>:11434/api/version (com o IP local do servidor) deve responder. De um celular nos dados móveis (Wi-Fi desligado), o mesmo endereço não pode responder.

LM Studio

O LM Studio tem as próprias chaves em Developer → Server Settings. A partir da 0.4.0, ative Require Authentication antes de Serve on Local Network, crie um token em Manage Tokens só com as permissões de que o cliente precisa, e faça os clientes enviarem Authorization: Bearer <token>. A autenticação vem desligada por padrão. Deixe Enable CORS desligado, a não ser que uma página da web realmente precise (a verificação no navegador (em inglês) também testa a porta 1234). As opções A, C e D funcionam do mesmo jeito com a porta 1234, por exemplo ssh -N -L 1234:127.0.0.1:1234 you@gpu-box.

Confira o resultado

O script gratuito local-ai-checkup aponta portas de IA de uma máquina que podem ser alcançadas pela rede, e verifica a sua versão do Ollama, o OLLAMA_ORIGINS e as portas publicadas pelo Docker. Ele só lê e não envia nada para fora da máquina. Depois, confira as versões com o verificador de CVEs (em inglês). O checklist para proteger o Ollama está em Meu Ollama está exposto?

Prefere que alguém verifique para você?

MV2 da Munim, Inc. faz uma verificação de IA local por US$ 49 para uma máquina, ou uma verificação para pequenos escritórios por US$ 199 para até 5 máquinas ou um servidor compartilhado de Ollama ou Open WebUI. Você recebe um relatório escrito do que está exposto, arriscado ou lento e do que corrigir primeiro, com os comandos exatos para o seu sistema operacional e sugestões de modelos que cabem na sua GPU. O relatório é em inglês. Veja um relatório de exemplo (em inglês). Pague US$ 49 ou pague US$ 199 no Stripe e depois envie para munimversion2@gmail.com a saída de python3 local_ai_checkup.py --json, o seu sistema operacional e para que você o usa. MV2 nunca pede senhas, chaves ou acesso remoto.