🕳️

Cloudflare Tunnel を systemctl で実行する際の config.yml 反映に関する落とし穴

に公開

バージョン

  • ubuntu 24.02
  • cloudflared version 2025.4.2 (built 2025-04-30-1407 UTC)

結論

Cloudflare Tunnel をsystemctlなどのサービスとして実行していて、インストール時に --config オプションで設定ファイルのパスを指定しても、実際に参照される設定ファイルは /etc/cloudflared/config.yml です。

経緯

Cloudflare Tunnel は、オンプレミスのサーバーやローカルネットワークを Cloudflare のネットワークに安全に接続するためのサービスです。
これを使えば、外部から直接アクセスできないサーバーにも、Cloudflare のセキュリティを経由してインターネット越しにアクセスできます。

私は Cloudflare Tunnel の設定ファイルを ~/.cloudflared/config.yml に書いていました。

tunnel: <tunnel-id>
credentials-file: /home/<user-name>/.cloudflared/<tunnel-id>.json

ingress:
  - hostname: www.example.com
    service: http://localhost:80
  - service: http_status:404

こんな感じで諸々設定すると、指定したドメインから自分のポートにアクセスできるようになります。
IPアドレスやポートを直接利用者に見せず、Cloudflare を経由するのでセキュアです。また、ポート開放を行う必要もありません。

これを「デーモンとして自動実行したいな〜」と思い、公式ドキュメントの Run as a service に従って、以下のコマンドを打ち込みました。

> cloudflared service install
Cannot determine default configuration path.
No file [config.yml config.yaml] in [~/.cloudflared ~/.cloudflare-warp ~/cloudflare-warp /etc/cloudflared /usr/local/etc/cloudflared]

むむ。デフォルトのコンフィグファイルの場所がわからないよって言われてる……(config.yml~/.cloudflared にあるんだけどな……)と思いつつ、調べてみると --config オプションで場所を指定できるらしい(参考

sudo cloudflared --config /home/ubuntu/.cloudflared/config.yml service install 

その後、systemctl restart cloudflared でトンネル起動!接続ヨシ👈😺!

問題発生

ところが、開発が進んで「コンフィグの中身をいじりたいな〜」と思い ~/.cloudflared/config.yml を編集しても、設定が反映されない。
systemctl restart cloudflared などで再起動しても変わらず、DNS レコードやファイアウォールの設定も見直したけど、解決せず……。

解決策

いったん systemctl を使うのをやめて、手動で cloudflared tunnel run <tunnel-name> を実行してみると、設定が反映された。
もしやと思い、/etc/cloudflared/config.yml を見てみたら、なんと ~/.cloudflared/config.yml の古いコピーが!

どうやら、サービス作成時に指定したファイルは、単に /etc/cloudflared/config.yml にコピーされ、それ以降はそちらが参照されるようです(参考)

つまり、--config で指定したファイル自体が使われるわけではなく、指定ファイルの中身が /etc/cloudflared/config.yml にコピーされて、それが使われるという動きだったようです。

そこで /etc/cloudflared/config.yml を編集してから、サービスをリスタートしたところ無事解決しました。

あとがき

  • レコードの指定が悪いのか……いや、ファイアウォールの問題か……?という感じに沼って、5時間くらい悩みました。
  • --config オプションは設定ファイルの「場所を指定」するものだと思っていたけど、実際は中身を「コピー」するだけのオプションでした。

Discussion