すべてのページ
このページの内容

Cloudflare Tunnel 経由でリレーに接続する

Cloudflare Tunnel を使うと、自分のサーバーを持たず、ルーターでポートを開けることもなく、リレーに公開の HTTPS アドレスを与えられます。OAR は Cloudflare の cloudflared プログラムを代わりに実行できます。リレーとともに起動し、切れたら再起動し、その状態をステータスドットに表示します。Cloudflare 上にドメインがあり、スマートフォンや別のネットワークからリレーに接続したい場合や、ページをアプリとしてインストールするためやプッシュ通知のために HTTPS が必要な場合に選んでください。

cloudflared は Cloudflare に向けて外向きに接続します。リレーはこのマシンだけで待ち受けたまま(localhostOnly は true のまま)で、Cloudflare があなたのホスト名へのリクエストをその接続を通じてリレーのポートまで運びます。

必要なもの #

  • Zero Trust を使える Cloudflare アカウントと、公開ホスト名用にそのアカウント上にあるドメイン(ゾーン)。
  • リレーを実行するマシンにインストールされた cloudflared。OAR には同梱されておらず、OAR がインストールすることもありません。
  • Cloudflare で作成したトンネル。OAR はトンネルのトークンからそれを実行します。

リレーは cloudflaredTunnel.binary で指定されたプログラムを実行し、指定がなければ PATH 上で見つけた cloudflared を実行します。インストール方法は次のとおりです。

システム インストール方法
Windows winget install --id Cloudflare.cloudflared
macOS brew install cloudflared
Linux Cloudflare のパッケージリポジトリ(Debian、Ubuntu、RHEL):pkg.cloudflare.com

Windows では、.cmd や .bat のランチャーは使えません。OAR が起動するのは .exe または .com のファイルです。

1 種類のトンネルのみ

OAR が対応しているのは、トークンから実行するトンネル(Cloudflare がリモート管理トンネルと呼ぶ種類)です。認証情報ファイルやトンネル名を指定する設定はなく、ランダムなアドレスのクイックトンネルの設定もありません。そうしたトンネルを自分で実行する場合は、cloudflared を OAR の外で起動してください。その場合、OAR はそのトンネルについて何も知りません。

設定する #

  1. Cloudflare Zero Trust のアカウントでトンネルを作成し、そのトークンをコピーします。
  2. トンネルにゾーン上の公開ホスト名(例:relay.example.com)を割り当て、http://localhost:3333 に向けます。config.json で port を変更している場合は、そのポートを使います。このルーティングは、あなたのマシンではなく Cloudflare 側にあります。
  3. トークンを入れた cloudflaredTunnel ブロックを config.json に追加します(設定ファイルのキーを参照)。
  4. oar restart でリレーを再起動します。

ブラウザーで https://relay.example.com/ を開きます。いつもどおりアクセストークンでサインインします。

設定ファイルのブロック #

{
  "cloudflaredTunnel": {
    "mode": "managed",
    "required": false,
    "token": "<tunnel token>",
    "binary": "cloudflared",
    "extraArgs": []
  }
}
キー 型 既定値 動作
mode "disabled" または "managed" "disabled" managed にすると、リレーが cloudflared を実行します。
token 文字列 なし トンネルのトークンです。managed の場合は必須です。ない場合、トンネルはオフのままになり、ログに理由が出ます。
required 真偽値 false トンネルが接続されていない間、リレーはキューからメッセージを取り出すのを一時停止します。必須のトンネルを参照してください。
binary 文字列 cloudflared プログラムです。絶対パスか、PATH 上で探す名前で指定します。パスは実行可能なファイルを指している必要があります。フォルダーを含む相対パスはリレーのプログラムのフォルダーを基準にするので、絶対パスを使ってください。
extraArgs 文字列の配列 [] cloudflared tunnel run --token <token> の後に追加する引数です。空のエントリは取り除かれます。

