DDNSをDiCEではなくcronで更新するようにした【自宅サーバー】

シェアする

スポンサーリンク

DiCEが上手く動かない

更新されていなかった

自宅サーバを再開してから1週間くらい経った頃、外出先でサーバにアクセスしてみるとMyDNS.JPのエラーページが表示された。

DiCEで1週間ごとに更新するように設定していたはずなのにおかしい。

帰宅後確認したら、サーバは動いていた。systemctl status diceで状態を見ると、active (exited)だった。詳しくないので分からないが、exitedというのはなんか変な気がする。

当時の環境

次のようなserviceファイルを作成し、systemdで自動起動する設定にしていた。

systemctl start dice した直後、statusのログを見たところ、

いたって普通のように(私のような素人には)見える……

しかし、systemctl stopすると、なぜかしばらく制御が戻ってこない。かなり長い時間待機していると、ようやく再びコマンド入力を受け入れる状態になった。そこで、statusを確認すると、

謎の「:」が大量に並んだログ。詳細は分からないが、とにかく正常に動いていないということだけは分かったので、DiCEを使うのは諦めて、別な方法でDDNSの更新を行ってみたいと思う。

cronによるDDNS更新

そもそも‥‥

なぜ私はDiCEを使っていたのだろう。私のような特に高度なことをしない人にとっては、DiCEを使う意味があるのか。

DDNS更新は定期的に行わなければならない作業である。DiCEはそれを自動的に行なってくれる。しかし、定期的に何かをしてくれるものといえば、もっと身近なものがある。cronだ。

私は、cronでIPアドレスの変更を自動検知しDDNS更新を行う方法は分からないので、その点はDiCEに比べれば劣ってしまうが、通常時の定期的な通知として、両者にそこまで差異はないように思える。

現状、DiCEを上手く動かせておらず、このままの状況だとまたDDNSの更新を忘れそうなので、ここは妥協してcronに頼ることにした。

要件

cronによるDDNS更新で何をしたいのか明確にしておこう

  • 自分のグローバルIPアドレスを取得する
  • DDNSに更新リクエストを送る
  • 上記の処理を定期的に実行する

要するにDiCEからIP変更自動検知を抜いたことをしたいわけである。

方法

MyDNSに通知するには、複数の方法がある(メール, FTP, HTTP)。今回は、最も簡単そうなHTTPによる方法を採用してみたい。HTTPによる方法でも、HTTP-BASICとHTTP-DIRECTがあるのだが、今回は自分自身の通知なのでHTTP-BASICによる方法で十分だろう。

HTTP-BASICによる方法では、http://masterID:[email protected]/login.html にアクセスすればいいらしい。つまり、このファイルを取得するcronを書けば良いことになる。なんだ、意外と簡単そう。

更新コマンド

実行するスクリプトは次のとおりである。

cronに突っ込む前にこのコマンドを実行してみて、MyDNS.JPのログで正常に動作していることを確認した。

cronによる自動更新

理想的な実行間隔

今までは短くても1日くらい空けて更新するものだと思っていたが、MyDNSのチュートリアルみたいなページを見るともっと短くてもいいっぽい。

具体的には、このページでは5分毎に更新コマンドを実行している。cosnomi.comの場合は、実際、hourlyでも問題ないとは思ったが、cronの練習を兼ねて、5分毎に実行するようにしてみたい。

ちなみにIPアドレスの変化を検知する機能がないため、IPアドレスが変化した場合は、最長で5分間、アクセスできなくなってしまう。まあ、このブログにアクセスしてくる人がちょうどその5分間にアクセスしてくるとしたら、すごい偶然だろう。つまり、問題はないということである。

実行間隔を管理する仕組み

/etc にはcron関係のファイルを置くディレクトリが幾つかある。ディレクトリによって実行間隔が異なる。

現状での最短はhourlyである。そこで、5分毎に実行するスクリプトのためには自前でディレクトリを作成し、登録しなければならない。

実は、dailyやmonthlyなどは0:00などに実行されるのではなく、anacrontabというものによって管理されているらしく、そのファイルの中身を見て見る限り、ある程度の遅延は許容されているらしい。確かに、0:00はcron以外にも色々なプログラムが動きそうなので理にかなっている。

しかし、hourlyは例外で、毎時1分?に実行されるようになっている。これは、見たところ、/etc/cron.d/0hourlyというファイルで定義されているみたいだ。

一番最後の行がメインっぽい。これを見る限り、毎時0分ではなく毎時1分に実行されるらしい。

設定

では、先程のファイルをコピーし、最後の行を書き換えてやれば5分毎の実行ができそうだ。

そして /etc/cron.everyfiveminにmydnsファイルを作成。中身に、前述したDDNS更新スクリプトを書く。

まとめ

5分毎の正常な挙動が確認できた。

全体的にすんなりと進んだが、これはMyDNS.JPが非常に簡単な方法での更新通知に対応していたからだと思う。

最後までお読み頂きありがとうございました。

間違いを発見したら、遠慮なくご指摘お願いします

スポンサーリンク

シェアする

フォローする