1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Ollama × Tailscale:自宅LLMサーバーを安全に公開する(OLLAMA_HOST=0.0.0.0を使わない)

1
Posted at

はじめに

自宅のPC(Windows + NVIDIA GPU)をOllamaサーバーにして、外出先のスマホやノートPCからローカルLLMを使えるようにしたい。よくある記事だと OLLAMA_HOST=0.0.0.0 にして終わり、というものが多いですが、これだと家庭内LANの他デバイスからも、ルーター設定次第ではインターネットからも到達しうる状態になってしまいます。

自宅で使うだけなのでそこまで神経質になる必要はないのですが、Ollama自体にはログインやパスワードのような仕組みが無いので、「どこからでも繋がる」状態は地味にリスクです。この記事では、Tailscaleに参加している端末からしかアクセスできないように絞り込んだ、家庭用途としては十分な構成を紹介します。

前提環境

  • OS: Windows11
  • GPU: NVIDIA (RTX系 VRAM 12G以上推奨)
  • 用途: Ollamaサーバーを自宅内に構築し、Tailscale経由でリモートアクセス

全体像

image.png


Step 1. Tailscaleのセットアップ

  1. Tailscale公式サイトからWindows版をダウンロード・インストール
  2. インストール後、サインイン(Google/GitHubアカウントなどでOK)
  3. アクセスしたい側の端末(スマホ、ノートPCなど)にもTailscaleをインストールし、同じアカウントでログイン
  4. これで同一tailnet内の端末同士が 100.x.x.x 形式のIPで相互到達可能になる

サーバーPCのTailscale IPは以下で確認できます。

tailscale ip -4

以降、このIPを <TAILSCALE_IP> として記載します。

Tailscaleについては以前こちらの記事でも紹介しています。


Step 2. Ollamaのインストール+インストール先の指定

1. Ollama本体のインストール

まずは公式サイトから Windows 版をダウンロードしてインストールします。

インストール後、Ollama を一度起動しておきます。


2. モデル保存先を指定する(任意)

複数モデルを使う場合、Cドライブ容量を圧迫しやすいため
モデル保存先を任意のフォルダに変更しておくと便利です。

  1. Win + Rsysdm.cpl
  2. 「詳細設定」タブ → 「環境変数」
  3. システム環境変数に以下を追加:
  • 変数名OLLAMA_MODELS
  • 変数値(例)K:\ollama\models(任意のフォルダ)

<Kドライブに設定した場合>
image.png

  1. Ollama を再起動(GUI を完全終了 → 再起動)

3. 必要なモデルをインストール

🧠 Qwen2.5(汎用・日本語強い、デフォルトは7B)

ollama pull qwen2.5

タグを省略すると qwen2.5:7b が入る。RTX 3060 12GBなら、これ1本あれば普段使いは十分(4bit量子化でVRAM使用量5.5GB前後が目安)。14Bや32Bなど別サイズが欲しい場合はタグを指定して個別にpullする(例: ollama pull qwen2.5:14b)。以下は用途に応じた追加候補。


他にもこんなモデルがおすすめ

Llama 3.1(英語強め・高速)— 英語ドキュメントを読ませる機会が多いなら

ollama pull llama3.1

VRAM目安:6GB前後

Qwen2.5-Coder(コード生成特化)— コーディング補助を使いたいなら

ollama pull qwen2.5-coder:7b

VRAM目安:5.5GB前後

DeepSeek-R1(推論・数学・思考系)— 数学やロジック系の質問をよくするなら

ollama pull deepseek-r1:7b

VRAM目安:5.5GB前後

nomic-embed-text(RAG用の埋め込みモデル)— 文書検索(RAG)を組みたいなら

ollama pull nomic-embed-text

VRAM目安:1GB未満

補足: VRAM使用量はコンテキスト長やKVキャッシュの分で変動するため、あくまで目安。RTX 3060 12GBなら上記のうち2〜3個を同時にロードしてもまだ余裕がある。


4. まとめてインストール(コピペ用)

ollama pull qwen2.5
ollama pull qwen2.5-coder:7b
ollama pull llama3.1
ollama pull deepseek-r1:7b
ollama pull nomic-embed-text

Step 3. リッスンアドレスをTailscale IPに限定

