Ollama를 외부에 노출하지 않고 다른 컴퓨터나 휴대폰에서 쓰기

Munim, Inc.의 MV2 작성. 2026년 10월 12일에 Ollama FAQ, Ollama 서버 소스(server/routes.go), Tailscale Serve 문서, Open WebUI의 HTTPS using Tailscale 페이지, LM Studio 서버 문서와 대조해 확인했습니다. 본인의 컴퓨터에만 사용하세요. 이 페이지는 영어 원문을 AI로 번역한 것입니다. 내용이 다를 경우 원문이 우선합니다.

흔한 조언은 "OLLAMA_HOST=0.0.0.0을 설정하라"(또는 macOS·Windows 앱에서 Settings → Expose Ollama to the network를 켜라)입니다. 동작은 하지만 Ollama API에는 로그인이 없으므로, 그 네트워크의 모든 기기가 여러분의 모델을 쓰고, 내려받고, 삭제하고, 올해 Ollama CVE(영어)가 있는 엔드포인트에 닿을 수 있게 됩니다. 공유기에서 포트를 포워딩한 적이 있다면 그 범위는 인터넷 전체입니다. 목적을 이루는 가장 좁은 방법을 고르세요:

원하는 것쓸 방법그 밖에 Ollama에 닿는 사람
내가 관리하는 노트북 한 대에서 가끔A. SSH 터널없음. 새로 여는 것이 없습니다.
집이든 밖이든 휴대폰에서 채팅B. Tailscale Serve를 통한 Open WebUI내 tailnet만, 그것도 Open WebUI 로그인을 거쳐서만. Ollama는 localhost에 남습니다.
다른 기기의 앱이 Ollama API와 통신(다른 PC의 도구, n8n, 휴대폰 앱)C. tailnet 위의 Ollama내 tailnet의 기기
같은 집 네트워크의 다른 컴퓨터D. LAN과 방화벽 규칙그 네트워크의 모든 기기, 로그인 없이

하지 말 것: 공유기에서 11434 포트를 포워딩하기, 서비스의 접근 제어 없이 Ollama에 tailscale funnel, ngrok, cloudflared를 쓰기(셋 모두 인터넷에 공개합니다), "되게 하려고" OLLAMA_ORIGINS=*를 설정하기. 마지막 것은 어떤 기기가 아니라 어떤 웹사이트가 Ollama를 호출할 수 있는지를 바꿉니다(브라우저 점검(영어) 참고).

A. SSH 터널: 노트북 한 대, 열 것은 없음

GPU 컴퓨터의 Ollama는 기본값 127.0.0.1:11434에 그대로 둡니다. 노트북에서:

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

이것이 실행되는 동안 노트북의 http://127.0.0.1:11434는 GPU 컴퓨터의 Ollama가 되므로, ollama list, Open WebUI, 그리고 기본값이 localhost인 모든 것이 그냥 동작합니다. curl http://127.0.0.1:11434/api/version으로 테스트하세요. 노트북에서도 자체 Ollama가 11434에서 돌고 있다면 다른 포트를 포워딩하고(-L 11435:127.0.0.1:11434) 클라이언트를 그쪽으로 향하게 하세요. 예: OLLAMA_HOST=127.0.0.1:11435 ollama list.

GPU 컴퓨터에는 SSH 서버가 필요합니다. Linux에는 보통 이미 있고, macOS에서는 시스템 설정 → 일반 → 공유 → 원격 로그인을 켜고, Windows에서는 선택적 기능 "OpenSSH 서버"를 추가합니다. ssh 클라이언트는 Windows 10/11, macOS, Linux에 기본으로 들어 있습니다. 요청이 127.0.0.1로 향하므로 Ollama의 Host 검사(아래)도 통과합니다.

B. 휴대폰에서: Tailscale Serve를 통한 Open WebUI

휴대폰에서 채팅하려면 휴대폰을 서버와 같은 사설 네트워크에 두고, Ollama가 아니라 Open WebUI에 접속하세요. Ollama는 localhost를 벗어나지 않고, Open WebUI 계정이 출입문 역할을 계속합니다.

  1. 서버와 휴대폰에 Tailscale을 설치하고 둘 다 같은 계정으로 로그인합니다.
  2. Open WebUI는 localhost에 둡니다. Docker에서는 -p 127.0.0.1:3000:8080(Compose에서는 ports: [ "127.0.0.1:3000:8080" ])이고, Ollama는 전과 같이 OLLAMA_BASE_URL로 연결합니다.
  3. 서버에서:
    tailscale serve --bg 3000
    tailscale serve status
    status에 주소 https://<machine>.<tailnet>.ts.net(컴퓨터 이름과 tailnet 이름이 들어감)이 표시됩니다. Tailscale Serve는 tailnet에서 HTTPS 인증서가 켜져 있어야 하며, 꺼져 있으면 처음 실행할 때 동의 페이지로 안내됩니다. --bg를 주면 재부팅 후에도 계속 동작합니다.
  4. Open WebUI의 Tailscale 페이지 안내대로 Open WebUI에 주소를 알려 줍니다: WEBUI_URL=https://<machine>.<tailnet>.ts.net과 CORS_ALLOW_ORIGIN=https://<machine>.<tailnet>.ts.net. 컨테이너를 다시 만드세요. (이 설정이 왜 중요한지, 쿠키와 비밀 키 설정은 Open WebUI behind a proxy(영어)를 참고하세요.)
  5. 휴대폰에서 그 주소를 열고 로그인합니다. "홈 화면에 추가"를 하면 앱 아이콘이 됩니다. Open WebUI 문서에 따르면 음성 통화 같은 브라우저 기능에는 HTTPS가 필요한데, Serve가 이를 제공합니다.

