Skip to content

Cloudflare DDNS

グローバル IPv4 を取得し、Cloudflare の A レコードを更新する。 IP が変わったときだけ更新し、任意で Discord に通知する。 スクリプト本体は ddns/cloudflare-ddns.sh にある。

構成上の位置づけ

LXC ddns(インベントリ)を実行ホストの一例とする。 このページはセットアップ手順だけを置く。

必要なもの

  • curl
  • jq
  • Cloudflare API トークン(対象 Zone の DNS Edit 権限)

手順

1. スクリプトを配置する

sudo install -m 755 cloudflare-ddns.sh /usr/local/bin/cloudflare-ddns.sh

2. 設定ファイルを作成する

sudo cp cloudflare-ddns.env.example /etc/cloudflare-ddns.env
sudo chmod 600 /etc/cloudflare-ddns.env
sudo edit /etc/cloudflare-ddns.env
変数 必須 説明
CF_API_TOKEN ○ Cloudflare API トークン
CF_ZONE_ID △ Zone ID(未設定時は CF_ZONE_NAME が必要)
CF_ZONE_NAME △ Zone 名(例: example.com)。CF_ZONE_ID があれば不要
CF_RECORD_NAME ○ 更新する A レコード(例: mail.example.com)
CF_TTL ○ TTL(秒)
CF_PROXIED ○ Cloudflare Proxy の有無(true / false)
DISCORD_WEBHOOK_URL × 設定時のみ Discord 通知

3. 動作確認する

sudo /usr/local/bin/cloudflare-ddns.sh

設定ファイルのパスを変える場合は次のとおり実行する。

ENV_FILE=/path/to/cloudflare-ddns.env /usr/local/bin/cloudflare-ddns.sh

4. cron で定期実行する

5 分ごとに実行する例:

*/5 * * * * /usr/local/bin/cloudflare-ddns.sh >> /var/log/cloudflare-ddns.log 2>&1

動作の流れ

  1. 複数ソースからグローバル IPv4 を取得する
  2. Cloudflare 上の現在の A レコードと比較する
  3. 差分がある場合のみ更新する
  4. 更新の成功時と失敗時に Discord 通知する(Webhook 設定時)