0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

tailscale serve の先の Ollama が 403 になる理由と、Ollama を外部に公開せずにスマホや別の PC から使う方法

0
Posted at

この記事は Munim, Inc. の MV2 が、AI を使って英語の原文から翻訳・作成したものです。内容は 2026 年 10 月 12 日に Ollama FAQ、Ollama のサーバーのソースコード(server/routes.go)、Tailscale Serve と Open WebUI の公式ドキュメントと照合しています。原文(英語): https://munimv2.github.io/ollama-remote-access.html / 日本語版: https://munimv2.github.io/ja/ollama-remote-access.html

はじめに

「Ollama を別の PC やスマホから使いたい」ときによく見る助言は OLLAMA_HOST=0.0.0.0 を設定する(または macOS・Windows のアプリで Settings → Expose Ollama to the network をオンにする)ことです。これで動きますが、Ollama の API にはログインがないので、同じネットワーク上のすべての端末があなたのモデルを使い、ダウンロードや削除までできるようになります。ルーターでポートを転送していれば、それはインターネット全体です。

この記事では、用途ごとに最も範囲の狭い方法を紹介します。あわせて、tailscale serve を Ollama の前に置くと 403 Forbidden になる理由も説明します。

やりたいこと 使う方法 ほかに Ollama に届くのは誰か
自分のノート PC 1 台から、ときどき使う 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 を使う(3 つともインターネットに公開します)。「とりあえず動かすため」に OLLAMA_ORIGINS=* を設定する(これはどの Web サイトから呼べるかを変えるだけで、どの端末から使えるかは変わりません)。

A. SSH トンネル: ノート PC 1 台、何も開かない

GPU マシンの Ollama は既定の 127.0.0.1:11434 のままにして、ノート PC から次を実行します(you@gpu-box はご自身のユーザー名と GPU マシン名に置き換え)。

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

実行中はノート PC の http://127.0.0.1:11434 が GPU マシンの Ollama になるので、ollama list や Open WebUI など、既定で localhost を使うものはそのまま動きます。curl http://127.0.0.1:11434/api/version で確認できます。ノート PC でも Ollama を 11434 で動かしているなら、別のポートを転送して(-L 11435:127.0.0.1:11434)、OLLAMA_HOST=127.0.0.1:11435 ollama list のようにクライアントをそちらへ向けます。

GPU マシンには SSH サーバーが必要です。Linux ではたいてい動いています。macOS は「システム設定 → 一般 → 共有 → リモートログイン」、Windows はオプション機能の「OpenSSH サーバー」です。宛先が 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" ])。
  3. サーバーで次を実行します。
tailscale serve --bg 3000
tailscale serve status

ステータスに https://<machine>.<tailnet>.ts.net 形式のアドレスが表示されます。tailnet で HTTPS 証明書が無効なら、初回に同意ページに案内されます。--bg を付けると再起動後も動き続けます。

  1. Open WebUI の Tailscale のページにあるとおり、WEBUI_URL=https://<machine>.<tailnet>.ts.net と CORS_ALLOW_ORIGIN=https://<machine>.<tailnet>.ts.net を設定し、コンテナを作り直します。
  2. スマホでそのアドレスを開いてサインインします。「ホーム画面に追加」でアプリのように使えます。

確認: スマホの Wi-Fi をオフにして再読み込みし、モバイルデータ通信でも使えれば成功です。tailnet に入っていない端末からは開けないはずです。自分のアカウントを作ったら新規登録を閉じてください(ENABLE_SIGNUP=False)。元に戻すには tailscale serve reset です。

tailscale funnel は使わないでください。 Funnel は同じアドレスをインターネットに公開します。

C. Ollama API そのものを tailnet で使う

tailscale serve 11434 が 403 を返す理由

localhost だけで待ち受ける Ollama の前に tailscale serve を置くと、すべてのリクエストが 403 Forbidden になります。原因は Tailscale ではなく Ollama 側です。

Ollama がループバックアドレスで待ち受けているとき、allowedHostsMiddleware がリクエストの Host ヘッダーを確認します。受け付けるのは localhost、そのマシン自身のホスト名、.localhost・.local・.internal で終わる名前、ループバック・プライベート・ローカルインターフェースの IP だけです。Web サイトからの 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 がループバック以外のアドレスで待ち受けている場合、このチェックは行われません。対処法は次の 2 つです。

