Cloudflare Tunnelで学術サーバを安全に公開する

Cloudflare Tunnelを使って、インバウンドポートを一切開けずにElasticsearchやCantaloupe(IIIF)を安全に公開する方法

cloudflaretunneldockerelasticsearchiiif

台本(フルテキスト)

動画の掛け合いを書き起こしたものです。音声を再生しづらい場合はこちらをお読みください。

オープニング

  • Cloudflare Tunnel でインバウンドポートを閉じたままサービス公開
  • Elasticsearch と Cantaloupe を学術サーバで運用
ずんだもん
今日は Cloudflare Tunnel を使って学術サーバを安全に公開する方法を紹介するのだ。
めたん
学術サーバで Elasticsearch や Cantaloupe の IIIF 画像配信を運用する場合、ポートを開放すると攻撃のリスクがあるのよね。
ずんだもん
Cloudflare Tunnel はどうやってそれを解決するのだ?
めたん
通常はサーバがポートを開けて外部から接続を待つけど、Tunnel ではサーバ側から Cloudflare にアウトバウンド接続を張る構造にするの。
ずんだもん
インバウンドポートが一切不要になるのだ!
めたん
そう。サーバ上の cloudflared というエージェントが Cloudflare との接続を維持して、外部リクエストをトンネル経由でサーバに転送するわ。

Cloudflare Tunnel のメリット

  • ポート開放不要・WAF・DDoS 防御・SSL 自動化・無料
  • 従来の Traefik + Let's Encrypt 構成との比較
ずんだもん
Tunnel を使うとどんないいことがあるのだ?
めたん
インバウンドポートを全部閉じられること、Cloudflare による WAF と DDoS 防御、SSL 自動化、そして無料で使えること、の4つが大きなメリットよ。
ずんだもん
従来の Traefik 構成と比べるとどうなのだ?
めたん
Traefik は 80 と 443 ポートの開放が必要で、WAF を追加するには ModSecurity の設定が別途必要なの。Cloudflare Tunnel ではそれが全部 Cloudflare 側で管理されるわ。
ずんだもん
SSL 証明書の管理も不要になるのだ?
めたん
そうね。Let's Encrypt の設定やリバースプロキシも不要になるわ。ただし 2 階層のサブドメインは無料プランでは証明書がカバーされない点は注意ね。

セットアップ手順

  • Cloudflare ダッシュボードでトークン取得 → Docker Compose に追加
  • Ingress ルールで hostname とサービスを紐づけ
ずんだもん
設定はどうやってするのだ?
めたん
まず Cloudflare の Zero Trust ダッシュボードからトンネルを作成してトークンを取得するの。
ずんだもん
Docker Compose への追加はどうするのだ?
めたん
cloudflared コンテナをサービスに追加して TUNNEL_TOKEN を環境変数で渡すの。各サービスは ports の外部公開なしで同じネットワークに配置するわ。
ずんだもん
ホスト名とサービスの紐づけはどうするのだ?
めたん
Cloudflare API で Ingress ルールを設定するの。ホスト名ごとにどのサービスに転送するか、JSON で定義するわ。最後にキャッチオールの 404 ルールが必要よ。

サービスごとの公開方針

  • Cantaloupe(IIIF)は外部公開+CDN キャッシュ
  • Elasticsearch は Ingress から除外・SSH ポートフォワードで開発時接続
ずんだもん
Elasticsearch は外部公開しない方がいいのだ?
めたん
そうね。認証なしで公開するとデータ漏洩や改ざんのリスクがあるわ。Ingress ルールに含めず、開発時は SSH ポートフォワーディングでアクセスする方法を推奨しているの。
ずんだもん
Cantaloupe の IIIF 画像配信はどうするのだ?
めたん
Tunnel 経由で外部公開して、Cache Rules で CDN キャッシュを有効にするの。同じタイルの繰り返しリクエストがキャッシュから返るからオリジンの負荷が下がるわ。
ずんだもん
CDN キャッシュは無料プランの範囲内で使えるのだ?
めたん
はい。容量・帯域ともに無制限よ。研究用途で無料枠を超えることはまずないわ。

Next.js + Elasticsearch + IIIF の実践例

  • Next.js と Elasticsearch を同じ Docker ネットワークに配置
  • ブラウザからはすべて Tunnel 経由でアクセス
ずんだもん
実際にアプリを作る場合の構成を教えてほしいのだ。
めたん
Next.js の検索 UI と Cantaloupe の IIIF 画像配信を Tunnel 経由で公開して、Elasticsearch はコンテナ内ネットワーク経由で Next.js から直接接続するの。
ずんだもん
Next.js から Elasticsearch への接続は速いのだ?
めたん
Docker の内部ネットワーク経由だから 1 ミリ秒未満で接続できるわ。外部公開する必要がないの。
ずんだもん
OpenSeadragon で IIIF 画像をビューア表示もできるのだ?
めたん
そうよ。クライアントサイドの OpenSeadragon が Cantaloupe からタイルを取得して表示するの。タイルは Cloudflare の CDN にキャッシュされるから再表示も速いわ。

まとめ

  • インバウンドポート全閉鎖・SSL/WAF/CDN が追加コストなし
  • 内部サービスは外部非公開のまま開発可能
ずんだもん
今日のポイントをまとめてほしいのだ。
めたん
Cloudflare Tunnel を使うと、サーバのインバウンドポートを完全に閉じた状態でサービスを公開できるわ。SSL・WAF・CDN・DDoS 防御が追加コストなしで使えるの。
ずんだもん
Elasticsearch みたいな内部サービスは外部に公開しないまま開発できるのだな。
めたん
そうね。研究用途なら無料プランで十分で、サーバ側のコスト以外は費用ゼロで運用できるわ。
ずんだもん
Traefik 構成からの移行も比較的容易なのだな。よく分かったのだ!