AI活用

ComfyUIをLAN・外部公開するときの認証設計|TLSとリバースプロキシ

ComfyUIをLAN外から使うときの防御設計を解説。--listenだけで公開しない理由、脅威モデル、リバースプロキシで入口を一つにする構成、Basic/OIDC/VPNの使い分け、入力制限、ログと更新の運用まで分かります。

この記事の目次
  1. 結論:ComfyUIは閉じたまま、入口はプロキシ1つ
  2. listen設定だけで外部公開しない
  3. 脅威モデルを1枚に書く
  4. リバースプロキシで入口を1つにする
  5. 認証とTLSを用途で選ぶ
  6. 外部から入ってくる値を制限する
  7. ログと更新を運用に入れる
  8. 再現してほしい確認:LAN限定構成と認証付きプロキシ構成の経路を比べる
  9. よくある質問
  10. LAN内だけで共有するなら –listen だけで十分ですか?
  11. –multi-user を付ければユーザーごとに分離されますか?
  12. Comfy Cloud を使えばこの設計は不要ですか?
  13. まとめ

ComfyUIをLANの外から使うなら、ComfyUI自体は127.0.0.1で待ち受けたまま、認証とTLSを持つリバースプロキシを唯一の入口にします。--listen 0.0.0.0でそのままインターネットに出すのは、認証のないworkflow実行サーバーを公開することと同じです。

情報確認日:2026年8月22日(日本時間)

結論:ComfyUIは閉じたまま、入口はプロキシ1つ

責任範囲

  • --listenの既定値と、それだけで外部公開してはいけない理由
  • 誰が・どこから・何を実行できるかを決める脅威モデルの作り方
  • リバースプロキシで入口を1つにする構成
  • Basic認証・OIDC・VPNの用途別の使い分けとTLS
  • 任意ノード・任意パス・巨大ファイルを外部から入れさせない制限
  • アクセスログ・失敗ログ・更新・鍵のローテーションを運用に入れる

ComfyUIのAPI経路とServer APIの基本はComfyUI APIの使い方、ブラウザとComfyUIの間にNext.jsを置いて接続先を隠す構成はNext.jsの記事、Queueの同時実行数や負荷制御はQueue制御の記事で扱っています。この記事は「ComfyUIそのものにLAN外から到達させる」場合の防御設計に絞り、特定のVPN製品の設定やUI実装は扱いません。

スポンサーリンク

listen設定だけで外部公開しない

ComfyUIの起動オプション--listenは、ソース上のヘルプ文で既定が127.0.0.1、引数なしで指定すると0.0.0.0,::(IPv4・IPv6の全インターフェース)で待ち受けると説明されています。つまり既定では同じマシンからしか接続できず、--listenを付けた瞬間に、そのマシンに到達できるすべての相手から接続できるようになります。

Server APIには認証がありません。POST /promptに到達できる相手は、任意のworkflow JSONを実行できます。workflowの中にはファイルを読み書きするノード、custom nodeが追加した任意の処理が含まれ得るため、「画像を生成されるだけ」では済みません。加えてPOST /upload/imageでファイルを置け、GET /viewで出力を読め、GET /system_statsで環境情報を取れます。

やってはいけない構成:ルーターのポート転送で8188を直接外に出す。--listen--enable-cors-header(既定*)で任意のサイトからブラウザ経由で叩ける状態にする。クラウドVMのセキュリティグループで81880.0.0.0/0に開ける。いずれも認証なしの実行サーバーの公開です。

ComfyUIには--tls-keyfile / --tls-certfileでHTTPS化するオプションもありますが、暗号化と認証は別の話です。TLSを付けても、誰でも実行できる状態は変わりません。

脅威モデルを1枚に書く

対策を選ぶ前に、「誰が・どこから・何を」を1枚に書きます。これが決まらないと、Basic認証で足りるのかVPNが要るのかを判断できません。

問い 例:個人が外出先から使う 例:少人数チームで共有 例:Webアプリの裏側
誰が使うか 自分1人 特定の数名 アプリのサーバーだけ(人は直接触らない)
どこから 自分の端末(場所は不定) 各自の端末 固定のサーバーIP/同一プライベート網
何を実行できてよいか 任意workflow(自分の責任) 任意workflowだが、他人のファイルは触らせたくない 決められたworkflowの入力差し替えのみ
漏れて困るもの 生成物・prompt・LoRA等のファイル 上記+メンバー間の生成物 上記+アプリ利用者の入力
適した入口 VPN、またはプロキシ+認証 プロキシ+OIDC(個人別の認証) プライベート網限定。外部入口を作らない

