BINDとMyDNSの連携

新サーバ用のタワーを購入してから、実は2年以上経っている。いつか構築しようと思いつつも、必要に迫られないとダメだね、人間は(私は・・・か)。だましだまし使ってた既存機も、先日遂にディスク障害ぽい症状が現れた。ふと確認するとファイルシステムがリードオンリーでマウントされた状態だった。特に意図することはなかったものの、電源オフにしてしばらく放置しておくと普通に起動できた。さすがにディスクは心配なので、fsckかけて再起動したところ、障害は解消してしまった。

とはいえ、またいつ問題が起こるかわからないので、writeを伴うバッチの停止と新サーバへの機能移行を本気で開始した。まずはDNSから手を付ける。いつもだったら最新のBINDを導入しておしまいだが、今回はMyDNSを使用してみるつもりだった。データモデルにMySQLを使用出来る事が採用の大きなウェイトを占めている。今回のサーバ構築は、これに限らずなるべくデータ周りをMySQLに持たせ、バックアップにMySQLレプリケーションを利用するつもり。

MyDNS自体の設定はそれほど難しくはなかったが、自ドメイン以外の名前を引けないので、その点を構成でカバーする必要がある。最初に試したのが、別のBINDに再問い合わせる方法。しかし、この方法は必ず逆引きの再帰問い合わせを伴う為、レスポンス性能が異常に悪かった。次のアイデアは、BINDをフロントに持ってきて自ドメインのみMyDNSにフォワードする方法。この方法については以前もBINDで運用していたので、レスポンス周りに不安はなかった。結局、BINDとMyDNSが並存する面倒な構成になってしまったが、自ドメインの運用に限って言うと幾つかメリットがある。

上記構成にapache + phpの環境があれば、MyDNSConfigというツールが導入できる。これを利用すれば、ウェブベースでネームサーバのレコードを管理でき、且つDB上でそのデータを運用できる。DNSレコードを機能ごとに準備して、それなりに増やしていく自分としては非常に作業し易い。実際にウェブベースのインタフェースも触ってみたが、直感的で問題なく使用できた。しばらくは、この構成での運用が自分のスタンダードになりそうだ。

セキュリティ上の問題もあるのでこちらも参照下さい(2015年11月追記)

以下、参考までに。

  • BINDのインストールと構築
wget -P /usr/local/src http://ftp.isc.org/isc/bind9/9.5.0/bind-9.5.0.tar.gz
tar xzf /usr/local/src/bind-9.5.0.tar.gz
cd /usr/local/src/bind-9.5.0
./configure \
    --prefix=/usr/local/bind \
    --with-openssl=/usr/local/openssl
make
make install
mkdir -p /usr/local/bind/chroot/etc
cd /usr/local/bind/chroot
# 外部zoneは別サーバのスレーブ、内部zoneはmydnsへforwardする設定。ついでにfletsも。
vi etc/named.conf
----
options {
        directory "/zone";
        pid-file "/var/run/named/named.pid";
        statistics-file "/named.stats";
        listen-on { 192.168.0.1; };
};
server 192.168.211.10 { edns no; };
include "/etc/rndc.key";
controls {
        inet 127.0.0.1 allow { localhost; } keys { rndckey; };
};
acl private {
        192.168.0.0/24;
        127.0.0.1;
};
view "internal" {
        match-clients { private; };
        recursion yes;
        zone "." {
                type hint;
                file "named.ca";
        };
        zone "localhost" {
                type forward;
                forward only;
                forwarders { 127.0.0.1; };
        };
        zone "0.0.127.in-addr.arpa" {
                type forward;
                forward only;
                forwarders { 127.0.0.1; };
        };
        zone "domain.com" {
                type forward;
                forward only;
                forwarders { 127.0.0.1; };
        };
        zone "0.168.192.in-addr.arpa" {
                type forward;
                forward only;
                forwarders { 127.0.0.1; };
        };
        zone "flets" {
                type forward;
                forward only;
                forwarders { 220.210.194.67; 220.210.194.68; };
        };
};
view "external" {
        match-clients { any; };
        recursion no;
        zone "." {
                type hint;
                file "named.ca";
        };
        zone "localhost" {
                type forward;
                forward only;
                forwarders { 127.0.0.1; };
        };
        zone "0.0.127.in-addr.arpa" {
                type forward;
                forward only;
                forwarders { 127.0.0.1; };
        };
        zone "domain.jp" {
                type slave;
                masters { 222.222.222.222; };
                file "domain.jp";
        };
        zone "domain.com" {
                type slave;
                masters { 222.222.222.222; };
                file "domain.com";
        };
};
----
wget ftp://ftp.rs.internic.net/domain/named.root
mkdir zone
mv named.root zone/named.ca
rndc-confgen -a -b 512 -k rndckey -c etc/rndc.key
vi etc/rndc.conf
----
options {
         default-server  localhost;
         default-key     "rndckey";
 };
