(写真は飯テロ、記事は小ネタです)
我が家では、IPoEとPPPoEの2セッションでインターネット接続しており、このうち、PPPoEのセッションは、Sophos Firewall (仮想マシン)で接続、定義したDMZネットワークに配備したサーバをインターネットに実験公開しています。IPoEはOpenWrt仮想マシンでの接続です。
PPPoE セッションの切断、再接続により、プロバイダから割り当てられるグローバル IP アドレスが変更となるため(固定 IP サービス未契約の場合)、サーバ公開のためには、都度 DNS レコードを自動更新する必要があります。
このシェルスクリプトは、Cloudflare API を利用して、指定したドメインの A レコードを現在のPPPoEセッションに割り当てられたグローバル IP アドレスに自動更新するものです。
(スクリプト自体は、常時稼働中のPhotonOS仮想マシンで定期的に実行しています)
#!/bin/sh
# 設定セクション
domain="mydomain.com" # 管理するドメイン名
target_hostname="www" # 更新対象のホスト名
target_domain="${domain}" # 完全修飾ドメイン名(FQDN)
# API アクセス情報
# Cloudflare ゾーンID(ドメインに対応)
zone_id="ssssttttuuuuvvvvwwwwxxxxyyyyzzzz"
# DNSレコードID(更新対象のDNSレコード)
dns_record_id="xx11yy22zz33aa44bb55cc66dd77ee88"
# Cloudflare 認証用のメールアドレス
mailaddr="its-me@mydomain.com"
# Cloudflare APIトークン
api_token="Token11112222333344445555666677778888000"
# 現在のグローバルIPアドレスを取得
current_global_ip_addr=$(curl -s https://inet-ip.info) # Webサービスを利用して現在のグローバルIPを取得
echo "Current:${current_global_ip_addr}" # 取得したIPアドレスを表示
echo "-"
# 現在のDNSレコードに設定されているIPアドレスを取得
domain_ip_addr=`dig ${target_hostname}.${domain} +short` # DNSで設定されているIPアドレスを取得
echo "domain_ip_addr:$domain_ip_addr" # DNSのIPアドレスを表示
echo "-"
# IPアドレスが異なる場合は更新
if [ "${current_global_ip_addr}" != "${domain_ip_addr}" ]; then
# CloudflareのAPIを使用してDNSレコードを更新
curl --request PUT \
--url https://api.cloudflare.com/client/v4/zones/$zone_id/dns_records/$dns_record_id \
--header 'Content-Type: application/json' \
--header "X-Auth-Email: $mailaddr" \
--header "Authorization: Bearer $api_token" \
--data '{
"content": "'"$current_global_ip_addr"'",
"name": "'"${target_hostname}.${domain}"'",
"proxied": false,
"type": "A",
"comment": "Domain verification record"
}'
echo "Update ${domain_ip_addr} => ${current_global_ip_addr}" # 更新結果を表示
else
echo "NOP" # IPが一致する場合は何もしない
fi
当初、DNSゾーンの管理には「お名前.com DNS管理サービス」を利用していました。
お名前DNSでも、lets’ encrypt ワイルドカード SSL 証明書の初回取得はできたのですが、自動更新のやり方がわからず、ネームサーバを お名前.comからCloudflare に変更しました。
ネームサーバの移行によって、DDNSスクリプトもCloudflare管理となるDNSレコードを書き換える必要がありましたので、お名前.com用スクリプトをCloudflare用に書き換えたものです。
考え方は同じ(現在のIPアドレスとDNSレコードが異なる場合、DNSレコードの更新処理を実行)でしたので、DNSレコードの更新処理の箇所だけ、簡単な差し替えで済みました。


コメント