DNS サーバ djbdns のインストールと設定 - 他の DNS からゾーンを取得する

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

ここは、djbdns を構成する axfr-get を用いて、BIND や Microsoft DNS といった DNS サーバーからゾーン情報を取得する方法についてのお話です。


4-3: 他の DNS からゾーンを取得する

ゾーン転送の要求

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

なので、プライマリ DNS に BIND や Microsoft DNS サーバを使用している場合には、djbdns に付属の axfr-get を使ってゾーン転送を 要求する必要があります。

 

axfr-get を使う

axfr-get を使用するにあたって、すでに tinydns が稼動中であるとします。

また、tcpclient というプログラムを使用します。これは ucspi-tcp というツールセットに入っていますので、あらかじめ導入しておきましょう。

 

そして、/etc/tinydns/root など、data ファイルがあるところで、次のようにコマンドを実行することで、ゾーン転送を要求することができます。

/usr/local/bin/tcpclient -i 192.168.0.3 192.168.0.2 53 /usr/local/bin/axfr-get ez-net.jp data data.tmp

 

ここでは DNS サーバ 192.168.0.2 の 53 番ポートに対して、ez-net.jp のゾーン転送を要求しています。要求を出すクライアントは 192.168.0.3 です。

そしてその要求を data ファイルに受けます。その際に data.tmp という作業ファイルを一時的に使用するという感じになります。

 

これで data ファイルに情報が取得できますので、あとは make コマンドで data.cdb を更新し、tinydns が新しいゾーンデータを使用して応答するようにします。

 

同期の自動化

このままだと、ゾーン転送を要求する際に毎回、axfr-get を実行しなくてはならないので、定期的に実行されるようにして見ましょう。これには crond を使用します。

 

crond の設定はディストリビューションによっても違うようです。

今回は Slackware を想定していますが、ほかのディストリビューションによっては、/etc/cron.d/cron.monthly といったファイルがあり、たとえばこの場合は月ごとに起動されるようになっている場合もあるようです。

 

まず、zone-sync など好きな名前で /etc/tinydns/root/ ディレクトリ内に、ゾーン転送を要求するスクリプトを用意します。

#!/bin/sh

 

cd /etc/tinydns/root/

/usr/local/bin/tcpclient -i 192.168.0.3 192.168.0.2 53 /usr/local/bin/axfr-get ez-net.jp data data.tmp

 

make

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

あとは、/usr/bin/crontab コマンドを使用して、この zone-sync スクリプトが定期的に自動実行されるようにします。

 

次のようにして、設定ファイルの編集を行います。

/usr/bin/crontab -e root

これで root 権限用の crond の設定ファイルを編集できるので、ここに次のようなデータを追加します。なお、編集には vi というエディタを使用しますので、慣れていないひとは気をつけましょう。

0 0 1 * * /etc/tinydns/root/zone-sync > /dev/null 2>&1

このような感じです。

編集が終わったら ps -e | grep crond などとして crond のプロセス ID を探し、たとえば 120 番だったら kill -HUP 120 のような感じで crond に HUP シグナルを送ります。

これで毎月一回、自動的に同期がなされるようになります。

 

効率化の一案

もしも取り扱うドメインがたくさんある場合、次のようにして管理しやすくするのはいかがでしょう。

まず、/etc/tinydns/root/ ディレクトリ内に、ひとつのゾーン転送を要求するスクリプト zone-get と、それらをまとめた zone-sync というスクリプトを次のような感じで用意します。

 

zone-get

#!/bin/sh

 

BIN="/usr/local/bin"

 

DNS_SELF="192.168.0.3"

DNS_TARGET="192.168.0.2"

DNS_PORT="53"

 

AXFRGET="${BIN}/tcpclient -i ${DNS_SELF} ${DNS_TARGET} ${DNS_PORT} ${BIN}/axfr-get"

 

${AXFRGET} $1 zone.$1 temp.$1

 

zone-sync

#!/bin/sh

cd /etc/tinydns/root

 

## ZONE ------------

./zone-get ez-net.jp

./zone-get local.ez-net.jp

./zone-get global.ez-net.jp

 

## -----------------

 

( cat zone.* | sort -u ) > data; make

 

このような感じです。

zone-get は、引数に転送要求をするドメイン名をとり、その前に zone. をつけた形で取得したデータを保存します。それを zone-sync 内で、必要なだけ呼び出して、最後にひとつの data ファイルに纏め上げるという処理をします。

あとはこれらを chmod u+x zone-* などとして実行可能な状態にしておいて、手動なり crond なりで zone-sync を実行します。

 

目次