테스트: 휴대폰의 Wi-Fi를 끄고 새로 고침하세요. 모바일 데이터로도 계속 동작해야 합니다. tailnet에 없는 기기에서는 주소가 아예 열리지 않아야 합니다. Open WebUI에서 가입이 열려 있다면 계정을 만든 뒤 닫으세요(ENABLE_SIGNUP=False). 되돌리려면: tailscale serve reset.

tailscale funnel은 안 됩니다. Funnel은 같은 주소를 인터넷에 공개합니다. Open WebUI 문서도 이를 경고하며, Open WebUI의 9월 보안 권고(영어)를 생각하면 사설 tailnet이 더 안전한 기본값입니다.

C. Ollama API 자체를 tailnet에 두기

일부 클라이언트는 API를 직접 써야 합니다. 다른 PC의 Ollama, 다른 서버의 n8n이나 스크립트, Ollama URL에 바로 접속하는 휴대폰 앱 등입니다.

tailscale serve 11434가 403을 반환하는 이유

누구나 떠올리는 방법, 즉 localhost 전용 Ollama 앞에 tailscale serve를 두면 모든 요청이 403 Forbidden이 됩니다. Tailscale 탓이 아닙니다. Ollama가 루프백 주소에서 대기할 때는 allowedHostsMiddleware가 요청의 Host 헤더를 검사합니다. 받아들이는 것은 localhost, 그 컴퓨터 자신의 호스트 이름, .localhost·.local·.internal로 끝나는 이름, 그리고 루프백·사설·로컬 인터페이스 IP뿐입니다. 이 검사는 웹사이트발 DNS 리바인딩을 막기 위한 것입니다. Serve는 <machine>.<tailnet>.ts.net을 그대로 넘기는데, 이 이름은 목록에 없습니다. 서버에서 직접 확인할 수 있습니다: curl http://127.0.0.1:11434/api/version은 응답하지만 curl -H "Host: gpu-box.example.ts.net" http://127.0.0.1:11434/api/version은 403을 받습니다. Ollama가 루프백이 아닌 주소에서 대기할 때는 이 검사를 건너뜁니다.

해결책 1(모든 OS): Ollama를 Tailscale 주소에만 바인드하기

  1. 서버의 tailnet IPv4 주소를 확인합니다: tailscale ip -4(예: 100.101.102.103).
  2. Ollama FAQ에 나온 방식으로 OLLAMA_HOST=100.101.102.103:11434를 설정합니다. Linux: sudo systemctl edit ollama.service로 [Service] 아래에 Environment="OLLAMA_HOST=100.101.102.103:11434"를 추가한 뒤 sudo systemctl daemon-reload && sudo systemctl restart ollama. macOS 앱: launchctl setenv OLLAMA_HOST "100.101.102.103:11434" 후 Ollama를 종료했다가 다시 엽니다. Windows: Ollama를 종료하고 "계정의 환경 변수 편집"에서 OLLAMA_HOST를 설정한 뒤 시작 메뉴에서 실행합니다. 앱의 "Expose Ollama to the network" 스위치는 꺼 둔 채로 둡니다.
  3. 실제로 어디서 대기하는지 확인합니다(Linux ss -tlnp | grep 11434, macOS lsof -nP -iTCP:11434 -sTCP:LISTEN, Windows netstat -ano | findstr :11434). 0.0.0.0이나 *가 아니라 100.x 주소가 나와야 합니다.
  4. 클라이언트는 http://100.101.102.103:11434 또는 http://gpu-box:11434 같은 컴퓨터의 MagicDNS 이름을 씁니다. 다른 컴퓨터의 Ollama CLI라면: OLLAMA_HOST=http://gpu-box:11434 ollama list.