server localhost {
        key     "rndckey";
};
include "/usr/local/bind/chroot/etc/rndc.key";
----
sed -ie 's/usr\/sbin/usr\/local\/bind\/sbin/g' /etc/init.d/named
sed -ie 's/#               OPTIONS="${OPTIONS} -t ${ROOTDIR}"/                OPTIONS="${OPTIONS} -t ${ROOTDIR} -c ¥/etc¥/named.conf"/g' /etc/init.d/named
sed -ie 's/rndc/rndc -c ${ROOTDIR}\/etc\/rndc.conf/g' /etc/init.d/named
sed -ie 's/#ROOTDIR=¥/var¥/named¥/chroot/ROOTDIR=/usr/local/bind/chroot/g' /etc/sysconfig/named
service named start
  • MyDNSのインストールと構築
wget -P /usr/local/src http://mydns.bboy.net/download/mydns-1.1.0.tar.gz
tar xzf /usr/local/src/mydns-1.1.0.tar.gz
cd /usr/local/src/mydns-1.1.0
sed -ie 's/node->sort1 = 65535 - order++;/node->sort1 = order++;/' src/mydns/sort.c
./configure \
    --prefix=/usr/local/mydns \
    --with-mysql-lib=/usr/local/mysql/lib/mysql \
    --with-mysql-include=/usr/local/mysql/include/mysql
make
make install
# インストール済みのmysqlに、既存bindからデータを移行する。
mysql -uroot -e'create database mydns'
mysql -uroot -e'grant all on mydns.* to mydns@localhost'
/usr/local/mydns/sbin/mydns --create-tables | mysql -umydns mydns
/usr/local/mydns/bin/mydnsimport --axfr=192.168.0.1 localhost
/usr/local/mydns/bin/mydnsimport --axfr=192.168.0.1 0.0.127.in-addr.arpa
/usr/local/mydns/bin/mydnsimport --axfr=192.168.0.1 domain.com
/usr/local/mydns/bin/mydnsimport --axfr=192.168.0.1 0.168.192.in-addr.arpa

vi /usr/local/mydns/mydns.conf
----
db-user = mydns
database = mydns
listen = 127.0.0.1
----
vi /etc/resolv.conf
----
search domain.com
nameserver 192.168.0.1
----
# 起動テスト、名前引けるか試す。
/usr/local/mydns/sbin/mydns -c /usr/local/mydns/etc/mydns.conf --background

# 起動用スクリプト
vi /etc/init.d/mydns
----
#! /bin/sh
#
# mydns         Start the MyDNS server
#
# Author:       Falko Timme <ft@falkotimme.com>.
#
set -e
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
NAME=mydns
DAEMON=/usr/local/mydns/sbin/$NAME
DESC="DNS server"
SCRIPTNAME=/etc/init.d/$NAME
# Gracefully exit if the package has been removed.
test -x $DAEMON || exit 0
case "$1" in
  start)
        echo -n "Starting $DESC: $NAME"
        $DAEMON -c /usr/local/mydns/etc/mydns.conf --background
        echo "."
        ;;
  stop)
        echo "Stopping $DESC: $NAME."
        kill -9 `pidof $NAME` &> /dev/null
        ;;
  restart)
        echo "Restarting $DESC: $NAME."
        $0 stop && sleep 1
        $0 start
        ;;
  *)
        echo "Usage: $SCRIPTNAME {start|stop|restart}" >&2
        exit 1
        ;;
esac
exit 0
----
chkconfig --add mydns
chkconfig mydns on
service mydns start
  • MyDNSConfigのインストールと構築
wget -P /usr/local/src http://downloads.sourceforge.net/mydnsconfig/MyDNSConfig-1.1.0.tar.gz?modtime=1173183827
tar xzf /usr/local/src/MyDNSConfig-1.1.0.tar.gz
cd /usr/local/src/MyDNSConfig-1.1.0
mysql -uroot mydns < install/mydnsconfig.sql
vi interface/lib/config.inc.php
----
$conf["rootpath"] = "/usr/local/mydnsconfig";
$conf["db_user"] = 'mydns';
$conf["db_password"] = '';
$conf["default_ns"] = 'ns.domain.com.';
$conf["default_mbox"] = 'postmaster.domain.com.';
$conf["default_refresh"] = 7200;
$conf["default_retry"] = 1800;
$conf["default_expire"] = 1209600;
----
# あとはhttpdがこのディレクトリを参照できるようにする。

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)