古い形式の "enabled": true も、mode: "managed" として引き続き使えます。3 つの環境変数がファイルより優先されます。COPILOT_CLOUDFLARED_MODE、COPILOT_CLOUDFLARED_TOKEN、COPILOT_CLOUDFLARED_BINARY です。config.json のリファレンスにはほかのトンネルの設定とともにキーが、環境変数のページには変数が記載されています。

リレーはトークンを、環境変数ではなくコマンドラインの引数として cloudflared に渡します(cloudflared tunnel run --token <token>)。そのため、ほかのユーザーがいるマシンでは、実行中のプロセスの一覧にトークンが表示されることがあります。リレーのログでは <redacted> と表示されます。

動作 #

  • 起動と停止。 リレーは、起動するときに cloudflared を起動し、終了するときにそれを停止します(終了シグナル)。
  • 接続。 cloudflared が登録済みの接続を報告したとき、またはそれがない場合は 5 秒間動作したときに、トンネルが接続されたとみなします。
  • 切断。 cloudflared が終了すると、リレーは約 5、10、20、40、そして 60 秒の待ち時間の後に再び起動します。それぞれ最大 20% が加算されます。30 秒より長く続いた接続の後は、段階が最初からやり直しになります。
  • 誤ったトークンや削除されたトンネル。 cloudflared が 3 回続けて 10 秒以内に終了すると、リレーはエラー auth-or-config を報告し、それ以降は約 1 分に 1 回だけ再試行します。
  • cloudflared がない場合。 リレーは通常どおり起動し、トンネルはオフのままです。リレーは 1 分ごとに確認し直し、プログラムが見つかるとトンネルを起動します。リレーの PATH にないフォルダーにインストールした場合は、リレーを再起動してください。

必須のトンネル #

required: true の場合、トンネルが接続されていない間、リレーはキューからメッセージを取り出しません。これには、最初に接続するまでの時間と、cloudflared やトークンがない場合も含まれます。外部から接続できなければリレーが役に立たないときに使ってください。メッセージはキューで待ち、トンネルが接続されると実行されます(ターンとキューを参照)。

状態を見る #

場所 表示内容
ステータスドット トンネルが接続されている間は琥珀色で、ツールチップは Web relay reachable via Cloudflare Tunnel(Cloudflare Tunnel 経由で Web リレーに到達できます)です。設定されているが接続されていないときは緑色で、ツールチップは Web relay reachable; Cloudflare tunnel disconnected ()(Web リレーには到達可能、Cloudflare トンネルは切断:)、または cloudflared がない場合は Cloudflare tunnel off: (Cloudflare トンネルはオフ:)です。リレーは引き続き応答します。メニューと外観を参照してください。
oar status トンネルがオンのときの Tunnel: の行です。running、not connected、not connected (<reason>)、off: <reason> のいずれかです。リレーが停止しているときは、oar doctor と同じ文言を表示します。oar status を参照してください。
oar doctor disabled、managed (cloudflared: <path>)、managed, cannot start: <reason> のいずれかです。設定ファイルを読むだけで、何も変更しません。oar doctor を参照してください。
ログ [cloudflared-tunnel] で始まる行です。コマンド(トークンは <redacted> と表示)、Tunnel connected、終了と再接続までの待ち時間、cloudflared 自身の出力が出ます。

公開ホスト名のルーティングは Cloudflare 側にあるため、リレーはそのホスト名を知りません。そのため、上記のどれにもホスト名は表示されません。

トンネル経由のトラフィックを見分ける #

Cloudflare は、転送するすべてのリクエストに cf-ray ヘッダーを付け加えます。リレーはこれを使って、トンネル経由で来たリクエストと、このマシン上で行われたリクエストを見分けます。自分のエッジが付け加えるヘッダーも同じように扱うには、それらを tunnelMarkerHeaders に記載します。publicHostnames にはリレーに到達するホスト名を記載し、trustProxy では、転送元のアドレスについてリレーがどのプロキシを信頼するかを指定します。既定値の "loopback" は、同じマシン上の cloudflared に適しています。3 つとも config.json のリファレンスにあります。

プレビュー用の 2 つ目のホスト名 #

プレビューには専用のホスト名が必要です。これにより、プレビューしたアプリがリレーとログインの Cookie を共有することはありません。同じトンネルに 2 つ目の公開ホスト名として追加し、プレビューのリスナー(既定では http://127.0.0.1:3334)に向けてください。プレビューのページに、イングレスの例と previews ブロックがあります。リレーのホスト名は publicHostnames に入れてください。

リレーの前段に置く Cloudflare Access #

リレーのホスト名に設定した Cloudflare Access のアプリケーションは、共有した会話の閲覧者を含む、すべての訪問者に適用されます。例外を設けないと、閲覧者はサインインを求められ、リンクが機能しません。/shared/* と /api/shared/* は、ログインなしで通すようにしてください。

/api/shared/* に Cloudflare のキャッシュルールを追加しないでください。共有ページは会話を追うためにそのアドレスを再読み込みするので、キャッシュされた応答だと古い状態が表示され続けてしまいます。リレーは、すべての API の応答に Cache-Control: no-store を付け、すべての応答で CDN-Cache-Control と Cloudflare-CDN-Cache-Control を no-store に設定します。Cloudflare は、ゾーン内のキャッシュルールよりもこの 2 つを優先します。

セキュリティ #

トンネルは、リレーを公開のインターネット上に置きます。ほかの人を締め出しているのはアクセストークンです。アクセストークンとリレーに接続できる範囲と OAR が公開するものを参照してください。

リレーのセッションワーカーは、このマシン上でだけ動作するソケットで接続します。公開のトンネルはすべてのパスを転送するため、リレーは、それらのパスへのリクエストで cf-ray か tunnelMarkerHeaders のいずれかを含むものに 403 を返し、ログに [tunnel-guard] として記録します。ログインなしでトンネル経由で届く共有リンクは影響を受けません。

トラブルシューティング #

表示 対処
ツールチップに Cloudflare tunnel off: cloudflared is not installed(Cloudflare トンネルはオフ:cloudflared がインストールされていません)と出る(その後にインストール方法が続く)、または oar doctor に cloudflared is not installed と出る cloudflared をインストールします(必要なものを参照)。1 分以内にトンネルが起動します。
cloudflared was not found as configured (<path>) cloudflaredTunnel.binary が何も指していません。パスを直すか、キーを空にして PATH 上の cloudflared を使います。
cloudflaredTunnel.token is required when cloudflaredTunnel.mode is "managed" 設定ファイルにトークンを追加するか、COPILOT_CLOUDFLARED_TOKEN を設定します。
Tunnel: not connected (auth-or-config) cloudflared がすぐに終了し続けています。トークンと、トンネルが Cloudflare にまだ存在することを確認します。ログに cloudflared 自身のメッセージがあります。
Tunnel: not connected (exit:<code>) cloudflared がその終了コードで終了しました。リレーは再試行しています。ログを読んでください。
トンネル経由でリレーを開いたのに、ドットが緑のまま リレー側から見て、トンネルが接続されていません。ツールチップと oar status を確認します。
メッセージが実行されず、キューが一時停止している required が true で、トンネルが接続されていません。トンネルを直すか、required を false に設定します。
共有リンクで閲覧者にサインインが求められる Cloudflare Access が妨げています。/shared/* と /api/shared/* を通すようにします。
共有ページに古い状態が表示される キャッシュルールが /api/shared/* を対象にしています。削除します。
セッションワーカーのパスで 403 想定どおりです。それらのパスはトンネル経由のトラフィックに対して閉じられています。
cloudflared はインストールされているのに、トンネルが起動しない リレーが PATH 上でそれを見つけられていない可能性があります。binary にフルパスを設定し、oar restart を実行します。