この記事は 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 のアカウントが入り口の鍵になります。
- サーバーとスマホの両方に Tailscale を入れ、同じアカウントでサインインします。
- Open WebUI は localhost のままにします。Docker では
-p 127.0.0.1:3000:8080(Compose ではports: [ "127.0.0.1:3000:8080" ])。 - サーバーで次を実行します。
tailscale serve --bg 3000
tailscale serve status
ステータスに https://<machine>.<tailnet>.ts.net 形式のアドレスが表示されます。tailnet で HTTPS 証明書が無効なら、初回に同意ページに案内されます。--bg を付けると再起動後も動き続けます。
- Open WebUI の Tailscale のページにあるとおり、
WEBUI_URL=https://<machine>.<tailnet>.ts.netとCORS_ALLOW_ORIGIN=https://<machine>.<tailnet>.ts.netを設定し、コンテナを作り直します。 - スマホでそのアドレスを開いてサインインします。「ホーム画面に追加」でアプリのように使えます。
確認: スマホの 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 のアドレスだけにバインドする
- サーバーの tailnet 上の IPv4 アドレスを調べます:
tailscale ip -4(例:100.101.102.103)。 - Ollama FAQ の手順どおり
OLLAMA_HOST=100.101.102.103:11434を設定します。- Linux:
sudo systemctl edit ollama.serviceで次を追加し、sudo systemctl daemon-reload && sudo systemctl restart ollama。
- Linux:
[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」はオフのまま。
- 実際の待ち受け先を確認します(Linux
ss -tlnp | grep 11434、macOSlsof -nP -iTCP:11434 -sTCP:LISTEN、Windowsnetstat -ano | findstr :11434)。0.0.0.0や*ではなく 100.x のアドレスが出れば OK です。 - クライアントは
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 では使わないでください。
-
OLLAMA_HOST=0.0.0.0:11434を設定するか、アプリの「Expose Ollama to the network」をオンにして、Ollama を完全に終了してから開き直します。 - 接続できる相手を制限します。
- 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 のルールを削除または範囲を狭めます(許可ルールは足し算で効くため)。
- Linux(ufw):
New-NetFirewallRule -DisplayName "Ollama LAN only" -Direction Inbound -Protocol TCP -LocalPort 11434 -RemoteAddress LocalSubnet -Profile Private -Action Allow
- macOS: 標準のファイアウォールはアプリ単位でしか制御できないので、方法 A か C を使ってください。
- ルーターで 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 のポート公開を確認できます。
関連(日本語):
- Docker の Open WebUI / n8n から Ollama に接続できないときの直し方
- Ollama が外部に公開されていないか? 締めるためのチェックリスト
- Ollama の API キー(Bearer キーのプロキシ)
誤りがあれば、コメントか https://github.com/munimv2/local-ai-checkup/issues でお知らせください。