3列目の「Webアプリの裏側」が最も多いケースで、この場合は公開入口を作らないのが答えです。Next.jsなどのアプリサーバーと同じホストか同じプライベート網にComfyUIを置き、外から来るのはアプリへのHTTPSだけにします。

リバースプロキシで入口を1つにする

人がLAN外からComfyUIのGUIやAPIを使う必要があるなら、ComfyUIは127.0.0.1:8188のまま、前段にリバースプロキシ(Caddy・nginx など)を置きます。プロキシがTLS終端と認証を担当し、通ったリクエストだけをComfyUIに転送します。

[インターネット] ──HTTPS:443──▶ [リバースプロキシ] ──HTTP:8188(localhost)──▶ [ComfyUI --listen 127.0.0.1]
                                   ├ TLS終端
                                   ├ 認証(Basic / OIDC)
                                   ├ パス制限(/prompt, /ws, /view …)
                                   ├ ボディサイズ上限・タイムアウト
                                   └ アクセスログ

Caddyは証明書の自動取得を含むため、個人用途では設定が短く済みます。以下はBasic認証+転送の最小例です(設定の文法はCaddy公式ドキュメントで現行版を確認してください)。

# Caddyfile(例)
comfy.example.com {
    basic_auth {
        # caddy hash-password で生成したハッシュを置く。平文は書かない
        alice JDJhJDE0JC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
    }
    request_body {
        max_size 20MB
    }
    reverse_proxy 127.0.0.1:8188
}

WebSocket(/ws)はCaddyのreverse_proxyがそのまま通します。nginxを使う場合はUpgradeConnectionヘッダの転送設定が必要です。どちらでも、プロキシの待ち受けは443だけにし、8188はファイアウォールで外から閉じます。

ComfyUI側の--enable-cors-headerは付けない:プロキシ経由で同一オリジンになるため、CORSの緩和は不要です。付けると、認証を通った利用者のブラウザから、別サイトのスクリプトがComfyUIを叩ける経路を作ることになります。

認証とTLSを用途で選ぶ

認証方式に万能はありません。利用者の数と、個人を識別する必要があるかで決めます。

方式 向いている場面 利点 限界
Basic認証(プロキシ) 自分1人、またはごく少人数 設定が短い。APIクライアントからも扱いやすい パスワード共有になりやすい。個人別の失効・監査が弱い。必ずTLSの上で使う
OIDC(ID基盤にログイン) チーム共有・退職や異動がある 個人別の認証・多要素・失効が基盤側でできる プロキシ側にOIDC対応(oauth2-proxy 等)が必要。APIクライアントはトークン取得の手順が増える
VPN(WireGuard 等) 公開入口自体を作りたくない ComfyUIをLANから出さずに済む。プロキシ不要な場合も 端末ごとの鍵配布・管理が要る。VPN内では無認証のままなので端末の管理が前提
クライアント証明書(mTLS) 固定されたサーバー間通信 鍵を持つ相手だけが接続できる 人が使うブラウザには配布が面倒

どの方式でもTLSは前提です。Basic認証はヘッダに資格情報をそのまま載せるため、HTTPで使えば経路上で読めます。証明書はLet’s Encryptなどで取得し、自己署名証明書は「自分の端末にだけ信頼設定を入れる」用途に限ります。

VPN製品の選定や個別設定はこの記事の範囲外です。どれを選んでも「ComfyUI本体は127.0.0.1(VPNならVPN内アドレス)にしか待ち受けない」点は共通です。

外部から入ってくる値を制限する

