「お名前.com」DDNSサービスの IPアドレス自動更新 - Aレコード情報を最新に保つ

はじめに

@nifty のサブドメインでは対応しきれない…

これまでは @niftyドメインサービスで取得したサブドメイン (xxx.atnifty.com) を使用してサーバーを運用してきました。

ところが最近では自宅メールサーバーからメールを送信しても送信元ドメイン認証にpassしないことが増えてきました。残念なことに @nifty サブドメイン (xxx.atnifty.com) のDDNSサービスではレコード設定を自由に行うことができません。
設定可能なのは、Aレコード一つと、CNAME 二つ (「www. ~」と「ftp. ~」だけ) です。

なんて不便なのでしょう。。。

「お名前.com」に決めました

最低限のレコード設定ができる業者であればどこでも良かったのですが、とりあえず耳にすることが多かった「お名前.com」に乗り換えることにしました。

「お名前.com」のドメイン管理サービスであれば、Aレコード、CNAMEレコード、MXレコード、TXTレコードのいずれも問題なく設定できるようです。新規ドメイン取得も含めて乗り換えます。

IPアドレス更新をどうする!?

私は固定IPアドレスを持っていません。
@niftyのサブドメインを利用していたときは、こちらのPerlスクリプトを利用させて頂いてDDNSサービスの IPアドレス更新をしていました。

「お名前.com」のDDNSでもWindows版のIPアドレス自動更新プログラムが配布されているようです。
でも私の Windows環境ではなぜかインストール時にエラーが出てしまいました。またできれば常時稼働させている CentOS マシン上で自動更新を実現したかったので、何とか動くスクリプトを探し出して解決できないものか調査してみることにしました。

※実は私が使用しているNECのルーター (Aterm) はDDNS更新機能を搭載しており、「お名前.com」との連携もサポートしています。素直にそれを使えば良いのですが、それでは何となく悔しいということと、一番の問題は Aレコードの複数更新には対応していないということでした。ルーター設定画面ではホスト名は一つしか入力できませんでした。

Python 3.x をインストールする

今回使わせて頂くスクリプトは こちらのスクリプトです。本当にありがたいです。
このスクリプトは Python3 で記述していますので、デフォルトで2.x系を採用しているCentOSの場合は自分で3.xをインストールすることになります。

ちなみに私が普段の Python環境は「Windows10+VS Code+Python 3.7.7」です。VS Codeは初期設定こそ少し戸惑いますが、一度設定してしまえばとても使いやすい IDEです。
ですので、Python 3.x をインストールするのはあくまで今回のスクリプトを動かすためだけであって、CentOS7 システムが利用するPythonバージョンを 3.x に変更したい訳ではありません。3.x にしてしまうとシステムにどんな悪影響が及ぶか分からないのと、コマンドを “python3 ~” で打てば良いだけなので、デフォルトのPythonコマンドのパス変更は行いません。

また私は仮想環境を使いたい場合は VS Code内で手軽に環境を切り替えて使っていますので、CentOS7 には仮想環境を入れる必要もありません。

というわけで今回は単純に3.x 系のインストールと pip のアップデートのみを行います。私のCentOS 7.8 環境ではリポジトリを追加しなくてもインストールすることができました。


Python 3.6.8 と pip 20.1 がインストールされました。
なお今回使うPythonスクリプトは Python3 の標準モジュールだけで動作しますので、追加のモジュールをインストールする必要はありません。

「お名前.com」のAレコードを更新する

更新スクリプト本体

