🕳️

cloudflared tunnel をモニターする

2024/04/25に公開

はじめに

cloudflared の監視について。
devdoc には 3 種類の記載があります。

Logs
Notifications
Metrics

Logs

用途

cloudflared ログのおもなユースケースは、接続エラーなどのトラブルシュートになると思います。

実装

ローカルファイルへの出力

起動ファイルやコマンド引数に設定を書いておくと

$ grep log config.yaml
loglevel: info
transport-loglevel: info
logfile: /home/ubuntu/log/cloudflared.log

ログがファイルに出力されます。

{"level":"info","time":"2024-04-25T08:57:24Z","message":"Initial protocol quic"}
リモートでストリーム出力

リモートからストリームでログを観察できます。

パフォーマンス面で注意点あり

ダッシュボード

CLI

~ $ cloudflared tunnel list
You can obtain more detailed information for each tunnel with `cloudflared tunnel info <name/uuid>`
ID NAME CREATED CONNECTIONS
<Tunnel_Uuid> Tun1 2023-09-03T10:27:29Z 2xnrt05, 1xnrt07, 1xnrt08

~ $ cloudflared tail --output=json  <Tunnel_Uuid>
{"time":"2024-04-25T09:38:10Z","message":"tcp proxy stream ...
{"time":"2024-04-25T09:38:10Z","message":"downstream-\u003eupstream ...

Notifications

用途

トンネルの突発的な状況変化イベントを管理者に知らせます。

実装

ダッシュボードから Notification を設定します。
Email や Webhook で送信されます。

Metrics

用途

トンネル稼働状況の継続的な把握、負荷などの傾向予測に利用します。
外部ツールとの連携で、トンネルが複数ある場合も、一元で可視化することができます。

実装

Metrics サーバーの公開

cloudflared を起動すると、その状況をさらす Metrics サーバーが立ち上がります。
それに外からアクセスするようにします。

  1. --metrics <Listen_IP:Port> で NIC の IP を指定し起動
$ cloudflared tunnel --config config.yaml --metrics 172.16.0.147:60123 run oc1
  1. メトリックが取れるか確認
## TCP と UDP のアクティブセッションを確認(cloudflared が仲介する TCP/UDP セッション)
$ curl 172.16.0.147:60123/metrics -s | egrep '^cloudflared_(udp|tcp)_active_sessions'
cloudflared_tcp_active_sessions 0
cloudflared_udp_active_sessions 0

## cloudflared 経由で UDP 接続する
## cloudflared_udp_active_sessions が上がる
@server
$ nc -lku 1234
@remote
$ nc -u 172.16.0.253 1234

$ curl 172.16.0.147:60123/metrics -s | egrep '^cloudflared_(udp|tcp)_active_sessions'
cloudflared_tcp_active_sessions 0
cloudflared_udp_active_sessions 1

## cloudflared 経由で TCP 接続する
## cloudflared_udp_active_sessions が上がる
@server
$ nc -lk 1234
@remote
$ nc 172.16.0.253 1234

$ curl 172.16.0.147:60123/metrics -s | egrep '^cloudflared_(udp|tcp)_active_sessions'
cloudflared_tcp_active_sessions 1
cloudflared_udp_active_sessions 0
Metrics 値の可視化

devdoc の手順にそえば、Grafana で見れるようなります。
ただ今回は一部追加した部分があります。

1. 監視用サーバーに PrometheusGrafana のダウンロードとインストール
2. prometheus.yml編集
  - job_name: "cloudflared"
    static_configs:
      - targets: ["172.16.0.147:60123"] ## cloudflared server IP and the --metrics port configured for the tunnel

  - job_name: "cfd_nodes"
    static_configs:
      - targets: ["172.16.0.147:9100"] ## cloudflared server IP and node exproler

cfd_nodes の方は、devdoc の例に記載がありません。
cloudflared のメトリック採取自体には不要な設定です。
ただ、cloudflared が動くサーバーの sysctl の設定が推奨値を設定しているかも一緒に取りたかったので、OS のメトリック採取目的で追加しました(↓3)。

3. cloudflared サーバーに Prometheus Node Exporter をインストール(オプション)

cloudflared の推奨環境の一つに、仲介時に利用できる送信元ポートの数に余力を持たせておくこととあり、net.ipv4.ip_local_port_range = 11000 60999 5 万ほど確保している例が示されています。
稼働サーバーでその値が何になっているか、を取るために Node Exporter を導入します。

Ubuntu 22.04 の apt で導入すると、sysctl を読むオプションがないバージョン(1.3.1)のようで、ソースから Latest 1.8.0 をインストールしました。

sysctl はデフォルトで読むリストから除外されていたので、sysctl を追加し、起動します。

$ ./node_exporter --collector.sysctl --collector.sysctl.include=net.ipv4.ip_local_port_range
4. 観測

下記あたりを観測してみました。

cloudflared のキャパシティを設計するツール で使うためのパラメータを cloudflared から採取。

  • cloudflared_tcp_total_sessions
  • cloudflared_udp_total_sessions

OS の利用可能ポート数を確認する項目を Node Exporter から採取。

  • sysctl.net.ipv4.ip_local_port_range

空きポートは推奨より 2 万ほど少ないのがわかります。

5. 通知

Cloudflare の通知機能は今のところトンネルの状態変化(Up, Down など)に限られますが、Grafana のアラート機能も併用すると、トンネルの負荷状況についても、しきい値で監視ができそうです。
下記は TCP 同時接続数がしきい値(1)を超えて(5)でアラートが発射された例になります。

その他

よくあるエラー

https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/troubleshoot-tunnels/common-errors/

最後に

日々の運用のなかで、これも監視すると効果的、こんな方法がある、などの情報をお持ちでしたら、ぜひ共有していただければと思います。
全国の cloudflared 友の会のみなさまにとってハッピートンネルライフが訪れますように。

Discussion