認証を通った相手が善意でも、入ってくる値は制限します。誤操作や、利用者の端末が乗っ取られた場合の被害を小さくするためです。

  • 任意のworkflowを受け付けない:Webアプリ経由なら雛形をサーバーが持ち、prompt・seed・サイズのように検証済みの値だけ差し込む。人がGUIを使う場合は、この制限はかけられないため、利用者を認証で絞る
  • パスを受け取らない/viewfilename / subfolder / typeや、Load Imageのファイル名を外部入力にしない。必要ならサーバー側の対応表でIDからファイルを引く
  • アップロードを制限する:プロキシでボディサイズ上限を設ける。/upload/imageを使うなら拡張子とサイズをアプリ側でも検証する。不要なら/upload/*自体をプロキシで遮断する
  • 使わないルートを閉じる:アプリの裏側なら、必要なのは/prompt/history/view/ws程度。/object_info/system_statsなど、構成情報を返すルートは外に出さない
  • custom nodeを棚卸しする:公開する環境には、必要なcustom nodeだけを入れる。ファイル操作やシェル実行を含むノードは、公開環境に置かない
  • 入出力フォルダを分ける--input-directory / --output-directoryで専用フォルダを指定し、モデルや設定ファイルと同じ場所に置かない

プロキシでルートを絞る例です。許可するパス以外は404にします。

# Caddyfile 抜粋(許可パスだけ転送する例)
@allowed path /prompt /history/* /view /ws /queue /interrupt
handle @allowed {
    reverse_proxy 127.0.0.1:8188
}
handle {
    respond 404
}

GUIを使わせる場合は、フロントエンドの静的ファイルや拡張のルートも必要になるため、この絞り込みはAPI専用の入口に向いています。

ログと更新を運用に入れる

公開した後に必要なのは、「誰がいつ何を実行したか」を後から追えることと、脆弱性修正を取り込み続けることです。

項目 何を残す・何をする どこで
アクセスログ 時刻・認証ユーザー・送信元IP・パス・ステータス・ボディサイズ プロキシ(promptの本文は残さないか、別途保護する)
失敗ログ 認証失敗の回数と送信元。連続失敗で一定時間遮断する(fail2ban等) プロキシ+ホスト
実行ログ prompt_idと完了・失敗。ComfyUIのコンソール出力を日付付きファイルに ComfyUI
バージョン更新 ComfyUI本体・custom node・プロキシ・OSを定期的に更新。更新前に/system_stats相当の情報と動作確認workflowを残す 運用手順
鍵・パスワードのローテーション Basic認証のパスワード、OIDCのクライアントシークレット、TLS証明書(自動更新の確認)、Comfy CloudやPartner NodeのAPIキーを期限付きで入れ替える 運用手順
メンバー変更 退職・異動時に即日失効。Basic認証では共有パスワードの変更が必要になるため、人数が増えたらOIDCへ 認証基盤

ComfyUIのServer APIは互換性の約束がなく、更新でルートやレスポンスが変わり得ます。更新後はプロキシの許可パスと、アプリ側のclient層が動くかを必ず確認します。

再現してほしい確認:LAN限定構成と認証付きプロキシ構成の経路を比べる

2つの構成で、「どのアドレス・ポートが誰から見えるか」を同じ手順で確認し、表に残します。

  1. 構成A(LAN限定):ComfyUIを既定(127.0.0.1)で起動。同じマシンからcurl http://127.0.0.1:8188/system_stats、LAN内の別端末からcurl http://<ホストのLAN IP>:8188/system_statsを実行する
  2. 構成B(プロキシ):構成Aのまま、プロキシを443で起動。別端末からhttps://comfy.example.com/system_statsを認証なし・認証ありで実行する。さらにhttp://<ホストのLAN IP>:8188/が引き続き拒否されることを確認する
  3. ホスト上で待ち受け中のソケットを一覧し(macOS/Linuxならlsof -iTCP -sTCP:LISTEN -n -P、Linuxならss -ltnp)、8188127.0.0.1にだけ束縛されていることを確認する
確認 構成A 期待 構成A 結果 構成B 期待 構成B 結果
同一マシンから 8188 200 200
LAN内別端末から 8188 接続拒否 接続拒否
443 認証なし 401
443 認証あり 200
443 で許可外パス(例 /object_info) 404(絞り込み設定時)
8188 の束縛アドレス 127.0.0.1 127.0.0.1

見るポイントは「構成Bにしても、8188への直接到達は構成Aと同じく拒否されたままか」です。ここが200になっていれば、プロキシを素通りする裏口が開いています。

よくある質問

LAN内だけで共有するなら –listen だけで十分ですか?

LAN内の全端末を信頼できるなら動きますが、認証がない点は変わりません。来客用Wi-Fiや家族・同僚の端末が同じネットワークにあるなら、LAN内でもプロキシ認証かホストのファイアウォールで送信元を絞ってください。

–multi-user を付ければユーザーごとに分離されますか?

ヘルプ文には「per-user storage を有効にする」とあり、保存先の分離が目的です。認証やアクセス制御を提供するものではないため、公開時の防御としては数えません。

Comfy Cloud を使えばこの設計は不要ですか?

自分でComfyUIを公開する必要はなくなります。代わりにAPIキーの管理と、workflowや生成物をクラウドに置くことの可否が判断事項になります。用途によってはこちらが簡単です。

まとめ

ComfyUIをLAN外から使う設計は、「ComfyUI本体は127.0.0.1のまま、TLSと認証を持つプロキシだけを入口にする」の一点に集約されます。--listenは認証を足す機能ではなく、到達できる相手を増やす機能です。

誰が・どこから・何を実行してよいかを先に書き、Basic・OIDC・VPNを用途で選び、任意のworkflow・パス・巨大ファイルを外から入れさせず、ログと更新とローテーションを運用に組み込んでください。Webアプリの裏側に置くだけなら、公開入口を作らないのが最も安全です。

スポンサーリンク