Cloudflare DDNSをAPIトークン+systemd timerで自動更新する方法

IT

モグラ先生:こんにちは!今日は、Cloudflare DDNS を最新の方法でラクに運用するトンネルを掘るよ。昔ながらの「グローバルAPIキー方式」はもう古い!今はAPIトークンsystemd timerでスマート管理する時代だね✨


はじめに|Cloudflare DDNSを最新仕様で運用しよう

今まで「グローバルAPIキー+cron」で更新していた人、多いですよね?
でもそれ、もう時代遅れかも知れません。

  • Cloudflare公式推奨は最小権限の「APIトークン」!
  • Linux界隈ではcronよりsystemd timerが推され中!
  • PythonもPEP 668対応が必要になってきました!

モグラ先生:つまり、「今風」に掘り直すと運用が安全・快適になるってことだね🐾


1️⃣ CloudflareでAPIトークンを作成しよう 🔑

必須キーワード:「Edit zone DNS」のトークン

  1. Cloudflareダッシュボードへログイン
  2. My Profile → API Tokens → Create Token
  3. テンプレートから「Edit zone DNS」を選ぶ
  4. 対象ゾーン(ドメイン)を限定して発行!

モグラ先生:昔のグローバルAPIキーは、落としたら全権喪失。怖いよね💦トークンなら安心!


2️⃣ Zone IDとRecord IDをAPIでゲットする🧭

bashスクリプト例:

CF_API="https://api.cloudflare.com/client/v4"
TOKEN="YOUR_BEARER"
DOMAIN="example.com"
FQDN="home.example.com"

ZONE_ID=$(curl -s -H "Authorization: Bearer $TOKEN" "$CF_API/zones?name=$DOMAIN" | jq -r '.result[0].id')
REC_ID=$(curl -s -H "Authorization: Bearer $TOKEN" "$CF_API/zones/$ZONE_ID/dns_records?type=A&name=$FQDN" | jq -r '.result[0].id')

モグラ先生:「手動で探す」とかもう卒業しよう。API叩いてサクッと掘り出そう!⛏️


3️⃣ 現在のIPアドレスを取得する方法 🌍

IPv4用(ipify)

IP=$(curl -s https://api.ipify.org)

IPv6用(ipify)

IP=$(curl -s https://api64.ipify.org)

ipifyは信頼できる無料サービスで、速度も安定してます!


4️⃣ PythonスクリプトでDNSを更新しよう 🐍

Pythonコード例:

#!/usr/bin/env python3
import requests, json, os

API   = "https://api.cloudflare.com/client/v4"
TOKEN = os.environ["CF_TOKEN"]
ZONE  = os.environ["CF_ZONE"]
REC   = os.environ["CF_REC"]
NAME  = os.environ["CF_FQDN"]
IP    = requests.get("https://api.ipify.org").text.strip()

headers = {"Authorization": f"Bearer {TOKEN}", "Content-Type":"application/json"}
payload = {"type":"A","name":NAME,"content":IP,"ttl":300,"proxied":False}

r = requests.put(f"{API}/zones/{ZONE}/dns_records/{REC}", headers=headers, data=json.dumps(payload))
print(r.json())
  • 成功すると "success": true が返ってきます。
  • IPv6対応も簡単にできますよ。

モグラ先生:DNSレコードはPUTでまるっと上書き、PATCHなら部分更新も可能だよ🐾


5️⃣ Python仮想環境(venv)で安全に運用 🐚

python3 -m venv ~/cf-ddns
~/cf-ddns/bin/pip install requests

PEP 668対応で、グローバルpip汚染を防ぎましょう。

モグラ先生:今どきsudo pip installは時限爆弾だから絶対やめようね💣


6️⃣ systemd-timerで自動更新!⏰

.serviceファイル

[Unit]
Description=Update Cloudflare DDNS
After=network-online.target

[Service]
Type=oneshot
ExecStart=/home/pi/cf-ddns/bin/python /home/pi/update_cf_ddns.py

.timerファイル

[Unit]
Description=Run Cloudflare DDNS every 5min

[Timer]
OnBootSec=1min
OnUnitActiveSec=5min
AccuracySec=30s
Persistent=true
Unit=cf-ddns.service

[Install]
WantedBy=timers.target

ポイント!

  • Persistent=trueにすると、シャットダウン中の実行漏れもリカバー!
  • systemctl list-timersで次回予定も確認できる!
sudo systemctl daemon-reload
sudo systemctl enable --now cf-ddns.timer
systemctl list-timers | grep cf-ddns

モグラ先生:「cronと違って、再起動後も自動で走る」のがsystemd-timer最大のメリットだよ!


7️⃣ 代替案:ddclient 3.11以上を使う手もある🚏

もし「Pythonスクリプトめんどい!」なら、ddclientでもいけます。

ddclient設定例:

protocol=cloudflare
login=token
password=<API_TOKEN>
zone=example.com
home.example.com
  • loginには「token」と明示!
  • passwordにAPIトークン直書き!

【まとめ】Cloudflare DDNSを最新運用にアップグレードしよう⛏️✨

  • APIトークン+systemd-timerで安全・スマートなDDNS運用が可能!
  • グローバルAPIキーやcronは卒業して、今風のやり方へ!
  • Python仮想環境(venv)運用で依存管理もバッチリ!

これでCloudflare DDNS運用は一段とラクに!
次回はこの仕組みをDocker化してさらに掘り進める予定だよ〜🐾

モグラ先生:最後まで読んでくれてありがと〜!他の記事もぜひ掘りに来てね🪹✨

タイトルとURLをコピーしました