オリジナルのスクリプトを少しだけ私の環境に合わせてアレンジさせて頂いてから使用します。アレンジの内容は、

    • グローバルIPアドレスの取得は別のスクリプトに分けて記述し、その結果は別のテキストファイルに保存しておくことにします。

      更新したいAレコードが複数ある場合、Aレコードごとにチェックサイトにアクセスしているとその分アクセス回数が増えてしまいます。それが何となく嫌だったので、アクセスは一つのAレコードだけ行い、他のAレコードについてはその結果を流用するようにします。

    • DNS情報の取得についても別のスクリプト (bashスクリプト) に分けて記述し、その結果をテキストファイルに保存しておくことにします。

      というのもオリジナルのスクリプトでは Google のDNSチェックサイトを用いてドメインの正引き情報を取得しています。
      でも何度か実験してみた限りでは、「お名前.com」の Aレコード更新後も GoogleのDNSサーバーに反映されるまでにタイムラグがありますから、「お名前.com」のDNS設定を無事に書き換え完了した場合であっても、スクリプト側はまだ完了していないものと思い込み再び更新処理に入ろうとしてしまいます。スクリプトの実行間隔を短く設定した場合には 2、3回ほど無駄に更新処理を実行していました。
      そこでDNS情報については直接「お名前.com」のDNSサーバーに問い合わせることでタイムラグのない情報取得とするようにしました。
      ただ私の場合 Python関数でDNSサーバーを指定しながらレコード検索を行う方法が見つけられませんでしたので、bashスクリプトで普通にdigコマンドを実行することでレコード検索を行うことにしました。bashスクリプトとなったことで、必然的に別スクリプトに分けて記述することになりました。

    • 「お名前.com」のDNSサーバーとのソケット通信確立後、recv() を実施してからその後の通信を行うようにします。

      私の CentOS7 の Python環境では「お名前.com」のDNSサーバーとのソケット通信確立後、先方からの応答メッセージを受信してからでなければその後の通信処理が正常に行われませんでした。
      不思議なことに Windows の Python環境では応答メッセージの受信処理をしなくても通信が正常に行われます。搭載している Socketモジュールに何か違いでもあるのでしょうか??
      いずれにしてもサーバー側の送信メッセージに残りがないことを保証してから通信を続けたりソケットを閉じたりすのが通常のやり方なのかもしれません。


これらを考慮に入れたスクリプトは以下のとおりです。

</usr/local/bin/onamaeddns/onamaeddns.py>


一々テキストファイルを介して情報を取得しているので何だか回りくどいスクリプトになってしまいましたが、Aレコードが複数個ある場合にはそれほど悪くないのかなと思います。

またAレコードが複数個あることを想定し、このスクリプトの実行時にはホスト名を引数として渡せるようにしました。

ついでですが、入手した情報が正しいIPアドレス形式であるかどうかも確認するようにしています。

グローバルIPを確認する Pythonスクリプト

内容はオリジナルのものを踏襲し、あとはファイルへの書き込み処理を加えただけです。

</usr/local/bin/onamaeddns/getip.py>

 

DNSサーバーへの問い合わせを行う bashスクリプト

Googleサイトではなく「お名前.com」のDNSサーバーに直接問い合わせたい…
本当なら Python関数を用いてDNSサーバーを指定しながらレコード検索する方法が分かればわざわざ bashスクリプトに分ける必要はなかったのですが、私にはその方法が分かりませんでした。

bashスクリプト自体はとても簡単です。digコマンドを用いて直接「01.dnsv.jp」(=お名前.com のDNSレンタルサービス) に問い合わせます。

</usr/local/bin/onamaeddns/getdns.sh>


私の場合はAレコードを 2、3個管理する予定ですが、いずれのAレコードも同一の IPアドレスを使用します。
でもそれらのAレコードの設定状況にはズレがある可能性を考慮して (IPアドレスの更新処理に失敗して、他のAレコードと違う値が設定されたままというAレコードもあるかもしれない)、Aレコードごとに別々に問い合わせられるようホスト名を引数として渡せるようにしました。
もし、すべてのホスト名に対してIPアドレス登録状況が揃っている自信があるなら、問い合わせは一つのホスト名に対する問い合わせだけで構わないと思います。

スクリプトを実行する

crond への登録

ホスト数が多いのであれば、お好みでスクリプトに渡す引数 (ホスト名) を一纏めにしたスクリプトを用意しても良いかもしれません。

getdns.sh をすべてのホストについて一纏めにしたスクリプトです。
</usr/local/bin/getdns_all.sh>


同様に anamaeddns.py についてもすべてのホスト名について一纏めにしました。
</usr/local/bin/onamaeddns_all.sh>


最後にここまで作成したスクリプトを crond に登録します。

 

動作確認

ルーターを再起動し、意図的にグローバルIPアドレスを変更してみます。

「お名前.com」のDNS管理ページを確認してみると、すべてのホスト名に対して問題なく Aレコードの IPアドレス部分が更新されたようです。
また更新頻度を 5分間隔で設定しても、無駄に更新処理に入ることはなかったので、期待通りの動作でした。

あとがき

今回はスクリプトにより DDNS 自動更新を実現しましたが、Aレコードを一つで済ませてしまえば NECルーター (Aterm) が搭載しているDDNS更新機能だけで実は十分です。
でも今回のようにスクリプトによる更新手段を持っておけば、いつ Atermが「お名前.com」との連携を打ち切っても安心です。

これで安心なドメイン環境が手に入りました。

コメント

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