「SSHポートフォワーディングでは繋ぎ直しが面倒で、固定のURLで常時使えるようにしたい」
そんな悩みを持つサーバー管理者やエンジニアは多い。この記事では、Tailscaleを使ってOllamaをチームのプライベートネットワークに公開する手順を解説する。インストールと `tailscale up` だけでNATを越えたメッシュVPNが完成し、ドメイン取得もNginx設定もTLS証明書管理も不要になる。
この記事のポイント
・Tailscaleをインストールして `tailscale up` するだけでOllamaサーバーとクライアントが同一プライベートネットワークにつながる
・`OLLAMA_HOST` をTailscale IPにバインドすることでインターネット公開ゼロのまま、チームからAPIにアクセスできる
・TailscaleのACLポリシーでタグを使い、接続元をチームメンバーに限定できる
・MagicDNSを有効化するとIPの代わりに `http://サーバー名:11434` という固定URLでOllamaにアクセスできる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
TailscaleとNginx・WireGuardによるリモートアクセスの違い
Ollamaをリモートからアクセスできるようにするアプローチはいくつかある。Nginxリバースプロキシはドメイン取得・DNS設定・証明書管理が前提で、インターネットにポートを公開するため攻撃の標的にもなりうる。WireGuardは自由度が高い反面、鍵の生成・配布・設定ファイルの同期が煩雑だ。SSHポートフォワーディングはゼロ設定で使えるがセッションの常時維持が必要で常用には向かない。
Tailscaleはその中間を埋める。インストールと `tailscale up` だけでNAT越えのメッシュネットワークが完成する。データプレーンはデバイス間のWireGuardで動き、tailnet外からOllamaのポートに一切到達できないため攻撃面が大幅に減る。社内導入の判断軸については「社内でChatGPTが使えないときの代替手段|機密データを守るローカルLLMという選択肢」に整理している。
事前準備|TailscaleのインストールとUbuntu Serverへの参加
Ubuntu Server 22.04/24.04でOllamaがsystemdサービスとして稼働していることを前提とする。構築手順は「Ubuntu ServerでローカルLLMを構築する方法」を先に確認してほしい。1. Tailscaleのインストール
# 公式インストールスクリプト(aptリポジトリの追加とインストールを一括実施) curl -fsSL https://tailscale.com/install.sh | sh # バージョン確認 tailscale version
2. Tailscaleネットワークへの参加
sudo tailscale up
3. TailscaleのIPアドレスを確認する
tailscale ip -4 # output: 100.94.31.12 # 100.64.0.0/10 の範囲から固定IPが割り当てられる
TailscaleのIPでOllamaを特定インターフェースにバインドする設定
デフォルトのOllamaはローカルループバック(`127.0.0.1:11434`)のみでリッスンする。Tailscale経由でアクセスするには、TailscaleのIPでも受け付けるよう設定を変更する必要がある。1. systemdのoverride.confでOLLAMA_HOSTを変更する
sudo systemctl edit ollama
[Service] Environment="OLLAMA_HOST=100.94.31.12:11434"
sudo systemctl daemon-reload sudo systemctl restart ollama sudo systemctl status ollama
2. UFWを使っている場合の設定確認
UFWが有効な環境では以下を実行しておく:sudo ufw allow in on tailscale0 to any port 11434 proto tcp sudo ufw status
チームメンバーのPCにTailscaleを追加してOllamaへアクセスする
チームメンバーのWindowsやmacOSにもTailscaleをインストールして同じtailnetに参加させることで、Ollama APIにアクセスできる。1. クライアント側のTailscale参加
チームメンバーはTailscale公式から各OS向けクライアントをインストールし、サーバーと同じtailnetのアカウントか管理者が発行した招待リンクで参加する。参加後、メンバーのPCからサーバーのTailscale IPで直接Ollama APIを呼べる:# チームメンバーのPC(Tailscale参加済み)から実行 curl http://100.94.31.12:11434/api/tags # 正常な応答例 # {"models":[{"name":"llama3.3:8b-instruct-q4_K_M","..."}]}
2. PythonのOpenAI互換クライアントから呼ぶ
from openai import OpenAI client = OpenAI( base_url="http://100.94.31.12:11434/v1", api_key="dummy", # OllamaはAPIキー不要 ) response = client.chat.completions.create( model="llama3.3:8b-instruct-q4_K_M", messages=[{"role": "user", "content": "Linuxのsystemdとは何ですか?"}], ) print(response.choices[0].message.content)
TailscaleのACLで接続元をチームに限定する
tailnetのデフォルトでは参加全デバイスが互いに通信できる。管理画面でACLポリシーを編集して接続元を絞り込む。以下の例では `tag:ollama-client` タグのデバイスのみがポート11434に接続できる:{ "tagOwners": { "tag:ollama-server": ["autogroup:admin"], "tag:ollama-client": ["autogroup:member"] }, "acls": [ { "action": "accept", "src": ["tag:ollama-client"], "dst": ["tag:ollama-server:11434"] } ] }
ACLポリシーを保存すると即座に全デバイスに配布される。接続テストは `tailscale ping <相手のTailscale IP>` で実施する。`pong` が返れば通信が成立している。**注意**: JSON構文エラーや意図しない拒否ルールがあると全デバイスの通信が遮断されるため、変更前にポリシーを手元にバックアップしておきたい。
MagicDNSで覚えやすいURLをOllamaサーバーに固定する
TailscaleのMagicDNSを有効化すると、IPの代わりにホスト名でアクセスできる。管理画面「DNS」タブからオンにするだけで数秒でtailnet全体に反映される。有効化後はホスト名でOllamaにアクセスできる:# ホスト名がollama-serverの場合 curl http://ollama-server:11434/api/tags # ホスト名を確認するコマンド(サーバー上で実行) hostname # ホスト名を変更する場合 sudo hostnamectl set-hostname ollama-server
よくあるトラブルと対処法
**`tailscale up` 実行後に「already connected」と表示される**別のtailnetに参加済みの状態だ。`sudo tailscale logout` でログアウトしてから `sudo tailscale up` で再ログインする。
**TailscaleのIPでOllamaに接続できない(Connection refused)**
`tailscale ip -4` で確認したIPが `OLLAMA_HOST` と一致しているかを確認する。`curl http://127.0.0.1:11434/api/tags` でローカルから通るなら、UFWのルール不足が原因だ。
**Ollama再起動後にTailscale IPが変わった**
tailnetから離脱して再参加した場合にIPが変わることがある。MagicDNSを有効化しておけば名前解決が自動更新されるため、クライアント側の変更が不要になる。
**ACL変更後にOllamaへの接続が全滅した**
まず全通信を許可する設定(`"acls": [{"action": "accept", "src": ["*"], "dst": ["*:*"]}]`)に戻して接続を確認し、そこから少しずつACLを絞り込む。管理画面「Logs」でアクセス拒否の詳細を確認できる。
**MagicDNSのホスト名が解決できない**
クライアントのTailscaleアプリで「Use Tailscale DNS settings」が有効かを確認する。解決しない場合はアプリを再起動してみる。
**OllamaがTailscale IPをリッスンしていない**
`ss -tlnp | grep 11434` でListenポートを確認する。想定のIPが出ない場合は `OLLAMA_HOST` の設定を再確認してから `sudo systemctl restart ollama` を実行する。
まとめ
TailscaleでOllamaをチームに公開するための設定をまとめる。| 設定内容 | 主なコマンド・設定 | 目的 |
|---|---|---|
| Tailscaleインストール | curl -fsSL https://tailscale.com/install.sh | sh | Ubuntu ServerをTailscaleネットワークに参加させる |
| tailnet参加 | sudo tailscale up | 認証URLを取得してデバイスをtailnetに追加する |
| Ollamaバインド変更 | OLLAMA_HOST=TailscaleIP:11434(override.conf) | Tailscale経由のみのアクセスに絞り込む |
| UFW許可ルール | sudo ufw allow in on tailscale0 to any port 11434 | tailscale0インターフェースからの接続を許可する |
| ACLポリシー設定 | 管理画面のACL JSON(tagOwners・acls) | 接続元をチームメンバーのtagに限定する |
| MagicDNS有効化 | 管理画面DNS設定でMagicDNSをオン | IPの代わりにホスト名でOllamaにアクセスする |
Tailscaleを使ったアプローチの最大の利点は、ドメイン取得もTLS証明書管理もNginx設定も不要な点だ。インストールから5分程度でチーム全員がセキュアに接続できる状態になる。ローカルLLMのユースケース全般については「社内でChatGPTが使えないときの代替手段」も参考にしてほしい。
Tailscaleを使ったローカルLLMのチーム運用を2日間のハンズオンで体験する
TailscaleネットワークへのOllama組み込みを含むチーム運用の実構成をLinuxサーバーで一から組み立てる、「ローカルAIマスターセミナー」を開催しています。
少人数(最大8名)ZOOMハンズオン形式で実施しています。
・Ubuntu ServerでローカルLLMを構築する方法|Ollamaで機密データを外に出さず業務AIを動かす完全ガイド
・社内でChatGPTが使えないときの代替手段|機密データを守るローカルLLMという選択肢
・ローカルLLMのモデルを比較する方法|Llama3.3・Mistral・Gemma・Phi-4をUbuntuで使い分けるポイント
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:OllamaとLangGraphでステートフルAIエージェントを構築する方法|グラフ構造とループ処理でローカルLLMに複雑な業務フローを実装する手順
- この記事の属するカテゴリ:ローカルLLMへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます