Cloudflare Tunnel は、cloudflared の問題を切り分けるための診断ログを生成します。診断レポートは、ローカルマシンで実行中の cloudflared インスタンス 1 つからデータを収集します。
診断ログの取得手順は、cloudflared のデプロイ環境によって異なります。
- ホストに
cloudflaredバージョン 2024.12.2 以降がインストールされていること
これらの手順は、ホストマシン上で直接実行しているリモート管理トンネルとローカル管理トンネルに適用されます。
-
(Linux のみ)ログにネットワーク診断を含めるには、
cloudflaredユーザーが root 権限なしで RAW ソケットと PACKET ソケットを作成できるようにします。sudo setcap cap_net_raw+ep /usr/bin/traceroute && sudo setcap cap_net_raw+ep /usr/bin/traceroutecap_net_rawを設定しない場合、traceroute のデータは利用できません。 -
診断ログを取得します。
cloudflared tunnel diag同じホストで複数の
cloudflaredインスタンスが動いている場合は、診断したいインスタンスの メトリクスサーバーの IP とポート を指定します。例:cloudflared tunnel diag --metrics 127.0.0.1:20241
このコマンドは各診断タスクのステータスを出力し、作業ディレクトリに cloudflared-diag-YYYY-MM-DDThh-mm-ss.zip ファイルを作成します。
cloudflared は、診断データを トンネルメトリクスサーバー から読み取ります。診断ログを取得するには、メトリクスサーバーを Docker コンテナから公開し、ホストマシンから到達できる必要があります。
-
Docker で実行中の
cloudflaredインスタンスの メトリクスサーバーのポート を確認します。 -
コンテナをポート転送ありでデプロイします。診断機能はローカルポート
20241を使って Docker インスタンスから情報を取得するため、手順 1 で確認したコンテナポートへ20241を転送します。docker run -d -p 20241:<metrics_port> docker.io/cloudflare/cloudflared tunnel ... -
Docker ホスト環境からメトリクスサーバーのアドレスに到達できることを確認します。
curl localhost:20241/diag/tunnelこのコマンドは次のような JSON を返します。
{ "tunnelID": "ef96b330-a7f5-4bce-a00e-827ce5be077f", "connectorID": "d236670a-9f74-422f-adf1-030f5c5f0523", "connections": [ { "isConnected": true, "protocol": 1, "edgeAddress": "198.41.192.167"}, {"isConnected": true, "protocol": 1, "edgeAddress": "198.41.200.113", "index": 1}, {"isConnected": true, "protocol": 1, "edgeAddress": "198.41.192.47", "index": 2}, {"isConnected": true, "protocol": 1, "edgeAddress": "198.41.200.73", "index": 3} ], "icmp_sources": ["192.168.1.243", "fe80::c59:bd4a:e815:ed6"] } -
Docker コンテナ ID を指定して診断を実行します。
cloudflared tunnel diag --diag-container-id=<containerID>コンテナ ID の代わりにコンテナ名を指定することもできます。
cloudflared tunnel diag --diag-container-id=<containerName>コンテナ ID を指定して診断コマンドを実行すると、
cloudflaredはログやコンテナの詳細など、Docker 環境から情報を収集できます。
このコマンドは各診断タスクのステータスを出力し、作業ディレクトリに cloudflared-diag-YYYY-MM-DDThh-mm-ss.zip ファイルを作成します。
診断機能は、ポート 20241 から 20245 を使って トンネルメトリクスサーバー からデータを取得します。ローカルの cloudflared インスタンスがこれらのポートのいずれかでメトリクスサーバーに接続できるよう、ポート転送が必要です。
-
トンネルの メトリクスサーバーのポート を確認します。
-
ポート転送を有効にします。
kubectl port-forward <pod> <diagnostic_port>:<metrics_port><pod>: トンネルが動いている Pod の名前<diagnostic_port>は、20241から20245の範囲内の任意のローカルポートです。<metrics_port>は、診断対象のcloudflaredインスタンスの Kubernetes Pod ポートです(手順 1 で確認します)。
たとえば、メトリクスサーバーのアドレスを
0.0.0.0:12345に設定している場合:kubectl port-forward cloudflared-6d4897585b-r8kfz 20244:12345ローカルポート
20244への接続は、トンネルが動いている Pod のポート12345へ転送されます。 -
診断を実行します。
cloudflared tunnel diag --diag-pod-id=<podID>Pod で複数のアプリケーション/サービスが動いており、
cloudflaredが Pod 内の先頭でない場合は、コンテナ ID または名前を指定する必要があります。cloudflared tunnel diag --diag-pod-id=<podID> --diag-container-id=<containerName>
このコマンドは各診断タスクのステータスを出力し、作業ディレクトリに cloudflared-diag-YYYY-MM-DDThh-mm-ss.zip ファイルを作成します。
cloudflared-diag-YYYY-MM-DDThh-mm-ss.zip アーカイブには、次のファイルが含まれます。各ファイルのデータは、診断対象の cloudflared インスタンス(diagnosee)か、診断を開始したインスタンス(diagnoser)のどちらかに対応します。たとえば、トンネルが Docker コンテナで動作している場合、diagnosee は Docker インスタンス、diagnoser はホストインスタンスです。
| ファイル名 | 説明 | インスタンス |
|---|---|---|
cli-configuration.json |
トンネル起動時に使った トンネル実行パラメーター | diagnosee |
cloudflared_logs.txt |
トンネルログファイル1 | diagnosee |
configuration.json |
トンネル構成パラメーター | diagnosee |
goroutine.pprof |
pprof が提供する goroutine プロファイル |
diagnosee |
heap.pprof |
pprof が提供するヒーププロファイル |
diagnosee |
metrics.txt |
診断時点の トンネルメトリクス のスナップショット | diagnosee |
network.txt |
IPv4 と IPv6 を使った、Cloudflare グローバルネットワークへの JSON traceroute | diagnoser |
raw-network.txt |
IPv4 と IPv6 を使った、Cloudflare グローバルネットワークへの生の traceroute | diagnoser |
systeminformation.json |
OS 情報とリソース使用状況 | diagnosee |
task-result.json |
各診断タスクの結果 | diagnoser |
tunnelstate.json |
診断時点のトンネル接続 | diagnosee |
-
ログファイルが空の場合は、トンネル起動時に
--loglevelをdebugに設定 する必要があることがあります。--loglevelパラメーターが必要になるのは、CLI でcloudflared tunnel runコマンドを使ってトンネルを実行した場合だけです。Linux / macOS のサービスとして動作している場合や、Docker / Kubernetes で動作している場合は不要です。 ↩