モグラ先生:こんにちは!今日は、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」のトークン
- Cloudflareダッシュボードへログイン
- My Profile → API Tokens → Create Token
- テンプレートから「Edit zone DNS」を選ぶ
- 対象ゾーン(ドメイン)を限定して発行!
モグラ先生:昔のグローバル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化してさらに掘り進める予定だよ〜🐾
モグラ先生:最後まで読んでくれてありがと〜!他の記事もぜひ掘りに来てね🪹✨