デフォルトのOllamaは localhost のみでリッスンしており、他端末からはアクセスできません。かといって 0.0.0.0 にすると全ネットワークインターフェースに公開されてしまうため、Tailscale IPをピンポイントで指定します。

  1. Win + Rsysdm.cpl → 「詳細設定」タブ → 「環境変数」
  2. システム環境変数(下段)の「新規」をクリック
  3. 変数名: OLLAMA_HOST
  4. 変数値: <TAILSCALE_IP> (Step1で確認した値)
  5. 「OK」で保存
  6. タスクトレイのOllamaアイコンから必ず一度終了し、再起動(環境変数の反映に必要)

image.png

ポイント: 0.0.0.0 ではなく実際のTailscale IPをbindすることで、そもそもTailscale以外のネットワークインターフェースからは接続を受け付けなくなります。同一LAN内から接続する場合もTailscale経由にすれば、設定の統一ができて便利です。

注意(Ollamaにはログイン機能がない): Ollama自体にはパスワードやAPIキーのような認証の仕組みが用意されていません(localhostアクセスは常に無認証、クラウド版のAPIキーはこのローカルサーバーには関係ありません)。つまり「どこからアクセスできるか」を絞ることが、そのままセキュリティの要になります。この記事でTailscale IPへのbindやファイアウォールにこだわっているのはそのためです。

注意(GUI/CLI競合): Windows版OllamaはGUI(タスクトレイ常駐)とCLI(ollama serve)が同時に立ち上がっていると競合することがあります。環境変数を変更したら、GUIを完全に終了してから起動し直すか、あるいはGUIを終了して ollama serve をCLIから起動する形に統一してください。GUIを終了せずタスクマネージャー上にOllamaプロセスが残ったままだと、環境変数の変更が反映されないことがあります。

補足(Tailscale Serveは使わない): TailscaleにはTailscale Serve/Funnelというトンネル機能もありますが、Windows版Ollamaとは相性がよくないという報告があるため、この記事では使いません。今回の構成(IP直接bind + ファイアウォールCIDR制限)だけで完結します。


Step 4. ファイアウォールルールの追加(Tailscale CIDR限定)

Windowsファイアウォールでポート11434を開放しますが、ここも全開放ではなくTailscaleのCIDR (100.64.0.0/10) だけに絞ります。

重要: このコマンドは管理者権限のPowerShellでないと失敗します。

ポイント: 「アクセスが拒否されました」エラー

通常のPowerShellから実行すると以下のエラーが出ます。

New-NetFirewallRule : アクセスが拒否されました。

対処: 管理者としてPowerShellを開き直す

  1. スタートメニューで「PowerShell」を検索
  2. 右クリック → 「管理者として実行」
  3. UACダイアログで「はい」を選択

改めて以下を実行します。

New-NetFirewallRule -DisplayName "Ollama-Tailscale" -Direction Inbound -LocalPort 11434 -Protocol TCP -RemoteAddress 100.64.0.0/10 -Program "$env:LOCALAPPDATA\Programs\Ollama\ollama.exe" -Action Allow

補足: -Direction Inbound のみで十分です。Windowsファイアウォールはデフォルトでoutbound通信を許可しているため、Ollamaサーバーとして外部からの接続を受け付けるにはinboundルールだけ追加すればOKです。-Program はOllamaの実行ファイルにも紐づけておくための保険で、必須ではありませんが付けておくと安心です(インストール先が違う場合はパスを読み替えてください)。

注意(古いルールが残っていないか確認): 以前に 0.0.0.0 で試したことがある人や、初回起動時にWindowsのセキュリティ警告ダイアログで「許可」を選んだ覚えがある人は要注意です。Windowsファイアウォールは「一致する許可ルールが1つでもあれば通す」仕組みなので、リモートアドレス制限のない古い許可ルールが残っていると、今回追加した絞り込みルールがあっても素通りしてしまいます。「Windows Defender ファイアウォール」→「詳細設定」→「受信の規則」で ollama を検索し、リモートアドレスが「任意」になっている許可ルールが無いか確認して、あれば無効化・削除しておきましょう。


Step 5. 動作確認

同一PC上での確認

curl http://<TAILSCALE_IP>:11434/api/tags

モデル一覧のJSONが返ってくればOKです。
image.png

別端末からの確認

同じTailscaleアカウントでログインした別端末(スマホなど)から、同様に

http://<TAILSCALE_IP>:11434/api/tags

