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 を転送することができます。
【目次】