提供: いつきメモ
移動: 案内検索

tinydns (ndjbdns)を使う

訳あって、ndjbdnsをCentOS 7に入れて、tinydns/axfrdnsを使うことになったので。

ちなみに、tinydnsは、DNSパケットをUDPのみ受け付けます!

TCPは受け付けてくれないので注意しましょう。

TCP受付はaxfrdnsのお仕事です。

axfrdnsは、標準設定だと、ゾーン転送許可しちゃうので注意しましょう。

いくつかのサイトではtinydnsしか設定していない例を見かけます。

TCPで接続されるとDNSが引けなくなる病を発症するので気をつけましょう。

tinydnsだけではTCPフォールバックがかかったときにDNSが引けなくなります

リポジトリからインストール

EPELを追加します。

yum install epel-release
yum update

パッケージを追加

インストール

yum install ndjbdns

設定

/etc/ndjbdns 以下にあるconfファイルを書き換えます

tinydns.conf

大体見れば分かる

IP=0.0.0.0とか、外から見えるIPに書き換えます

専用のユーザやグループを作るなら(その方が良いと思う)、そのUIDやGIDをUID=とGID=に整数値で書きます

標準の場所以外にdata.cdbを作るなら(専用のユーザディレクトリ以下にした方が良いと思う)、そのディレクトリをROOT=に書きます

あとはそのままでOK。

axfrdns.conf

AXFR=""と、""を指定します

指定しないと、ゾーン転送全許可されるので注意してください

UID/GID/ROOTはtinydns.confと同じです。

UID/GIDは別のユーザでも良いですが、ROOT=は、tinydns.confと場所を合わせましょう(じゃないと、TCPで同じデータが返せません)

data

DATA=で指定した場所に置くファイルです。

作った後、そのディレクトリでtinydns-dataって実行すればdata.cdbが作られます。

作り忘れるとDNSの更新が出来ないので注意

なお、オリジナルのMakefileと同様のMakefileを作っておくと楽です。

dataファイルの形式は tinydns側の情報を参照してください。


システム側の設定

firewalldの設定

firewalldでDNSを許可しないと駄目です。

firewall-cmd --add-service=dns --zone=public --permanent
firewall-cmd --reload

こんな感じで追加しましょう。

tinydnsの起動

これは簡単です。

systemctl start tinydns

で起動して、

systemctl status -l tinydns

でエラーが出ないことを確認しましょう。

この時点で、53/UDPへの受付が出来ています。

dig any example.com @DNS-Server.example.com +notcp

とかで疎通確認してみましょう。

起動OKなら、

systemctl enable tinydns

として、再起動時に実行するように変更します。

axfrdnsの起動

これ、ハメポイントです。

systemdにはsocketというinetd的なモノがついています(何それ怖い)

ndjbdnsのaxfrdnsは、systemdのsocket経由で起動します。

で、そのsystemdのsocketをコピーして使わないと駄目です。

具体的には次のようにします。

cd /etc/systemd/system
cp /lib/systemd/system/axfrdns.socket .

として、axfrdns.socketをコピーしてきます。

そして、コピーした(つまり、/etc/systemd/system/axfrdns.socketを)編集します(何それ怖い

ListenStream=127.0.0.1:53

この行を

ListenStream=0.0.0.0:53

に書き換えます。

どうも、0.0.0.0以外を指定すると、OS起動時にうまく動かないようです(何それ怖い

でも、OS起動後にsystemd start axfrdns.socketすると動きます。つまり、再起動すると起動しない罠にはまります(何それ怖い

そして、

systemctl start axfrdns.socket

で起動します。

この時点で、53/TCPへの受付が出来ています。

dig any example.com @DNS-Server.example.com +tcp

とかで疎通確認してみましょう。

逆に、

dig axfr example.com @DNS-Server.example.com

でエラーになることを確認しましょう!(なんか出てきたらゾーン転送が許可されています)

起動OKなら、

systemctl enable axfrdns.socket

として、再起動時に実行するように変更します。