にアクセスし、応答が返ってくればTailscale経由でのリモートアクセスが成功しています。

念のため、絞り込めていることも確認

Tailscaleに参加していない端末(自宅Wi-FiのみでTailscale未インストールの端末や、スマホのTailscaleをオフにした状態など)から同じURLにアクセスしてみて、タイムアウトして繋がらないことも確認しておくと安心です。ここで普通に繋がってしまう場合は、Step4の古いルールが残っている可能性が高いです。


補足: さらに安全にする / 運用を楽にする

起動スクリプト化

Tailscale IPは基本的に同一デバイス・同一アカウントであれば変わりませんが、念のため動的取得するバッチファイルにしておくと安心です。特にWake-on-LANなどでPCを自動起動する構成にする場合は、起動のたびにIPを合わせ直せるようにしておくと安定します。

@echo off
for /f "tokens=*" %%i in ('tailscale ip -4') do set TSIP=%%i
setx /M OLLAMA_HOST %TSIP%

注意: setx はデフォルトだとユーザー環境変数として設定されます。Step3ではシステム環境変数としてOLLAMA_HOSTを設定しているため、バッチファイル側も /M オプションでシステム環境変数に揃えています(要管理者権限での実行)。ユーザー環境変数でも動作はしますが、混乱を避けるため統一しておくのがおすすめです。

使い方

  1. バッチファイルとして保存
    上記の内容を update_ollama_host.bat のような名前で、任意のフォルダ(例: C:\scripts\)に保存する

  2. 手動で一度動作確認
    保存したバッチファイルを実行する前に、一度わざと別の値に書き換えて、正しく上書きされるか確認しておくと分かりやすい。

    setx /M OLLAMA_HOST 1.2.3.4
    

    新しいcmdウィンドウを開き直し、echo %OLLAMA_HOST%1.2.3.4 になっていることを確認する(同じウィンドウのままだと反映されないので注意)。

    その後、保存したバッチファイルを右クリック→「管理者として実行」で実行し、再び新しいウィンドウを開き直して echo %OLLAMA_HOST% を確認する。実際のTailscale IPに戻っていれば、バッチは正しく動作している。

  3. タスクスケジューラに登録して自動化する
    PC起動のたびに自動実行させたい場合は、スタートアップフォルダへのショートカット配置ではなくタスクスケジューラを使う。スタートアップフォルダ経由だと管理者権限が引き継がれず、setx /M(システム環境変数への書き込み)が失敗することがあるため。

    • Win + Rtaskschd.msc でタスクスケジューラを開く
    • 「タスクの作成」を選択
    • 「全般」タブ: 名前を入力し、「最上位の特権で実行する」にチェック
    • 「トリガー」タブ: 新規→「ログオン時」を選択
    • 「操作」タブ: 新規→「プログラムの開始」でバッチファイルのパスを指定
    • 保存時、実行アカウントのパスワード入力を求められる場合がある
  4. Ollama自体の自動起動も確認
    バッチで環境変数を更新しても、Ollama本体が起動していなければ意味がないため、Ollamaの設定で「サインイン時に起動」がONになっているか確認しておく(Windows版はデフォルトでON)

これでPC起動→ログオン時にIPが自動更新される状態になるので、Wake-on-LANなどでPCを遠隔起動する構成と組み合わせても、IPのズレを気にせず運用できます。

発展編: ログオンなしで自動化したい場合

Wake-on-LANでPCの電源だけ入れて、誰もサインインしない運用にしたい場合は、上記の「ログオン時」トリガーでは不十分です。「ログオン時」トリガーは実際に誰かがサインインしたときしか発火しないため、電源だけ入って誰もログインしない状態だと、バッチもOllama(GUI版)も起動しません。

この場合は以下のように構成を変えます。

項目 ログオン前提 ログオンなし
トリガー ログオン時 スタートアップ時
実行アカウント 任意のユーザー SYSTEM
Ollama起動方法 GUI版(サインイン時に自動起動) GUI版は使えない。バッチ側で ollama serve をバックグラウンド起動する必要がある

バッチファイルの修正例:

