はじめに
はじめまして。本記事を閲覧いただきありがとうございます。株式会社NTTデータ九州 ビジネス共創部 デジタルビジネス推進室の内田です。
普段はセキュリティチームに属して、ゼロトラスト技術によるサイバーセキュリティ対策やSaaSサービス活用によるお客様業務高度化などのビジネスに取り組んでいます。
今回、セキュリティ+AI活用という文脈で、機密データを外部に出さずに生成AIを活用しつつゼロトラスト前提で安全にアクセスできる形を模索するため、ローカルLLMとOpen WebUI/SearXNG/Tailscaleを組み合わせた構成を検証したので紹介します。
本記事で紹介する内容は、筆者が業務とは切り離して、個人的に行った技術検証に基づくものです。記載内容は所属組織の公式見解や業務での利用方針を示すものではありません。
最近ローカルLLM界隈が盛り上がっていますが、「ハイスペックなNVIDIA製グラボがないと実用レベルではないのでは?」「外出先のスマホから使いたいけど、自宅ネットワークに穴を開ける(ポート開放する)のはセキュリティ的にあり得ない」と感じている方は多いのではないでしょうか。
私もそう考えていましたが、手持ちの「内蔵GPU(Radeon 780M)」と「メモリ32GB」のPC環境をベースに、情報漏洩リスクを極小化した自分専用のRAGチャット(Web検索連携AI)環境を容易に、かつ安全に構築できました。
本記事では、著名なクラウドAIサービスや従来のリモートアクセス手法と比較しつつ、セキュリティと利便性を両立させた構成と、各種設定ファイル、そして「実際に運用してわかったWeb検索連携のシビアな現実」を共有します。
1. システムアーキテクチャと採用技術
この環境は、以下のオープンソースツール群を組み合わせて実現しています。全体像を把握しやすいよう構成図を作成しました。
- ハードウェア: Windows 11 / Ryzen 7 8745HS / メモリ32GB / Radeon 780M (UMA 16GB割当)
- LLM基盤 (LM Studio): 今回は実験的に、日本語の文脈理解に優れた「gpt-oss 20bのSwallowモデル」を採用。20Bクラスの少し重いモデルですが、内蔵GPUの活用で実用的に動作します。
- フロントエンド (Open WebUI): ChatGPTライクなUIを提供するDockerコンテナ。
- Web検索連携 (SearXNG): プライバシー重視のメタ検索エンジン。AIのRAG(検索拡張生成)のソースとして機能します。
- リモートアクセス (Tailscale): ゼロトラストベースのVPN通信網。
2. セキュリティ担当視点での工夫ポイント
外出先からスマホでアクセスし、さらにAIにWeb検索を用いたRAGチャットをさせるにあたり、以下のセキュリティ対策を講じています。
工夫①:Tailscaleによる「ルーターの穴あけゼロ」
外部から自宅サーバーにアクセスするためのポートフォワーディング(ポート開放)は、攻撃の入り口を晒すリスクがあります。
そこでTailscaleを採用し、「ルーターのインバウンドポートを一切開けることなく」端末同士を暗号化トンネルで直結しました。スマホからはTailscaleが付与するIP(例:http://100.x.x.x:3000)にアクセスするだけでよく、安全なリモートアクセスを担保しています。
工夫②:Open WebUI + SearXNGによる「検索プライバシーの2段構え」
AIに最新情報を答えさせるRAGチャットを実装する際、GoogleなどのAPIを直接叩くと、ユーザーの検索履歴がデータとして蓄積される可能性があります。これを以下の2段構えで防御しています。
-
生プロンプトの流出防止(Open WebUI)
ユーザーが入力した生の質問文がそのまま検索エンジンに飛ぶわけではなく、Open WebUI(LLM)が事前に質問から「検索キーワード」だけを抽出して生成します。 -
トラッキングの隠蔽(SearXNG)
抽出されたキーワードは、プロキシとして働くSearXNGを経由して検索エンジンに送られます。これにより、検索エンジン側からのトラッキングを防ぐことができます。
3. 実践:Docker ComposeとSearXNGの設定ファイル
安定してRAGチャットを稼働させるための、核となる設定ファイルです。
docker-compose.yml(Open WebUI + SearXNG)
ポイントは SEARXNG_SEARCH_URL の指定です。 URLパラメータで言語を強制するよりも、Open WebUIのGUI設定側で言語(Language)を all に指定したほうが検索精度が向上することがわかったため、本構成ではこのアプローチを採用しています。
services:
valkey:
image: valkey/valkey:latest
container_name: searxng-valkey
networks:
- home-chat-net
command: valkey-server --save "" --appendonly no
tmpfs:
- /var/lib/valkey
restart: always
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
restart: always
ports:
- "3000:8080"
environment:
# LM StudioのAPIエンドポイント(ホストマシンの1234番)
- OPENAI_API_BASE_URL=[http://host.docker.internal:1234/v1](http://host.docker.internal:1234/v1)
- OPENAI_API_KEY=lm-studio
- ENABLE_RAG_WEB_SEARCH=True
- RAG_WEB_SEARCH_ENGINE=searxng
# ★重要: URLパラメータで日本語検索を強制する
- SEARXNG_SEARCH_URL=http://searxng:8080/search?q=<query>
# コンテキスト超過を防ぐため、検索取得件数を5件に絞る
- WEB_SEARCH_RESULT_COUNT=5
volumes:
- open-webui-data:/app/backend/data
extra_hosts:
- "host.docker.internal:host-gateway"
networks:
- home-chat-net
depends_on:
- searxng
searxng:
image: searxng/searxng:latest
container_name: searxng
restart: always
ports:
- "8081:8080"
volumes:
- ./searxng:/etc/searxng
environment:
- SEARXNG_BASE_URL=http://localhost:8081/
networks:
- home-chat-net
depends_on:
- valkey
volumes:
open-webui-data:
networks:
home-chat-net:
driver: bridge
SearXNGの設定(settings.yml)
SearXNGの設定は searxng/settings.yml として保存します。
後述するBot判定を回避するため、limiter: false とし、エラーを起こしやすいエンジンを無効化しています。
use_default_settings: true
server:
port: 8080
bind_address: "0.0.0.0"
secret_key: "your_secret_key_here"
# ★重要: trueにするとOpen WebUIからの高頻度リクエストが身内ブロックされる
limiter: false
search:
default_lang: "ja-JP"
formats:
- html
- json
redis:
url: redis://searxng-valkey:6379/0
engines:
# CAPTCHAやJSONパースエラーを起こしやすいエンジンは全て無効化
- name: google
engine: google
disabled: true
- name: bing
engine: bing
disabled: true
- name: brave
engine: brave
disabled: true
# ★Bot判定に比較的緩いDuckDuckGoのみを有効化
- name: duckduckgo
engine: duckduckgo
shortcut: ddg
disabled: false
4. 実用性を高めるチューニングと「RAGチャットの現実」
構築にあたり、Radeon 780Mの性能を引き出すためにLM Studioでバックエンドに「Vulkan」を指定し、BIOS設定でUMA(VRAM割当)を16GBに変更しました。これにより、20BクラスのSwallowモデルでもローカルである程度高速に推論させることが可能になりました。
しかし、Web検索(RAG)を有効にした途端、運用時にいくつかの課題が判明しました。
現実①:Web検索ONだと処理速度が「分単位」になり実用性に課題が生じる
ローカルLLM単体(内部知識のみ)でのレスポンスは快適なのですが、Web検索をONにすると「検索 → 複数サイトのテキスト取得 → 20Bモデルでの読解・生成」という重い処理が走ります。
結果として、回答が返ってくるまでに分単位のオーダーの時間がかかることがあり、課題が生じました。普段は割り切ってWeb検索をOFFにし、Swallowモデルの優秀な内部知識だけで完結させる使い方がストレスフリーです。
現実②:検索エンジンのCAPTCHA問題(Bot対策の壁)
Web検索をONにしていると、Googleなどの検索エンジンでは「Bot(スクレイピング)」判定が行われやすく、CAPTCHAが発生する場合があります。
【現在の対策】
前述の settings.yml にある通り、現在はSearXNG側のエンジン設定でDuckDuckGo一本に絞って運用しています。
運用開始から数日経過した現時点ではCAPTCHAの傾向は見られず安定していますが、一般的にはDuckDuckGoでも一定期間連続で自動検索をさせるとCAPTCHA問題が発生するリスクがあるようです。今後もしブロックされるようになった場合は、別のエンジンに切り替えるなど運用面でのカバーが必要になりそうです。
5. まとめ
「ローカル運用はグラボが必須」「外部アクセスは危険」といった先入観は、Tailscaleや各種オープンソース技術によって覆すことができました。クラウドにデータを渡すことなく、外出先のスマホから自宅のAIにアクセスできる環境は、セキュリティ面でも非常に安心感があります。
一方で、ローカルリソースでの「RAGチャット」は処理速度やBot対策回避の面で課題が残り、実用レベルへの昇華には割り切りや工夫が必要です。それでも、月数百円程度の電気代増で、20Bクラスの優秀な日本語特化AIを24時間持ち歩けるのは大きな魅力です。ぜひ皆さんも、自分専用のローカルAI環境の構築に挑戦してみてください!
【追記】LM Studioの新機能「lm link」について
この記事を執筆している最中、なんとLM Studioから「lm link」という新機能がリリースされました!
この機能は、まさに本記事のテーマである「セキュアなリモートアクセス」をより簡単にするもので、TailscaleがLM Studioの内部に直接組み込まれています。
これにより、OS側でTailscaleをセットアップせずとも、ルーターのポートを開放することなく、非常に簡単かつセキュアに自宅PCのモデルをリモートの端末(外出先のノートPCや別のデスクトップPCなど)と共有できるようになりました。
この機能も近日中に是非試してみたいと思います。数日単位で目まぐるしく便利な機能が登場するローカルLLM界隈の進化スピードには、本当に驚かされるばかりです。
【執筆日・免責事項】
【執筆日】2026年2月27日
【免責事項】本記事の内容は筆者個人の検証結果に基づくものであり、各ソフトウェアの動作を保証するものではありません。