対処法 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 で次を追加し、sudo systemctl daemon-reload && sudo systemctl restart ollama。
[Service]
Environment="OLLAMA_HOST=100.101.102.103:11434"
  • macOS アプリ: launchctl setenv OLLAMA_HOST "100.101.102.103:11434" の後、Ollama を終了して開き直す。
  • Windows: Ollama を終了し、「アカウントの環境変数を編集」で OLLAMA_HOST を設定してから、スタートメニューで起動。アプリの「Expose Ollama to the network」はオフのまま。
  1. 実際の待ち受け先を確認します(Linux ss -tlnp | grep 11434、macOS lsof -nP -iTCP:11434 -sTCP:LISTEN、Windows netstat -ano | findstr :11434)。0.0.0.0 や * ではなく 100.x のアドレスが出れば OK です。
  2. クライアントは http://100.101.102.103:11434 か MagicDNS 名(http://gpu-box:11434 など)を使います。別 PC の CLI からは OLLAMA_HOST=http://gpu-box:11434 ollama list です。

副作用が 2 つあります。 (1) サーバー自身で localhost:11434 が応答しなくなるので、ローカルのツールも 100.x に向けます(同じマシンの Open WebUI の OLLAMA_BASE_URL も)。(2) Tailscale がアドレスを得る前に 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 が対象です。Docker でポートを公開している場合、Docker が独自のファイアウォールルールを書き込むので ufw は効きません。

どちらの場合も: 既定では tailnet 内のすべての端末が互いに届きます。共有しているマシンや信頼度の低い端末があるなら、tailnet のアクセスポリシーでポート 11434 を自分の端末だけに制限してください。

D. 同じ家庭内ネットワークだけ: LAN とファイアウォールルール

信頼できる家庭内ネットワーク向けです。オフィス、寮、ホテル、カフェの Wi-Fi では使わないでください。

  1. OLLAMA_HOST=0.0.0.0:11434 を設定するか、アプリの「Expose Ollama to the network」をオンにして、Ollama を完全に終了してから開き直します。
  2. 接続できる相手を制限します。
    • Linux(ufw): default deny incoming にしたうえで sudo ufw allow from 192.168.1.0/24 to any port 11434 proto tcp(サブネットはご自身のものに)。
    • Windows: 管理者の PowerShell で次を実行し、「Windows Defender ファイアウォール → 詳細設定 → 受信の規則」で、パブリック ネットワークや任意のアドレスを許可している古い Ollama のルールを削除または範囲を狭めます(許可ルールは足し算で効くため)。
New-NetFirewallRule -DisplayName "Ollama LAN only" -Direction Inbound -Protocol TCP -LocalPort 11434 -RemoteAddress LocalSubnet -Profile Private -Action Allow
  • macOS: 標準のファイアウォールはアプリ単位でしか制御できないので、方法 A か C を使ってください。
  1. ルーターで 11434 のポート転送は絶対に設定しないでください。

確認: LAN 内の別の端末から curl http://<server LAN IP>:11434/api/version(サーバーの LAN 内 IP に置き換え)が応答し、モバイルデータ通信のスマホ(Wi-Fi オフ)からは応答しないことを確認します。

LM Studio の場合

「Developer → Server Settings」で、Serve on Local Network をオンにする前に Require Authentication(0.4.0 以降)をオンにし、「Manage Tokens」で必要な権限だけのトークンを作り、クライアントに Authorization: Bearer <token> を送らせます。認証は既定でオフです。方法 A、C、D はポート 1234 でも同じように使えます(例: ssh -N -L 1234:127.0.0.1:1234 you@gpu-box)。

最後に: 開けすぎていないか確認

オープンソースのスクリプト local-ai-checkup(読み取り専用で、マシンの外には何も送信しません)で、ネットワークから届いてしまう AI 関連のポート、Ollama のバージョン、OLLAMA_ORIGINS、Docker のポート公開を確認できます。

関連(日本語):

誤りがあれば、コメントか https://github.com/munimv2/local-ai-checkup/issues でお知らせください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?