@echo off
for /f "tokens=*" %%i in ('tailscale ip -4') do set TSIP=%%i
setx /M OLLAMA_HOST %TSIP%
rem 環境変数をこのプロセスにも反映させてからOllamaを起動
set OLLAMA_HOST=%TSIP%
start "" "C:\Users\<ユーザー名>\AppData\Local\Programs\Ollama\ollama.exe" serve
  • setxはレジストリを書き換えるだけで、同じバッチ内で直後にollama serveを呼んでも反映されないため、set OLLAMA_HOST=%TSIP%でそのプロセス内の環境変数にも明示的にセットしている
  • Ollamaのインストールパスは環境によって異なるため、where ollama などで事前に確認しておく
  • タスクスケジューラでは、トリガーを「スタートアップ時」に、実行アカウントをSYSTEMに設定する

注意: Ollama公式のWindows版はGUIアプリ(タスクトレイ常駐)としての利用が前提の配布形態のため、SYSTEM権限での起動は非公式な運用になります。動作自体はollama serveコマンドで可能ですが、アップデート時の挙動などは自己責任での検証が必要です。

ルーター側の確認

  • UPnPが有効になっていないか確認し、無効化しておく
  • このPCへのポートフォワーディング設定が入っていないことを確認する

image.png

(任意) 家族とtailnetを共有している場合の絞り込み

一人用のTailscaleアカウントで自分の端末しか繋いでいないなら、ここまでの設定で十分です。ただ、家族用に招待したスマホなど、自分以外の端末も同じtailnetに参加させている場合は少し話が変わります。Tailscaleはデフォルトで同一tailnet内の端末同士が自由に到達できる仕様なので、「自分だけがサーバーPCにアクセスできる」わけではなく、「同じtailnetに入っている端末なら誰でもアクセスできる」状態になっています。

もっと絞りたい場合は、Tailscale管理画面のACL(グラント)設定で、サーバーPCにタグを付けて、アクセスできる送信元を限定できます。例えば以下のような設定です。

{
  "tagOwners": {
    "tag:home-ollama": ["autogroup:admin"]
  },
  "grants": [
    {
      "src": ["autogroup:member"],
      "dst": ["tag:home-ollama"],
      "ip": ["tcp:11434"]
    }
  ]
}

サーバーPCに tag:home-ollama を付与しておくと、tailnet内の端末(autogroup:member)からでも11434番ポート以外へは到達できなくなり、ポート単位でも絞り込めます。特定の家族のデバイスだけに許可したい場合は src を個別のメールアドレスやグループに置き換えれば対応可能です。ここまでやらなくても実用上は困りませんが、「念のためもう一段階絞りたい」人向けの発展編として覚えておくと便利です。


まとめ

  • 0.0.0.0 でのbindは家庭内LANや設定次第で外部にも公開される危険がある
  • Ollama自体にはログイン機能が無いため、「どこから届くか」を絞ることがそのままセキュリティになる
  • Tailscale IPを直接指定してbind + ファイアウォールをTailscaleのCIDR (100.64.0.0/10) に限定することで、Tailscale参加端末以外からは基本的に到達不可能な構成にできる
  • 古いファイアウォールルールが残っていると絞り込みが効かなくなるので、追加前に一度「受信の規則」を確認しておくと安心
  • ファイアウォールルールの追加は管理者権限のPowerShellが必須(プロンプト表示だけでは判断できない)
  • 家族とtailnetを共有している場合は、ACL(グラント)でさらに絞り込むこともできる(任意)

家庭で自分専用のLLMサーバーを持つだけなら、正直ここまでやらなくても困ることは少ないと思います。ただ、Ollamaに認証機能が無い以上、ネットワーク経路をきっちり絞っておくのは安いコストで得られる安心感としては悪くないはずです。

今後の予定

この構成を土台にして、以下は別記事として書く予定です。

  • Home AssistantからのWake-on-LAN連携: ラズパイ上のHome Assistant(WoLプラットフォーム)がローカルLANに向けてマジックパケットを送る中継役になり、その自動化はHome AssistantのYAML(automations)に直接書く構成。外出先からTailscale経由でHome Assistantに指示を出し、サーバーPC自体を遠隔起動できるようにする話です。
  • Open WebUIによるGUI化: curlでAPIを叩くだけでなく、スマホからチャットUIで使えるようにする話です。Ollama公式アプリにもチャットUIが搭載されましたがローカル専用なので、リモートから使うにはOpen WebUIなどを別途サーバー側に立てる必要があり、ポート追加や公開範囲の検討も絡むため独立した記事にします。
1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?