DNS サーバ djbdns のインストールと設定 - SSH でデータファイルを複製する

DNS サーバである djbdns のインストールと設定をまとめてみました。

ここは、セカンダリ DNS も tinydns で構成されている場合を想定して、SSH を用いて tynydns-data をそのまま転送することで、ゾーン情報の複製を行う方法についてのお話です。


4-4: SSH でデータファイルを複製する

ゾーン転送の要求

tinydns にはいわゆるゾーン転送の機能はありません。

なので、DNS の情報を tinydns どうしで二重化する場合は、なんらかの方法で data.cdb ファイルをそれぞれ同一のものにする必要があります。

なお、片方の DNS が、BIND など data.cdb を使用しないものの場合は、 axfr-get や axfrdns を使用する必要があります。

 

OpenSSH の scp を使う

data.cdb ファイルを転送するにあたっては、ネットワーク経由でのコピーコマンドを使用します。

セキュリティの面などから、OpenSSH に付属している scp を使うのが手ごろそうなので、今回はそれを想定して話を進めることにします。

 

まずは scp がインストールされているかを調べてみましょう。

whereis scp

これで次のような返事が返れば、scp がインストールされていることがわかります。

 scp: /usr/local/bin/scp

逆に単純に次のような感じならば、OpenSSH をインストールしなくてはいけません。

 scp:

参考としては EZ-NET: OpenSSH による ssh サーバ構築 あたりでしょうか。ここの sshd を起動する手前までが、インストールの説明でしょうか…。

ただ、遠隔のほうでは sshd が稼動していなくてはいけないので気をつけましょう。

 

scp の使い方は、普通のコピーのときのように、コピー元とコピー先を指定して使います。

ネットワークに対応しているため、ローカルファイルに対しては、通常のパス指定ができますが、ネットワーク側の場合は、ユーザ名@ホスト:絶対パス というような指定になります。

なので、メインの tinydns から 192.168.0.2 で稼動している tinydns へ data.cdb をコピーするには次のようにします。

scp /etc/tinydns/root/data.cdb root@192.168.0.2:/etc/tinydns/root/data.cdb

こうすると、root のパスワードを聞かれますので、入力してやると data.cdb のコピーが完了します。なお、scp は ssh で接続しますので、接続先の 192.168.0.2 ではちゃんと sshd が機能している必要があります。root 権限でログインするのがセキュリティ上危険な場合は、/etc/tinydns/root/ ディレクトリの所有権などを変更して、ほかのアカウントでも scp でコピーできるようにして、そのアカウントで SCP 接続が行われるようにすれば良いでしょう。

tinydns の場合、data.cdb が更新されればすぐにその情報が有効になるので、これでデータの同期は完了です。

 

 

同期の自動化

このままだとゾーン転送を要求する際に毎回、scp を実行しなくてはならないので、すこし改良して同期のわずらわしさをなくしてみましょう。

それには Makefile に少し手を加えるのと、あらたに zone-sync というスクリプトを作成します。なお、レコード管理の一案 で紹介した zone-make スクリプトとも共存できます。

 

zone-sync

#!/bin/sh

R_TINYDNS="/etc/tinydns"

R_LOGIN="root"

R_HOST="192.168.0.2"

R_PORT="22"

 

scp -P ${R_PORT} data.cdb ${R_LOGIN}@${R_HOST}:/${R_TINYDNS}/root/data.cdb.tmp

ssh -l ${R_LOGIN} -p ${R_PORT} ${R_HOST} mv -f ${R_TINYDNS}/root/data.cdb.tmp ${R_TINYDNS}/root/data.cdb

そしてこのファイルに、chmod u+x zone-sync などとして、実行権限を与えます。

このスクリプトは、scp を用いて自分の持っている data.cdb を data.cdb.tmp としてコピーした後、ssh へ mv コマンドを実行してもらって、data.cdb.tmp を data.cdb に置き換えます。

 

scp と ssh コマンドを合わせて2回発行するため、このスクリプトを実行すると、パスワードを2回聞かれます。

このようなことをしているのは、念のためコピーがちゃんとできてから既存の data.cdb を書き換えようとしているためです。面倒ならば scp の行でいきなり data.cdb に書き込んでしまってもいいと思います。または、EZ-NET: 公開鍵認証を用いて SSH へ接続する に記した方法を活用することで、パスワードなしでファイル転送を行うこともできると思います。

 

これで zone-sync を実行すれば遠隔の DNS サーバに data.cdb が転送されるので二重化が実現できますが、もうすこし手間を省略してみましょう。

というのも、この zone-sync が必要になるのは、data.cdb が変更されたときです。なので、make コマンドを実行した際に、この zone-sync も自動的に実行されるように Makefile の内容を少し書き換えます。

 

既存の Makefile を見てみると data.cdb のブロックは次のようになっていると思います。

data.cdb: data

/usr/local/bin/tinydns-data

 

 

ここで tinydns-data というプログラムを使って data ファイルから data.cdb を作成しています。なのでこの直後に zone-sync を実行してもらうように、次のように一行書き加えます。

data.cdb: data

/usr/local/bin/tinydns-data

./zone-sync

 

これで完成です。

こうしておけば、data ファイルを変更して make コマンドを実行した際に、自動的に zone-sync スクリプトを実行して、遠隔の DNS サーバへ data.cdb を転送することができます。

 

目次