부작용 두 가지. (1) 서버 자신에서 localhost:11434가 더 이상 응답하지 않습니다. 로컬 도구도 100.x 주소를 쓰게 하세요. 예: OLLAMA_HOST=100.101.102.103:11434 ollama run ..., 같은 컴퓨터에 있는 Open WebUI의 OLLAMA_BASE_URL도 마찬가지입니다. (2) Tailscale이 주소를 얻기 전에 Ollama가 시작되면 바인드가 실패합니다. Ollama 설치 프로그램이 만드는 Linux 유닛에는 Restart=always와 RestartSec=3이 있어서 바인드될 때까지 계속 재시도합니다. macOS와 Windows에서는 Tailscale이 연결된 뒤 Ollama를 다시 시작하세요.

해결책 2(ufw를 쓰는 Linux): 모든 곳에서 대기하되 tailnet만 들여보내기

이 방법은 localhost:11434가 계속 동작합니다. (위와 같은 방식으로) OLLAMA_HOST=0.0.0.0:11434를 설정한 뒤:

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

(주석의 뜻: 첫 줄은 이 컴퓨터를 SSH로 관리한다면 가장 먼저 실행, 마지막 줄은 다른 규칙이 11434를 허용하고 있으면 안 된다는 것.) 이 방법은 직접 설치한 Ollama에 해당합니다. Ollama가 포트를 공개한 Docker에서 돌고 있다면 ufw는 적용되지 않습니다. Docker가 자체 방화벽 규칙을 쓰기 때문입니다(Docker에서 Ollama 연결 안 됨 참고).

어느 쪽이든: 기본적으로 tailnet의 모든 기기는 서로 닿을 수 있습니다. 컴퓨터를 다른 사람과 공유했거나 덜 믿는 기기가 있다면, tailnet 접근 정책에서 11434 포트를 본인 기기로만 제한하세요. 앱에도 키를 요구하려면 앞에 Bearer 키 프록시를 두세요.

D. 같은 집 네트워크에서만: LAN과 방화벽 규칙

믿을 수 있는 집 네트워크라면 괜찮습니다. 사무실, 기숙사, 호텔, 카페 Wi-Fi에서는 안 됩니다. 손님을 포함해 그 네트워크의 모든 사람이 로그인 없이 여러분의 Ollama를 쓰게 됩니다.

  1. OLLAMA_HOST=0.0.0.0:11434를 설정하거나(해결책 1의 절차에서 0.0.0.0을 사용) 앱의 "Expose Ollama to the network"를 켭니다. Ollama를 완전히 종료했다가 다시 엽니다.
  2. 접속할 수 있는 대상을 제한합니다:
  3. 공유기에 11434 포트 포워딩을 절대 추가하지 마세요.

테스트: 네트워크의 다른 기기에서 curl http://<server LAN IP>:11434/api/version(서버의 LAN IP로 바꿔서)이 응답해야 합니다. 모바일 데이터를 쓰는 휴대폰(Wi-Fi 끔)에서는 같은 주소가 응답하면 안 됩니다.

LM Studio

LM Studio에는 Developer → Server Settings 아래에 자체 스위치가 있습니다. 0.4.0부터는 Serve on Local Network보다 먼저 Require Authentication을 켜고, Manage Tokens에서 클라이언트에 필요한 권한만 가진 토큰을 만든 뒤, 클라이언트가 Authorization: Bearer <token>을 보내게 하세요. 인증은 기본적으로 꺼져 있습니다. 웹 페이지가 정말 필요로 하지 않는 한 Enable CORS는 꺼 두세요(브라우저 점검(영어)은 1234 포트도 검사합니다). A, C, D 방법은 1234 포트로도 똑같이 동작합니다. 예: ssh -N -L 1234:127.0.0.1:1234 you@gpu-box.

결과 확인하기

무료 스크립트 local-ai-checkup은 컴퓨터에서 네트워크로 접근 가능한 AI 포트를 표시하고, Ollama 버전, OLLAMA_ORIGINS, Docker 포트 바인딩을 확인합니다. 읽기 전용이며 컴퓨터 밖으로 아무것도 보내지 않습니다. 그다음 CVE 검사기(영어)로 버전을 확인하세요.

대신 점검받고 싶다면

Munim, Inc.의 MV2는 컴퓨터 1대를 위한 로컬 AI 상태 점검(49달러)과, 최대 5대 또는 공유 Ollama·Open WebUI 서버 1대를 위한 소규모 사무실 점검(199달러)을 제공합니다. 무엇이 노출되어 있고 무엇이 위험하거나 느린지, 무엇부터 고쳐야 하는지를 여러분의 OS에 맞는 정확한 명령, GPU에 맞는 모델 추천과 함께 보고서로 드립니다. 보고서는 영어로 작성됩니다. 보고서 샘플을 보세요. Stripe에서 49달러 결제 또는 199달러 결제 후, munimversion2@gmail.com으로 python3 local_ai_checkup.py --json의 출력, 사용 중인 OS, 용도를 이메일로 보내 주세요. MV2는 비밀번호, 키, 원격 접속을 절대 요청하지 않습니다.