CloudFlareのDNSをDDNSとして使う方法

IT

はじめに

Google Domainのサービスが終了するので、私もCloudFlareに移行してみました。
もし移行先を探しているようであれば、CloudFlareも候補の1つとして考えてみるのはいかがでしょうか?
今回は移行手順は省略しますが、必要な設定やプログラムを公開するので、参考にどうぞ。

事前作業(この手順については省略します。)

  • CloudFlareのアカウントを作成してください。
  • 自動的に変更するDNSレコードを登録しておく。

必要な情報の取得

CloudFlareより、「Global API key」を取得する。

  1. 「APIキー」>「Global API Key」で、「表示」を選択して取得。

CloudFlareより、「API トークン」を作成する。

1.「トークンを作成」>「ゾーンDNSを編集する」

2.下記のとおり設定し、トークンを作成する。

アクセス許可
- ゾーン -> DNS -> 編集
- ゾーン -> ゾーン -> 読み込み
ゾーンリソース
- 包含 -> 特定のゾーン -> ドメイン名

3.作成後、トークンが表示されるので、メモっておく。

ゾーンIDを取得する。

以下のCURLコマンドを実行して、Resultに表示されるidの値をメモっておく。

curl -w "\n" --request GET \
  --url https://api.cloudflare.com/client/v4/zones?name=ドメイン \
  --header 'Content-Type: application/json' \
  --header 'X-Auth-Email: CloudFlareのメールアドレス'\
  --header 'X-Auth-Key: 取得したGlobal API key'

DNSレコードを取得する。

以下のCURLコマンドを実行して、結果のjsonの値に、変更したいレコードのIDをメモっておく。

curl -w "\n" --request GET \
--url https://api.cloudflare.com/client/v4/zones/取得したゾーンID/dns_records \
--header 'Content-Type: application/json' \
--header 'X-Auth-Email: CloudFlareのメールアドレス'\
--header 'X-Auth-Key: 取得したGlobal API key'

変更するPythonプログラムの作成

メインプログラム(update_dns.py)

import os
import requests
import re
from datetime import datetime
import configparser

# 現在のスクリプトのディレクトリを取得
current_directory = os.path.dirname(os.path.abspath(__file__))

# 設定ファイルを読み込む
config = configparser.ConfigParser()
config_file = os.path.join(current_directory, 'config.ini')
config.read(config_file)

# 設定値の取得
MY_DOMAIN = config['DEFAULT']['MY_DOMAIN']
ZONE_ID = config['DEFAULT']['ZONE_ID']
RECORD_ID = config['DEFAULT']['RECORD_ID']
AUTH_EMAIL = config['DEFAULT']['AUTH_EMAIL']
API_TOKEN = config['DEFAULT']['API_TOKEN']

# IPアドレス取得サービスのリスト
services = [
    "https://api.ipify.org/",
]

def get_ip_address(url):
    """
    指定されたURLからIPアドレスを取得します。
    """
    try:
        response = requests.get(url)
        response.raise_for_status()
        return response.text.strip()
    except requests.RequestException:
        return None

def is_valid_ip(ip_address):
    """
    IPアドレスが正しい形式かどうかをチェックします。
    """
    pattern = r"^([0-9]{1,3}\.){3}[0-9]{1,3}$"
    return re.match(pattern, ip_address) is not None

# IPアドレスを取得するループ
ip_address = None
for service in services:
    ip_address = get_ip_address(service)
    if ip_address and is_valid_ip(ip_address):
        break

if ip_address is None:
    raise Exception("有効なIPアドレスを取得できませんでした。")

# 今日の日付を取得
current_datetime = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

# CloudFlare APIによるAレコードの更新
update_url = f"https://api.cloudflare.com/client/v4/zones/{ZONE_ID}/dns_records/{RECORD_ID}"
headers = {
    'Content-Type': 'application/json',
    'X-Auth-Email': AUTH_EMAIL,
    'Authorization': f'Bearer {API_TOKEN}'
}
data = {
    "content": ip_address,
    "name": MY_DOMAIN,
    "proxied": False,
    "type": "A",
    "comment": f"DDNS record updated on {current_datetime}"
}

response = requests.put(update_url, headers=headers, json=data)
response.raise_for_status()  # エラーが発生した場合、例外を発生させます

print("IPアドレスが更新されました。")
print('response',response)

設定ファイル(config.ini)

必要に応じて書き直してください。

[DEFAULT]
MY_DOMAIN=
ZONE_ID=
RECORD_ID=
AUTH_EMAIL=
API_TOKEN=

ラズパイで動くように設定

  1. デフォルトではpipが入っていないので、インストール
sudo apt install pip
  1. 必要なパッケージをインストール
pip install requests
pip install configparser
  1. 作成したプログラムをラズパイにコピーする。
  2. Cronで登録して定期実行する。
    crontab -eを実行する。
* */1 * * * python3 /home/pi/update_dns.py

まとめ

いかがだったでしょうか?
更新プログラムはPythonなので、Windowsでもラズパイでも色んな環境で使えるので、ぜひ試してみてください。

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